diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ede79df --- /dev/null +++ b/.gitignore @@ -0,0 +1,10 @@ +release/ + +lightning + +VERSION +version.go +coverage.data +coverage.html +coverage.txt +*.log diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..d645695 --- /dev/null +++ b/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + 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. diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..adb99b6 --- /dev/null +++ b/Makefile @@ -0,0 +1,129 @@ +# colors compatible setting +CRED:=$(shell tput setaf 1 2>/dev/null) +CGREEN:=$(shell tput setaf 2 2>/dev/null) +CYELLOW:=$(shell tput setaf 3 2>/dev/null) +CEND:=$(shell tput sgr0 2>/dev/null) + +# Add mysql version for testing `MYSQL_RELEASE=percona MYSQL_VERSION=5.7 make docker` +# MySQL 5.1 `MYSQL_RELEASE=vsamov/mysql-5.1.73 make docker` +# MYSQL_RELEASE: mysql, percona, mariadb ... +# MYSQL_VERSION: latest, 8.0, 5.7, 5.6, 5.5 ... +# use mysql:latest as default +MYSQL_RELEASE := $(or ${MYSQL_RELEASE}, ${MYSQL_RELEASE}, mysql) +MYSQL_VERSION := $(or ${MYSQL_VERSION}, ${MYSQL_VERSION}, latest) + +# Build the project +.PHONY: build +build: + @echo "$(CGREEN)Building ...$(CEND)" + @bash ./genver.sh + @ret=0 && for d in $$(go list -f '{{if (eq .Name "main")}}{{.ImportPath}}{{end}}' ./...); do \ + b=$$(basename $${d}) ; \ + go build ${GCFLAGS} -o $${b} $$d || ret=$$? ; \ + done ; exit $$ret + @echo "build Success!" + +.PHONY: release +release: build + @echo "$(CGREEN)Cross platform building for release ...$(CEND)" + @mkdir -p release + @for GOOS in darwin linux windows; do \ + for GOARCH in amd64; do \ + for d in $$(go list -f '{{if (eq .Name "main")}}{{.ImportPath}}{{end}}' ./...); do \ + b=$$(basename $${d}) ; \ + echo "Building $${b}.$${GOOS}-$${GOARCH} ..."; \ + GOOS=$${GOOS} GOARCH=$${GOARCH} go build ${GCFLAGS} ${LDFLAGS} -v -o release/$${b}.$${GOOS}-$${GOARCH} $$d 2>/dev/null ; \ + done ; \ + done ;\ + done + +# Code format +.PHONY: fmt +fmt: + @echo "$(CGREEN)Run gofmt on all source files ...$(CEND)" + @echo "gofmt -l -s -w ..." + @ret=0 && for d in $$(go list -f '{{.Dir}}' ./... | grep -v /vendor/); do \ + gofmt -l -s -w $$d/*.go || ret=$$? ; \ + done ; exit $$ret + +# Run golang test cases +.PHONY: test +test: + @echo "$(CGREEN)Run all test cases ...$(CEND)" + go test -timeout 10m -race ./... + @echo "test Success!" + +# Code Coverage +# colorful coverage numerical >=90% GREEN, <80% RED, Other YELLOW +.PHONY: cover +cover: test + @echo "$(CGREEN)Run test cover check ...$(CEND)" + go test -coverpkg=./... -coverprofile=coverage.data ./... | column -t + go tool cover -html=coverage.data -o coverage.html + go tool cover -func=coverage.data -o coverage.txt + @tail -n 1 coverage.txt | awk '{sub(/%/, "", $$NF); \ + if($$NF < 80) \ + {print "$(CRED)"$$0"%$(CEND)"} \ + else if ($$NF >= 90) \ + {print "$(CGREEN)"$$0"%$(CEND)"} \ + else \ + {print "$(CYELLOW)"$$0"%$(CEND)"}}' + + +# Update tidb vendor +.PHONY: tidb +tidb: + @echo "$(CGREEN)Update tidb deps ...$(CEND)" + govendor fetch -v github.com/pingcap/tidb/... + +# make pingcap parser +.PHONY: pingcap-parser +pingcap-parser: tidb + @echo "$(CGREEN)Update pingcap parser deps ...$(CEND)" + govendor fetch -v github.com/pingcap/parser/... + +# Update all vendor +.PHONY: vendor +vendor: pingcap-parser + +.PHONY: docker +docker: + @echo "$(CGREEN)Build mysql test environment ...$(CEND)" + @docker stop lightning-mysql 2>/dev/null || true + @docker wait lightning-mysql 2>/dev/null >/dev/null || true + @echo "docker run --name lightning-mysql $(MYSQL_RELEASE):$(MYSQL_VERSION)" + @docker run --name lightning-mysql --rm -d \ + -e MYSQL_ROOT_PASSWORD='******' \ + -e MYSQL_DATABASE=test \ + -p 3306:3306 \ + -v `pwd`/test/schema.sql:/docker-entrypoint-initdb.d/schema.sql \ + -v `pwd`/test/init.sql:/docker-entrypoint-initdb.d/init.sql \ + $(MYSQL_RELEASE):$(MYSQL_VERSION) + + @echo "waiting for test database initializing " + @timeout=180; while [ $${timeout} -gt 0 ] ; do \ + if ! docker exec lightning-mysql mysql --user=root --password='******' --host "127.0.0.1" --silent -NBe "do 1" >/dev/null 2>&1 ; then \ + timeout=`expr $$timeout - 1`; \ + printf '.' ; sleep 1 ; \ + else \ + echo "." ; echo "mysql test environment is ready!" ; break ; \ + fi ; \ + if [ $$timeout = 0 ] ; then \ + echo "." ; echo "$(CRED)docker lightning-mysql start timeout(180 s)!$(CEND)" ; exit 1 ; \ + fi ; \ + done + +.PHONY: docker-connect +docker-connect: + @docker exec -it lightning-mysql mysql --user=root --password='******' --host "127.0.0.1" test + +# attach docker container with bash interactive mode +.PHONY: docker-it +docker-it: + docker exec -it lightning-mysql /bin/bash + +# Installs our project: copies binaries +install: build + @echo "$(CGREEN)Install ...$(CEND)" + go install ./... + @echo "install Success!" diff --git a/README.md b/README.md new file mode 100644 index 0000000..ed48537 --- /dev/null +++ b/README.md @@ -0,0 +1,107 @@ +# 简介 + +[文档](http://github.com/LianjiaTech/lightning/blob/master/doc/) | [English Readme](http://github.com/LianjiaTech/lightning/blob/master/README_EN.md) + +![lightning](https://github.githubassets.com/images/icons/emoji/unicode/26a1.png) lightning 是由贝壳找房 DBA 团队开发和维护的一个 MySQL binlog 转换工具。该工具可以将 MySQL ROW 格式的 binlog 转换为想要的 SQL,如:原始 SQL,闪回 SQL等。也可以对 binlog 进行统计分析,用于数据库异常分析。甚至可以通过定制 lua 插件进行二次开发,发挥无限的想象力。 + +## 应用 + +* 数据修改错误,需要快速回滚 (闪回) + * DELETE, UPDATE 未指定 WHERE 条件 + * UPDATE SET 误用 AND 连接 +* 数据异常, 从 binlog 中找特定表某些数据是什么时间修的 +* 业务流量异常或从库同步延迟,需要统计排查是哪些表在频繁更新 +* 需要把指定表,指定时间的更新提供给开发定位服务异常问题 +* 主从切换后新主库丢失数据的修复 +* 从 binlog 生成标准 SQL,带来的衍生功能 +* 找出某个时间点数据库是否有大事务 (Size) 或者长事务 (Time) + +## 优点 + +* 跨平台支持,二进制文件即下即用,无其他依赖。 +* 支持 lua 定制化插件,发挥无限的想象力,二次开发周期短。 +* 支持从 SQL 文件加载库表信息,不必连接 MySQL 便于历史变更恢复。 +* SQL 进行多行合并,相比 mysqlbinlog ROW 格式,更好过滤。 + +## 安装 + +### 二进制安装 + +lightning 使用 Go 1.11+ 开发,可以直接下载编译好的二进制文件在命令行下使用。由于 Go 原生对跨平台支持较好,在 Windows, Linux, Mac 下均可使用。 + +[下载地址](https://github.com/LianjiaTech/lightning/releases) + +### 源码安装 + +```bash +go get -d github.com/LianjiaTech/lightning +cd ${PATH_TO_SOURCE}/lightning # 进入源码路径,PATH_TO_SOURCE 需要人为具体指定。 +make +``` + +## 测试示例 + +[常用命令](http://github.com/LianjiaTech/lightning/blob/master/doc/cmd.md) + +直接读取文件生成回滚语句 + +```bash +lightning -no-defaults \ +-plugin flashback \ +-start-datetime "2019-01-01 00:00:00" \ +-stop-datetime "2019-01-01 00:01:00" \ +-event-types delete,update \ +-tables test.tb \ +-schema-file schema.sql \ +-binlog-file binlog.0000001 > flashback.sql +``` + +使用 `Binlog Dump` 方式读取日志生成回滚语句 + +```bash +cat > master.info +master_host: 127.0.0.1 +master_user: root +master_password: ****** +master_port: 3306 +master_log_file: binlog.000002 +master_log_pos: 4 ++D + +lightning -no-defaults \ +-plugin flashback \ +-start-datetime "2019-01-01 00:00:00" \ +-stop-datetime "2019-01-01 00:01:00" \ +-event-types delete,update \ +-tables test.tb \ +-master-info master.info > flashback.sql +``` + +## 配置 + +lightning 使用 YAML 格式的配置文件。使用 `-config` 参数指定配置文件路径,如不指定默认按 /etc/lightning.yaml -> ./etc/lightning.yaml -> ./lightning.yaml 的顺序加载配置文件。如果不想使用默认路径下的配置文件还可以通过 `-no-defaults` 参数屏蔽所有默认配置文件。 + +* [全局配置](http://github.com/LianjiaTech/lightning/blob/master/doc/global.md) +* [MySQL 日志源](http://github.com/LianjiaTech/lightning/blob/master/doc/mysql.md) +* [过滤器](http://github.com/LianjiaTech/lightning/blob/master/doc/filters.md) +* [SQL 重建规则](http://github.com/LianjiaTech/lightning/blob/master/doc/rebuild.md) + +## 限制/局限 + +* 仅测试了 v4 版本 (MySQL 5.1+) 的 binlog,更早版本未做测试。 +* BINLOG_FORMAT = ROW +* 参数 BINLOG_ROW_IMAGE 必须为 FULL,暂不支持 MINIMAL +* 由于添加了更多的处理逻辑,解析速度不如 mysqlbinlog 快 +* 当 binlog 中的 DDL 语句变更表结构时,lightning 中的表结构原数据并不随之改变(TODO) + +## 沟通交流 + +* [常见问题(FAQ)](http://github.com/LianjiaTech/lightning/blob/master/doc/FAQ.md) +* 欢迎通过 Github Issues 提交问题报告与建议 +* QQ 群: 573877257 + +![QQ](http://github.com/LianjiaTech/lightning/raw/master/doc/qq_group.png) + +## License + +[Apache License 2.0](http://github.com/LianjiaTech/lightning/blob/master/LICENSE) diff --git a/README_EN.md b/README_EN.md new file mode 100644 index 0000000..171312f --- /dev/null +++ b/README_EN.md @@ -0,0 +1,104 @@ +# Introduction + +![lightning](https://github.githubassets.com/images/icons/emoji/unicode/26a1.png) lightning is developed and maintained by Ke's DBA Team. It's a tool for binlog parsing. It can generate rollback SQL if BINLOG_FORMAT=ROW, and also binlog statistics. Lua self develop plugin is also supportted, which can do what you can imagine. + +## Scenario + +* Data modification error, need to quickly rollback (flashback). + * DELETE, UPDATE with no WHERE condition. + * UPDATE SET connect with AND. +* Data is abnormal, find at which time it changed? +* binlog statistic, find which table update most. +* filter specified table's query. +* Repair of lost data from master failure. +* Generate self define format SQL from binlog. +* Find out if the database has a large transaction (Size) or a long transaction (Time) at certain time. + +## Advance + +* Cross operation system support. +* Lua plugin supported, self develop friendly. +* Schema info can load from file, can parse binlog file offline. +* SQL format self definable, can be filtered line by line. + +## Installation + +### Binary Install + +lightning developed with Go 1.11+,no matter you are using with Windows, Linux, MySQL, just downloading the released binary file and happy to work with it. + +[Download](https://github.com/LianjiaTech/lightning/releases) + +### Source Code Install + +```bash +go get -d github.com/LianjiaTech/lightning +cd ${PATH_TO_SOURCE}/lightning +make +``` + +## Try it + +[Useful command](http://github.com/LianjiaTech/lightning/blob/master/doc/cmd.md) + +Read binlog event from file and generate rollback SQL. + +```bash +lightning -no-defaults \ +-plugin flashback \ +-start-datetime "2019-01-01 00:00:00" \ +-stop-datetime "2019-01-01 00:01:00" \ +-event-types delete,update \ +-tables test.tb \ +-schema-file schema.sql \ +-binlog-file binlog.0000001 > flashback.sql +``` + +Send `Binlog Dump` command and simulate as slave genearate rollback SQL. + +```bash +cat > master.info +master_host: 127.0.0.1 +master_user: root +master_password: ****** +master_port: 3306 +master_log_file: binlog.000002 +master_log_pos: 4 ++D + +lightning -no-defaults \ +-plugin flashback \ +-start-datetime "2019-01-01 00:00:00" \ +-stop-datetime "2019-01-01 00:01:00" \ +-event-types delete,update \ +-tables test.tb \ +-master-info master.info > flashback.sql +``` + +## Configuration + +lightning's config file is YAML formated. Configure file load sequence: /etc/lightning.yaml -> ./etc/lightning.yaml -> ./lightning.yaml. With `-config` argument can find new config file, with `-no-defaults` can disable all default config. + +* [Global Config](http://github.com/LianjiaTech/lightning/blob/master/doc/global.md) +* [MySQL Config](http://github.com/LianjiaTech/lightning/blob/master/doc/mysql.md) +* [Filter Config](http://github.com/LianjiaTech/lightning/blob/master/doc/filters.md) +* [Rebuild Config](http://github.com/LianjiaTech/lightning/blob/master/doc/rebuild.md) + +## Limitation + +* binlog version only support v4 (MySQL 5.1+), no test with(<= MySQL 5.0) +* BINLOG_FORMAT = ROW +* BINLOG_ROW_IMAGE = FULL +* for binlog parsing performance not better than mysqlbinlog itself. + +## Communication + +* [FAQ](http://github.com/LianjiaTech/lightning/blob/master/doc/FAQ.md) +* Welcome feed back with Github Issues. +* QQ Group: 573877257 + +![QQ](http://github.com/LianjiaTech/lightning/raw/master/doc/qq_group.png) + +## License + +[Apache License 2.0](http://github.com/LianjiaTech/lightning/blob/master/LICENSE) diff --git a/common/config.go b/common/config.go new file mode 100644 index 0000000..9b9b9f8 --- /dev/null +++ b/common/config.go @@ -0,0 +1,723 @@ +/* + * Copyright(c) 2019 Lianjia, Inc. All Rights Reserved + * 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 common + +import ( + "database/sql" + "flag" + "fmt" + "io/ioutil" + "math/rand" + "os" + "runtime" + "strconv" + "strings" + "time" + + // database/sql + _ "github.com/go-sql-driver/mysql" + "github.com/juju/errors" + pingcap "github.com/pingcap/parser/mysql" + "gopkg.in/yaml.v2" +) + +// GlobalConfig global config +type GlobalConfig struct { + // 日志级别,这里使用了 beego 的 log 包 + // [0:Emergency, 1:Alert, 2:Critical, 3:Error, 4:Warning, 5:Notice, 6:Informational, 7:Debug] + LogLevel int `yaml:"log-level"` + // 日志输出位置,默认日志输出到控制台 + // 目前只支持['console', 'file']两种形式,如非console形式这里需要指定文件的路径,可以是相对路径 + LogOutput string `yaml:"log-output"` + Demonize bool `yaml:"demonize"` + Charset string `yaml:"charset"` + HexString bool `yaml:"hex-string"` // string, varchar 等数据是否使用 hex 转义,防止数据转换 + CPU int `yaml:"cpu"` // CPU core limit + Verbose bool `yaml:"verbose"` // more info to print + VerboseVerbose bool `yaml:"verbose-verbose"` // more and more info to print + TimeZone string `yaml:"time-zone"` // "UTC", "Asia/Shanghai" + Location *time.Location `yaml:"-"` +} + +var gConfig = GlobalConfig{ + LogLevel: 3, + LogOutput: "lightning.log", + TimeZone: "Asia/Shanghai", + Charset: "utf8mb4", // MySQL 低版本不支持 utf8mb4, 可能会有报错需要通过修改配置文件避免 +} + +// MySQL binlog file location or streamer, if streamer use dsn format +type MySQL struct { + BinlogFile []string `yaml:"binlog-file"` + SchemaFile string `yaml:"schema-file"` + MasterInfo string `yaml:"master-info"` + ReplicateFromCurrentPosition bool `yaml:"replicate-from-current-position"` + SyncInterval string `yaml:"sync-interval"` + SyncDuration time.Duration `yaml:"-"` + ReadTimeout string `yaml:"read-timeout"` + RetryCount int `yaml:"retry-count"` +} + +var mConfig = MySQL{ + BinlogFile: []string{}, + SchemaFile: "", + SyncInterval: "1s", + ReadTimeout: "3s", + RetryCount: 100, +} + +// Filters filters about event +type Filters struct { + Tables []string `yaml:"tables"` // replication_wild_do_tables format + IgnoreTables []string `yaml:"ignore-tables"` // replicate_wild_ignore_tables format + EventType []string `yaml:"event-types"` // insert, update, delete + ThreadID int `yaml:"thread-id"` + ServerID int `yaml:"server-id"` + StartPosition int64 `yaml:"start-position"` + StopPosition int64 `yaml:"stop-position"` + StartDatetime string `yaml:"start-datetime"` + StopDatetime string `yaml:"stop-datetime"` + IncludeGTIDSet string `yaml:"include-gtid-set"` + ExcludeGTIDSet string `yaml:"exclude-gtid-set"` + StartTimestamp int64 `yaml:"-"` + StopTimestamp int64 `yaml:"-"` +} + +var fConfig = Filters{ + Tables: []string{}, + IgnoreTables: []string{ + "mysql.%", + "percona.%", + }, + StartDatetime: "", + StopDatetime: "", +} + +// Rebuild rebuild plugins +type Rebuild struct { + Plugin string `yaml:"plugin"` // Plugin name: sql, flashback, stat, lua + CompleteInsert bool `yaml:"complete-insert"` + ExtendedInsertCount int `yaml:"extended-insert-count"` + IgnoreColumns []string `yaml:"ignore-columns"` + Replace bool `yaml:"replace"` + SleepInterval string `yaml:"sleep-interval"` + SleepDuration time.Duration `yaml:"-"` + LuaScript string `yaml:"lua-script"` +} + +var rConfig = Rebuild{ + Plugin: "sql", + SleepInterval: "0s", +} + +// Configuration config sections +type Configuration struct { + Global GlobalConfig `yaml:"global"` + MySQL MySQL `yaml:"mysql"` + Filters Filters `yaml:"filters"` + Rebuild Rebuild `yaml:"rebuild"` +} + +// Config global config variable +var Config = Configuration{ + gConfig, + mConfig, + fConfig, + rConfig, +} + +// ChangeMaster change master info +type ChangeMaster struct { + MasterHost string `yaml:"master_host"` + MasterUser string `yaml:"master_user"` + MasterPassword string `yaml:"master_password"` + MasterPort int `yaml:"master_port"` + MasterLogFile string `yaml:"master_log_file"` + MasterLogPos int64 `yaml:"master_log_pos"` + ExecutedGTIDSet string `yaml:"executed_gtid_set"` + AutoPosition bool `yaml:"auto_position"` + + SecondsBehindMaster int64 `yaml:"seconds_behind_master"` // last execute event timestamp + ServerID uint32 `yaml:"server-id"` + ServerType string `yaml:"server-type"` // mysql, mariadb +} + +// MasterInfo replication status info +var MasterInfo = ChangeMaster{ + MasterPort: 3306, + ServerID: 11, + ServerType: "mysql", +} + +// ShowMasterStatus execute `show master status`, get master info +func ShowMasterStatus(masterInfo ChangeMaster) ChangeMaster { + db, err := sql.Open("mysql", + fmt.Sprintf(`%s:%s@tcp(%s:%d)/`, + masterInfo.MasterUser, + masterInfo.MasterPassword, + masterInfo.MasterHost, + masterInfo.MasterPort, + )) + if err != nil { + Log.Error(err.Error()) + return masterInfo + } + defer db.Close() + + rows, err := db.Query("show master status") + if err != nil { + Log.Error(err.Error()) + return masterInfo + } + + columns, err := rows.Columns() + if err != nil { + Log.Error(err.Error()) + return masterInfo + } + values := make([]sql.RawBytes, len(columns)) + scanArgs := make([]interface{}, len(values)) + for i := range values { + scanArgs[i] = &values[i] + } + for rows.Next() { + err = rows.Scan(scanArgs...) + if err != nil { + Log.Error(err.Error()) + break + } + for i, v := range values { + switch columns[i] { + case "File": + masterInfo.MasterLogFile = string(v) + case "Position": + masterInfo.MasterLogPos, _ = strconv.ParseInt(string(v), 10, 64) + case "Binlog_Do_DB": + case "Binlog_Ignore_DB": + case "Executed_Gtid_Set": + masterInfo.ExecutedGTIDSet = string(v) + } + } + } + return masterInfo +} + +// ParseConfig parse configuration +func ParseConfig() { + var err error + + // Not in config flags + noDefaults := flag.Bool("no-defaults", false, "don't load config from default file") + configFile := flag.String("config", "", "load config from specify file") + printConfig := flag.Bool("print-config", false, "print config into stdout") + printMasterInfo := flag.Bool("print-master-info", false, "print master.info into stdout") + checkConfig := flag.Bool("check-config", false, "check config file format") + printVersion := flag.Bool("version", false, "print version info into stdout") + listPlugin := flag.Bool("list-plugin", false, "list support plugins") + + // Global section config + globalLogLevel := flag.Int("log-level", 0, "log level") + globalLogOutput := flag.String("log-output", "", "log output file name") + globalTimeZone := flag.String("time-zone", "", "time zone info") + globalCharset := flag.String("charset", "", "charset use for binlog parsing") + globalCPU := flag.Int("cpu", 0, "cpu cores limit") + globalVerbose := flag.Bool("verbose", false, "verbose mode, more info will print") + globalVerboseVerbose := flag.Bool("vv", false, "verbose verbose mode, more and more info will print") + globalDemonize := flag.Bool("demonize", false, "replication run as demonize") + globalHexString := flag.Bool("hex-string", false, "convert string to hex format") + + // MySQL section config + mysqlUser := flag.String("user", "", "mysql user") + mysqlHost := flag.String("host", "", "mysql host") + mysqlPort := flag.Int("port", 0, "mysql port") + mysqlPassword := flag.String("password", "", "mysql password") + mysqlBinlogFile := flag.String("binlog-file", "", "binlog files separate with space, eg. --binlog-file='binlog.000001 binlog.000002'") + mysqlSchemaFile := flag.String("schema-file", "", "schema load from file") + mysqlMasterInfo := flag.String("master-info", "", "master.info file") + mysqlReplicateFromCurrent := flag.Bool("replicate-from-current-position", false, "binlog dump from current `show master status`") + mysqlSyncInterval := flag.String("sync-interval", "", "sync master.info interval") + mysqlReadTimeout := flag.String("read-timeout", "", "I/O read timeout. The value must be a decimal number with a unit suffix ('ms', 's', 'm', 'h'), such as '30s', '0.5m' or '1m30s'.") + mysqlRetryCount := flag.Int("retry-count", 0, "maximum number of attempts to re-establish a broken connection") + + // Filters section config + filterThreadID := flag.Int("thread-id", 0, "binlog filter thread-id") + filterServerID := flag.Int("server-id", 0, "binlog filter server-id") + filterIncludeGTID := flag.String("include-gtids", "", "like mysqlbinlog include-gtids") + filterExcludeGTID := flag.String("exclude-gtids", "", "like mysqlbinlog exclude-gtids") + filterStartPosition := flag.Int64("start-position", 0, "binlog start-position") + filterStopPosition := flag.Int64("stop-position", 0, "binlog stop-position") + filterStartDatetime := flag.String("start-datetime", "", "binlog filter start-datetime") + filterStopDatetime := flag.String("stop-datetime", "", "binlog filter stop-datetime") + filterTables := flag.String("tables", "", "binlog filter tables") + filterIgnoreTables := flag.String("ignore-tables", "", "binlog filter ignore tables") + filterEventTypes := flag.String("event-types", "", "binlog filter event types") + + // Rebuild section config + rebuildPlugin := flag.String("plugin", "", "plugin name") + rebuildCompleteInsert := flag.Bool("complete-insert", false, "complete column info, like 'INSERT INTO tb (col) VALUES (1)'") + rebuildExtendedInsertCount := flag.Int("extended-insert-count", 0, "use multiple-row INSERT syntax that include several VALUES") + rebuildReplace := flag.Bool("replace", false, "use REPLACE INTO instead of INSERT INTO.") + rebuildSleepInterval := flag.String("sleep-interval", "", "execute commands repeatedly with a sleep between") + rebuildIgnoreColumns := flag.String("ignore-columns", "", "query rebuild ignore columns") + rebuildLuaScript := flag.String("lua-script", "", "lua plugin script file") + + // master.info config + masterHost := flag.String("master-host", "", "master.info master_host") + masterUser := flag.String("master-user", "", "master.info master_user") + masterPassword := flag.String("master-password", "", "master.info master_password") + masterPort := flag.Int("master-port", 0, "master.info master_port") + masterLogFile := flag.String("master-log-file", "", "master.info master_log_file") + masterLogPos := flag.Int64("master-log-pos", 0, "master.info master_log_pos") + executedGtidSet := flag.String("executed-gtid-set", "", "master.info executed_gtid_set") + autoPosition := flag.Bool("auto-position", false, "master.info auto_position") + serverId := flag.Uint("slave-server-id", 0, "master.info server-id") + serverType := flag.String("server-type", "", "master.info server-type") + + flag.CommandLine.SetOutput(os.Stdout) + flag.Parse() + + // Not in config flags + if !*noDefaults { + err = Config.parseConfigFile(*configFile) + } + if *configFile != "" { + err = Config.parseConfigFile(*configFile) + } + if *checkConfig { + if err != nil { + fmt.Println(err.Error()) + os.Exit(1) + } else { + fmt.Println("OK") + os.Exit(0) + } + } + if *printVersion { + version() + os.Exit(0) + } + if *listPlugin { + ListPlugin() + os.Exit(0) + } + + // Global config + if *globalLogLevel > 0 { + Config.Global.LogLevel = *globalLogLevel + } + if *globalLogOutput != "" { + Config.Global.LogOutput = *globalLogOutput + } + if *globalTimeZone != "" { + Config.Global.TimeZone = *globalTimeZone + } + Config.Global.Location, err = time.LoadLocation(Config.Global.TimeZone) + if err != nil { + Log.Error(errors.Trace(err).Error()) + Config.Global.Location = time.Now().Location() + } + if *globalCharset != "" { + Config.Global.Charset = *globalCharset + } + if ok := pingcap.Charsets[Config.Global.Charset]; ok == "" { + Log.Warn("Config.Global.Charset: %s not exist", Config.Global.Charset) + Config.Global.Charset = "utf8mb4" + } + if *globalCPU > 0 { + Config.Global.CPU = *globalCPU + runtime.GOMAXPROCS(*globalCPU) + } + if *globalVerbose { + Config.Global.Verbose = *globalVerbose + } + if *globalVerboseVerbose { + Config.Global.VerboseVerbose = *globalVerboseVerbose + } + if *globalDemonize { + Config.Global.Demonize = *globalDemonize + } + if *globalHexString { + Config.Global.HexString = *globalHexString + } + + // MySQL config + if *mysqlBinlogFile != "" { + Config.MySQL.BinlogFile = strings.Fields(*mysqlBinlogFile) + } else { + // Only parse first not flags file + files := flag.Args() + if len(files) >= 1 { + Config.MySQL.BinlogFile = files + } + } + if *mysqlSchemaFile != "" { + Config.MySQL.SchemaFile = *mysqlSchemaFile + } + if *mysqlMasterInfo != "" { + Config.MySQL.MasterInfo = *mysqlMasterInfo + } + if *mysqlReplicateFromCurrent { + Config.MySQL.ReplicateFromCurrentPosition = *mysqlReplicateFromCurrent + } + if *mysqlSyncInterval != "" { + _, err = time.ParseDuration(*mysqlSyncInterval) + if err != nil { + Log.Warn("-sync-interval '%s' Error: %s", *mysqlSyncInterval, err.Error()) + } else { + Config.MySQL.SyncInterval = *mysqlSyncInterval + } + } + Config.MySQL.SyncDuration, err = time.ParseDuration(Config.MySQL.SyncInterval) + if err != nil { + Log.Warn("sync-interval '%s' Error: %s", Config.MySQL.SyncInterval, err.Error()) + Config.MySQL.SyncDuration = time.Duration(0 * time.Second) + } + if *mysqlReadTimeout != "" { + _, err = time.ParseDuration(*mysqlReadTimeout) + if err != nil { + Log.Warn("-read-timeout '%s' Error: %s", *mysqlReadTimeout, err.Error()) + } else { + Config.MySQL.ReadTimeout = *mysqlReadTimeout + } + } + if *mysqlRetryCount > 0 { + Config.MySQL.RetryCount = *mysqlRetryCount + } + + // Filters Config + if *filterThreadID > 0 { + Config.Filters.ThreadID = *filterThreadID + } + if *filterServerID > 0 { + Config.Filters.ServerID = *filterServerID + } + if *filterIncludeGTID != "" { + Config.Filters.IncludeGTIDSet = *filterIncludeGTID + } + if *filterExcludeGTID != "" { + Config.Filters.ExcludeGTIDSet = *filterExcludeGTID + } + if *filterStartDatetime != "" { + Config.Filters.StartDatetime = *filterStartDatetime + } + layout := "2006-01-02 15:04:05" + if Config.Filters.StartDatetime != "" { + t, err := time.ParseInLocation(layout, Config.Filters.StartDatetime, Config.Global.Location) + if err != nil { + fmt.Println(err.Error()) + os.Exit(1) + } else { + Config.Filters.StartTimestamp = t.Unix() + } + } + VerboseVerbose("-- [DEBUG] Config.Filters.StartTimestamp: %d", Config.Filters.StartTimestamp) + if *filterStopDatetime != "" { + Config.Filters.StopDatetime = *filterStopDatetime + } + if Config.Filters.StopDatetime == "" && Config.Global.Demonize == false { + Config.Filters.StopDatetime = time.Now().Format(layout) + } + + if Config.Filters.StopDatetime != "" { + t, err := time.ParseInLocation(layout, Config.Filters.StopDatetime, Config.Global.Location) + if err != nil { + fmt.Println(err.Error()) + os.Exit(1) + } else { + Config.Filters.StopTimestamp = t.Unix() + } + } + VerboseVerbose("-- [DEBUG] Config.Filters.StopTimestamp: %d", Config.Filters.StopTimestamp) + if *filterStartPosition > 0 { + Config.Filters.StartPosition = *filterStartPosition + } + if *filterStopPosition > 0 { + Config.Filters.StopPosition = *filterStopPosition + } + if *filterTables != "" { + Config.Filters.Tables = strings.Split(*filterTables, ",") + } + for _, t := range Config.Filters.Tables { + if !strings.Contains(t, ".") { + fmt.Println("filter -tables format should be `db`.`tb`") + os.Exit(1) + } + } + if *filterIgnoreTables != "" { + Config.Filters.IgnoreTables = strings.Split(*filterIgnoreTables, ",") + } + for _, t := range Config.Filters.IgnoreTables { + if !strings.Contains(t, ".") { + fmt.Println("filter -ignore-tables format should be `db`.`tb`") + os.Exit(1) + } + } + if *filterEventTypes != "" { + Config.Filters.EventType = strings.Split(*filterEventTypes, ",") + } + + // Rebuild config + if *rebuildPlugin != "" { + Config.Rebuild.Plugin = *rebuildPlugin + } + switch Config.Rebuild.Plugin { + case "": + Config.Rebuild.Plugin = "sql" + case "lua", "sql", "flashback", "stat": + default: + ListPlugin() + os.Exit(1) + } + if *rebuildCompleteInsert { + Config.Rebuild.CompleteInsert = *rebuildCompleteInsert + } + if *rebuildExtendedInsertCount > 0 { + Config.Rebuild.ExtendedInsertCount = *rebuildExtendedInsertCount + } + if *rebuildReplace { + Config.Rebuild.Replace = *rebuildReplace + } + if *rebuildSleepInterval != "" { + _, err = time.ParseDuration(*rebuildSleepInterval) + if err != nil { + Log.Warn("-sleep-interval '%s' Error: %s", *rebuildSleepInterval, err.Error()) + } else { + Config.Rebuild.SleepInterval = *rebuildSleepInterval + } + } + Config.Rebuild.SleepDuration, err = time.ParseDuration(Config.Rebuild.SleepInterval) + if err != nil { + Log.Warn("sleep-interval '%s' Error: %s", Config.Rebuild.SleepInterval, err.Error()) + Config.Rebuild.SleepDuration = time.Duration(0 * time.Second) + } + if *rebuildIgnoreColumns != "" { + Config.Rebuild.IgnoreColumns = strings.Split(*rebuildIgnoreColumns, ",") + } + if len(Config.Rebuild.IgnoreColumns) > 0 { + Config.Rebuild.CompleteInsert = true + } + if *rebuildLuaScript != "" { + Config.Rebuild.LuaScript = *rebuildLuaScript + } + + LoadMasterInfo() + + if len(Config.MySQL.BinlogFile) == 0 && Config.MySQL.MasterInfo == "" { + Config.MySQL.MasterInfo = "master.info" + } + + if *printConfig { + PrintConfiguration() + os.Exit(0) + } + + // master.info config + if *mysqlUser != "" { + MasterInfo.MasterUser = *mysqlUser + } + if *mysqlHost != "" { + MasterInfo.MasterHost = *mysqlHost + } + if *mysqlPassword != "" { + MasterInfo.MasterPassword = *mysqlPassword + } + if *mysqlPort != 0 { + MasterInfo.MasterPort = *mysqlPort + } + if *masterHost != "" { + MasterInfo.MasterHost = *masterHost + } + if *masterUser != "" { + MasterInfo.MasterUser = *masterUser + } + if *masterPassword != "" { + MasterInfo.MasterPassword = *masterPassword + } + if *masterPort != 0 { + MasterInfo.MasterPort = *masterPort + } + if *masterLogFile != "" { + MasterInfo.MasterLogFile = *masterLogFile + } + if *masterLogPos != 0 { + MasterInfo.MasterLogPos = *masterLogPos + } + if *executedGtidSet != "" { + MasterInfo.ExecutedGTIDSet = *executedGtidSet + } + if *autoPosition { + MasterInfo.AutoPosition = *autoPosition + } + if *serverId != 0 { + MasterInfo.ServerID = uint32(*serverId) + } + if *serverType != "" { + MasterInfo.ServerType = *serverType + } + + if *printMasterInfo { + PrintMasterInfo() + os.Exit(0) + } + + loggerInit() +} + +// PrintConfiguration for `-print-config` flag +func PrintConfiguration() { + data, _ := yaml.Marshal(Config) + fmt.Print(string(data)) +} + +// PrintMasterInfo for `-print-master-info` flag +func PrintMasterInfo() { + data, _ := yaml.Marshal(MasterInfo) + fmt.Print(string(data)) +} + +// parseConfigFile load config from file +func (conf *Configuration) parseConfigFile(path string) error { + path = getConfigFile(path) + configFile, err := os.Open(path) + if err != nil { + return err + } + defer configFile.Close() + + content, err := ioutil.ReadAll(configFile) + if err != nil { + return err + } + + err = yaml.Unmarshal(content, &Config) + if err != nil { + return err + } + return nil +} + +// getConfigFile config file load sequence +func getConfigFile(path string) string { + if path == "" { + path = "/etc/lightning.yaml" + _, err := os.Stat(path) + if err == nil { + return path + } + + path = "etc/lightning.yaml" + _, err = os.Stat(path) + if err == nil { + return path + } + + path = "lightning.yaml" + _, err = os.Stat(path) + if err == nil { + return path + } + } + return path +} + +// version print version info +func version() { + fmt.Println("Version: ", Version) + fmt.Println("Compiled time: ", Compile) + fmt.Println("Code branch: ", Branch) + fmt.Println("GirDirty: ", GitDirty) +} + +// SyncReplicationInfo sync replication status into master.info +func SyncReplicationInfo() { + if Config.MySQL.SyncDuration.Seconds() == 0 { + return + } + + if Config.MySQL.MasterInfo == "" || len(Config.MySQL.BinlogFile) > 0 { + Log.Info("SyncReplicationInfo -master-info not specified, reading from '%v'", Config.MySQL.BinlogFile) + return + } + + for { + FlushReplicationInfo() + time.Sleep(Config.MySQL.SyncDuration) + } +} + +// FlushReplicationInfo flush master.info +func FlushReplicationInfo() { + if Config.MySQL.MasterInfo == "" { + return + } + f, err := os.OpenFile(Config.MySQL.MasterInfo, os.O_WRONLY|os.O_TRUNC|os.O_CREATE, 0644) + if err != nil { + Log.Error(errors.Trace(err).Error()) + return + } + defer f.Close() + info, err := yaml.Marshal(MasterInfo) + if err != nil { + Log.Error(errors.Trace(err).Error()) + return + } + _, err = f.WriteString(string(info)) + if err != nil { + Log.Error(errors.Trace(err).Error()) + } +} + +// LoadMasterInfo get master.info from file +func LoadMasterInfo() { + if Config.MySQL.MasterInfo == "" { + return + } + conf, err := ioutil.ReadFile(Config.MySQL.MasterInfo) + if err != nil { + fmt.Println("-- LoadMasterInfo Error: ", err.Error()) + return + } + err = yaml.Unmarshal(conf, &MasterInfo) + if err != nil { + fmt.Println("-- LoadMasterInfo Error: ", err.Error()) + return + } + if MasterInfo.ServerID == 0 { + s1 := rand.NewSource(time.Now().UnixNano()) + r1 := rand.New(s1) + MasterInfo.ServerID = uint32(r1.Intn(3306) + 3306) + } +} + +// ListPlugin list support plugin name and description +func ListPlugin() { + fmt.Println("lightning -plugin support following type") + fmt.Println(" sql(default): parse ROW format binlog into SQL.") + fmt.Println(" flashback: generate flashback query from ROW format binlog") + fmt.Println(" stat: statistic ROW format binlog table update|insert|delete query count") + fmt.Println(" lua: self define lua scripts") +} + +// TimeOffset timezone offset seconds +func TimeOffset(timezone string) int { + loc, err := time.LoadLocation(timezone) + if err != nil { + Log.Error(err.Error()) + return 0 + } + now := time.Now() + _, destOffset := now.In(loc).Zone() + _, localOffset := now.Zone() + return destOffset - localOffset +} diff --git a/common/config_test.go b/common/config_test.go new file mode 100644 index 0000000..f670f4e --- /dev/null +++ b/common/config_test.go @@ -0,0 +1,113 @@ +/* + * Copyright(c) 2019 Lianjia, Inc. All Rights Reserved + * 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 common + +import ( + "flag" + "fmt" + "testing" + "time" + + "github.com/kr/pretty" +) + +var update = flag.Bool("update", false, "update .golden files") + +func TestLoadReplicationInfo(t *testing.T) { + masterInfoOrg := Config.MySQL.MasterInfo + Config.MySQL.MasterInfo = DevPath + "/etc/master.info" + LoadMasterInfo() + pretty.Println(MasterInfo) + Config.MySQL.MasterInfo = masterInfoOrg +} + +func TestPrintConfiguration(t *testing.T) { + err := GoldenDiff(func() { + PrintConfiguration() + }, t.Name(), update) + if nil != err { + t.Fatal(err) + } +} + +func TestListPlugin(t *testing.T) { + err := GoldenDiff(func() { + ListPlugin() + }, t.Name(), update) + if nil != err { + t.Fatal(err) + } +} + +func TestTimeOffset(t *testing.T) { + tzs := []string{ + "UTC", + "Asia/Shanghai", + "Europe/London", + "America/Los_Angeles", + } + + err := GoldenDiff(func() { + for _, tz := range tzs { + fmt.Println(TimeOffset(tz)) + } + }, t.Name(), update) + if nil != err { + t.Fatal(err) + } +} + +func TestFlushReplicationInfo(t *testing.T) { + masterInfoOrg := Config.MySQL.MasterInfo + Config.MySQL.MasterInfo = DevPath + "/common/fixture/master.info" + FlushReplicationInfo() + Config.MySQL.MasterInfo = masterInfoOrg +} + +func TestSyncReplicationInfo(t *testing.T) { + durationOrg := Config.MySQL.SyncDuration + Config.MySQL.SyncDuration = time.Duration(0 * time.Second) + SyncReplicationInfo() + Config.MySQL.SyncDuration = durationOrg +} + +func TestParseConfig(t *testing.T) { + ParseConfig() + pretty.Println(Config, MasterInfo) +} + +func TestParseConfigFile(t *testing.T) { + var cfg *Configuration + cfg.parseConfigFile(DevPath + "/etc/lightning.yaml") + pretty.Println(Config) +} + +func TestVersion(t *testing.T) { + version() +} + +func TestPrintMasterInfo(t *testing.T) { + PrintMasterInfo() +} + +func TestShowMasterStatus(t *testing.T) { + // dsn := `root:******@tcp(127.0.0.1:3306)/` + masterInfo := ChangeMaster{ + MasterUser: "root", + MasterPassword: "******", + MasterHost: "127.0.0.1", + MasterPort: 3306, + } + pretty.Println(ShowMasterStatus(masterInfo)) +} diff --git a/common/doc.go b/common/doc.go new file mode 100644 index 0000000..5089f2b --- /dev/null +++ b/common/doc.go @@ -0,0 +1,15 @@ +/* + * Copyright(c) 2019 Lianjia, Inc. All Rights Reserved + * 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 common common library func for lightning +package common diff --git a/common/fixture/TestListPlugin.golden b/common/fixture/TestListPlugin.golden new file mode 100644 index 0000000..859788e --- /dev/null +++ b/common/fixture/TestListPlugin.golden @@ -0,0 +1,5 @@ +lightning -plugin support following type + sql(default): parse ROW format binlog into SQL. + flashback: generate flashback query from ROW format binlog + stat: statistic ROW format binlog table update|insert|delete query count + lua: self define lua scripts diff --git a/common/fixture/TestPrintConfiguration.golden b/common/fixture/TestPrintConfiguration.golden new file mode 100644 index 0000000..c1a84c9 --- /dev/null +++ b/common/fixture/TestPrintConfiguration.golden @@ -0,0 +1,40 @@ +global: + log-level: 3 + log-output: lightning.log + demonize: false + charset: utf8mb4 + hex-string: false + cpu: 0 + verbose: false + verbose-verbose: false + time-zone: Asia/Shanghai +mysql: + binlog-file: [] + schema-file: "" + master-info: "" + replicate-from-current-position: false + sync-interval: 1s + read-timeout: 3s + retry-count: 100 +filters: + tables: [] + ignore-tables: + - mysql.% + - percona.% + event-types: [] + thread-id: 0 + server-id: 0 + start-position: 0 + stop-position: 0 + start-datetime: "" + stop-datetime: "" + include-gtid-set: "" + exclude-gtid-set: "" +rebuild: + plugin: sql + complete-insert: false + extended-insert-count: 0 + ignore-columns: [] + replace: false + sleep-interval: 0s + lua-script: "" diff --git a/common/fixture/TestTimeOffset.golden b/common/fixture/TestTimeOffset.golden new file mode 100644 index 0000000..6cb06e0 --- /dev/null +++ b/common/fixture/TestTimeOffset.golden @@ -0,0 +1,4 @@ +-28800 +0 +-25200 +-54000 diff --git a/common/fixture/master.info b/common/fixture/master.info new file mode 100755 index 0000000..a1928b4 --- /dev/null +++ b/common/fixture/master.info @@ -0,0 +1,11 @@ +master_host: 127.0.0.1 +master_user: root +master_password: '******' +master_port: 3306 +master_log_file: binlog.000007 +master_log_pos: 4 +executed_gtid_set: 376b1ae7-39a1-11e9-a253-14187759814e:1, 3b0075c9-39a1-11e9-a250-f86eee9113c6:1-98 +auto_position: false +seconds_behind_master: 84 +server-id: 33061 +server-type: mysql diff --git a/common/golden.go b/common/golden.go new file mode 100644 index 0000000..dcd8e57 --- /dev/null +++ b/common/golden.go @@ -0,0 +1,85 @@ +/* + * Copyright(c) 2019 Lianjia, Inc. All Rights Reserved + * 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 common + +import ( + "bufio" + "bytes" + "fmt" + "io/ioutil" + "os" + "path/filepath" +) + +// GoldenDiff 从 gofmt 学来的测试方法 +// https://medium.com/soon-london/testing-with-golden-files-in-go-7fccc71c43d3 +func GoldenDiff(f func(), name string, update *bool) error { + var b bytes.Buffer + w := bufio.NewWriter(&b) + str := captureOutput(f) + _, err := w.WriteString(str) + if err != nil { + Log.Warning(err.Error()) + } + err = w.Flush() + if err != nil { + Log.Warning(err.Error()) + } + + gp := filepath.Join("fixture", name+".golden") + if *update { + if err = ioutil.WriteFile(gp, b.Bytes(), 0644); err != nil { + err = fmt.Errorf("%s failed to update golden file: %s", name, err) + return err + } + } + g, err := ioutil.ReadFile(gp) + if err != nil { + err = fmt.Errorf("%s failed reading .golden: %s", name, err) + } + if !bytes.Equal(b.Bytes(), g) { + err = fmt.Errorf("%s does not match .golden file", name) + } + return err +} + +// captureOutput 获取函数标准输出 +func captureOutput(f func()) string { + // keep backup of the real stdout + oldStdout := os.Stdout + r, w, _ := os.Pipe() + os.Stdout = w + + // copy the output in a separate goroutine so printing can't block indefinitely + outC := make(chan string) + go func() { + buf, err := ioutil.ReadAll(r) + if err != nil { + panic(err) + } + outC <- string(buf) + }() + + // execute function + f() + + // back to normal state + if err := w.Close(); err != nil { + panic(err) + } + os.Stdout = oldStdout // restoring the real stdout + out := <-outC + os.Stdout = oldStdout + return out +} diff --git a/common/log.go b/common/log.go new file mode 100644 index 0000000..9dade32 --- /dev/null +++ b/common/log.go @@ -0,0 +1,144 @@ +/* + * Copyright(c) 2019 Lianjia, Inc. All Rights Reserved + * 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 common + +import ( + "encoding/json" + "fmt" + "regexp" + "runtime" + "strings" + + "github.com/astaxie/beego/logs" + disablelog "github.com/siddontang/go-log/log" +) + +// Log 使用 beego 的 log 库 +var Log *logs.BeeLogger + +func init() { + Log = logs.NewLogger(0) + Log.EnableFuncCallDepth(true) + disablelog.SetLevel(disablelog.LevelFatal) +} + +// loggerInit Log配置初始化 +func loggerInit() { + Log.SetLevel(Config.Global.LogLevel) + func() { _ = Log.DelLogger(logs.AdapterFile) }() + logConfig := map[string]interface{}{ + "filename": Config.Global.LogOutput, + "level": 7, + "maxlines": 0, + "maxsize": 0, + "daily": false, + "maxdays": 0, + } + logConfigJSON, _ := json.Marshal(logConfig) + err := Log.SetLogger(logs.AdapterFile, string(logConfigJSON)) + if err != nil { + fmt.Println(err.Error()) + } +} + +// Caller returns the caller of the function that called it :) +// https://stackoverflow.com/questions/35212985/is-it-possible-get-information-about-caller-function-in-golang +func Caller() string { + // we get the callers as uintptrs - but we just need 1 + fpcs := make([]uintptr, 1) + + // skip 3 levels to get to the caller of whoever called Caller() + n := runtime.Callers(3, fpcs) + if n == 0 { + return "n/a" // proper error her would be better + } + + // get the info of the actual function that's in the pointer + fun := runtime.FuncForPC(fpcs[0] - 1) + if fun == nil { + return "n/a" + } + + // return its name + return fun.Name() +} + +// GetFunctionName 获取调当前函数名 +func GetFunctionName() string { + // Skip this function, and fetch the PC and file for its parent + pc, _, _, _ := runtime.Caller(1) + // Retrieve a Function object this functions parent + functionObject := runtime.FuncForPC(pc) + // Regex to extract just the function name (and not the module path) + extractFnName := regexp.MustCompile(`^.*\.(.*)$`) + fnName := extractFnName.ReplaceAllString(functionObject.Name(), "$1") + return fnName +} + +// fileName get filename from path +func fileName(original string) string { + i := strings.LastIndex(original, "/") + if i == -1 { + return original + } + return original[i+1:] +} + +// LogIfError 简化if err != nil 打 Error 日志代码长度 +func LogIfError(err error, format string, v ...interface{}) { + if err != nil { + _, fn, line, _ := runtime.Caller(1) + if format == "" { + format = "[%s:%d] %s" + Log.Error(format, fileName(fn), line, err.Error()) + } else { + format = "[%s:%d] " + format + " Error: %s" + Log.Error(format, fileName(fn), line, v, err.Error()) + } + } +} + +// LogIfWarn 简化if err != nil 打 Warn 日志代码长度 +func LogIfWarn(err error, format string, v ...interface{}) { + if err != nil { + _, fn, line, _ := runtime.Caller(1) + if format == "" { + format = "[%s:%d] %s" + Log.Warn(format, fileName(fn), line, err.Error()) + } else { + format = "[%s:%d] " + format + " Error: %s" + Log.Warn(format, fileName(fn), line, v, err.Error()) + } + } +} + +// Verbose ... +func Verbose(format string, a ...interface{}) { + if Config.Global.Verbose || Config.Global.VerboseVerbose { + if !strings.HasSuffix(format, "\n") { + format += "\n" + } + fmt.Printf(format, a...) + } +} + +// VerboseVerbose ... +func VerboseVerbose(format string, a ...interface{}) { + if Config.Global.VerboseVerbose { + if !strings.HasSuffix(format, "\n") { + format += "\n" + } + fmt.Printf(format, a...) + } +} diff --git a/common/log_test.go b/common/log_test.go new file mode 100644 index 0000000..15828f7 --- /dev/null +++ b/common/log_test.go @@ -0,0 +1,52 @@ +/* + * Copyright(c) 2019 Lianjia, Inc. All Rights Reserved + * 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 common + +import ( + "errors" + "testing" +) + +func TestLogger(t *testing.T) { + Log.Info("TestLogger_Info") + Log.Debug("TestLogger_Debug") + Log.Warning("TestLogger_Warning") + Log.Error("Warning_Error") +} + +func TestCaller(t *testing.T) { + caller := Caller() + if caller != "testing.tRunner" { + t.Error("get caller failed") + } +} + +func TestGetFunctionName(t *testing.T) { + f := GetFunctionName() + if f != "TestGetFunctionName" { + t.Error("get functionname failed") + } +} + +func TestIfError(t *testing.T) { + err := errors.New("TestIfError") + LogIfError(err, "") + LogIfError(err, "func %s", "func_test") +} + +func TestIfWarn(t *testing.T) { + err := errors.New("test") + LogIfWarn(err, "") + LogIfWarn(err, "func %s", "func_test") +} diff --git a/doc/FAQ.md b/doc/FAQ.md new file mode 100644 index 0000000..2218762 --- /dev/null +++ b/doc/FAQ.md @@ -0,0 +1,78 @@ +# FAQ + +## 数据闪回实现的原理? + +参考这篇文章 [MySQL 下实现闪回的设计思路 (MySQL Flashback Feature)](http://www.penglixun.com/tech/database/mysql_flashback_feature.html) + +## 是否支持 GTID? + +lightning 支持 GTID event 的分析,可以分析含有 GTID 的 binlog 文件,也可以实时分析开启 GTID 的 MySQL 二进制日志。 + +## 能否用于 relay-log 的解析? + +MySQL relay-log 的格式与 binlog 相同,但对应 event 中结构体内成员代表的含义会略有不同。解析 relay-log 可以生成 SQL 及对应 SQL 的回滚语句,但如果用于统计分析,需要参考 MySQL [文档](https://dev.mysql.com/doc/internals/en/binary-log-structure-and-contents.html) 明确每个 event 成员的真实含义。 + +## 待恢复表有外键关联 + +```text +ERROR 1451 (23000): Connot delete or update a parent row: a foreign key constraint fails +``` + +存在外键的表应先恢复父表记录,再恢复子表,故报错。 + +```sql +SET SESSION FOREIGN_KEY_CHECKS = 0; -- 数据恢复前禁用外键检查 + +SOURCE rollback.sql + +SET SESSION FOREIGN_KEY_CHECKS = 1; -- 数据恢复完成后开启外键检查 +``` + +## GTID 同步报错 + +使用 Binlog Dump GTID 方式同步数据时如果报以下错误,很可能是 master.info 中的 executed_gtid_set 配置错了。正确的配置格式参考 MySQL [官方文档](https://dev.mysql.com/doc/refman/5.7/en/replication-gtids-concepts.html) GTID Sets。 + +```text +ERROR 1236 (HY000): The slave is connecting using CHANGE MASTER TO MASTER_AUTO_POSITION = 1, but the master has purged binary logs containing GTIDs that the slave requires. +``` + +查看当前主库 master status。 + +```sql +mysql > show master status; ++------------------+----------+--------------+------------------+-----------------------------------------------------------------------------------+ +| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | ++------------------+----------+--------------+------------------+-----------------------------------------------------------------------------------+ +| mysql-bin.000020 | 234 | | | 376b1ae7-39a1-11e9-a253-14187759814e:1, +3b0075c9-39a1-11e9-a250-f86eee9113c6:1-98 | ++------------------+----------+--------------+------------------+-----------------------------------------------------------------------------------+ +1 row in set (0.00 sec) +``` + +## zombie Binlog Dump + +当 lightning 异常退出未断开与主库的同步又重新启动后,主库错误日志会打印如下信息,这种情况不需要处理。 + +多个 lightning 同步同一个主库且 master.info 中 server-id 配置相同进也会出现类型错误日志,此时需要手工指定不同的 server-id 解决。 + +```text +2019-05-23T10:29:27.082175+08:00 631113 [Note] Start binlog_dump to master_thread_id(631113) slave_server(33061), pos(mysql-bin.000018, 2316) +2019-05-23T10:30:32.574203+08:00 631125 [Note] While initializing dump thread for slave with server_id <33061>, found a zombie dump thread with the same server_id. Master is killing the zombie dump thread(631113). +``` + +参考文章: + +* [MySQL 多个 Slave 同一 server_id 的冲突原因分析](http://www.penglixun.com/tech/database/mysql_multi_slave_same_serverid.html) +* [两台备库设置 server_id 一致的问题](https://win-man.github.io/2017/07/11/%E4%B8%A4%E5%8F%B0%E5%A4%87%E5%BA%93%E8%AE%BE%E7%BD%AEserver-id%E4%B8%80%E8%87%B4%E7%9A%84%E9%97%AE%E9%A2%98/) + +## 使用 lua 插件实现数据双写同步效率问题 + +尝试用 lua 插件来实现将某些表数据写两份时,我们发现写入速度不够快,在高 QPS(>1K) 情况下很难保证数据低延迟。 + +从实现机制上分析,lua 插件是通过 TCP 协议远程写对端 MySQL,执行一条写操作一来一回网络相对较大,而且更新线程只有一个,不像 MySQL 是进程内本地多线程复制。 + +优化思路: + +1. 将 lightning 与待更新的 MySQL 本地部署,通过 127.0.0.1 或 socket 方式写数据库。 +2. 对一定时间的 binlog 合并更新,减少更新中间态。 +3. 模仿多线程同步,通过配置表过滤规则,不同表开启不同的 lightning 进程同步。 diff --git a/doc/cmd.md b/doc/cmd.md new file mode 100644 index 0000000..8a35ecb --- /dev/null +++ b/doc/cmd.md @@ -0,0 +1,37 @@ +# 常用命令 + +## ROW 格式转换为 STATEMENT 格式 + +```bash +lightning -user xxx -password xxx -host xxx -port xxx binlog.00000[123] +或 +lightning -schema-file schema.sql -plugin sql binlog.00000[123] + +cat schema.sql +use test; +create table tb ( + a int, + b varchar(10), + primary key (a) +) +``` + +## 生成回滚语句 + +```bash +lightning -schema-file schema.sql -plugin flashback binlog.000001 +``` + +## 统计各表更新量 + +```bash +lightning -no-defaults -plugin stat -event-types insert,update,delete binlog.000001 | jq -r '.TableStats | keys[] as $k | "\($k) \(.[$k] | .insert + .delete + .update)"' | sort -k 2 -nr | column -t | head +``` + +## 大事务、长事务分析 + +verbose 模式中可以看到很多 binlog event 的信息,其中 TransactionSizeBytes 表示事务的 binlog event 大小。主库 binlog 和从库的 relay-log 中 ExecutionTime 显示的是事务执行时间,从库的 binlog 中 ExecutionTime 为从库同步延迟时间并不是事务执行耗时。 + +```bash +lightning -no-defaults -verbose -schema-file test/schema.sql test/binlog.000002 | grep "DEBUG" | grep "TransactionSizeBytes\|ExecutionTime" +``` diff --git a/doc/filters.md b/doc/filters.md new file mode 100644 index 0000000..ae087a7 --- /dev/null +++ b/doc/filters.md @@ -0,0 +1,165 @@ +# 过滤器 + +## 表过滤器 + +可以配置只同步某些表 `tables` 或不同步某些表 `ignore-tables`。需要注意的是必需指定库名,不可以只指定表名,如需匹配所有库的某张表可以写 %.tb。 + +### 命令行 + +用逗号作为分隔符,格式为:{db}.{tb},使用 `%` 作为通配符。 + +```bash +-tables db1.tb1,db1.tb2,db2.%,%.tb -ignore-tables db3.ignore_tb +``` + +### 配置文件 + +```yaml +filters: + tables: + - db1.tb1 + - db1.tb2 + - db2.% + ignore-tables: + - db2.ignore +``` + +## 事件过滤器 + +只匹配特殊的事件类型,如:insert, delete, update, delete, create, drop 等,主意中间不要有空格,使用小写字母。 + +### 命令行 + +```bash +-event-types delete,insert +``` + +### 配置文件 + +```yaml +filters: + event-types: + - insert + - update +``` + +## 时间过滤器 + +像 `mysqlbinlog` 一样可以指定开始时间 `start-datetime` 和结束时间 `stop-datetime` 。如不指定 `stop-datetime` 又未配置 `demonize` 时 `stop-datetime` 使用当前时间为默认值。时间格式: `2006-01-02 15:04:05`。注意要配合时区使用,如不配置 lightning 使用 `UTC` 作为默认时区。 + +### 命令行 + +```bash +-time-zone Asia/Shanghai -start-datetime "2019-10-01 00:00:00" -stop-datetime "2019-10-01 01:00:00" +``` + +### 配置文件 + +```yaml +global: + time-zone: Asia/shanghai +filters: + start-datetime: "" + stop-datetime: "2019-10-01 01:00:00" +``` + +## 文件及位点过滤器 + +lightning 可以从文件读取日志,也可以向 MySQL 发送 `Binlog Dump` 命令模拟从库读取日志。如需从文件读取日志使用 `-binlog-file` 指定启始读取的日志文件名,如使用 `Binlog Dump` 读取日志需使用 `-master-info` 指定 MySQL 同步源。只解析 ROW 格式的 binlog 无得到库表结构,因为无法直接还原为 SQL 语句,需要结合 `schema-file` 或 `master-info` 来获取库表结构。与 `mysqlbinlog` 使用方式相同,使用 `start-position` 和 `stop-position` 两个参数指定起始点和终止点位。 + +### 命令行 + +```bash +lightning -binlog-file binlog.000001 +或将文件名置于最后一个参数 +lightning binlog.000001 +``` + +### 配置文件 + +```yaml +mysql: + binlog-file: binlog.000002 + schema-file: schema.sql + master-info: etc/master.info +filters: + start-position: 0 + stop-position: 0 +``` + +使用 `schema-file` 来读取库表结构的处是可以使用表结修改前的信息来复原 SQL 。 + +```sql +use test; +create table tb ( + `a` int, + `b` varchar(10), + PRIMARY KEY (`a`) +) ENGINE = InnoDB; +``` + +master.info 文件格式如下,如从文件读取日志不需要指定 `master_log_file` 和 `master_log_pos` 等信息,只会连接 MySQL 获取库表结构。如使用 `Binlog Dump` 方式读取日志,需要指定 `master_log_file`, `master_log_pos` 及 `server-id`。`server-id` 如不指定使用 3306+RAND(3306) 作为 `server-id`,为避免冲突建议手工指定 `server-id`。 + +```yaml +master_host: 127.0.0.1 +master_user: root +master_password: ****** +master_port: 3306 +master_log_file: binlog.000002 +master_log_pos: 4 +gtid_next: "" +server-id: 3307 +server-type: mysql +``` + +## 线程过滤器 + +通过 `thread-id` 过滤指定线程,可用于单次 SQL 上线的快速回滚。 + +### 命令行 + +```bash +-thread-id 10086 +``` + +### 配置文件 + +```yaml +filters: + thread-id: 10086 +``` + +## 主库 server-id 过滤器 + +通过 `server-id` 过滤指定的主库,当存在多源级联同步或从库有数据写入时使用该参数。可以使用 `SELECT @@server_id;` 查看主库的 `server-id`。 + +### 命令行 + +```bash +-server-id 1 +``` + +### 配置文件 + +```yaml +filers: + server-id: 1 +``` + +## GTID 过滤器 + +对于开启了 GTID 的 MySQL 实例也可以通过 `include-gtids` 和 `exclude-gtids` 来做过滤。以上两个参数可以配多个 `gtid_set`, 格式为 {uuid}:N-M,多个 `gtid_set` 使用逗号连接。 + +### 命令行 + +```bash +-include-gtids 376b1ae7-39a1-11e9-a253-14187759814e:1-100 -exclude-gtids 376b1ae7-39a1-11e9-a253-14187759814e:1-20 +``` + +### 配置文件 + +```yaml +filters: + include-gtids: 376b1ae7-39a1-11e9-a253-14187759814e:1-100 + exclude-gtids: 376b1ae7-39a1-11e9-a253-14187759814e:1-20,376b1ae7-39a1-11e9-a253-14187759814e:40-60 +``` diff --git a/doc/global.md b/doc/global.md new file mode 100644 index 0000000..5ed9efa --- /dev/null +++ b/doc/global.md @@ -0,0 +1,29 @@ +# 全局配置 + +```yaml +# 全局配置 +global: + # 日志级别 + log-level: 3 + # 日志文件名 + log-output: lightning.log + # 是否开启守护进程模式 + demonize: false + # 数据库字符集 + charset: utf8mb4 + # CPU 使用限制 + cpu: 0 + # Verbose 模式,打印更多信息 + verbose: false + # 比 Verbose 还 Verbose + verbose-verbose: false + # 设置时区,默认 UTC + time-zone: UTC +``` + +## time-zone + +该参数需要与 MySQL 服务器指定的时区相同,否则会导致 `start-datetime`, `stop-datetime` 等参数无法生效。 + +* UTC:世界标准时间。协调世界时,又称世界标准时间或世界协调时间,其以原子时秒长为基础,在时刻上尽量接近于格林尼治标准时间。 +* Asia/Shanghai:为本地时间,一个国家或地区使用时间,中国为东八区。 diff --git a/doc/lightning_exporter.py b/doc/lightning_exporter.py new file mode 100755 index 0000000..b34338b --- /dev/null +++ b/doc/lightning_exporter.py @@ -0,0 +1,24 @@ +#!/usr/bin/env python2 +# -*- coding: utf-8 -*- + +import yaml +import time +from prometheus_client import start_http_server, Gauge, CollectorRegistry + +# Create a metric to track time spent and requests made. +master_log_pos = Gauge('lightning_master_log_pos', 'replication master log position', ['server_id', 'port']) +seconds_behind_master = Gauge('lightning_seconds_behind_master', 'seconds behind master', ['server_id', 'port']) + +def snap_metrics(): + with open('master.info') as f: + metrics = yaml.load(f, Loader=yaml.Loader) + master_log_pos.labels(metrics["server-id"], metrics["master_port"]).set(metrics["master_log_pos"]) + seconds_behind_master.labels(metrics["server-id"], metrics["master_port"]).set(metrics["seconds_behind_master"]) + +if __name__ == '__main__': + # Start up the server to expose the metrics. + start_http_server(8100, '0.0.0.0') + # Generate some requests. + while True: + snap_metrics() + time.sleep(10) diff --git a/doc/lua.md b/doc/lua.md new file mode 100644 index 0000000..b1e925a --- /dev/null +++ b/doc/lua.md @@ -0,0 +1,74 @@ +# Lua 插件 + +## 简介 + +lightning 使用 [gopher-lua](https://github.com/yuin/gopher-lua) 作为 [Lua](http://www.lua.org/) 解析执行引擎,可以根据用户的需求对 binlog 的转写方式进行定制化修改,而又不必修改重新编译 Go 代码。为了方便访问数据库 lightning 默认加载了 [gluadb](https://github.com/zhu327/gluadb) 库,用于连接 MySQL, Redis。 + +## 限制 + +当使用 lua 插件做数据同步或双写时要注意数据库写流量不可过大,一般超过 1K qps 就很难保证同步的实时性了。从原理上讲 lightning 写入的速度因为依赖连接 MySQL 的执行速度,所以不可能比 MySQL 自己的同步快,大部分开销在网络上。即使转为使用本地 IP 访问或 SOCKET 连接由于单线程同步,在更新量过大时也无法和 MySQL 原生的同步效率媲美。但如果表与表之间的更新互无相关性时可以考虑为每张表启动一个 lightning 进程实现并行复制。 + +## 配置 + +配置文件 + +```yaml +rebuild: + plugin: lua + lua-script: plugin/demo.flashback.lua +``` + +命令行参数 + +```bash +lightning -plugin lua -lua-script plugin/demo.flashback.lua +``` + +## 示例脚本 + +* [demo.flashback.lua](http://github.com/LianjiaTech/lightning/tree/master/plugin/demo.flashback.lua) 数据闪回示例 +* [demo.mysql.lua](http://github.com/LianjiaTech/lightning/tree/master/plugin/demo.mysql.lua) 连接 MySQL 示例 +* [demo.redis.lua](http://github.com/LianjiaTech/lightning/tree/master/plugin/demo.redis.lua) 连接 Redis 示例 +* [demo.sql.lua](http://github.com/LianjiaTech/lightning/tree/master/plugin/demo.sql.lua) 转写 SQL 示例 +* [demo.mode.lua](http://github.com/LianjiaTech/lightning/tree/master/plugin/demo.mod.lua) 引入第三方 Lua 库示例 + +## 全局变量 + +库表元数据 + +* GoPrimaryKeys map[string][]string +* GoColumns map[string][]string + +记录值 + +* GoValues [][]string +* GoValuesWhere []string +* GoValuesSet []string + +## 接口函数 + +以下接口函数必须在 lua 脚本中存在,不需要的函数可以将函数体留空。 + +### Init + +全局初始化函数 + +### InsertRewrite + +WRITE_ROWS_EVENT 转写函数。 + +### DeleteRewrite + +DELETE_ROWS_EVENT 转写函数。 + +### UpdateRewrite + +UPDATE_ROWS_EVENT 转写函数。 + +### QueryRewrite + +QUERY_EVENT 转写函数。 + +### Finalizer + +全局析构函数。 \ No newline at end of file diff --git a/doc/mysql.md b/doc/mysql.md new file mode 100644 index 0000000..4f9c576 --- /dev/null +++ b/doc/mysql.md @@ -0,0 +1,54 @@ +# 数据库相关配置 + +## 数据库授权 + +```sql +CREATE USER 'user'@'%' IDENTIFIED /*!80000 WITH mysql_native_password */ BY 'xxx'; +GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'user'@'%'; +``` + +## mysql 段配置 + +```yaml +# 日志源 +mysql: + # 从文件读取二进制日志 + binlog-file: test/binlog.000002 + # 建表语句文件 + schema-file: test/schema.sql + # MySQL 源 + master-info: etc/master.info + # master-info sync interval,默认 1s sync 一次,配置为 0 后,每解析完成一个事务都会更新 master.info + sync-interval: 1s + # Binlog Dump I/O read timeout. + read-timeout: 3s +``` + +## master.info + +```yaml +# 主库 IP +master_host: 127.0.0.1 +# 同步账号,用于查建表语句,发起 Binlog Dump 指令 +master_user: root +# 同步账号密码 +master_password: ****** +# 数据库端口 +master_port: 3306 +# 起始同步文件 +master_log_file: binlog.000002 +# 起始同步点位 +master_log_pos: 4 +# 是否开启 GTID +auto_position: false +# 同步延迟时间 +seconds_behind_master: 0 +# GTID 模式下起始同步点位 +gtid_next: "" +# 模拟从库 server-id +server-id: 33061 +# 服务类型,暂未使用不建议修改 +server-type: mysql +``` + +注意:如不指定 master_log_file 和 master_log_pos 默认从首个 binlog 文件开始同步,而不是当前最新的同步点位。如需从当前最新点位同步需指定 `replicate-from-current-position` 参数。 diff --git a/doc/qq_group.png b/doc/qq_group.png new file mode 100644 index 0000000..aad51a5 Binary files /dev/null and b/doc/qq_group.png differ diff --git a/doc/rebuild.md b/doc/rebuild.md new file mode 100644 index 0000000..7ccb47e --- /dev/null +++ b/doc/rebuild.md @@ -0,0 +1,157 @@ +# 重建 SQL + +lightning 内建支持两种重建规则以及 SQL 类型统计功能,同时支持是 lua 插件形式进行自定义二次开发。 + +* sql: 生成 ROW 格式对应的原始 SQL +* flashback: 生成数据闪回 SQL,即:INSERT -> DELETE, DELETE -> INSERT, UPDATE WHERE 和 SET 互换。 +* stat: 按表统计各表的请求类型 + +注:MySQL 高版本(5.6.2+)支持 `binlog_rows_query_log_events` 参数,该参数默认是关闭的,开启后可以在 binlog 中记录原始 SQL 请求,不需要使用其他工具进行复原效果更好。 + +## 差异 + +* ENUM, SET, BIT 使用整型替代,不影响数据一致性。 +* DECIMAL 使用 float 替代,不影响精度。 + +## 配置文件 + +```yaml +# 重建规则 +rebuild: + # 插件:sql, flashback, stat, lua + plugin: sql + # INSERT 语句是否补全列 + complete-insert: false + # INSERT 语句多个 VALUES 合并 + extended-insert-count: 0 + # 使用 REPLACE INTO 替代 INSERT INTO + replace: false + # 两条 SQL 语句之前添加 sleep 间隔,,最小精度 us + sleep-interval: 0s + # 生成 SQL 语句省略某些列,如: INSERT 忽略主键 + ignore-columns: + - id + # lua 插件脚本位置 + lua-script: plugin/demo.flashback.lua +``` + +## 示例 + +ROW 格式 binlog 生成 SQL 更新语句。不指定 `-plugin` 默认即为该模式。 + +```bash +lightning -no-defaults -schema-file test/schema.sql -binlog-file test/binlog.000002 +``` + +ROW 格式 binlog 生成回滚语句。 + +```bash +lightning -no-defaults -plugin flashback -schema-file test/schema.sql -binlog-file test/binlog.000002 +``` + +## 统计分析 + +### 统计各库表更新语句数量 + +```bash +lightning -no-defaults -plugin stat -binlog-file test/binlog.000002 + +{ + "TableStats": { + "`test`.`bitTest`": { + "insert": 1 + }, + "`test`.`enumTest`": { + "insert": 1 + }, + "`test`.`setTest`": { + "insert": 3 + }, + "`test`.`tb`": { + "delete": 1, + "insert": 1, + "update": 1 + }, + "`test`.`testNoPRI`": { + "insert": 1 + } + }, + "QueryStats": { + "ALTER": 1, + "BEGIN": 9, + "CREATE": 6, + "DROP": 4 + }, + "TransactionStats": { + "SizeBytes": { + "Max": "141.0", + "MaxTransactionPos": "1292", + "Mean": "131.3", + "Median": "129.0", + "P95": "139.5", + "P99": "139.5" + }, + "TimeSeconds": { + "Max": "0.00", + "MaxTransactionPos": "0", + "Mean": "0.00", + "Median": "0.00", + "P95": "0.00", + "P99": "0.00" + } + } +} +``` + +### 使用 mysqlbinlog + awk 分析 + +参考: [Identifying useful info from MySQL row-based binary logs](https://www.percona.com/blog/2015/01/20/identifying-useful-information-mysql-row-based-binary-logs/) + +Q1: Which tables received highest number of insert/update/delete statements? + +```bash +./summarize_binlogs.sh | grep Table |cut -d':' -f5| cut -d' ' -f2 | sort | uniq -c | sort -nr +``` + +Q2: Which table received the highest number of DELETE queries? + +```bash +./summarize_binlogs.sh | grep -E 'DELETE' |cut -d':' -f5| cut -d' ' -f2 | sort | uniq -c | sort -nr +``` + +Q3: How many insert/update/delete queries executed against sakila.country table? + +```bash +./summarize_binlogs.sh | grep -i '`sakila`.`country`' | awk '{print $7 " " $11}' | sort -k1,2 | uniq -c +``` + +Q4: Give me the top 3 statements which affected maximum number of rows. + +```bash +./summarize_binlogs.sh | grep Table | sort -nr -k 12 | head -n 3 +``` + +Q5: Find DELETE queries that affected more than 1000 rows. + +```bash +./summarize_binlogs.sh | grep -E 'DELETE' | awk '{if($12>1000) print $0}' + +./summarize_binlogs.sh | grep -E 'Table' | awk '{if($12>1000) print $0}' +``` + +### 使用 mysqlbinlog + pt-query-digest 分析 + +参考: + +* [pt-query-digest](https://www.percona.com/doc/percona-toolkit/LATEST/pt-query-digest.html) +* [pt-query-digest 解析 MySQL Binlog 日志文件](https://blog.csdn.net/dba_waterbin/article/details/14453255) + +```bash +mysqlbinlog mysql-bin.000441 > mysql-bin.000441.txt + +pt-query-digest --type binlog mysql-bin.000441.txt + +pt-query-digest --type binlog --since "2019-01-06 20:55:00" --until "2019-01-06 21:00:00" mysql-bin.000441.txt + +pt-query-digest --type binlog --group-by fingerprint --limit "100%" --order-by "Query_time:cnt" --output report --report-format profile mysql-bin.000441.txt +``` diff --git a/doc/reference.md b/doc/reference.md new file mode 100644 index 0000000..92e0640 --- /dev/null +++ b/doc/reference.md @@ -0,0 +1,73 @@ +# 参考 + +## 同类产品 + +* [MariaDB mysqlbinlog](https://mariadb.com/kb/en/library/flashback/) +* [binlog2sql](https://github.com/danfengcao/binlog2sql) +* [MyFlash](https://github.com/Meituan-Dianping/MyFlash) +* [mysqlbinlog_flashback](https://github.com/58daojia-dba/mysqlbinlog_flashback) +* [pt-query-digest](https://www.percona.com/doc/percona-toolkit/LATEST/pt-query-digest.html) + +## 技术文章 + +数据闪回 + +* [MySQL Internals Manual / The Binary Log](https://dev.mysql.com/doc/internals/en/binary-log.html) +* [ROWS_EVENT](https://dev.mysql.com/doc/internals/en/rows-event.html) +* [MySQL 下实现闪回的设计思路 (MySQL Flashback Feature)](http://www.penglixun.com/tech/database/mysql_flashback_feature.html) +* [Provide the flashback feature by binlog](https://bugs.mysql.com/bug.php?id=65178) +* [MySQL 闪回方案讨论及实现](https://dinglin.iteye.com/blog/1539167) +* [mysqlbinlog flashback 5.6 完全使用手册与原理](http://www.cnblogs.com/youge-OneSQL/p/5249736.html) +* [拿走不谢,Flashback for MySQL 5.7](http://t.cn/E9ZH8sU) +* [AliSQL and some features that have made it into MariaDB Server](https://mariadb.com/resources/blog/alisql-and-some-features-that-have-made-it-into-mariadb-server/) +* [MyFlash—— 美团点评的开源 MySQL 闪回工具](http://t.cn/RjRbjpM) +* [Identifying useful info from MySQL row-based binary logs](https://www.percona.com/blog/2015/01/20/identifying-useful-information-mysql-row-based-binary-logs/) +* [MySQL 多个 Slave 同一 server_id 的冲突原因分析](http://www.penglixun.com/tech/database/mysql_multi_slave_same_serverid.html) +* [两台备库设置 server_id 一致的问题](https://win-man.github.io/2017/07/11/两台备库设置server-id一致的问题/) +* [pt-query-digest 解析 MySQL Binlog 日志文件](https://blog.csdn.net/dba_waterbin/article/details/14453255) +* [Binary Log Options and Variables](https://dev.mysql.com/doc/refman/5.6/en/replication-options-binary-log.html) +* [Read MySQL Binlogs better with rows query log events](https://mydbops.wordpress.com/2017/08/02/read-mysql-binlogs-better-with-binlog_rows_query_log_events/) + +Lua + +* [Lua 教程](https://www.runoob.com/lua/lua-tutorial.html) +* [gopher-lua](https://github.com/yuin/gopher-lua) +* [Embedding Lua in Go](https://otm.github.io/2015/07/embedding-lua-in-go/) + +## 第三方包引用 + +* [go-mysql](https://github.com/siddontang/go-mysql) +* [pingcap/parser](https://github.com/pingcap/parser) +* [gopher-lua](https://github.com/yuin/gopher-lua) + +## 性能对比 + +lightning 与 mysqlbinlog 原生工具比较在文件解析速度上存在差距。目前分析主要的瓶颈点在于 lightning 需要识别不同的库、表、列、值等数据,并按照正确的语法逻辑进行拼接,但 mysqlbinlog 并不需要这样做,即使是 verbose 模式生成的 SQL 也并不能真正执行。 + +```bash +ls -lh mysql-bin.001287 +-rw-rw---- 1 mysql mysql 513M May 22 01:12 mysql-bin.001287 + +time lightning mysql-bin.001287 > mysql-bin.001287.lightning.sql + +real 0m20.563s +user 0m23.280s +sys 0m6.806s + +time mysqlbinlog -vv mysql-bin.001287 > mysql-bin.001287.mysqlbinlog.sql + +real 0m7.892s +user 0m5.636s +sys 0m2.163s + +time mysqlbinlog mysql-bin.001287 > mysql-bin.001287.mysqlbinlog.raw.sql + +real 0m3.492s +user 0m1.571s +sys 0m1.871s + +ls -lh mysql-bin.001287.* +-rw-r--r-- 1 mysql mysql 758M May 23 11:32 mysql-bin.001287.lightning.sql +-rw-r--r-- 1 mysql mysql 1.4G May 23 11:32 mysql-bin.001287.mysqlbinlog.sql +-rw-r--r-- 1 mysql mysql 635M May 23 12:37 mysql-bin.001287.mysqlbinlog.raw.sql +``` diff --git a/doc/summarize_binlogs.sh b/doc/summarize_binlogs.sh new file mode 100755 index 0000000..55d02cb --- /dev/null +++ b/doc/summarize_binlogs.sh @@ -0,0 +1,19 @@ +#!/bin/bash + +# Identifying useful info from MySQL row-based binary logs +# https://www.percona.com/blog/2015/01/20/identifying-useful-information-mysql-row-based-binary-logs/ + +BINLOG_FILE="mysqld-bin.000035" +START_TIME="2015-01-16 13:30:00" +STOP_TIME="2015-01-16 14:00:00" + +mysqlbinlog --base64-output=decode-rows -vv --start-datetime="${START_TIME}" --stop-datetime="${STOP_TIME}" ${BINLOG_FILE} | awk \ +'BEGIN {s_type=""; s_count=0;count=0;insert_count=0;update_count=0;delete_count=0;flag=0;} \ +{if(match($0, /#15.*Table_map:.*mapped to number/)) {printf "Timestamp : " $1 " " $2 " Table : " $(NF-4); flag=1} \ +else if (match($0, /(### INSERT INTO .*..*)/)) {count=count+1;insert_count=insert_count+1;s_type="INSERT"; s_count=s_count+1;} \ +else if (match($0, /(### UPDATE .*..*)/)) {count=count+1;update_count=update_count+1;s_type="UPDATE"; s_count=s_count+1;} \ +else if (match($0, /(### DELETE FROM .*..*)/)) {count=count+1;delete_count=delete_count+1;s_type="DELETE"; s_count=s_count+1;} \ +else if (match($0, /^(# at) /) && flag==1 && s_count>0) {print " Query Type : "s_type " " s_count " row(s) affected" ;s_type=""; s_count=0; } \ +else if (match($0, /^(COMMIT)/)) {print "[Transaction total : " count " Insert(s) : " insert_count " Update(s) : " update_count " Delete(s) : " \ +delete_count "] \n+----------------------+----------------------+----------------------+----------------------+"; \ +count=0;insert_count=0;update_count=0; delete_count=0;s_type=""; s_count=0; flag=0} } ' diff --git a/etc/lightning.stream.yaml b/etc/lightning.stream.yaml new file mode 100644 index 0000000..8d9ea35 --- /dev/null +++ b/etc/lightning.stream.yaml @@ -0,0 +1,8 @@ +global: + log-level: 3 + log-output: lightning.log + charset: "utf8mb4" + time-zone: "UTC" + +mysql: + master-info: "etc/master.info" diff --git a/etc/lightning.yaml b/etc/lightning.yaml new file mode 100644 index 0000000..34f20d9 --- /dev/null +++ b/etc/lightning.yaml @@ -0,0 +1,77 @@ +# 全局配置 +global: + # 日志级别 + log-level: 3 + # 日志文件名 + log-output: lightning.log + # 是否开启守护进程模式 + demonize: false + # 数据库字符集 + charset: utf8mb4 + # CPU 使用限制 + cpu: 0 + # Verbose 模式,打印更多信息 + verbose: false + # 设置时区,默认 Asia/Shanghai + # time-zone: UTC + time-zone: Asia/Shanghai + # 是否将 VARCHAR, CHAR, STRING 等数据类型转成 HEX, 防止不必要转换 + hex-string: false +# 日志源 +mysql: + # 从文件读取二进制日志 + binlog-file: ["test/binlog.000002"] + # 建表语句文件 + schema-file: test/schema.sql + # MySQL 源 + master-info: etc/master.info + # master-info sync interval + sync-interval: 1s + # Binlog Dump I/O read timeout. + read-timeout: 60s +# 过滤器 +filters: + # 表过滤器,只处理特定表 + tables: + - test.% + # 表过滤器,忽略特殊定表 + ignore-tables: + - test.ignore + # 事件过滤器,只处理特定类型 SQL + event-types: + - insert + - update + - delete + - create + # 线程过滤器,只处理某个线程的更新 + thread-id: 0 + # 主库过滤器,只处理特定主库的更新 + server-id: 0 + # 日志起始位点 + start-position: 0 + # 日志结束位点 + stop-position: 0 + # 日志开始时间 + start-datetime: "" + # 日志结束时间 + stop-datetime: "" + # GTID 过滤器,只处理特定 gtid_set 的事件 + include-gtid-set: "" + # GTID 过滤器,忽略特殊 gtid_set 的事件 + exclude-gtid-set: "" +# 重建规则 +rebuild: + # 插件:sql, flashback, stat, lua + plugin: sql + # INSERT 语句是否补全列 + complete-insert: false + # 生成 SQL 语句省略某些列,如: INSERT 忽略主键 + ignore-columns: [] + # INSERT 语句多个 VALUES 合并 + extended-insert-count: 0 + # 使用 REPLACE INTO 替代 INSERT INTO + replace: false + # 两条 SQL 语句之前添加 sleep 间隔,最小精度 us + sleep-interval: 0s + # lua 插件脚本位置 + lua-script: plugin/demo.flashback.lua diff --git a/etc/master.info b/etc/master.info new file mode 100644 index 0000000..a1a6dfd --- /dev/null +++ b/etc/master.info @@ -0,0 +1,11 @@ +master_host: 127.0.0.1 +master_user: root +master_password: '******' +master_port: 3306 +master_log_file: binlog.000007 +master_log_pos: 4 +executed_gtid_set: 376b1ae7-39a1-11e9-a253-14187759814e:1, 3b0075c9-39a1-11e9-a250-f86eee9113c6:1-98 +auto_position: false +seconds_behind_master: 105 +server-id: 33061 +server-type: mysql diff --git a/event/doc.go b/event/doc.go new file mode 100644 index 0000000..9293d7e --- /dev/null +++ b/event/doc.go @@ -0,0 +1,15 @@ +/* + * Copyright(c) 2019 Lianjia, Inc. All Rights Reserved + * 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 event binlog event parse library functions +package event diff --git a/event/filter.go b/event/filter.go new file mode 100644 index 0000000..720fd72 --- /dev/null +++ b/event/filter.go @@ -0,0 +1,361 @@ +/* + * Copyright(c) 2019 Lianjia, Inc. All Rights Reserved + * 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 event + +import ( + "fmt" + "strings" + "time" + + "github.com/LianjiaTech/lightning/common" + "github.com/LianjiaTech/lightning/rebuild" + + uuid "github.com/satori/go.uuid" + "github.com/siddontang/go-mysql/replication" +) + +var FollowGTID bool +var FollowThreadID bool +var Ending bool + +// FilterThreadID ... +func FilterThreadID(event *replication.BinlogEvent) bool { + var do bool + if common.Config.Filters.ThreadID == 0 { + return true + } + var threadId uint32 + switch event.Header.EventType { + case replication.QUERY_EVENT: + threadId = event.Event.(*replication.QueryEvent).SlaveProxyID + if threadId == uint32(common.Config.Filters.ThreadID) { + do = true + FollowThreadID = do + } else { + FollowThreadID = false + } + default: + common.VerboseVerbose("-- [DEBUG] FilterThreadID do: %v, Table: %s", FollowThreadID, threadId) + return FollowThreadID + } + common.VerboseVerbose("-- [DEBUG] FilterThreadID do: %v, Table: %s", do, threadId) + return do +} + +// FilterTables ... +func FilterTables(event *replication.BinlogEvent) bool { + var do bool + if len(common.Config.Filters.Tables) == 0 { + do = true + } + table := rebuild.RowEventTable(event) + for _, filter := range common.Config.Filters.Tables { + if tableFilterMatch(table, filter) { + do = true + break + } + } + common.VerboseVerbose("-- [DEBUG] FilterTables do: %v, Table: %s", do, table) + return do +} + +// FilterIgnoreTables ... +func FilterIgnoreTables(event *replication.BinlogEvent) bool { + do := true + if len(common.Config.Filters.IgnoreTables) == 0 { + return true + } + table := rebuild.RowEventTable(event) + for _, filter := range common.Config.Filters.IgnoreTables { + if tableFilterMatch(table, filter) { + do = false + break + } + } + common.VerboseVerbose("-- [DEBUG] FilterIgnoreTables do: %v, Table: %s", do, table) + return do +} + +// FilterStartDatetime ... +func FilterStartDatetime(event *replication.BinlogEvent) bool { + var do bool + if common.Config.Filters.StartTimestamp == 0 { + do = true + } + if int64(event.Header.Timestamp) >= common.Config.Filters.StartTimestamp { + do = true + } + return do +} + +// FilterStopDatetime ... +func FilterStopDatetime(event *replication.BinlogEvent) bool { + var do bool + if common.Config.Filters.StopTimestamp == 0 { + do = true + return do + } + if int64(event.Header.Timestamp) <= common.Config.Filters.StopTimestamp { + do = true + } else { + Ending = true + } + return do +} + +// FilterServerID ... +func FilterServerID(event *replication.BinlogEvent) bool { + var do bool + if common.Config.Filters.ServerID == 0 { + do = true + } + if event.Header.ServerID == uint32(common.Config.Filters.ServerID) { + do = true + } + return do +} + +// FilterIncludeGTIDs ... +func FilterIncludeGTIDs(event *replication.BinlogEvent) bool { + var do bool + if common.Config.Filters.IncludeGTIDSet == "" { + return true + } + switch event.Header.EventType { + case replication.GTID_EVENT: + do = InGTIDSet(event.Event.(*replication.GTIDEvent).SID, event.Event.(*replication.GTIDEvent).GNO, common.Config.Filters.IncludeGTIDSet) + if FollowGTID && !do { + Ending = true + } + FollowGTID = do + default: + do = FollowGTID + } + return do +} + +// FilterExcludeGTIDs ... +func FilterExcludeGTIDs(event *replication.BinlogEvent) bool { + var do bool + if common.Config.Filters.ExcludeGTIDSet == "" { + return true + } + switch event.Header.EventType { + case replication.GTID_EVENT: + do = !InGTIDSet(event.Event.(*replication.GTIDEvent).SID, event.Event.(*replication.GTIDEvent).GNO, common.Config.Filters.ExcludeGTIDSet) + FollowGTID = do + default: + do = FollowGTID + } + return do +} + +// FilterStartPos ... +func FilterStartPos(event *replication.BinlogEvent) bool { + var do bool + if common.Config.Filters.StartPosition == 0 { + do = true + } + if event.Header.LogPos >= uint32(common.Config.Filters.StartPosition) { + do = true + } + return do +} + +// FilterStopPos ... +func FilterStopPos(event *replication.BinlogEvent) bool { + var do bool + if common.Config.Filters.StopPosition == 0 { + do = true + return do + } + if event.Header.LogPos <= uint32(common.Config.Filters.StopPosition) { + do = true + } else { + Ending = true + } + return do +} + +// FilterQueryType ... +func FilterQueryType(event *replication.BinlogEvent) bool { + var do bool + if len(common.Config.Filters.EventType) == 0 { + return true + } + + for _, t := range common.Config.Filters.EventType { + switch event.Header.EventType { + case replication.WRITE_ROWS_EVENTv2, replication.WRITE_ROWS_EVENTv1, replication.WRITE_ROWS_EVENTv0: + if strings.ToLower(t) == "insert" { + do = true + break + } + case replication.UPDATE_ROWS_EVENTv2, replication.UPDATE_ROWS_EVENTv1, replication.UPDATE_ROWS_EVENTv0: + if strings.ToLower(t) == "update" { + do = true + break + } + case replication.DELETE_ROWS_EVENTv2, replication.DELETE_ROWS_EVENTv1, replication.DELETE_ROWS_EVENTv0: + if strings.ToLower(t) == "delete" { + do = true + break + } + case replication.QUERY_EVENT: + prefix := strings.Fields(string(event.Event.(*replication.QueryEvent).Query))[0] + if strings.ToLower(t) == prefix { + do = true + break + } + default: + } + } + return do +} + +// UpdateMasterInfo ... +func UpdateMasterInfo(event *replication.BinlogEvent) { + switch event.Header.EventType { + case replication.ROTATE_EVENT: + nextFile := string(event.Event.(*replication.RotateEvent).NextLogName) + if nextFile != common.MasterInfo.MasterLogFile { + common.MasterInfo.MasterLogFile = nextFile + common.MasterInfo.MasterLogPos = 4 + } + case replication.QUERY_EVENT: + common.MasterInfo.MasterLogPos = int64(event.Header.LogPos) + case replication.XID_EVENT: + common.MasterInfo.MasterLogPos = int64(event.Header.LogPos) + executedGTIDSet := fmt.Sprint(event.Event.(*replication.XIDEvent).GSet) + if executedGTIDSet != "" { + common.MasterInfo.ExecutedGTIDSet = executedGTIDSet + } + default: + } + common.MasterInfo.SecondsBehindMaster = time.Now().Unix() - int64(event.Header.Timestamp) + if common.Config.MySQL.SyncDuration.Seconds() == 0 { + common.FlushReplicationInfo() + } +} + +// BinlogFilter check if event will do +func BinlogFilter(event *replication.BinlogEvent) bool { + if !FilterStopPos(event) { + return false + } + if !FilterStartPos(event) { + return false + } + if !FilterThreadID(event) { + return false + } + if !FilterExcludeGTIDs(event) { + return false + } + if !FilterIncludeGTIDs(event) { + return false + } + if !FilterServerID(event) { + return false + } + if !FilterStopDatetime(event) { + return false + } + if !FilterStartDatetime(event) { + return false + } + if !FilterTables(event) { + return false + } + if !FilterIgnoreTables(event) { + return false + } + if !FilterQueryType(event) { + return false + } + return true +} + +func tableFilterMatch(table, filter string) bool { + var match, dbMatch, tbMatch bool + table = strings.Replace(table, "`", "", -1) + schema := strings.Split(table, ".") + if len(schema) < 2 { + return match + } + sep := strings.Split(filter, ".") + if len(sep) < 2 { + common.Log.Error("tableFilterMatch, -tables: '%s' filter format error", filter) + return match + } + + // 库表名大小写不敏感 + if sep[0] == "%" { + dbMatch = true + } + // 当 -schema 指定的文件中只有 CREATE TABLE 忘了写 USE db 的时候,schema[0] 为 % + if schema[0] == "%" { + dbMatch = true + } + if i := strings.Index(sep[0], "%"); i > 0 { + if strings.HasPrefix(schema[0], sep[0][0:i]) { + dbMatch = true + } + } + if strings.ToLower(schema[0]) == strings.ToLower(sep[0]) { + dbMatch = true + } + + if sep[1] == "%" { + tbMatch = true + } + if i := strings.Index(sep[1], "%"); i > 0 { + if strings.HasPrefix(strings.ToLower(schema[1]), strings.ToLower(sep[1][0:i])) { + tbMatch = true + } + } + if schema[1] == sep[1] { + tbMatch = true + } + match = dbMatch && tbMatch + return match +} + +// InGTIDSet ... +func InGTIDSet(sid []byte, gno int64, gtidSet string) bool { + var gtidSets [][]string + for _, set := range strings.Split(gtidSet, ",") { + var couple []string + tmp := strings.Split(strings.TrimSpace(set), ":") + if len(tmp) != 2 { + return true + } + couple = append(couple, tmp[0]) + couple = append(couple, strings.Split(tmp[1], "-")...) + gtidSets = append(gtidSets, couple) + } + for _, set := range gtidSets { + s, _ := uuid.FromBytes(sid) + if len(set) != 3 { + continue + } + if set[0] == s.String() { + if strings.Compare(set[1], fmt.Sprint(gno)) <= 0 && + strings.Compare(set[2], fmt.Sprint(gno)) >= 0 { + return true + } + } + } + return false +} diff --git a/event/filter_test.go b/event/filter_test.go new file mode 100644 index 0000000..c838ddc --- /dev/null +++ b/event/filter_test.go @@ -0,0 +1,38 @@ +/* + * Copyright(c) 2019 Lianjia, Inc. All Rights Reserved + * 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 event + +import ( + "fmt" + "testing" +) + +func TestTableFilterMatch(t *testing.T) { + tables := []string{ + "`db`.`tb`", + "db.tb", + } + + filters := []string{ + "db.%", + "db.tb%", + "db%.tb%", + "db%.%", + } + for _, table := range tables { + for _, filter := range filters { + fmt.Println(table, filter, tableFilterMatch(table, filter)) + } + } +} diff --git a/event/parser.go b/event/parser.go new file mode 100644 index 0000000..68583fc --- /dev/null +++ b/event/parser.go @@ -0,0 +1,304 @@ +/* + * Copyright(c) 2019 Lianjia, Inc. All Rights Reserved + * 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 event + +import ( + "bytes" + "context" + "database/sql" + "fmt" + "io" + "os" + "time" + + "github.com/LianjiaTech/lightning/common" + "github.com/LianjiaTech/lightning/rebuild" + + // database/sql + _ "github.com/go-sql-driver/mysql" + "github.com/juju/errors" + "github.com/siddontang/go-mysql/mysql" + "github.com/siddontang/go-mysql/replication" +) + +// https://dev.mysql.com/doc/internals/en/binary-log-structure-and-contents.html + +const ( + FileHeaderLength = 4 // binlog file magic header 0XFE bin + EventHeaderLength = 19 // event header length +) + +// BinlogParser ... +func BinlogParser() { + if len(common.Config.MySQL.BinlogFile) > 0 { + err := BinlogFileParser(common.Config.MySQL.BinlogFile) + if err != nil { + fmt.Println(err.Error()) + } + return + } + if common.Config.MySQL.MasterInfo != "" { + err := BinlogStreamParser() + if err != nil { + fmt.Println(err.Error()) + } + } +} + +// CheckBinlogFileHeader check file is binary log +func CheckBinlogFileHeader(buf []byte) bool { + return bytes.Equal(buf, []byte{0xfe, 'b', 'i', 'n'}) +} + +// CheckBinlogFormat check binlog format +func CheckBinlogFormat(dsn string) string { + format := "unknown" + db, err := sql.Open("mysql", dsn) + if err != nil { + return format + } + defer db.Close() + res, err := db.Query("SELECT @@binlog_format;") + for res.Next() { + res.Scan(&format) + } + return format +} + +// BinlogFileParser parser binary log file +func BinlogFileParser(files []string) error { + for _, filename := range files { + fd, err := os.Open(filename) + if err != nil { + return err + } + bufFileHeader := make([]byte, FileHeaderLength) + if _, err := io.ReadFull(fd, bufFileHeader); err != nil { + return errors.Trace(err) + } + if !CheckBinlogFileHeader(bufFileHeader) { + err = errors.Errorf("invalid file type, not binlog") + return err + } + + p := replication.NewBinlogParser() + for { + event, err := FileNextEvent(p, fd) + if err == io.EOF { + break + } + if err != nil { + return errors.Trace(err) + } + if BinlogFilter(event) { + TypeSwitcher(event) + } else { + common.VerboseVerbose("-- [DEBUG] BinlogFilter ignore, EventType: %s, Position: %d, ServerID: %d, TimeStamp: %d", + event.Header.EventType.String(), + event.Header.LogPos, + event.Header.ServerID, + event.Header.Timestamp, + ) + } + if Ending { + break + } + } + fd.Close() + } + return nil +} + +// FileNextEvent ... +func FileNextEvent(p *replication.BinlogParser, r io.Reader) (*replication.BinlogEvent, error) { + var err error + var head *replication.EventHeader + var event *replication.BinlogEvent + + bufHead := make([]byte, EventHeaderLength) + if _, err = io.ReadFull(r, bufHead); err != nil { + return event, err + } + head, err = ParseEventHeader(bufHead) + if err != nil { + return event, errors.Trace(err) + } + + eventLength := head.EventSize - replication.EventHeaderSize + bufBody := make([]byte, eventLength) + if n, err := io.ReadFull(r, bufBody); err != nil { + err = errors.Errorf("get event body err %v, need %d - %d, but got %d", err, head.EventSize, replication.EventHeaderSize, n) + return event, err + } + + var rawData []byte + rawData = append(rawData, bufHead...) + rawData = append(rawData, bufBody...) + return p.Parse(rawData) +} + +// BinlogStreamParser parser mysql connection replication event +func BinlogStreamParser() error { + readTimeout, err := time.ParseDuration(common.Config.MySQL.ReadTimeout) + if err != nil { + common.Log.Error("BinlogStreamParser Error: %s", err.Error()) + return err + } + + changeMaster := replication.BinlogSyncerConfig{ + ServerID: common.MasterInfo.ServerID, + Flavor: common.MasterInfo.ServerType, + Host: common.MasterInfo.MasterHost, + Port: uint16(common.MasterInfo.MasterPort), + User: common.MasterInfo.MasterUser, + Password: common.MasterInfo.MasterPassword, + Charset: common.Config.Global.Charset, + ReadTimeout: readTimeout, + MaxReconnectAttempts: common.Config.MySQL.RetryCount, + SemiSyncEnabled: false, + + ParseTime: false, // parse mysql datetime/time as string + TimestampStringLocation: common.Config.Global.Location, // If ParseTime is false, convert TIMESTAMP into this specified timezone. + UseDecimal: false, // parse decimal type as float64 + } + syncer := replication.NewBinlogSyncer(changeMaster) + defer syncer.Close() + var streamer *replication.BinlogStreamer + if common.MasterInfo.AutoPosition { + streamer, err = binlogDumpGTIDSyncer(syncer) + } else { + streamer, err = binlogDumpSyncer(syncer) + } + if err != nil { + return err + } + + for { + event, err := getEvent(streamer, readTimeout) + if err != nil { + return errors.Trace(err) + } + if BinlogFilter(event) { + TypeSwitcher(event) + } else { + common.VerboseVerbose("-- [DEBUG] BinlogFilter ignore, EventType: %s, Position: %d, ServerID: %d, TimeStamp: %d", + event.Header.EventType.String(), + event.Header.LogPos, + event.Header.ServerID, + event.Header.Timestamp, + ) + } + UpdateMasterInfo(event) + if Ending { + break + } + } + return nil +} + +func getEvent(streamer *replication.BinlogStreamer, readTimeout time.Duration) (*replication.BinlogEvent, error) { + var ctx context.Context + var cancel context.CancelFunc + if common.Config.Global.Demonize { + ctx = context.Background() + } else { + ctx, cancel = context.WithTimeout(context.Background(), readTimeout) + defer cancel() + } + return streamer.GetEvent(ctx) +} + +// TypeSwitcher event router by type +func TypeSwitcher(event *replication.BinlogEvent) { + rebuild.EventHeaderRebuild(event) + switch event.Header.EventType { + case replication.GTID_EVENT: + rebuild.GTIDRebuild(event.Event.(*replication.GTIDEvent)) + case replication.WRITE_ROWS_EVENTv0, replication.WRITE_ROWS_EVENTv1, replication.WRITE_ROWS_EVENTv2: + rebuild.InsertRebuild(event) + case replication.UPDATE_ROWS_EVENTv0, replication.UPDATE_ROWS_EVENTv1, replication.UPDATE_ROWS_EVENTv2: + rebuild.UpdateRebuild(event) + case replication.DELETE_ROWS_EVENTv0, replication.DELETE_ROWS_EVENTv1, replication.DELETE_ROWS_EVENTv2: + rebuild.DeleteRebuild(event) + case replication.QUERY_EVENT: + rebuild.QueryRebuild(event) + case replication.ROWS_QUERY_EVENT: + rebuild.RowsQueryRebuild(event) + case replication.XID_EVENT: + rebuild.XidRebuild(event) + case replication.ROTATE_EVENT: + common.VerboseVerbose("-- [DEBUG] EventType: %s, NextLogName: %s", event.Header.EventType.String(), string(event.Event.(*replication.RotateEvent).NextLogName)) + // case replication.ANONYMOUS_GTID_EVENT, replication.PREVIOUS_GTIDS_EVENT, replication.TABLE_MAP_EVENT: + default: + common.VerboseVerbose("-- [DEBUG] TypeSwitcher EventType: %s bypass", event.Header.EventType.String()) + } + sleepInterval(event) +} + +func binlogDumpSyncer(syncer *replication.BinlogSyncer) (*replication.BinlogStreamer, error) { + if common.MasterInfo.MasterLogFile == "" && common.Config.MySQL.ReplicateFromCurrentPosition { + masterInfo := common.ShowMasterStatus(common.MasterInfo) + common.MasterInfo.MasterLogFile = masterInfo.MasterLogFile + common.MasterInfo.MasterLogPos = masterInfo.MasterLogPos + } + position := mysql.Position{Name: common.MasterInfo.MasterLogFile, Pos: uint32(common.MasterInfo.MasterLogPos)} + return syncer.StartSync(position) +} + +func binlogDumpGTIDSyncer(syncer *replication.BinlogSyncer) (*replication.BinlogStreamer, error) { + gtid, err := mysql.ParseGTIDSet(common.MasterInfo.ServerType, common.MasterInfo.ExecutedGTIDSet) + if err != nil { + return nil, err + } + return syncer.StartSyncGTID(gtid) +} + +// ParseEventHeader parser event header, in go-mysql it's internal func, make it public +func ParseEventHeader(buf []byte) (*replication.EventHeader, error) { + head := new(replication.EventHeader) + err := head.Decode(buf) + if err != nil { + return nil, err + } + + if head.EventSize <= uint32(replication.EventHeaderSize) { + err = errors.Errorf("invalid event header, event size is %d, too small", head.EventSize) + return nil, err + } + return head, nil +} + +// sleepInterval ... +func sleepInterval(event *replication.BinlogEvent) { + switch common.Config.Rebuild.Plugin { + case "sql", "flashback": + default: + return + } + interval := common.Config.Rebuild.SleepDuration.Seconds() + if interval > 0 { + switch event.Header.EventType { + case replication.WRITE_ROWS_EVENTv0, replication.WRITE_ROWS_EVENTv1, replication.WRITE_ROWS_EVENTv2, + replication.UPDATE_ROWS_EVENTv0, replication.UPDATE_ROWS_EVENTv1, replication.UPDATE_ROWS_EVENTv2, + replication.DELETE_ROWS_EVENTv0, replication.DELETE_ROWS_EVENTv1, replication.DELETE_ROWS_EVENTv2: + fmt.Printf("SELECT sleep(%f);\n", interval) + case replication.QUERY_EVENT: + switch string(event.Event.(*replication.QueryEvent).Query) { + case "BEGIN", "COMMIT": + default: + fmt.Printf("SELECT sleep(%f);\n", interval) + } + } + } +} diff --git a/event/parser_test.go b/event/parser_test.go new file mode 100644 index 0000000..4f2b533 --- /dev/null +++ b/event/parser_test.go @@ -0,0 +1,67 @@ +/* + * Copyright(c) 2019 Lianjia, Inc. All Rights Reserved + * 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 event + +import ( + "testing" + + "github.com/LianjiaTech/lightning/common" + "github.com/LianjiaTech/lightning/rebuild" +) + +func init() { + common.Config.MySQL.SchemaFile = common.DevPath + "/test/schema.sql" + rebuild.LoadSchemaInfo() +} + +func TestBinlogFileValidator(t *testing.T) { + headersRight := [][]byte{ + {0xfe, 'b', 'i', 'n'}, + } + headersWrong := [][]byte{ + {0xfe, 'g', 'i', 'f'}, + } + for _, head := range headersRight { + if !CheckBinlogFileHeader(head) { + t.Error("CheckBinlogFileHeader should true") + } + } + + for _, head := range headersWrong { + if CheckBinlogFileHeader(head) { + t.Error("CheckBinlogFileHeader should false") + } + } +} + +func TestBinlogFileParser(t *testing.T) { + err := BinlogFileParser([]string{common.DevPath + "/test/binlog.000002"}) + if err != nil { + t.Error(err.Error()) + } +} + +func TestBinlogStreamParser(t *testing.T) { + masterInfoOrg := common.Config.MySQL.MasterInfo + stopPositionOrg := common.Config.Filters.StopPosition + common.Config.MySQL.MasterInfo = common.DevPath + "/etc/master.info" + common.Config.Filters.StopPosition = 190 + common.LoadMasterInfo() + err := BinlogStreamParser() + if err != nil { + t.Error(err.Error()) + } + common.Config.MySQL.MasterInfo = masterInfoOrg + common.Config.Filters.StopPosition = stopPositionOrg +} diff --git a/genver.sh b/genver.sh new file mode 100755 index 0000000..ce3d28e --- /dev/null +++ b/genver.sh @@ -0,0 +1,38 @@ +#!/bin/bash + +## Generate Repository Version +tag="$(git describe --tags --always)" +version="$(git log --date=iso --pretty=format:"%cd" -1) ${tag}" +if [ "X${version}" == "X" ]; then + version="not a git repo" + tag="not a git repo" +fi + +git_dirty=$(git diff --no-ext-diff 2>/dev/null | wc -l) + +compile="$(date +"%F %T %z") by $(go version)" + +branch=$(git rev-parse --abbrev-ref HEAD) + +dev_path=$( + cd "$(dirname "$0")" || exit + pwd +) + +cat <common/version.go +package common + +// -version输出信息 +const ( + Version = "${version}" + Compile = "${compile}" + Branch = "${branch}" + GitDirty= ${git_dirty} + DevPath = "${dev_path}" +) +EOF + +LIANJIA=$(git ls-remote --get-url | grep -i lianjia) +if [ "x${LIANJIA}" != "x" ]; then + echo "${tag}" | awk -F '-' '{print $1}' > VERSION +fi diff --git a/plugin/basement.sh b/plugin/basement.sh new file mode 100644 index 0000000..e3deb08 --- /dev/null +++ b/plugin/basement.sh @@ -0,0 +1,32 @@ +#!/bin/bash + +DB=$1 +TABLE=$2 +INTERVAL=100 + +MYSQL_USER="root" +MYSQL_PASS='******' +MYSQL_PORT=3306 +MYSQL_HOST="127.0.0.1" +MYSQL="mysql -A -u${MYSQL_USER} -p${MYSQL_PASS} -h${MYSQL_HOST} -P${MYSQL_PORT} --connect-timeout=5 " + +${MYSQL} "${DB}" -NBe "CREATE TABLE _${TABLE}_new LIKE ${TABLE}" + +MIN_MAX=$(${MYSQL} "${DB}" -NBe "SELECT MIN(id) min_id, MAX(id) max_id FROM ${TABLE}") + +MIN_ID=$(echo "${MIN_MAX}" | awk '{print $1}') +MAX_ID=$(echo "${MIN_MAX}" | awk '{print $2}') + +LAST_ID=${MIN_ID} +TOTAL_CHUNK=$(echo "${MAX_ID}/100 + 1" | bc) +CHUNK=1 + +while true; do + ${MYSQL} "${DB}" -NBe "INSERT LOW_PRIORITY IGNORE INTO _${TABLE}_new SELECT * FROM ${TABLE} WHERE id >= ${LAST_ID} AND id < ${LAST_ID} + ${INTERVAL} LOCK IN SHARE MODE /*lightning coping table, ${CHUNK} of ${TOTAL_CHUNK} */" + LAST_ID=$(echo "${LAST_ID} + 100" | bc) + if [ ${LAST_ID} -gt ${MAX_ID} ]; then + break + else + CHUNK=$(echo "${CHUNK} + 1" | bc) + fi +done diff --git a/plugin/demo.flashback.lua b/plugin/demo.flashback.lua new file mode 100644 index 0000000..abe758c --- /dev/null +++ b/plugin/demo.flashback.lua @@ -0,0 +1,104 @@ +-- GoPrimaryKeys +-- GoColumns +-- GoValues + +-- GoValuesWhere +-- GoValuesSet + +-- Init inital funcation +function Init() + -- print("Init ...") +end + +-- InsertRewrite insert rewrite logic +function InsertRewrite (tab) + local whereStr = {} + -- primary-keys + for k, keys in pairs(GoPrimaryKeys) do + if k == tab + then + for _, key in ipairs(keys) do + for t, cols in pairs(GoColumns) do + if k == t + then + for i, col in ipairs(cols) do + if col == key + then + if GoValues[i] == "NULL" + then + table.insert(whereStr, string.format("%s IS %s", col, GoValues[i])) + else + table.insert(whereStr, string.format("%s = %s", col, GoValues[i])) + end + end + end + end + end + end + end + end + print(string.format("DELETE FROM %s WHERE %s;", tab, table.concat(whereStr, " AND "))) +end + +-- DeleteRewrite delete rewrite logic +function DeleteRewrite (tab) + local columnStr = "" + -- columns + for k, values in pairs(GoColumns) do + if k == tab + then + columnStr = table.concat(values, ", ") + end + end + print(string.format("INSERT INTO %s (%s) VALUES (%s);", tab, columnStr, table.concat(GoValues, ", "))) +end + +-- UpdateRewrite update rewrite logic +function UpdateRewrite (tab) + local whereStr = {} + local setStr = {} + for k, keys in pairs(GoPrimaryKeys) do + if k == tab + then + for _, key in ipairs(keys) do + for t, cols in pairs(GoColumns) do + if k == t + then + for i, col in ipairs(cols) do + if col == key + then + if GoValuesWhere[i] == "NULL" + then + table.insert(setStr, string.format("%s IS %s", col, GoValuesWhere[i])) + else + table.insert(setStr, string.format("%s = %s", col, GoValuesWhere[i])) + end + end + end + end + end + end + end + end + + for t, cols in pairs(GoColumns) do + if t == tab + then + for i, col in ipairs(cols) do + table.insert(whereStr, string.format("%s = %s", col, GoValuesSet[i])) + end + end + end + + print(string.format("UPDATE %s SET %s WHERE %s;", tab, table.concat(setStr, ", "), table.concat(whereStr, " AND "))) +end + +-- QueryRewrite query rewrite logic +function QueryRewrite (sql) + print(string.format("%s", sql)) +end + +-- Finalizer final destructor function +function Finalizer () + -- print("Finalizer ...") +end diff --git a/plugin/demo.mod.lua b/plugin/demo.mod.lua new file mode 100644 index 0000000..9aca556 --- /dev/null +++ b/plugin/demo.mod.lua @@ -0,0 +1,36 @@ +-- GoPrimaryKeys +-- GoColumns +-- GoValues + +-- GoValuesWhere +-- GoValuesSet + +-- Init inital funcation +function Init() + -- append your package.path + -- use `mymod = require('mymod')` import third party lua library + lfs = require("lfs") + package.path = package.path .. lfs.currentdir() .. [[/?.lua]] + local mymod = require("plugin/mymod") + mymod.myfunc() +end + +-- InsertRewrite insert rewrite logic +function InsertRewrite (tab) +end + +-- DeleteRewrite delete rewrite logic +function DeleteRewrite (tab) +end + +-- UpdateRewrite update rewrite logic +function UpdateRewrite (tab) +end + +-- QueryRewrite query rewrite logic +function QueryRewrite (sql) +end + +-- Finalizer final destructor function +function Finalizer () +end diff --git a/plugin/demo.mysql.lua b/plugin/demo.mysql.lua new file mode 100644 index 0000000..7e5b87d --- /dev/null +++ b/plugin/demo.mysql.lua @@ -0,0 +1,70 @@ +-- GoPrimaryKeys +-- GoColumns +-- GoValues + +-- GoValuesWhere +-- GoValuesSet + +mysql = require "mysql" +db = mysql:new() + +-- Init inital funcation +function Init() + connect() +end + +-- InsertRewrite insert rewrite logic +function InsertRewrite (tab) + +end + +-- DeleteRewrite delete rewrite logic +function DeleteRewrite (tab) + +end + +-- UpdateRewrite update rewrite logic +function UpdateRewrite (tab) + +end + +-- QueryRewrite query rewrite logic +function QueryRewrite (sql) + +end + +-- Finalizer final destructor function +function Finalizer () + db:close() +end + +function connect () + -- lua not support MySQL 8.0 caching_sha2_password authentication method yet + local ok, err, errcode, sqlstate = db:connect{ + host = "127.0.0.1", + port = 3306, + database = "mysql", + user = "root", + password = "******", + charset = "utf8", + max_packet_size = 64 * 1024 * 1024, -- 64MB + } + if err then + print("MySQL connected failed: ", err) + return + end +end + +-- MySQL query +function query (sql) + if db.state ~= STATE_CONNECTED then + db:close() + connect() + end + + local res, err, errcode, sqlstate = db:query(sql, 0) + if err then + print("-- ", sql) + print("MySQL query error: ", errcode, err) + end +end diff --git a/plugin/demo.redis.lua b/plugin/demo.redis.lua new file mode 100644 index 0000000..b209ff1 --- /dev/null +++ b/plugin/demo.redis.lua @@ -0,0 +1,42 @@ +-- GoPrimaryKeys +-- GoColumns +-- GoValues + +-- GoValuesWhere +-- GoValuesSet + +redis = require "redis" +red = redis:new() + +-- Init inital funcation +function Init() + local ok, err = red:connect("127.0.0.1", 6379) + ok, err = red:set("dog", "an animal") + local res, err = red:get("dog") + print("redis status: ",res) +end + +-- InsertRewrite insert rewrite logic +function InsertRewrite (tab) + +end + +-- DeleteRewrite delete rewrite logic +function DeleteRewrite (tab) + +end + +-- UpdateRewrite update rewrite logic +function UpdateRewrite (tab) + +end + +-- QueryRewrite query rewrite logic +function QueryRewrite (sql) + +end + +-- Finalizer final destructor function +function Finalizer () + red:close() +end \ No newline at end of file diff --git a/plugin/demo.sql.lua b/plugin/demo.sql.lua new file mode 100644 index 0000000..1f44e69 --- /dev/null +++ b/plugin/demo.sql.lua @@ -0,0 +1,103 @@ +-- GoPrimaryKeys +-- GoColumns +-- GoValues + +-- GoValuesWhere +-- GoValuesSet + +-- Init inital funcation +function Init() + +end + +-- InsertRewrite insert rewrite logic +function InsertRewrite (tab) + local columnStr = "" + -- columns + for k, values in pairs(GoColumns) do + if k == tab + then + columnStr = table.concat(values, ", ") + end + end + print(string.format("INSERT INTO %s (%s) VALUES (%s);", tab, columnStr, table.concat(GoValues, ", "))) +end + +-- DeleteRewrite delete rewrite logic +function DeleteRewrite (tab) + local whereStr = {} + -- primary-keys + for k, keys in pairs(GoPrimaryKeys) do + if k == tab + then + for _, key in ipairs(keys) do + for t, cols in pairs(GoColumns) do + if k == t + then + for i, col in ipairs(cols) do + if col == key + then + if GoValues[i] == "NULL" + then + table.insert(whereStr, string.format("%s IS %s", col, GoValues[i])) + else + table.insert(whereStr, string.format("%s = %s", col, GoValues[i])) + end + end + end + end + end + end + end + end + print(string.format("DELETE FROM %s WHERE %s;", tab, table.concat(whereStr, " AND "))) +end + +-- UpdateRewrite update rewrite logic +function UpdateRewrite (tab) + local whereStr = {} + local setStr = {} + for k, keys in pairs(GoPrimaryKeys) do + if k == tab + then + for _, key in ipairs(keys) do + for t, cols in pairs(GoColumns) do + if k == t + then + for i, col in ipairs(cols) do + if col == key + then + if GoValuesWhere[i] == "NULL" + then + table.insert(whereStr, string.format("%s IS %s", col, GoValuesWhere[i])) + else + table.insert(whereStr, string.format("%s = %s", col, GoValuesWhere[i])) + end + end + end + end + end + end + end + end + + for t, cols in pairs(GoColumns) do + if t == tab + then + for i, col in ipairs(cols) do + table.insert(setStr, string.format("%s = %s", col, GoValuesSet[i])) + end + end + end + + print(string.format("UPDATE %s SET %s WHERE %s;", tab, table.concat(setStr, ", "), table.concat(whereStr, " AND "))) +end + +-- QueryRewrite query rewrite logic +function QueryRewrite (sql) + print(string.format("%s", sql)) +end + +-- Finalizer final destructor function +function Finalizer () +end diff --git a/plugin/mymod.lua b/plugin/mymod.lua new file mode 100644 index 0000000..3127c34 --- /dev/null +++ b/plugin/mymod.lua @@ -0,0 +1,7 @@ +local mymod = {} + +function mymod.myfunc() + print("-- hi! this is my first mod in lua.") +end + +return mymod diff --git a/rebuild/common.go b/rebuild/common.go new file mode 100644 index 0000000..0fb67dd --- /dev/null +++ b/rebuild/common.go @@ -0,0 +1,325 @@ +/* + * Copyright(c) 2019 Lianjia, Inc. All Rights Reserved + * 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 rebuild + +import ( + "encoding/hex" + "encoding/json" + "fmt" + "github.com/LianjiaTech/lightning/common" + + "github.com/BixData/gluabit32" + "github.com/BixData/gluasocket" + "github.com/montanaflynn/stats" + "github.com/satori/go.uuid" + "github.com/siddontang/go-mysql/mysql" + "github.com/siddontang/go-mysql/replication" + "github.com/yuin/gopher-lua" + "github.com/zhu327/gluadb" + "layeh.com/gopher-lfs" +) + +// for -plugin stat +// TableStats +var TableStats map[string]map[string]int64 + +// QueryStats ... +var QueryStats map[string]int64 + +// TransactionStartPos ... +var TransactionStartPos float64 + +// TransactionStartTimeStamp ... +var TransactionStartTimeStamp float64 + +// MaxTransactionTime ... +var MaxTransactionTime float64 + +// MaxTransactionSize ... +var MaxTransactionSize float64 + +// MaxTransactionSizeStartPos .. +var MaxTransactionSizeStartPos float64 + +// MaxTransactionSizeStopPos = MaxTransactionSizeStartPos + Max(TransactionSizeStats) + +// MaxTransactionTimeStartPos ... +var MaxTransactionTimeStartPos float64 + +// MaxTransactionTimeStopPos ... +var MaxTransactionTimeStopPos float64 + +// TransactionSizeStats ... +var TransactionSizeStats []float64 + +// TransactionTimeStats ... +var TransactionTimeStats []float64 + +type Stats struct { + Table map[string]map[string]int64 `json:"TableStats"` + Query map[string]int64 `json:"QueryStats"` + Transaction map[string]map[string]string `json:"TransactionStats"` + TransactionSize []float64 `json:"-"` // take from end_log_pos between begin and commit + TransactionTime []float64 `json:"-"` // take from timestamp between begin and commit +} + +// BinlogStats ... +var BinlogStats Stats + +// Lua ... +var Lua *lua.LState + +// InsertValuesMerge INSERT values merge +var InsertValuesMerge []string + +func init() { + TableStats = make(map[string]map[string]int64) +} + +// RowEventTable ... +func RowEventTable(event *replication.BinlogEvent) string { + if event == nil { + return "" + } + switch event.Header.EventType { + case replication.WRITE_ROWS_EVENTv0, replication.WRITE_ROWS_EVENTv1, replication.WRITE_ROWS_EVENTv2, + replication.UPDATE_ROWS_EVENTv0, replication.UPDATE_ROWS_EVENTv1, replication.UPDATE_ROWS_EVENTv2, + replication.DELETE_ROWS_EVENTv0, replication.DELETE_ROWS_EVENTv1, replication.DELETE_ROWS_EVENTv2: + return fmt.Sprintf("`%s`.`%s`", + string(event.Event.(*replication.RowsEvent).Table.Schema), + string(event.Event.(*replication.RowsEvent).Table.Table)) + } + return "" +} + +// BuildValues build values list +func BuildValues(event *replication.RowsEvent) [][]string { + var values [][]string + for _, row := range event.Rows { + var columns []string + for i, t := range event.Table.ColumnType { + if row[i] == nil { + columns = append(columns, "NULL") + continue + } + + switch t { + case mysql.MYSQL_TYPE_DECIMAL, mysql.MYSQL_TYPE_NEWDECIMAL, mysql.MYSQL_TYPE_TINY, mysql.MYSQL_TYPE_SHORT, + mysql.MYSQL_TYPE_LONG, mysql.MYSQL_TYPE_FLOAT, mysql.MYSQL_TYPE_DOUBLE, mysql.MYSQL_TYPE_NULL, + mysql.MYSQL_TYPE_TIMESTAMP, mysql.MYSQL_TYPE_LONGLONG, mysql.MYSQL_TYPE_INT24: + columns = append(columns, fmt.Sprint(row[i])) + case mysql.MYSQL_TYPE_DATE, mysql.MYSQL_TYPE_TIME, mysql.MYSQL_TYPE_DATETIME, mysql.MYSQL_TYPE_YEAR, + mysql.MYSQL_TYPE_NEWDATE, mysql.MYSQL_TYPE_TIMESTAMP2, mysql.MYSQL_TYPE_DATETIME2, mysql.MYSQL_TYPE_TIME2: + columns = append(columns, fmt.Sprint("'", row[i], "'")) + case mysql.MYSQL_TYPE_VARCHAR, mysql.MYSQL_TYPE_VAR_STRING, mysql.MYSQL_TYPE_STRING: + switch row[i].(type) { + case string: + if common.Config.Global.HexString { + columns = append(columns, fmt.Sprintf(`X'%s'`, hex.EncodeToString(row[i].([]byte)))) + } else { + // strconv.Quote will escape unicode \u0100 + // escape function maybe not correct with multi byte charset + // columns = append(columns, strconv.Quote(row[i].(string))) + columns = append(columns, fmt.Sprintf(`"%s"`, escape(row[i].(string)))) + } + case int, int64, int32, int16, int8, uint64, uint32, uint16, uint8: + // SET ENUM + columns = append(columns, fmt.Sprint(row[i])) + default: + columns = append(columns, fmt.Sprintf(`'%s'`, fmt.Sprint(row[i]))) + } + + case mysql.MYSQL_TYPE_JSON: + columns = append(columns, fmt.Sprintf(`'%s'`, row[i].([]byte))) + case mysql.MYSQL_TYPE_BIT: + columns = append(columns, fmt.Sprintf(`%d`, row[i].(int64))) + default: + // mysql.MYSQL_TYPE_TINY_BLOB, mysql.MYSQL_TYPE_BLOB, mysql.MYSQL_TYPE_MEDIUM_BLOB, mysql.MYSQL_TYPE_LONG_BLOB + // mysql.MYSQL_TYPE_GEOMETRY + columns = append(columns, fmt.Sprintf(`X'%s'`, hex.EncodeToString(row[i].([]byte)))) + } + } + values = append(values, columns) + } + return values +} + +// GTIDRebuild ... +func GTIDRebuild(event *replication.GTIDEvent) { + serverID, _ := uuid.FromBytes(event.SID) + common.Verbose("-- [DEBUG] GTID_NEXT: %s:%d, LastCommitted: %d, SequenceNumber: %d, CommitFlag: %d\n", serverID, event.GNO, event.LastCommitted, event.SequenceNumber, event.CommitFlag) +} + +// EventHeaderRebuild ... +func EventHeaderRebuild(event *replication.BinlogEvent) { + header := event.Header + common.Verbose("-- [DEBUG] EventType: %s, ServerID: %d, Timestamp: %d, LogPos: %d, EventSize: %d, Flags: %d\n", + header.EventType.String(), header.ServerID, header.Timestamp, header.LogPos, header.EventSize, header.Flags) +} + +// LastStatus ... +func LastStatus() { + switch common.Config.Rebuild.Plugin { + case "stat": + printBinlogStat() + } + if Lua != nil { + if err := Lua.CallByParam(lua.P{ + Fn: Lua.GetGlobal("Finalizer"), + NRet: 1, + Protect: true, + }); err != nil { + common.Log.Error(err.Error()) + return + } + defer Lua.Close() + } +} + +// printBinlogStat ... +func printBinlogStat() { + // TransactionTimeStats + medianTime, _ := stats.Median(TransactionTimeStats) + maxTime, _ := stats.Max(TransactionTimeStats) + meanTime, _ := stats.Mean(TransactionTimeStats) + p99Time, _ := stats.Percentile(TransactionTimeStats, 99) + p95Time, _ := stats.Percentile(TransactionTimeStats, 95) + // TransactionSizeStats + medianSize, _ := stats.Median(TransactionSizeStats) + maxSize, _ := stats.Max(TransactionSizeStats) + meanSize, _ := stats.Mean(TransactionSizeStats) + p99Size, _ := stats.Percentile(TransactionSizeStats, 99) + p95Size, _ := stats.Percentile(TransactionSizeStats, 95) + + BinlogStats = Stats{ + Table: TableStats, + Query: QueryStats, + Transaction: map[string]map[string]string{ + "TimeSeconds": { + "MaxTransactionPos": fmt.Sprintf("-start-position %d -stop-position %d", int64(MaxTransactionTimeStartPos), int64(MaxTransactionTimeStopPos)), + "Median": fmt.Sprintf("%0.2f", medianTime), + "Max": fmt.Sprintf("%0.2f", maxTime), + "Mean": fmt.Sprintf("%0.2f", meanTime), + "P99": fmt.Sprintf("%0.2f", p99Time), + "P95": fmt.Sprintf("%0.2f", p95Time), + }, + "SizeBytes": { + "MaxTransactionPos": fmt.Sprintf("-start-position %d -stop-position %d", int64(MaxTransactionSizeStartPos), int64(MaxTransactionSizeStartPos+MaxTransactionSize)), + "Median": fmt.Sprintf("%0.1f", medianSize), + "Max": fmt.Sprintf("%0.1f", maxSize), + "Mean": fmt.Sprintf("%0.1f", meanSize), + "P99": fmt.Sprintf("%0.1f", p99Size), + "P95": fmt.Sprintf("%0.1f", p95Size), + }, + }, + } + + buf, err := json.MarshalIndent(BinlogStats, "", " ") + if err != nil { + fmt.Println(err) + } + fmt.Println(string(buf)) +} + +// LuaStringList ... +func LuaStringList(name string, values []string) { + t := Lua.NewTable() + for k, v := range values { + Lua.SetTable(t, lua.LNumber(k+1), lua.LString(v)) + } + Lua.SetGlobal(name, t) +} + +// LuaMapStringList ... +func LuaMapStringList(name string, values map[string][]string) { + t := Lua.NewTable() + for k, cols := range values { + l := Lua.NewTable() + for i, col := range cols { + Lua.SetTable(l, lua.LNumber(i+1), lua.LString(col)) + } + Lua.SetTable(t, lua.LString(k), l) + } + Lua.SetGlobal(name, t) +} + +// LoadLuaScript ... +func LoadLuaScript() { + if common.Config.Rebuild.LuaScript == "" || common.Config.Rebuild.Plugin != "lua" { + return + } + Lua = lua.NewState() + gluasocket.Preload(Lua) + gluabit32.Preload(Lua) + gluadb.Preload(Lua) // lua package require "mysql", "redis" + lfs.Preload(Lua) // lfs.currentdir() for package loading + + if err := Lua.DoFile(common.Config.Rebuild.LuaScript); err != nil { + common.Log.Error(err.Error()) + return + } + + LuaMapStringList("GoPrimaryKeys", PrimaryKeys) + LuaMapStringList("GoColumns", Columns) + + if err := Lua.CallByParam(lua.P{ + Fn: Lua.GetGlobal("Init"), + NRet: 1, + Protect: true, + }); err != nil { + common.Log.Error(err.Error()) + return + } +} + +func escape(sql string) string { + dest := make([]byte, 0, 2*len(sql)) + var escape byte + for i := 0; i < len(sql); i++ { + c := sql[i] + + escape = 0 + + switch c { + case 0: /* Must be escaped for 'mysql' */ + escape = '0' + break + case '\n': /* Must be escaped for logs */ + escape = 'n' + break + case '\r': + escape = 'r' + break + case '\\': + escape = '\\' + break + case '\'': + escape = '\'' + break + case '"': /* Better safe than sorry */ + escape = '"' + break + case '\032': /* This gives problems on Win32 */ + escape = 'Z' + } + + if escape != 0 { + dest = append(dest, '\\', escape) + } else { + dest = append(dest, c) + } + } + + return string(dest) +} diff --git a/rebuild/common_test.go b/rebuild/common_test.go new file mode 100644 index 0000000..a9da824 --- /dev/null +++ b/rebuild/common_test.go @@ -0,0 +1,37 @@ +/* + * Copyright(c) 2019 Lianjia, Inc. All Rights Reserved + * 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 rebuild + +import ( + "fmt" + "strconv" + "testing" +) + +func TestLastStatus(t *testing.T) { + LastStatus() +} + +func TestPrintBinlogStat(t *testing.T) { + printBinlogStat() +} + +func TestLoadLuaScript(t *testing.T) { + LoadLuaScript() +} + +func TestStrconvQuote(t *testing.T) { + fmt.Println(strconv.Quote(`'"space `)) + fmt.Printf(`"%s"`, escape(`'"space `)) +} diff --git a/rebuild/delete.go b/rebuild/delete.go new file mode 100644 index 0000000..b97d834 --- /dev/null +++ b/rebuild/delete.go @@ -0,0 +1,179 @@ +/* + * Copyright(c) 2019 Lianjia, Inc. All Rights Reserved + * 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 rebuild + +import ( + "fmt" + "strings" + + "github.com/LianjiaTech/lightning/common" + + "github.com/siddontang/go-mysql/replication" + lua "github.com/yuin/gopher-lua" +) + +// DeleteRebuild ... +func DeleteRebuild(event *replication.BinlogEvent) string { + switch common.Config.Rebuild.Plugin { + case "sql": + DeleteQuery(event) + case "flashback": + DeleteRollbackQuery(event) + case "stat": + DeleteStat(event) + case "lua": + DeleteLua(event) + default: + } + return "" +} + +// DeleteQuery build original delete SQL +func DeleteQuery(event *replication.BinlogEvent) { + table := RowEventTable(event) + ev := event.Event.(*replication.RowsEvent) + values := BuildValues(ev) + + if ok := PrimaryKeys[table]; ok != nil { + for _, value := range values { + var where []string + for _, col := range PrimaryKeys[table] { + for i, c := range Columns[table] { + if c == col { + if value[i] == "NULL" { + where = append(where, fmt.Sprintf("%s IS NULL", col)) + } else { + where = append(where, fmt.Sprintf("%s = %s", col, value[i])) + } + } + } + } + fmt.Printf("DELETE FROM %s WHERE %s LIMIT 1;\n", table, strings.Join(where, " AND ")) + } + } else { + for _, value := range values { + var where []string + for i, v := range value { + col := fmt.Sprintf("@%d", i) + if v == "NULL" { + where = append(where, fmt.Sprintf("%s IS NULL", col)) + } else { + where = append(where, fmt.Sprintf("%s = %s", col, v)) + } + } + fmt.Printf("-- DELETE FROM %s WHERE %s LIMIT 1;\n", table, strings.Join(where, " AND ")) + } + } +} + +// DeleteRollbackQuery build rollback insert SQL +func DeleteRollbackQuery(event *replication.BinlogEvent) { + table := RowEventTable(event) + ev := event.Event.(*replication.RowsEvent) + values := BuildValues(ev) + + var insertPrefix string + if common.Config.Rebuild.Replace { + insertPrefix = "REPLACE INTO" + } else { + insertPrefix = "INSERT INTO" + } + + colStr := "" + for row, v := range values { + valStr := "" + if common.Config.Rebuild.CompleteInsert { + if ok := Columns[table]; ok != nil { + if len(common.Config.Rebuild.IgnoreColumns) > 0 { + var truncValues, truncColumns []string + for i, col := range Columns[table] { + ignore := false + for _, c := range common.Config.Rebuild.IgnoreColumns { + if c == strings.Trim(col, "`") { + ignore = true + } + } + if !ignore { + truncColumns = append(truncColumns, col) + truncValues = append(truncValues, v[i]) + } + } + colStr = fmt.Sprintf("(%s)", strings.Join(truncColumns, ", ")) + valStr = strings.Join(truncValues, ", ") + } else { + colStr = fmt.Sprintf("(%s)", strings.Join(Columns[table], ", ")) + valStr = strings.Join(v, ", ") + } + } else { + valStr = strings.Join(v, ", ") + } + } else { + valStr = strings.Join(v, ", ") + } + + if common.Config.Rebuild.ExtendedInsertCount > 1 { + InsertValuesMerge = append(InsertValuesMerge, fmt.Sprintf("(%s)", valStr)) + } else { + fmt.Printf("%s %s %s VALUES (%s);\n", insertPrefix, table, colStr, valStr) + } + + // INSERT VALUES merge + if row != 0 && common.Config.Rebuild.ExtendedInsertCount > 1 && + (row+1)%common.Config.Rebuild.ExtendedInsertCount == 0 { + fmt.Printf("%s %s %s VALUES %s;\n", insertPrefix, table, colStr, strings.Join(InsertValuesMerge, ", ")) + InsertValuesMerge = []string{} + } + } + if len(InsertValuesMerge) > 0 { + fmt.Printf("%s %s %s VALUES %s;\n", insertPrefix, table, colStr, strings.Join(InsertValuesMerge, ", ")) + InsertValuesMerge = []string{} + } +} + +// DeleteStat ... +func DeleteStat(event *replication.BinlogEvent) { + table := RowEventTable(event) + if TableStats[table] != nil { + TableStats[table]["delete"]++ + } else { + TableStats[table] = map[string]int64{"delete": 1} + } +} + +// DeleteLua ... +func DeleteLua(event *replication.BinlogEvent) { + if common.Config.Rebuild.LuaScript == "" || event == nil { + return + } + + table := RowEventTable(event) + ev := event.Event.(*replication.RowsEvent) + values := BuildValues(ev) + + // lua function + f := lua.P{ + Fn: Lua.GetGlobal("DeleteRewrite"), + NRet: 0, + Protect: true, + } + // lua value + v := lua.LString(table) + for _, value := range values { + LuaStringList("GoValues", value) + if err := Lua.CallByParam(f, v); err != nil { + common.Log.Error(err.Error()) + return + } + } +} diff --git a/rebuild/delete_test.go b/rebuild/delete_test.go new file mode 100644 index 0000000..0efd902 --- /dev/null +++ b/rebuild/delete_test.go @@ -0,0 +1,14 @@ +/* + * Copyright(c) 2019 Lianjia, Inc. All Rights Reserved + * 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 rebuild diff --git a/rebuild/doc.go b/rebuild/doc.go new file mode 100644 index 0000000..fc055c2 --- /dev/null +++ b/rebuild/doc.go @@ -0,0 +1,15 @@ +/* + * Copyright(c) 2019 Lianjia, Inc. All Rights Reserved + * 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 rebuild binlog event rebuild library functions +package rebuild diff --git a/rebuild/fixture/TestQueryRollback.golden b/rebuild/fixture/TestQueryRollback.golden new file mode 100644 index 0000000..05bb129 --- /dev/null +++ b/rebuild/fixture/TestQueryRollback.golden @@ -0,0 +1,2 @@ +DROP TABLE IF EXISTS `tb`; +DROP DATABASE IF EXISTS `db`; diff --git a/rebuild/insert.go b/rebuild/insert.go new file mode 100644 index 0000000..f0ce25a --- /dev/null +++ b/rebuild/insert.go @@ -0,0 +1,179 @@ +/* + * Copyright(c) 2019 Lianjia, Inc. All Rights Reserved + * 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 rebuild + +import ( + "fmt" + "strings" + + "github.com/LianjiaTech/lightning/common" + + "github.com/siddontang/go-mysql/replication" + lua "github.com/yuin/gopher-lua" +) + +// InsertRebuild ... +func InsertRebuild(event *replication.BinlogEvent) string { + switch common.Config.Rebuild.Plugin { + case "sql": + InsertQuery(event) + case "flashback": + InsertRollbackQuery(event) + case "stat": + InsertStat(event) + case "lua": + InsertLua(event) + default: + } + return "" +} + +// InsertQuery ... +func InsertQuery(event *replication.BinlogEvent) { + table := RowEventTable(event) + ev := event.Event.(*replication.RowsEvent) + values := BuildValues(ev) + + var insertPrefix string + if common.Config.Rebuild.Replace { + insertPrefix = "REPLACE INTO" + } else { + insertPrefix = "INSERT INTO" + } + + colStr := "" + for row, v := range values { + valStr := "" + if common.Config.Rebuild.CompleteInsert { + if ok := Columns[table]; ok != nil { + if len(common.Config.Rebuild.IgnoreColumns) > 0 { + var truncValues, truncColumns []string + for i, col := range Columns[table] { + ignore := false + for _, c := range common.Config.Rebuild.IgnoreColumns { + if c == strings.Trim(col, "`") { + ignore = true + } + } + if !ignore { + truncColumns = append(truncColumns, col) + truncValues = append(truncValues, v[i]) + } + } + colStr = fmt.Sprintf("(%s)", strings.Join(truncColumns, ", ")) + valStr = strings.Join(truncValues, ", ") + } else { + colStr = fmt.Sprintf("(%s)", strings.Join(Columns[table], ", ")) + valStr = strings.Join(v, ", ") + } + } else { + valStr = strings.Join(v, ", ") + } + } else { + valStr = strings.Join(v, ", ") + } + + if common.Config.Rebuild.ExtendedInsertCount > 1 { + InsertValuesMerge = append(InsertValuesMerge, fmt.Sprintf("(%s)", valStr)) + } else { + fmt.Printf("%s %s %s VALUES (%s);\n", insertPrefix, table, colStr, valStr) + } + + // INSERT VALUES merge + if row != 0 && common.Config.Rebuild.ExtendedInsertCount > 1 && + (row+1)%common.Config.Rebuild.ExtendedInsertCount == 0 { + fmt.Printf("%s %s %s VALUES %s;\n", insertPrefix, table, colStr, strings.Join(InsertValuesMerge, ", ")) + InsertValuesMerge = []string{} + } + } + if len(InsertValuesMerge) > 0 { + fmt.Printf("%s %s %s VALUES %s;\n", insertPrefix, table, colStr, strings.Join(InsertValuesMerge, ", ")) + InsertValuesMerge = []string{} + } +} + +// InsertRollbackQuery ... +func InsertRollbackQuery(event *replication.BinlogEvent) { + table := RowEventTable(event) + ev := event.Event.(*replication.RowsEvent) + values := BuildValues(ev) + + if ok := PrimaryKeys[table]; ok != nil { + for _, value := range values { + var where []string + for _, col := range PrimaryKeys[table] { + for i, c := range Columns[table] { + if c == col { + if value[i] == "NULL" { + where = append(where, fmt.Sprintf("%s IS NULL", col)) + } else { + where = append(where, fmt.Sprintf("%s = %s", col, value[i])) + } + } + } + } + fmt.Printf("DELETE FROM %s WHERE %s LIMIT 1;\n", table, strings.Join(where, " AND ")) + } + } else { + for _, value := range values { + var where []string + for i, v := range value { + col := fmt.Sprintf("@%d", i) + if v == "NULL" { + where = append(where, fmt.Sprintf("%s IS NULL", col)) + } else { + where = append(where, fmt.Sprintf("%s = %s", col, v)) + } + } + fmt.Printf("-- DELETE FROM %s WHERE %s LIMIT 1;\n", table, strings.Join(where, " AND ")) + } + } +} + +// InsertStat ... +func InsertStat(event *replication.BinlogEvent) { + table := RowEventTable(event) + if TableStats[table] != nil { + TableStats[table]["insert"]++ + } else { + TableStats[table] = map[string]int64{"insert": 1} + } +} + +// InsertLua ... +func InsertLua(event *replication.BinlogEvent) { + if common.Config.Rebuild.LuaScript == "" || event == nil { + return + } + + table := RowEventTable(event) + ev := event.Event.(*replication.RowsEvent) + values := BuildValues(ev) + + // lua function + f := lua.P{ + Fn: Lua.GetGlobal("InsertRewrite"), + NRet: 0, + Protect: true, + } + // lua value + v := lua.LString(table) + for _, value := range values { + LuaStringList("GoValues", value) + if err := Lua.CallByParam(f, v); err != nil { + common.Log.Error(err.Error()) + return + } + } +} diff --git a/rebuild/insert_test.go b/rebuild/insert_test.go new file mode 100644 index 0000000..0efd902 --- /dev/null +++ b/rebuild/insert_test.go @@ -0,0 +1,14 @@ +/* + * Copyright(c) 2019 Lianjia, Inc. All Rights Reserved + * 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 rebuild diff --git a/rebuild/query.go b/rebuild/query.go new file mode 100644 index 0000000..441baee --- /dev/null +++ b/rebuild/query.go @@ -0,0 +1,214 @@ +/* + * Copyright(c) 2019 Lianjia, Inc. All Rights Reserved + * 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 rebuild + +import ( + "fmt" + "strings" + + "github.com/LianjiaTech/lightning/common" + "github.com/siddontang/go-mysql/replication" + lua "github.com/yuin/gopher-lua" + + "github.com/pingcap/parser" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/mysql" + + // pingcap/parser + _ "github.com/pingcap/tidb/types/parser_driver" +) + +// QueryRebuild rebuild sql, need pingcap/parser +func QueryRebuild(queryEvent *replication.BinlogEvent) string { + switch queryEvent.Header.EventType { + case replication.QUERY_EVENT: + default: + common.Log.Error("QueryRebuild get wrong event: %s", queryEvent.Header.EventType.String()) + return "" + } + + event := queryEvent.Event.(*replication.QueryEvent) + + common.Verbose("-- [DEBUG] ThreadID: %d, Schema: %s, ErrorCode: %d, ExecutionTime: %d, GSet: %v\n", + event.SlaveProxyID, event.Schema, event.ErrorCode, event.ExecutionTime, event.GSet) + + sql := string(event.Query) + switch common.Config.Rebuild.Plugin { + case "sql": + // fmt.Printf("SET TIMESTAMP=%d;\n", queryEvent.Header.Timestamp) + QueryFormat(sql) + case "flashback": + QueryRollback(sql) + case "stat": + if sql == "BEGIN" { + TransactionStartPos = float64(queryEvent.Header.LogPos) + TransactionStartTimeStamp = float64(queryEvent.Header.Timestamp) + } + QueryStat(sql) + case "lua": + QueryLua(sql) + default: + } + + // stat transaction time, exec_time on slave it's replication lag time. + // https://dev.mysql.com/doc/refman/5.6/en/mysqlbinlog.html + transactionTime := float64(event.ExecutionTime) + if transactionTime > MaxTransactionTime { + MaxTransactionTime = transactionTime + MaxTransactionTimeStartPos = TransactionStartPos + } + TransactionTimeStats = append(TransactionTimeStats, transactionTime) + + return "" +} + +// RowsQueryRebuild ... +func RowsQueryRebuild(rowsQueryEvent *replication.BinlogEvent) string { + switch rowsQueryEvent.Header.EventType { + case replication.ROWS_QUERY_EVENT: + default: + common.Log.Error("RowsQueryRebuild get wrong event: %s", rowsQueryEvent.Header.EventType.String()) + return "" + } + + event := rowsQueryEvent.Event.(*replication.RowsQueryEvent) + common.VerboseVerbose("-- [DEBUG] RowsQuery Event, Query: %s\n", string(event.Query)) + return "" +} + +// XidRebuild ... +func XidRebuild(event *replication.BinlogEvent) string { + // stat transaction size + transactionSize := float64(event.Header.LogPos) - TransactionStartPos + if transactionSize > MaxTransactionSize { + MaxTransactionSizeStartPos = TransactionStartPos + MaxTransactionSize = transactionSize + } + TransactionSizeStats = append(TransactionSizeStats, transactionSize) + + if MaxTransactionTimeStartPos == TransactionStartPos { + MaxTransactionTimeStopPos = float64(event.Header.LogPos) + } + + common.Verbose("-- [DEBUG] XID_EVENT TransactionSizeBytes: %s, Xid: %d, GSet: %v\n", + fmt.Sprintf("%0.0f", transactionSize), event.Event.(*replication.XIDEvent).XID, event.Event.(*replication.XIDEvent).GSet) + return "" +} + +// TiParse TiDB 语法解析 +func TiParse(sql, charset, collation string) ([]ast.StmtNode, error) { + p := parser.New() + stmt, _, err := p.Parse(sql, charset, collation) + return stmt, err +} + +// QueryFormat ... +func QueryFormat(sql string) { + if strings.HasPrefix(sql, "BEGIN") { + common.Verbose("-- [DEBUG] BEGIN;") + return + } + + if strings.HasSuffix(sql, ";") { + fmt.Println(sql) + } else { + fmt.Println(sql, ";") + } +} + +func QueryRollback(sql string) { + stmts, err := TiParse(sql, common.Config.Global.Charset, mysql.Charsets[common.Config.Global.Charset]) + if err == nil { + for _, stmt := range stmts { + switch node := stmt.(type) { + case *ast.CreateTableStmt: + CreateTableRollback(node) + case *ast.CreateDatabaseStmt: + CreateDatabaseRollback(node) + case *ast.CreateIndexStmt: + CreateIndexRollback(node) + case *ast.CreateViewStmt: + CreateViewRollback(node) + // case *ast.AlterTableStmt: + // TODO: ALTER TABLE tb ADD col int; + case *ast.BeginStmt: + common.Verbose("-- [DEBUG] BEGIN;") + default: + common.VerboseVerbose("-- [DEBUG] can't rollback: %s;", sql) + } + } + } else { + common.Log.Error(err.Error()) + } +} + +// CreateTableRollback ... +func CreateTableRollback(stmt *ast.CreateTableStmt) { + if stmt.Table.Schema.String() == "" { + fmt.Printf("DROP TABLE IF EXISTS `%s`;\n", stmt.Table.Name) + } else { + fmt.Printf("DROP TABLE IF EXISTS `%s`.`%s`;\n", stmt.Table.Schema, stmt.Table.Name) + } +} + +// CreateDatabaseRollback ... +func CreateDatabaseRollback(stmt *ast.CreateDatabaseStmt) { + fmt.Printf("DROP DATABASE IF EXISTS `%s`;\n", stmt.Name) +} + +// CreateIndexRollback ... +func CreateIndexRollback(stmt *ast.CreateIndexStmt) { + if stmt.Table.Schema.String() == "" { + fmt.Printf("DROP INDEX `%s` ON `%s`;\n", stmt.IndexName, stmt.Table.Name) + } else { + fmt.Printf("DROP INDEX `%s` ON `%s`.`%s`;\n", stmt.IndexName, stmt.Table.Schema, stmt.Table.Name) + } +} + +// CreateViewRollback ... +func CreateViewRollback(stmt *ast.CreateViewStmt) { + if stmt.ViewName.Schema.String() == "" { + fmt.Printf("DROP VIEW IF EXISTS `%s`;\n", stmt.ViewName.Name) + } else { + fmt.Printf("DROP VIEW IF EXISTS `%s`.`%s`;\n", stmt.ViewName.Schema, stmt.ViewName.Name) + } +} + +// QueryStat ... +func QueryStat(sql string) { + // TODO: statement base table stat + // stmt, err := TiParse(sql, common.Config.Global.Charset, mysql.Charsets[common.Config.Global.Charset]) + t := strings.ToLower(strings.Fields(sql)[0]) + if QueryStats != nil { + QueryStats[t]++ + } else { + QueryStats = map[string]int64{t: 1} + } +} + +// QueryLua ... +func QueryLua(sql string) { + if common.Config.Rebuild.LuaScript == "" || sql == "" { + return + } + + if err := Lua.CallByParam(lua.P{ + Fn: Lua.GetGlobal("QueryRewrite"), + NRet: 1, + Protect: true, + }, lua.LString(sql)); err != nil { + common.Log.Error(err.Error()) + return + } +} diff --git a/rebuild/query_test.go b/rebuild/query_test.go new file mode 100644 index 0000000..21b4938 --- /dev/null +++ b/rebuild/query_test.go @@ -0,0 +1,41 @@ +/* + * Copyright(c) 2019 Lianjia, Inc. All Rights Reserved + * 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 rebuild + +import ( + "flag" + "testing" + + "github.com/LianjiaTech/lightning/common" +) + +var update = flag.Bool("update", false, "update .golden files") + +func TestQueryRollback(t *testing.T) { + sqls := []string{ + `CREATE TABLE tb (a int)`, + `create database db`, + // "create index on tb idx_col (`col`)", + } + + err := common.GoldenDiff(func() { + for _, sql := range sqls { + QueryRollback(sql) + } + }, t.Name(), update) + if nil != err { + t.Fatal(err) + } + +} diff --git a/rebuild/schema.go b/rebuild/schema.go new file mode 100644 index 0000000..0aade4a --- /dev/null +++ b/rebuild/schema.go @@ -0,0 +1,260 @@ +/* + * Copyright(c) 2019 Lianjia, Inc. All Rights Reserved + * 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 rebuild + +import ( + "database/sql" + "fmt" + "io/ioutil" + "os" + "regexp" + "strings" + + "github.com/juju/errors" + + "github.com/LianjiaTech/lightning/common" + + // database/sql + _ "github.com/go-sql-driver/mysql" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" +) + +// Schemas ... +var Schemas []*ast.CreateTableStmt + +// Columns ... +var Columns map[string][]string + +// PrimaryKeys ... +var PrimaryKeys map[string][]string + +// LoadSchemaInfo load schema info from file or mysql +func LoadSchemaInfo() { + if common.Config.MySQL.SchemaFile != "" { + // load from file + err := loadSchemaFromFile() + if err != nil { + common.Log.Error(errors.Trace(err).Error()) + } + return + } else { + // load from mysql server + err := loadSchemaFromMySQL() + if err != nil { + common.Log.Error(errors.Trace(err).Error()) + } + } +} + +func loadSchemaFromFile() error { + common.Log.Debug("loadSchemaFromFile %s", common.Config.MySQL.SchemaFile) + if _, err := os.Stat(common.Config.MySQL.SchemaFile); err != nil { + return err + } + buf, err := ioutil.ReadFile(common.Config.MySQL.SchemaFile) + if err != nil { + return err + } + err = schemaAppend("", string(buf)) + buildColumns() + buildPrimaryKeys() + return err +} + +func loadSchemaFromMySQL() error { + var databases []string + dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/?charset=%s&timeout=5s", + common.MasterInfo.MasterUser, + common.MasterInfo.MasterPassword, + common.MasterInfo.MasterHost, + common.MasterInfo.MasterPort, + common.Config.Global.Charset, + ) + common.Log.Debug("loadSchemaFromMySQL %s", dsn) + db, err := sql.Open("mysql", dsn) + if err != nil { + return err + } + defer db.Close() + + res, err := db.Query("SHOW DATABASES;") + if err != nil { + return err + } + for res.Next() { + var database string + res.Scan(&database) + switch database { + case "information_schema", "sys", "mysql", "performance_schema": + default: + databases = append(databases, database) + } + } + + for _, database := range databases { + res, err := db.Query(fmt.Sprintf("SHOW TABLES FROM `%s`", database)) + if err != nil { + common.Log.Error(errors.Trace(err).Error()) + continue + } + for res.Next() { + var table string + err = res.Scan(&table) + if err != nil { + common.Log.Error(errors.Trace(err).Error()) + continue + } + tableRes, err := db.Query(fmt.Sprintf("SHOW CREATE TABLE `%s`.`%s`;", database, table)) + if err != nil { + common.Log.Error(errors.Trace(err).Error()) + continue + } + + cols, err := tableRes.Columns() + if err != nil { + common.Log.Error(errors.Trace(err).Error()) + continue + } + // SHOW CREATE VIEW WILL GET 4 COLUMNS + if len(cols) != 2 { + common.Log.Info("by pass host: %s, port: %d, database: %s, table: %s", + common.MasterInfo.MasterHost, + common.MasterInfo.MasterPort, + database, table) + continue + } + + for tableRes.Next() { + var name, schema string + err = tableRes.Scan(&name, &schema) + if err != nil { + common.Log.Error("host: %s, port: %d, database: %s, table: %s, error: %s", + common.MasterInfo.MasterHost, + common.MasterInfo.MasterPort, + database, table, errors.Trace(err).Error()) + continue + } + err = schemaAppend(database, schema) + if err != nil { + common.Log.Error("host: %s, port: %d, database: %s, table: %s, sql: %s, error: %s", + common.MasterInfo.MasterHost, + common.MasterInfo.MasterPort, + database, table, + schema, + errors.Trace(err).Error()) + schemaAppend(database, buildFakeTable(db, fmt.Sprintf("`%s`.`%s`", database, table))) + } + } + tableRes.Close() + } + res.Close() + } + buildColumns() + buildPrimaryKeys() + return nil +} + +func schemaAppend(database, sql string) error { + sql = removeIncompatibleWords(sql) + stmts, err := TiParse(sql, common.Config.Global.Charset, mysql.Charsets[common.Config.Global.Charset]) + if err != nil { + return err + } + if database == "" { + database = "%" + } + for _, stmt := range stmts { + switch node := stmt.(type) { + case *ast.CreateTableStmt: + if node.Table.Schema.String() == "" { + node.Table.Schema = model.NewCIStr(database) + } + Schemas = append(Schemas, node) + case *ast.UseStmt: + database = node.DBName + } + } + return nil +} + +// removeIncompatibleWords remove pingcap/parser not support words from schema +// Note: only for MySQL `SHOW CREATE TABLE` hand-writing SQL not compatible +func removeIncompatibleWords(sql string) string { + // CONSTRAINT col_fk FOREIGN KEY (col) REFERENCES tb (id) ON UPDATE CASCADE + re := regexp.MustCompile(` ON UPDATE CASCADE`) + sql = re.ReplaceAllString(sql, "") + + // FULLTEXT KEY col_fk (col) /*!50100 WITH PARSER `ngram` */ + // /*!50100 PARTITION BY LIST (col) + re = regexp.MustCompile(`/\*!5`) + sql = re.ReplaceAllString(sql, "/* 5") + + // col varchar(10) CHARACTER SET gbk DEFAULT NULL + re = regexp.MustCompile(`CHARACTER SET [a-z_0-9]* `) + sql = re.ReplaceAllString(sql, "") + + return sql +} + +// buildColumns build column name list +func buildColumns() { + Columns = make(map[string][]string) + for _, schema := range Schemas { + table := fmt.Sprintf("`%s`.`%s`", schema.Table.Schema.String(), schema.Table.Name.String()) + for _, col := range schema.Cols { + Columns[table] = append(Columns[table], fmt.Sprintf("`%s`", col.Name.String())) + } + } +} + +// buildPrimaryKeys build primary key list +func buildPrimaryKeys() { + PrimaryKeys = make(map[string][]string) + for _, schema := range Schemas { + table := fmt.Sprintf("`%s`.`%s`", schema.Table.Schema.String(), schema.Table.Name.String()) + for _, con := range schema.Constraints { + if con.Tp == ast.ConstraintPrimaryKey { + for _, col := range con.Keys { + PrimaryKeys[table] = append(PrimaryKeys[table], fmt.Sprintf("`%s`", col.Column.String())) + } + } + } + // 如果表没有主键,把表的所有列合起来当主键 + if len(PrimaryKeys[table]) == 0 { + PrimaryKeys[table] = Columns[table] + } + } +} + +// buildFakeTable ... +func buildFakeTable(db *sql.DB, table string) string { + var col, key string + var t []byte + var columns, primary []string + res, err := db.Query(fmt.Sprintf("SHOW COLUMNS FROM %s", table)) + if err != nil { + common.Log.Error(err.Error()) + return "" + } + for res.Next() { + res.Scan(&col, &t, &t, &key, &t, &t) + columns = append(columns, fmt.Sprintf("`%s` INT", col)) + if key == "PRI" { + primary = append(primary, fmt.Sprintf("`%s`", col)) + } + } + return fmt.Sprintf("CREATE TABLE %s (%s %s);", table, strings.Join(columns, ","), fmt.Sprintf(", PRIMARY KEY (%s)", strings.Join(primary, ","))) +} diff --git a/rebuild/schema_test.go b/rebuild/schema_test.go new file mode 100644 index 0000000..c5ac204 --- /dev/null +++ b/rebuild/schema_test.go @@ -0,0 +1,48 @@ +/* + * Copyright(c) 2019 Lianjia, Inc. All Rights Reserved + * 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 rebuild + +import ( + "testing" + + "github.com/LianjiaTech/lightning/common" + "github.com/kr/pretty" +) + +func TestLoadSchemaInfo(t *testing.T) { + TestLoadSchemaFromFile(t) + + TestLoadSchemaFromMySQL(t) +} + +func TestLoadSchemaFromFile(t *testing.T) { + schemaFileOrg := common.Config.MySQL.SchemaFile + + common.Config.MySQL.SchemaFile = common.DevPath + "/test/schema.sql" + err := loadSchemaFromFile() + pretty.Println(err, Schemas) + + common.Config.MySQL.SchemaFile = schemaFileOrg +} + +func TestLoadSchemaFromMySQL(t *testing.T) { + master := common.Config.MySQL.MasterInfo + + common.Config.MySQL.MasterInfo = common.DevPath + "/etc/master.info" + common.LoadMasterInfo() + err := loadSchemaFromMySQL() + pretty.Println(err, Schemas) + + common.Config.MySQL.MasterInfo = master +} diff --git a/rebuild/update.go b/rebuild/update.go new file mode 100644 index 0000000..84107d8 --- /dev/null +++ b/rebuild/update.go @@ -0,0 +1,229 @@ +/* + * Copyright(c) 2019 Lianjia, Inc. All Rights Reserved + * 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 rebuild + +import ( + "fmt" + "strings" + + "github.com/LianjiaTech/lightning/common" + + "github.com/siddontang/go-mysql/replication" + lua "github.com/yuin/gopher-lua" +) + +// UpdateRebuild ... +func UpdateRebuild(event *replication.BinlogEvent) string { + switch common.Config.Rebuild.Plugin { + case "sql": + UpdateQuery(event) + case "flashback": + UpdateRollbackQuery(event) + case "stat": + UpdateStat(event) + case "lua": + UpdateLua(event) + default: + fmt.Println("InsertRebuild ...") + } + return "" +} + +// UpdateQuery ... +func UpdateQuery(event *replication.BinlogEvent) { + table := RowEventTable(event) + ev := event.Event.(*replication.RowsEvent) + values := BuildValues(ev) + + var where []string + var set []string + + if ok := PrimaryKeys[table]; ok != nil { + for odd, value := range values { + if odd%2 == 0 { + where = []string{} + set = []string{} + for _, col := range PrimaryKeys[table] { + for i, c := range Columns[table] { + if c == col { + if value[i] == "NULL" { + where = append(where, fmt.Sprintf("%s IS NULL", col)) + } else { + where = append(where, fmt.Sprintf("%s = %s", col, value[i])) + } + } + } + } + } else { + if len(common.Config.Rebuild.IgnoreColumns) > 0 { + for i, col := range Columns[table] { + ignore := false + for _, c := range common.Config.Rebuild.IgnoreColumns { + if c == strings.Trim(col, "`") { + ignore = true + } + } + if !ignore { + set = append(set, fmt.Sprintf("%s = %s", col, value[i])) + } + } + } else { + for i, c := range Columns[table] { + set = append(set, fmt.Sprintf("%s = %s", c, value[i])) + } + } + fmt.Printf("UPDATE %s SET %s WHERE %s LIMIT 1;\n", table, strings.Join(set, ", "), strings.Join(where, " AND ")) + } + } + } else { + for odd, value := range values { + if odd%2 == 0 { + where = []string{} + set = []string{} + for i, v := range value { + if v == "NULL" { + where = append(where, fmt.Sprintf("@%d IS NULL", i)) + } else { + where = append(where, fmt.Sprintf("@%d = %s", i, v)) + } + } + } else { + for i, v := range value { + set = append(set, fmt.Sprintf("@%d = %s", i, v)) + } + fmt.Printf("-- UPDATE %s SET %s WHERE %s LIMIT 1;\n", table, strings.Join(set, ", "), strings.Join(where, " AND ")) + } + } + } +} + +// UpdateRollbackQuery ... +func UpdateRollbackQuery(event *replication.BinlogEvent) { + table := RowEventTable(event) + ev := event.Event.(*replication.RowsEvent) + values := BuildValues(ev) + + var where []string + var set []string + + if ok := PrimaryKeys[table]; ok != nil { + for odd, value := range values { + if odd%2 == 0 { + where = []string{} + set = []string{} + if len(common.Config.Rebuild.IgnoreColumns) > 0 { + for i, col := range Columns[table] { + ignore := false + for _, c := range common.Config.Rebuild.IgnoreColumns { + if c == strings.Trim(col, "`") { + ignore = true + } + } + if !ignore { + set = append(set, fmt.Sprintf("%s = %s", col, value[i])) + } + } + } else { + for i, c := range Columns[table] { + set = append(set, fmt.Sprintf("%s = %s", c, value[i])) + } + } + } else { + for _, col := range PrimaryKeys[table] { + for i, c := range Columns[table] { + if c == col { + if value[i] == "NULL" { + where = append(where, fmt.Sprintf("%s IS NULL", col)) + } else { + where = append(where, fmt.Sprintf("%s = %s", col, value[i])) + } + } + } + } + fmt.Printf("UPDATE %s SET %s WHERE %s LIMIT 1;\n", table, strings.Join(set, ", "), strings.Join(where, " AND ")) + } + } + } else { + for odd, value := range values { + if odd%2 == 0 { + where = []string{} + set = []string{} + for i, v := range value { + set = append(set, fmt.Sprintf("@%d = %s", i, v)) + } + } else { + for i, v := range value { + if v == "NULL" { + where = append(where, fmt.Sprintf("@%d IS NULL", i)) + } else { + where = append(where, fmt.Sprintf("@%d = %s", i, v)) + } + } + fmt.Printf("-- UPDATE %s SET %s WHERE %s LIMIT 1;\n", table, strings.Join(set, ", "), strings.Join(where, " AND ")) + } + } + } +} + +// UpdateStat ... +func UpdateStat(event *replication.BinlogEvent) { + table := RowEventTable(event) + if TableStats[table] != nil { + TableStats[table]["update"]++ + } else { + TableStats[table] = map[string]int64{"update": 1} + } +} + +// UpdateLua ... +func UpdateLua(event *replication.BinlogEvent) { + if common.Config.Rebuild.LuaScript == "" || event == nil { + return + } + + table := RowEventTable(event) + ev := event.Event.(*replication.RowsEvent) + values := BuildValues(ev) + + // lua function + f := lua.P{ + Fn: Lua.GetGlobal("UpdateRewrite"), + NRet: 0, + Protect: true, + } + // lua value + v := lua.LString(table) + var where, set []string + for odd, value := range values { + if odd%2 == 0 { + where = []string{} + set = []string{} + for _, v := range value { + where = append(where, v) + } + } else { + for _, v := range value { + set = append(set, v) + } + + LuaStringList("GoValuesWhere", where) + LuaStringList("GoValuesSet", set) + + if err := Lua.CallByParam(f, v); err != nil { + common.Log.Error(err.Error()) + return + } + } + } +} diff --git a/rebuild/update_test.go b/rebuild/update_test.go new file mode 100644 index 0000000..0efd902 --- /dev/null +++ b/rebuild/update_test.go @@ -0,0 +1,14 @@ +/* + * Copyright(c) 2019 Lianjia, Inc. All Rights Reserved + * 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 rebuild diff --git a/test/binlog.000002 b/test/binlog.000002 new file mode 100644 index 0000000..3e4acc9 Binary files /dev/null and b/test/binlog.000002 differ diff --git a/test/init.sql b/test/init.sql new file mode 100644 index 0000000..3ea6d33 --- /dev/null +++ b/test/init.sql @@ -0,0 +1,11 @@ +FLUSH LOGS; +SET GLOBAL BINLOG_FORMAT=ROW; +SET GLOBAL BINLOG_ROW_IMAGE=FULL; +SET GLOBAL ENFORCE_GTID_CONSISTENCY = ON; +SET GLOBAL GTID_MODE=OFF_PERMISSIVE; +SET GLOBAL GTID_MODE=ON_PERMISSIVE; +SET GLOBAL GTID_MODE=ON; + +/*!80000 ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '******' */; + +FLUSH LOGS; diff --git a/test/schema.sql b/test/schema.sql new file mode 100644 index 0000000..0f0f328 --- /dev/null +++ b/test/schema.sql @@ -0,0 +1,62 @@ +SET NAMES UTF8MB4; + +CREATE DATABASE IF NOT EXISTS test; +USE test; + +DROP TABLE IF EXISTS `tb`; +CREATE TABLE `tb` ( + `a` int(11) NOT NULL, + `b` varchar(10) DEFAULT NULL, + PRIMARY KEY (`a`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +INSERT INTO `tb` VALUES (1, "abc"); +INSERT INTO `tb` VALUES (2, "ghi"); +INSERT INTO `tb` VALUES (3, 'space '); +UPDATE `tb` SET b = "中文" WHERE a = 2; +UPDATE `tb` SET b = "'abc'" WHERE a = 2; +UPDATE `tb` SET b = '"abc' WHERE a = 2; +DELETE FROM `tb` WHERE a = 1; + +DROP TABLE IF EXISTS `setTest`; +CREATE TABLE `setTest` ( + id int(11) AUTO_INCREMENT, + attrib SET('bold','italic','underline'), + PRIMARY KEY (`id`) +); + +INSERT INTO setTest (attrib) VALUES ('bold'); +INSERT INTO setTest (attrib) VALUES ('bold,italic'); +INSERT INTO setTest (attrib) VALUES ('bold,italic,underline'); + +DROP TABLE IF EXISTS `enumTest`; +CREATE TABLE `enumTest` ( + id int(11) AUTO_INCREMENT, + color ENUM('red','green','blue'), + PRIMARY KEY (`id`) +); + +INSERT INTO `enumTest` (color) VALUES ('red'); + +DROP TABLE IF EXISTS `bitTest`; +CREATE TABLE `bitTest` ( + id int(11) AUTO_INCREMENT, + days BIT(7), + PRIMARY KEY(id) +); + +INSERT INTO `bitTest` (`days`) VALUES (B'1111100'); + +CREATE TABLE testNoPRI ( + `a` int, + `b` varchar(10) +); + +INSERT INTO testNoPRI VALUES (1, 'abc'); + +CREATE TABLE `timeTest` ( + `a` timestamp NULL DEFAULT NULL, + `b` datetime DEFAULT NULL +) ENGINE=InnoDB; + +INSERT INTO timeTest VALUES ("2016-06-01 23:55:29", "2016-06-01 23:55:29"); diff --git a/vendor/github.com/BixData/gluabit32/LICENSE b/vendor/github.com/BixData/gluabit32/LICENSE new file mode 100644 index 0000000..843414a --- /dev/null +++ b/vendor/github.com/BixData/gluabit32/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2017 BixData + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/vendor/github.com/BixData/gluabit32/README.md b/vendor/github.com/BixData/gluabit32/README.md new file mode 100644 index 0000000..22feb36 --- /dev/null +++ b/vendor/github.com/BixData/gluabit32/README.md @@ -0,0 +1,37 @@ +# bit32 for GopherLua + +A native Go implementation of [bit32](https://luarocks.org/modules/siffiejoe/bit32) for the [GopherLua](https://github.com/yuin/gopher-lua) VM. + +## Using + +### Loading Module + +```go +import ( + "github.com/BixData/gluabit32" +) + +// Bring up a GopherLua VM +L := lua.NewState() +defer L.Close() + +// Preload bit32 module +gluabit32.Preload(L) +``` + +### Invoking functions + +```go +script := ` + local bit32 = require 'bit32' + return bit32.rshift(5, 1), bit32.rshift(0xffffffff, 0)` +L.DoString(script) +assert.equal(2, L.ToString(-2)) +assert.equal(4294967295, L.ToString(-1)) +``` + +## Testing + +```bash +$ go test +``` diff --git a/vendor/github.com/BixData/gluabit32/band.go b/vendor/github.com/BixData/gluabit32/band.go new file mode 100644 index 0000000..269728a --- /dev/null +++ b/vendor/github.com/BixData/gluabit32/band.go @@ -0,0 +1,13 @@ +package gluabit32 + +import ( + "github.com/yuin/gopher-lua" +) + +func bandFn(L *lua.LState) int { + a := L.CheckInt(1) + b := L.CheckInt(2) + result := a & b + L.Push(lua.LNumber(result)) + return 1 +} diff --git a/vendor/github.com/BixData/gluabit32/bnot.go b/vendor/github.com/BixData/gluabit32/bnot.go new file mode 100644 index 0000000..637f3c8 --- /dev/null +++ b/vendor/github.com/BixData/gluabit32/bnot.go @@ -0,0 +1,12 @@ +package gluabit32 + +import ( + "github.com/yuin/gopher-lua" +) + +func bnotFn(L *lua.LState) int { + a := L.CheckInt(1) + result := ^a + L.Push(lua.LNumber(result)) + return 1 +} diff --git a/vendor/github.com/BixData/gluabit32/bor.go b/vendor/github.com/BixData/gluabit32/bor.go new file mode 100644 index 0000000..facbb62 --- /dev/null +++ b/vendor/github.com/BixData/gluabit32/bor.go @@ -0,0 +1,13 @@ +package gluabit32 + +import ( + "github.com/yuin/gopher-lua" +) + +func borFn(L *lua.LState) int { + a := L.CheckInt(1) + b := L.CheckInt(2) + result := a | b + L.Push(lua.LNumber(result)) + return 1 +} diff --git a/vendor/github.com/BixData/gluabit32/bxor.go b/vendor/github.com/BixData/gluabit32/bxor.go new file mode 100644 index 0000000..e55d737 --- /dev/null +++ b/vendor/github.com/BixData/gluabit32/bxor.go @@ -0,0 +1,13 @@ +package gluabit32 + +import ( + "github.com/yuin/gopher-lua" +) + +func bxorFn(L *lua.LState) int { + a := L.CheckInt(1) + b := L.CheckInt(2) + result := a ^ b + L.Push(lua.LNumber(result)) + return 1 +} diff --git a/vendor/github.com/BixData/gluabit32/gluabit32.go b/vendor/github.com/BixData/gluabit32/gluabit32.go new file mode 100644 index 0000000..d4a6eae --- /dev/null +++ b/vendor/github.com/BixData/gluabit32/gluabit32.go @@ -0,0 +1,30 @@ +package gluabit32 + +import ( + "github.com/yuin/gopher-lua" +) + +// ---------------------------------------------------------------------------- + +var exports = map[string]lua.LGFunction{ + "band": bandFn, + "bnot": bnotFn, + "bor": borFn, + "bxor": bxorFn, + "lshift": lshiftFn, + "rshift": rshiftFn, +} + +// ---------------------------------------------------------------------------- + +func Loader(l *lua.LState) int { + mod := l.SetFuncs(l.NewTable(), exports) + l.Push(mod) + return 1 +} + +// ---------------------------------------------------------------------------- + +func Preload(L *lua.LState) { + L.PreloadModule("bit32", Loader) +} diff --git a/vendor/github.com/BixData/gluabit32/lshift.go b/vendor/github.com/BixData/gluabit32/lshift.go new file mode 100644 index 0000000..d289910 --- /dev/null +++ b/vendor/github.com/BixData/gluabit32/lshift.go @@ -0,0 +1,13 @@ +package gluabit32 + +import ( + "github.com/yuin/gopher-lua" +) + +func lshiftFn(L *lua.LState) int { + a := L.CheckInt(1) + b := L.CheckInt(2) + result := a << uint(b) + L.Push(lua.LNumber(result)) + return 1 +} diff --git a/vendor/github.com/BixData/gluabit32/rshift.go b/vendor/github.com/BixData/gluabit32/rshift.go new file mode 100644 index 0000000..482de0d --- /dev/null +++ b/vendor/github.com/BixData/gluabit32/rshift.go @@ -0,0 +1,14 @@ +package gluabit32 + +import ( + "github.com/yuin/gopher-lua" +) + +// rshift (JavaScript >>> operator) +func rshiftFn(L *lua.LState) int { + n := L.CheckInt64(1) + n2 := L.CheckInt(2) + result := n >> uint8(n2) + L.Push(lua.LNumber(result)) + return 1 +} diff --git a/vendor/github.com/BixData/gluasocket/CHANGELOG.md b/vendor/github.com/BixData/gluasocket/CHANGELOG.md new file mode 100644 index 0000000..9efb802 --- /dev/null +++ b/vendor/github.com/BixData/gluasocket/CHANGELOG.md @@ -0,0 +1,18 @@ +## [0.1.1] - 2018-01-12 +### Added +- Implemented `socket.core.dns` module `getaddrinfo()` +- Implemented `socket.core` module `tcp4()` and `tcp6()` +- Implemented `socket{master}` userData object `bind()` and `listen()` + +## [0.1.0] - 2017-10-14 +### Added +- Fully implemented `mime.core` module in Go, which includes base64 and quoted-printable decoders & encoders +- Fully support `ltn12`, `mime`, `socket`, `socket.ftp`, `socket.headers`, `socket.smtp`, `socket.tp`, and `socket.url` modules by registering appropriate [LuaSocket](https://github.com/diegonehab/luasocket) sources +- Partially support `http` module `request()`, supporting "simple form" GET and POST, complete with SSL support +- Added experimental support of `socket` module `newtry()` and `protect()` using community [LuaSocket](https://github.com/diegonehab/luasocket) Lua sources +- Implemented `socket.core` module `connect()`, `gettime()`, `skip()`, `sleep()`, and `tcp()` in Go +- Implemented `socket.core.dns` module `gethostname()` and `toip()` in Go +- Implemented `socket{client}` userData object `close()`, `getfd()`, `receive('*a')`, `receive('*l')`, `receive()`, `send()`, and `settimeout()` in Go +- Implemented `socket{master}` userData object `close()` (a no-op), `connect()`, and `settimeout()` in Go + +(formatted per [keepachangelog-1.1.0](http://keepachangelog.com/en/1.0.0/)) diff --git a/vendor/github.com/BixData/gluasocket/LICENSE b/vendor/github.com/BixData/gluasocket/LICENSE new file mode 100644 index 0000000..1954973 --- /dev/null +++ b/vendor/github.com/BixData/gluasocket/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2017-2018 BixData + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/vendor/github.com/BixData/gluasocket/README.md b/vendor/github.com/BixData/gluasocket/README.md new file mode 100644 index 0000000..c98876a --- /dev/null +++ b/vendor/github.com/BixData/gluasocket/README.md @@ -0,0 +1,76 @@ +# LuaSocket for GopherLua + +A native Go implementation of [LuaSocket](https://github.com/diegonehab/luasocket) for the [GopherLua](https://github.com/yuin/gopher-lua) VM. + +## Using + +### Loading Modules + +```go +import ( + "github.com/BixData/gluasocket" +) + +// Bring up a GopherLua VM +L := lua.NewState() +defer L.Close() + +// Preload LuaSocket modules +gluasocket.Preload(L) +``` + +### Read lines from a socket + +```go +script := ` + local client = require 'socket'.connect('127.0.0.1', 8000) + local line1 = client:receive('*l') + local line2 = client:receive('*l') + client:close() + return line1, line2` +L.DoString(script) +line1 := L.ToString(-2) +line2 := L.ToString(-1) +``` + +### Get system time + +```go +L.DoString("return require 'socket'.gettime()") +gettimeValue := float64(L.ToNumber(-1)) +``` + +## Testing + +```bash +$ go test github.com/BixData/gluasocket... +ok github.com/BixData/gluasocket 0.045s +? github.com/BixData/gluasocket/ltn12 [no test files] +? github.com/BixData/gluasocket/mime [no test files] +ok github.com/BixData/gluasocket/mimecore 0.040s +? github.com/BixData/gluasocket/socket [no test files] +ok github.com/BixData/gluasocket/socketcore 0.269s +? github.com/BixData/gluasocket/socketexcept [no test files] +? github.com/BixData/gluasocket/socketftp [no test files] +? github.com/BixData/gluasocket/socketheaders [no test files] +? github.com/BixData/gluasocket/sockethttp [no test files] +? github.com/BixData/gluasocket/socketsmtp [no test files] +? github.com/BixData/gluasocket/sockettp [no test files] +? github.com/BixData/gluasocket/socketurl [no test files] +``` + +Some original Lua-based LuaSocket unit tests are used and wrapped in Go unit test functions. Tests that perform `os.exit()` are modified to perform `error()` instead so that errors are made detectable. + +## Design + +### Divergence from LuaSocket source codes + +#### 1. Unit test calls to `os.exit()` replaced with `error()` + +This was necessary in order to detect and report errors from a test runner. Filed [LuaSocket Issue #227](https://github.com/diegonehab/luasocket/issues/227). + +#### 2. Finalized Exceptions moved to pure-Lua + +LuaSocket's exception handling is based on Diego's [Finalized Exceptions](http://lua-users.org/wiki/FinalizedExceptions) whitepaper. + +After struggling to port the C-based `socket.newtry()` and `socket.protect()` functions to GopherLua, an easier path emerged when I discovered the pure-Lua implementations found in the unmerged [LuaSocket Pull Request #161](https://github.com/diegonehab/luasocket/pull/161), which introduces a new `socket.except` module, and makes tiny modifications to the `socket` module in order to use it. This served the purposes of this project perfectly. diff --git a/vendor/github.com/BixData/gluasocket/gluasocket.go b/vendor/github.com/BixData/gluasocket/gluasocket.go new file mode 100644 index 0000000..f4b500f --- /dev/null +++ b/vendor/github.com/BixData/gluasocket/gluasocket.go @@ -0,0 +1,32 @@ +package gluasocket + +import ( + "github.com/BixData/gluasocket/ltn12" + "github.com/BixData/gluasocket/mime" + "github.com/BixData/gluasocket/mimecore" + "github.com/BixData/gluasocket/socket" + "github.com/BixData/gluasocket/socketcore" + "github.com/BixData/gluasocket/socketexcept" + "github.com/BixData/gluasocket/socketftp" + "github.com/BixData/gluasocket/socketheaders" + "github.com/BixData/gluasocket/sockethttp" + "github.com/BixData/gluasocket/socketsmtp" + "github.com/BixData/gluasocket/sockettp" + "github.com/BixData/gluasocket/socketurl" + "github.com/yuin/gopher-lua" +) + +func Preload(L *lua.LState) { + L.PreloadModule("ltn12", gluasocket_ltn12.Loader) + L.PreloadModule("mime.core", gluasocket_mimecore.Loader) + L.PreloadModule("mime", gluasocket_mime.Loader) + L.PreloadModule("socket", gluasocket_socket.Loader) + L.PreloadModule("socket.core", gluasocket_socketcore.Loader) + L.PreloadModule("socket.except", gluasocket_socketexcept.Loader) + L.PreloadModule("socket.ftp", gluasocket_socketftp.Loader) + L.PreloadModule("socket.headers", gluasocket_socketheaders.Loader) + L.PreloadModule("socket.http", gluasocket_sockethttp.Loader) + L.PreloadModule("socket.smtp", gluasocket_socketsmtp.Loader) + L.PreloadModule("socket.tp", gluasocket_sockettp.Loader) + L.PreloadModule("socket.url", gluasocket_socketurl.Loader) +} diff --git a/vendor/github.com/BixData/gluasocket/ltn12/ltn12.go b/vendor/github.com/BixData/gluasocket/ltn12/ltn12.go new file mode 100644 index 0000000..a3749f3 --- /dev/null +++ b/vendor/github.com/BixData/gluasocket/ltn12/ltn12.go @@ -0,0 +1,326 @@ +package gluasocket_ltn12 + +import ( + "github.com/yuin/gopher-lua" +) + +// ---------------------------------------------------------------------------- + +func Loader(l *lua.LState) int { + if err := l.DoString(ltn12DotLua); err != nil { + l.RaiseError("Error loading ltn12.lua: %v", err) + return 0 + } + return 1 +} + +const ltn12DotLua = `----------------------------------------------------------------------------- +-- LTN12 - Filters, sources, sinks and pumps. +-- LuaSocket toolkit. +-- Author: Diego Nehab +----------------------------------------------------------------------------- + +----------------------------------------------------------------------------- +-- Declare module +----------------------------------------------------------------------------- +local string = require("string") +local table = require("table") +local unpack = unpack or table.unpack +local base = _G +local _M = {} +if module then -- heuristic for exporting a global package table + ltn12 = _M +end +local filter,source,sink,pump = {},{},{},{} + +_M.filter = filter +_M.source = source +_M.sink = sink +_M.pump = pump + +local unpack = unpack or table.unpack +local select = base.select + +-- 2048 seems to be better in windows... +_M.BLOCKSIZE = 2048 +_M._VERSION = "LTN12 1.0.3" + +----------------------------------------------------------------------------- +-- Filter stuff +----------------------------------------------------------------------------- +-- returns a high level filter that cycles a low-level filter +function filter.cycle(low, ctx, extra) + base.assert(low) + return function(chunk) + local ret + ret, ctx = low(ctx, chunk, extra) + return ret + end +end + +-- chains a bunch of filters together +-- (thanks to Wim Couwenberg) +function filter.chain(...) + local arg = {...} + local n = base.select('#',...) + local top, index = 1, 1 + local retry = "" + return function(chunk) + retry = chunk and retry + while true do + if index == top then + chunk = arg[index](chunk) + if chunk == "" or top == n then return chunk + elseif chunk then index = index + 1 + else + top = top+1 + index = top + end + else + chunk = arg[index](chunk or "") + if chunk == "" then + index = index - 1 + chunk = retry + elseif chunk then + if index == n then return chunk + else index = index + 1 end + else base.error("filter returned inappropriate nil") end + end + end + end +end + +----------------------------------------------------------------------------- +-- Source stuff +----------------------------------------------------------------------------- +-- create an empty source +local function empty() + return nil +end + +function source.empty() + return empty +end + +-- returns a source that just outputs an error +function source.error(err) + return function() + return nil, err + end +end + +-- creates a file source +function source.file(handle, io_err) + if handle then + return function() + local chunk = handle:read(_M.BLOCKSIZE) + if not chunk then handle:close() end + return chunk + end + else return source.error(io_err or "unable to open file") end +end + +-- turns a fancy source into a simple source +function source.simplify(src) + base.assert(src) + return function() + local chunk, err_or_new = src() + src = err_or_new or src + if not chunk then return nil, err_or_new + else return chunk end + end +end + +-- creates string source +function source.string(s) + if s then + local i = 1 + return function() + local chunk = string.sub(s, i, i+_M.BLOCKSIZE-1) + i = i + _M.BLOCKSIZE + if chunk ~= "" then return chunk + else return nil end + end + else return source.empty() end +end + +-- creates rewindable source +function source.rewind(src) + base.assert(src) + local t = {} + return function(chunk) + if not chunk then + chunk = table.remove(t) + if not chunk then return src() + else return chunk end + else + table.insert(t, chunk) + end + end +end + +-- chains a source with one or several filter(s) +function source.chain(src, f, ...) + if ... then f=filter.chain(f, ...) end + base.assert(src and f) + local last_in, last_out = "", "" + local state = "feeding" + local err + return function() + if not last_out then + base.error('source is empty!', 2) + end + while true do + if state == "feeding" then + last_in, err = src() + if err then return nil, err end + last_out = f(last_in) + if not last_out then + if last_in then + base.error('filter returned inappropriate nil') + else + return nil + end + elseif last_out ~= "" then + state = "eating" + if last_in then last_in = "" end + return last_out + end + else + last_out = f(last_in) + if last_out == "" then + if last_in == "" then + state = "feeding" + else + base.error('filter returned ""') + end + elseif not last_out then + if last_in then + base.error('filter returned inappropriate nil') + else + return nil + end + else + return last_out + end + end + end + end +end + +-- creates a source that produces contents of several sources, one after the +-- other, as if they were concatenated +-- (thanks to Wim Couwenberg) +function source.cat(...) + local arg = {...} + local src = table.remove(arg, 1) + return function() + while src do + local chunk, err = src() + if chunk then return chunk end + if err then return nil, err end + src = table.remove(arg, 1) + end + end +end + +----------------------------------------------------------------------------- +-- Sink stuff +----------------------------------------------------------------------------- +-- creates a sink that stores into a table +function sink.table(t) + t = t or {} + local f = function(chunk, err) + if chunk then table.insert(t, chunk) end + return 1 + end + return f, t +end + +-- turns a fancy sink into a simple sink +function sink.simplify(snk) + base.assert(snk) + return function(chunk, err) + local ret, err_or_new = snk(chunk, err) + if not ret then return nil, err_or_new end + snk = err_or_new or snk + return 1 + end +end + +-- creates a file sink +function sink.file(handle, io_err) + if handle then + return function(chunk, err) + if not chunk then + handle:close() + return 1 + else return handle:write(chunk) end + end + else return sink.error(io_err or "unable to open file") end +end + +-- creates a sink that discards data +local function null() + return 1 +end + +function sink.null() + return null +end + +-- creates a sink that just returns an error +function sink.error(err) + return function() + return nil, err + end +end + +-- chains a sink with one or several filter(s) +function sink.chain(f, snk, ...) + if ... then + local args = { f, snk, ... } + snk = table.remove(args, #args) + f = filter.chain(unpack(args)) + end + base.assert(f and snk) + return function(chunk, err) + if chunk ~= "" then + local filtered = f(chunk) + local done = chunk and "" + while true do + local ret, snkerr = snk(filtered, err) + if not ret then return nil, snkerr end + if filtered == done then return 1 end + filtered = f(done) + end + else return 1 end + end +end + +----------------------------------------------------------------------------- +-- Pump stuff +----------------------------------------------------------------------------- +-- pumps one chunk from the source to the sink +function pump.step(src, snk) + local chunk, src_err = src() + local ret, snk_err = snk(chunk, src_err) + if chunk and ret then return 1 + else return nil, src_err or snk_err end +end + +-- pumps all data from a source to a sink, using a step function +function pump.all(src, snk, step) + base.assert(src and snk) + step = step or pump.step + while true do + local ret, err = step(src, snk) + if not ret then + if err then return nil, err + else return 1 end + end + end +end + +return _M +` diff --git a/vendor/github.com/BixData/gluasocket/mime/mime.go b/vendor/github.com/BixData/gluasocket/mime/mime.go new file mode 100644 index 0000000..c0e75a7 --- /dev/null +++ b/vendor/github.com/BixData/gluasocket/mime/mime.go @@ -0,0 +1,107 @@ +package gluasocket_mime + +import ( + "github.com/yuin/gopher-lua" +) + +// ---------------------------------------------------------------------------- + +func Loader(l *lua.LState) int { + if err := l.DoString(mimeDotLua); err != nil { + l.RaiseError("Error loading mime.lua: %v", err) + return 0 + } + return 1 +} + +const mimeDotLua = `----------------------------------------------------------------------------- +-- MIME support for the Lua language. +-- Author: Diego Nehab +-- Conforming to RFCs 2045-2049 +----------------------------------------------------------------------------- + +----------------------------------------------------------------------------- +-- Declare module and import dependencies +----------------------------------------------------------------------------- +local base = _G +local ltn12 = require("ltn12") +local mime = require("mime.core") +local io = require("io") +local string = require("string") +local _M = mime + +-- encode, decode and wrap algorithm tables +local encodet, decodet, wrapt = {},{},{} + +_M.encodet = encodet +_M.decodet = decodet +_M.wrapt = wrapt + +-- creates a function that chooses a filter by name from a given table +local function choose(table) + return function(name, opt1, opt2) + if base.type(name) ~= "string" then + name, opt1, opt2 = "default", name, opt1 + end + local f = table[name or "nil"] + if not f then + base.error("unknown key (" .. base.tostring(name) .. ")", 3) + else return f(opt1, opt2) end + end +end + +-- define the encoding filters +encodet['base64'] = function() + return ltn12.filter.cycle(_M.b64, "") +end + +encodet['quoted-printable'] = function(mode) + local temp = (mode == "binary") and "=0D=0A" or "\r\n" + return ltn12.filter.cycle(_M.qp, "", temp) +end + +-- define the decoding filters +decodet['base64'] = function() + return ltn12.filter.cycle(_M.unb64, "") +end + +decodet['quoted-printable'] = function() + return ltn12.filter.cycle(_M.unqp, "") +end + +local function format(chunk) + if chunk then + if chunk == "" then return "''" + else return string.len(chunk) end + else return "nil" end +end + +-- define the line-wrap filters +wrapt['text'] = function(length) + length = length or 76 + return ltn12.filter.cycle(_M.wrp, length, length) +end +wrapt['base64'] = wrapt['text'] +wrapt['default'] = wrapt['text'] + +wrapt['quoted-printable'] = function() + return ltn12.filter.cycle(_M.qpwrp, 76, 76) +end + +-- function that choose the encoding, decoding or wrap algorithm +_M.encode = choose(encodet) +_M.decode = choose(decodet) +_M.wrap = choose(wrapt) + +-- define the end-of-line normalization filter +function _M.normalize(marker) + return ltn12.filter.cycle(_M.eol, 0, marker) +end + +-- high level stuffing filter +function _M.stuff() + return ltn12.filter.cycle(_M.dot, 2) +end + +return _M +` diff --git a/vendor/github.com/BixData/gluasocket/mimecore/b64.go b/vendor/github.com/BixData/gluasocket/mimecore/b64.go new file mode 100644 index 0000000..7c2a7ba --- /dev/null +++ b/vendor/github.com/BixData/gluasocket/mimecore/b64.go @@ -0,0 +1,142 @@ +package gluasocket_mimecore + +import ( + "bytes" + + "github.com/yuin/gopher-lua" +) + +var ( + b64base = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" + b64unbase [256]byte +) + +/*-------------------------------------------------------------------------*\ +* Fill base64 decode map. +\*-------------------------------------------------------------------------*/ +func b64setup() { + for i := 0; i <= 255; i++ { + b64unbase[i] = 255 + } + for i := 0; i < 64; i++ { + b64unbase[b64base[i]] = byte(i) + } + b64unbase['='] = 0 +} + +/*-------------------------------------------------------------------------*\ +* Incrementally applies the Base64 transfer content encoding to a string +* A, B = b64(C, D) +* A is the encoded version of the largest prefix of C .. D that is +* divisible by 3. B has the remaining bytes of C .. D, *without* encoding. +* The easiest thing would be to concatenate the two strings and +* encode the result, but we can't afford that or Lua would dupplicate +* every chunk we received. +\*-------------------------------------------------------------------------*/ +func b64Fn(L *lua.LState) int { + var atom bytes.Buffer + + ///* end-of-input blackhole */ + if L.Get(1).Type() == lua.LTNil { + L.Push(lua.LNil) + L.Push(lua.LNil) + return 2 + } + + input := L.ToString(1) + + /* process first part of the input */ + var buffer bytes.Buffer + for i := 0; i < len(input); i++ { + b64encode(input[i], &atom, &buffer) + } + + /* if second part is nil, we are done */ + if L.Get(2).Type() == lua.LTNil { + b64pad(atom, &buffer) + if buffer.Len() == 0 { + L.Push(lua.LNil) + } else { + L.Push(lua.LString(buffer.String())) + } + L.Push(lua.LNil) + return 2 + } + + /* otherwise process the second part */ + input = L.ToString(2) + for i := 0; i < len(input); i++ { + b64encode(input[i], &atom, &buffer) + } + L.Push(lua.LString(buffer.String())) + L.Push(lua.LString(atom.String())) + return 2 +} + +/*-------------------------------------------------------------------------*\ +* Acumulates bytes in input buffer until 3 bytes are available. +* Translate the 3 bytes into Base64 form and append to buffer. +* Returns new number of bytes in buffer. +\*-------------------------------------------------------------------------*/ +func b64encode(c byte, input *bytes.Buffer, buffer *bytes.Buffer) { + input.WriteByte(c) + if input.Len() == 3 { + var code [4]byte + var value uint32 + + value += uint32(input.Next(1)[0]) + value <<= 8 + value += uint32(input.Next(1)[0]) + value <<= 8 + value += uint32(input.Next(1)[0]) + code[3] = b64base[value&0x3f] + + value >>= 6 + code[2] = b64base[value&0x3f] + + value >>= 6 + code[1] = b64base[value&0x3f] + + value >>= 6 + code[0] = b64base[value] + + buffer.WriteString(string(code[:])) + } +} + +/*-------------------------------------------------------------------------*\ +* Encodes the Base64 last 1 or 2 bytes and adds padding '=' +* Result, if any, is appended to buffer. +* Returns 0. +\*-------------------------------------------------------------------------*/ +func b64pad(input bytes.Buffer, buffer *bytes.Buffer) { + var value uint64 + code := []byte("====") + switch input.Len() { + case 1: + value = uint64(input.Next(1)[0]) << 4 + code[1] = b64base[value&0x3f] + + value >>= 6 + code[0] = b64base[value] + + buffer.WriteString(string(code)) + break + case 2: + value = uint64(input.Next(1)[0]) << 8 + value |= uint64(input.Next(1)[0]) + value <<= 2 + code[2] = b64base[value&0x3f] + + value >>= 6 + code[1] = b64base[value&0x3f] + + value >>= 6 + code[0] = b64base[value] + + buffer.WriteString(string(code)) + break + default: + break + } +} diff --git a/vendor/github.com/BixData/gluasocket/mimecore/dot.go b/vendor/github.com/BixData/gluasocket/mimecore/dot.go new file mode 100644 index 0000000..e01a851 --- /dev/null +++ b/vendor/github.com/BixData/gluasocket/mimecore/dot.go @@ -0,0 +1,45 @@ +package gluasocket_mimecore + +import ( + "bytes" + + "github.com/yuin/gopher-lua" +) + +/*-------------------------------------------------------------------------*\ +* Incrementally applies smtp stuffing to a string +* A, n = dot(l, D) +\*-------------------------------------------------------------------------*/ +func dotFn(l *lua.LState) int { + state := l.ToNumber(1) + input := l.ToString(2) + var buffer bytes.Buffer + for _, c := range input { + state = dot(c, state, &buffer) + } + l.Push(lua.LString(buffer.String())) + l.Push(state) + return 2 +} + +/*-------------------------------------------------------------------------*\ +* Takes one byte and stuff it if needed. +\*-------------------------------------------------------------------------*/ +func dot(c rune, state lua.LNumber, buffer *bytes.Buffer) lua.LNumber { + buffer.WriteRune(c) + switch c { + case '\r': + return 1 + case '\n': + if state == 1 { + return 2 + } else { + return 0 + } + case '.': + if state == 2 { + buffer.WriteRune('.') + } + } + return 0 +} diff --git a/vendor/github.com/BixData/gluasocket/mimecore/eol.go b/vendor/github.com/BixData/gluasocket/mimecore/eol.go new file mode 100644 index 0000000..5fa58db --- /dev/null +++ b/vendor/github.com/BixData/gluasocket/mimecore/eol.go @@ -0,0 +1,65 @@ +package gluasocket_mimecore + +import ( + "bytes" + + "github.com/yuin/gopher-lua" +) + +/*-------------------------------------------------------------------------*\ +* Converts a string to uniform EOL convention. +* A, n = eol(o, B, marker) +* A is the converted version of the largest prefix of B that can be +* converted unambiguously. 'o' is the context returned by the previous +* call. 'n' is the new context. +\*-------------------------------------------------------------------------*/ +func eolFn(L *lua.LState) int { + ctx := rune(L.OptInt(1, 1)) + + /* end of input blackhole */ + if L.Get(2).Type() == lua.LTNil { + L.Push(lua.LNil) + L.Push(lua.LNumber(0)) + return 2 + } + + /* process all input */ + var buffer bytes.Buffer + marker := L.OptString(3, "\r\n") + input := L.ToString(2) + for _, c := range input { + ctx = eolprocess(c, ctx, marker, &buffer) + } + + L.Push(lua.LString(buffer.String())) + L.Push(lua.LNumber(ctx)) + return 2 +} + +/*-------------------------------------------------------------------------*\ +* Here is what we do: \n, and \r are considered candidates for line +* break. We issue *one* new line marker if any of them is seen alone, or +* followed by a different one. That is, \n\n and \r\r will issue two +* end of line markers each, but \r\n, \n\r etc will only issue *one* +* marker. This covers Mac OS, Mac OS X, VMS, Unix and DOS, as well as +* probably other more obscure conventions. +* +* c is the current character being processed +* last is the previous character +\*-------------------------------------------------------------------------*/ +func eolprocess(c rune, last rune, marker string, buffer *bytes.Buffer) rune { + if c == '\r' || c == '\n' { + if last == '\r' || last == '\n' { + if c == last { + buffer.WriteString(marker) + } + return 0 + } else { + buffer.WriteString(marker) + return c + } + } else { + buffer.WriteRune(c) + return 0 + } +} diff --git a/vendor/github.com/BixData/gluasocket/mimecore/mimecore.go b/vendor/github.com/BixData/gluasocket/mimecore/mimecore.go new file mode 100644 index 0000000..93bc39d --- /dev/null +++ b/vendor/github.com/BixData/gluasocket/mimecore/mimecore.go @@ -0,0 +1,30 @@ +package gluasocket_mimecore + +import ( + "github.com/yuin/gopher-lua" +) + +// ---------------------------------------------------------------------------- + +var exports = map[string]lua.LGFunction{ + "b64": b64Fn, + "dot": dotFn, + "eol": eolFn, + "qp": qpFn, + "qpwrp": qpwrpFn, + "unb64": unb64Fn, + "unqp": unqpFn, + "wrp": wrpFn, +} + +// ---------------------------------------------------------------------------- + +func Loader(l *lua.LState) int { + mod := l.SetFuncs(l.NewTable(), exports) + l.Push(mod) + + qpsetup() + b64setup() + + return 1 +} diff --git a/vendor/github.com/BixData/gluasocket/mimecore/qp.go b/vendor/github.com/BixData/gluasocket/mimecore/qp.go new file mode 100644 index 0000000..7e6de10 --- /dev/null +++ b/vendor/github.com/BixData/gluasocket/mimecore/qp.go @@ -0,0 +1,201 @@ +package gluasocket_mimecore + +import ( + "bytes" + + "github.com/yuin/gopher-lua" +) + +const ( + qpbase = "0123456789ABCDEF" + + QP_PLAIN = iota + QP_QUOTED + QP_CR + QP_IF_LAST +) + +var ( + qpclass, qpunbase [256]byte +) + +/*-------------------------------------------------------------------------*\ +* Incrementally converts a string to quoted-printable +* A, B = qp(C, D, marker) +* Marker is the text to be used to replace CRLF sequences found in A. +* A is the encoded version of the largest prefix of C .. D that +* can be encoded without doubts. +* B has the remaining bytes of C .. D, *without* encoding. +\*-------------------------------------------------------------------------*/ +func qpFn(l *lua.LState) int { + var atom bytes.Buffer + + // end-of-input blackhole + if l.Get(1).Type() == lua.LTNil { + l.Push(lua.LNil) + l.Push(lua.LNil) + return 2 + } + + input := l.ToString(1) + + marker := "\r\n" + if l.Get(3).Type() == lua.LTString { + marker = l.ToString(3) + } + + // process first part of input + var buffer bytes.Buffer + for i := 0; i < len(input); i++ { + qpencode(input[i], &atom, marker, &buffer) + } + + // if second part is nil, we are done + if l.Get(2).Type() == lua.LTNil { + qppad(atom, &buffer) + if buffer.Len() == 0 { + l.Push(lua.LNil) + } else { + l.Push(lua.LString(buffer.String())) + } + l.Push(lua.LNil) + return 2 + } + + // otherwise process rest of input + input = l.ToString(2) + for i := 0; i < len(input); i++ { + qpencode(input[i], &atom, marker, &buffer) + } + + l.Push(lua.LString(buffer.String())) + l.Push(lua.LString(atom.String())) + return 2 +} + +/*-------------------------------------------------------------------------*\ +* Split quoted-printable characters into classes +* Precompute reverse map for encoding +\*-------------------------------------------------------------------------*/ +func qpsetup() { + for i := 0; i < 256; i++ { + qpclass[i] = QP_QUOTED + } + for i := 33; i <= 60; i++ { + qpclass[i] = QP_PLAIN + } + for i := 62; i <= 126; i++ { + qpclass[i] = QP_PLAIN + } + + qpclass['\t'] = QP_IF_LAST + qpclass[' '] = QP_IF_LAST + qpclass['\r'] = QP_CR + + for i := 0; i < 256; i++ { + qpunbase[i] = 255 + } + qpunbase['0'] = 0 + qpunbase['1'] = 1 + qpunbase['2'] = 2 + qpunbase['3'] = 3 + qpunbase['4'] = 4 + qpunbase['5'] = 5 + qpunbase['6'] = 6 + qpunbase['7'] = 7 + qpunbase['8'] = 8 + qpunbase['9'] = 9 + qpunbase['A'] = 10 + qpunbase['a'] = 10 + qpunbase['B'] = 11 + qpunbase['b'] = 11 + qpunbase['C'] = 12 + qpunbase['c'] = 12 + qpunbase['D'] = 13 + qpunbase['d'] = 13 + qpunbase['e'] = 14 + qpunbase['e'] = 14 + qpunbase['F'] = 15 + qpunbase['f'] = 15 +} + +/*-------------------------------------------------------------------------*\ +* Accumulate characters until we are sure about how to deal with them. +* Once we are sure, output to the buffer, in the correct form. +\*-------------------------------------------------------------------------*/ +func qpencode(c byte, input *bytes.Buffer, marker string, buffer *bytes.Buffer) { + input.WriteByte(c) + + // deal with all characters we can have + for input.Len() > 0 { + inputBytes := input.Bytes() + klass := qpclass[inputBytes[0]] + + switch klass { + + // might be the CR of a CRLF sequence + case QP_CR: + if len(inputBytes) < 2 { + return + } + if inputBytes[1] == '\n' { + buffer.WriteString(marker) + input.Next(2) + return + } else { + qpquote(inputBytes[0], buffer) + } + break + // might be a space and that has to be quoted if last in line + case QP_IF_LAST: + if len(inputBytes) < 3 { + return + } + // if it is the last, quote it and we are done + if inputBytes[1] == '\r' && inputBytes[2] == '\n' { + qpquote(inputBytes[0], buffer) + buffer.WriteString(marker) + input.Next(2) + return + } else { + buffer.WriteByte(inputBytes[0]) + } + break + // might have to be quoted always + case QP_QUOTED: + qpquote(inputBytes[0], buffer) + break + // might never have to be quoted + default: + buffer.WriteByte(inputBytes[0]) + break + } + input.Next(1) + } +} + +/*-------------------------------------------------------------------------*\ +* Deal with the final characters +\*-------------------------------------------------------------------------*/ +func qppad(input bytes.Buffer, buffer *bytes.Buffer) int { + for _, c := range input.Bytes() { + if qpclass[c] == QP_PLAIN { + buffer.WriteByte(c) + } else { + qpquote(c, buffer) + } + } + if input.Len() > 0 { + buffer.WriteString("=\r\n") + } + return 0 +} + +/*-------------------------------------------------------------------------*\ +* Output one character in form =XX +\*-------------------------------------------------------------------------*/ +func qpquote(c byte, buffer *bytes.Buffer) { + buffer.WriteRune('=') + buffer.WriteByte(qpbase[c>>4]) + buffer.WriteByte(qpbase[c&0x0f]) +} diff --git a/vendor/github.com/BixData/gluasocket/mimecore/qpwrp.go b/vendor/github.com/BixData/gluasocket/mimecore/qpwrp.go new file mode 100644 index 0000000..8147fbd --- /dev/null +++ b/vendor/github.com/BixData/gluasocket/mimecore/qpwrp.go @@ -0,0 +1,79 @@ +package gluasocket_mimecore + +import ( + "bytes" + + "github.com/yuin/gopher-lua" +) + +/*-------------------------------------------------------------------------*\ +* Incrementally breaks a quoted-printed string into lines +* A, n = qpwrp(l, B, length) +* A is a copy of B, broken into lines of at most 'length' bytes. +* 'l' is how many bytes are left for the first line of B. +* 'n' is the number of bytes left in the last line of A. +* There are two complications: lines can't be broken in the middle +* of an encoded =XX, and there might be line breaks already +\*-------------------------------------------------------------------------*/ +func qpwrpFn(L *lua.LState) int { + left := L.ToNumber(1) + + inputArg := L.Get(2) + var input string + if inputArg.Type() != lua.LTNil { + input = inputArg.String() + } + + lengthArg := L.Get(3) + var length lua.LNumber + if lengthArg.Type() == lua.LTNumber { + length = lengthArg.(lua.LNumber) + } else { + length = 76 + } + + var buffer bytes.Buffer + + // end-of-input blackhole + if inputArg.Type() == lua.LTNil { + if left < length { + L.Push(lua.LString("=\r\n")) + } else { + L.Push(lua.LNil) + } + L.Push(lua.LNumber(length)) + return 2 + } + + // process all input + for _, c := range input { + switch c { + case '\r': + break + case '\n': + left = length + buffer.WriteString("\r\n") + break + case '=': + if left <= 3 { + left = length + buffer.WriteString("=\r\n") + } + buffer.WriteRune(c) + left-- + break + default: + if left <= 1 { + left = length + buffer.WriteString("=\r\n") + } + buffer.WriteRune(c) + left-- + break + } + } + + L.Push(lua.LString(buffer.String())) + L.Push(left) + return 2 +} diff --git a/vendor/github.com/BixData/gluasocket/mimecore/unb64.go b/vendor/github.com/BixData/gluasocket/mimecore/unb64.go new file mode 100644 index 0000000..3ecac1b --- /dev/null +++ b/vendor/github.com/BixData/gluasocket/mimecore/unb64.go @@ -0,0 +1,107 @@ +package gluasocket_mimecore + +import ( + "bytes" + + "github.com/yuin/gopher-lua" +) + +/*-------------------------------------------------------------------------*\ +* Incrementally removes the Base64 transfer content encoding from a string +* A, B = b64(C, D) +* A is the encoded version of the largest prefix of C .. D that is +* divisible by 4. B has the remaining bytes of C .. D, *without* encoding. +\*-------------------------------------------------------------------------*/ +func unb64Fn(L *lua.LState) int { + /* end-of-input blackhole */ + if L.Get(1).Type() == lua.LTNil { + L.Push(lua.LNil) + L.Push(lua.LNil) + return 2 + } + + /* process first part of the input */ + input := L.ToString(1) + var atom, buffer bytes.Buffer + for _, c := range input { + b64decode(c, &atom, &buffer) + } + + if L.Get(2).Type() == lua.LTNil { + if buffer.Len() == 0 { + L.Push(lua.LNil) + } else { + L.Push(lua.LString(buffer.String())) + } + L.Push(lua.LNil) + return 2 + } + + /* otherwise, process the rest of the input */ + input = L.ToString(2) + for _, c := range input { + b64decode(c, &atom, &buffer) + } + + L.Push(lua.LString(buffer.String())) + L.Push(lua.LString(atom.String())) + return 2 +} + +/*-------------------------------------------------------------------------*\ +* Acumulates bytes in input buffer until 4 bytes are available. +* Translate the 4 bytes from Base64 form and append to buffer. +* Returns new number of bytes in buffer. +\*-------------------------------------------------------------------------*/ +func b64decode(c rune, input *bytes.Buffer, buffer *bytes.Buffer) { + /* ignore invalid characters */ + if b64unbase[c] > 64 { + return + } + input.WriteRune(c) + + /* decode atom */ + if input.Len() == 4 { + var decoded [3]byte + var value uint64 + var valid int + + input0 := input.Next(1)[0] + value = uint64(b64unbase[input0]) + value <<= 6 + + input1 := input.Next(1)[0] + value |= uint64(b64unbase[input1]) + value <<= 6 + + input2 := input.Next(1)[0] + value |= uint64(b64unbase[input2]) + value <<= 6 + + input3 := input.Next(1)[0] + value |= uint64(b64unbase[input3]) + + decoded[2] = byte(value & 0xff) + + value >>= 8 + decoded[1] = byte(value & 0xff) + + value >>= 8 + decoded[0] = byte(value) + + /* take care of padding */ + if input2 == '=' { + valid = 1 + } else { + if input3 == '=' { + valid = 2 + } else { + valid = 3 + } + } + + for i := 0; i < valid; i++ { + buffer.WriteByte(decoded[i]) + } + } +} diff --git a/vendor/github.com/BixData/gluasocket/mimecore/unqp.go b/vendor/github.com/BixData/gluasocket/mimecore/unqp.go new file mode 100644 index 0000000..2803358 --- /dev/null +++ b/vendor/github.com/BixData/gluasocket/mimecore/unqp.go @@ -0,0 +1,105 @@ +package gluasocket_mimecore + +import ( + "bytes" + + "github.com/yuin/gopher-lua" +) + +/*-------------------------------------------------------------------------*\ +* Incrementally decodes a string in quoted-printable +* A, B = qp(C, D) +* A is the decoded version of the largest prefix of C .. D that +* can be decoded without doubts. +* B has the remaining bytes of C .. D, *without* decoding. +\*-------------------------------------------------------------------------*/ +func unqpFn(l *lua.LState) int { + var atom bytes.Buffer + + if l.Get(1).Type() == lua.LTNil { + l.Push(lua.LNil) + l.Push(lua.LNil) + return 2 + } + + input := l.ToString(1) + var buffer bytes.Buffer + + /* process first part of input */ + for _, c := range input { + qpdecode(c, &atom, &buffer) + } + + /* if second part is nil, we are done */ + if l.Get(2).Type() == lua.LTNil { + if buffer.Len() == 0 { + l.Push(lua.LNil) + } else { + l.Push(lua.LString(buffer.String())) + } + l.Push(lua.LNil) + return 2 + } + + /* otherwise process rest of input */ + input = l.ToString(2) + for _, c := range input { + qpdecode(c, &atom, &buffer) + } + + l.Push(lua.LString(buffer.String())) + l.Push(lua.LString(atom.String())) + return 2 +} + +/*-------------------------------------------------------------------------*\ +* Accumulate characters until we are sure about how to deal with them. +* Once we are sure, output the to the buffer, in the correct form. +\*-------------------------------------------------------------------------*/ +func qpdecode(c rune, input *bytes.Buffer, buffer *bytes.Buffer) { + input.WriteRune(c) + + /* deal with all characters we can deal */ + inputBytes := input.Bytes() + switch inputBytes[0] { + /* if we have an escape character */ + case '=': + if len(inputBytes) < 3 { + return + } + /* eliminate soft line break */ + if inputBytes[1] == '\r' && inputBytes[2] == '\n' { + return + } + /* decode quoted representation */ + c_ := qpunbase[inputBytes[1]] + d := qpunbase[inputBytes[2]] + + /* if it is an invalid, do not decode */ + if c_ > 15 || d > 15 { + buffer.WriteByte(inputBytes[0]) + buffer.WriteByte(inputBytes[1]) + buffer.WriteByte(inputBytes[2]) + input.Next(3) + } else { + buffer.WriteByte((c_ << 4) + d) + input.Next(3) + return + } + case '\r': + if len(inputBytes) < 2 { + return + } + if inputBytes[1] == '\n' { + buffer.WriteByte(inputBytes[0]) + buffer.WriteByte(inputBytes[1]) + input.Next(2) + } + return + default: + if inputBytes[0] == '\t' || (inputBytes[0] > 31 && inputBytes[0] < 127) { + buffer.WriteByte(inputBytes[0]) + input.Next(1) + } + } +} diff --git a/vendor/github.com/BixData/gluasocket/mimecore/wrp.go b/vendor/github.com/BixData/gluasocket/mimecore/wrp.go new file mode 100644 index 0000000..33e6ca1 --- /dev/null +++ b/vendor/github.com/BixData/gluasocket/mimecore/wrp.go @@ -0,0 +1,58 @@ +package gluasocket_mimecore + +import ( + "bytes" + + "github.com/yuin/gopher-lua" +) + +/*-------------------------------------------------------------------------*\ +* Incrementaly breaks a string into lines. The string can have CRLF breaks. +* A, n = wrp(l, B, length) +* A is a copy of B, broken into lines of at most 'length' bytes. +* 'l' is how many bytes are left for the first line of B. +* 'n' is the number of bytes left in the last line of A. +\*-------------------------------------------------------------------------*/ +func wrpFn(L *lua.LState) int { + left := L.ToNumber(1) + length := L.OptNumber(3, lua.LNumber(76)) + + /* end of input black-hole */ + if L.Get(2).Type() == lua.LTNil { + if left < length { + /* if last line has not been terminated, add a line break */ + L.Push(lua.LString("\r\n")) + } else { + /* otherwise, we are done */ + L.Push(lua.LNil) + } + L.Push(length) + return 2 + } + + var buffer bytes.Buffer + + input := L.ToString(2) + for _, c := range input { + // switch (*input) { + switch c { + case '\r': + break + case '\n': + buffer.WriteString("\r\n") + left = length + break + default: + if left <= 0 { + left = length + buffer.WriteString("\r\n") + } + buffer.WriteRune(c) + left-- + break + } + } + L.Push(lua.LString(buffer.String())) + L.Push(left) + return 2 +} diff --git a/vendor/github.com/BixData/gluasocket/socket/socket.go b/vendor/github.com/BixData/gluasocket/socket/socket.go new file mode 100644 index 0000000..8ed98e5 --- /dev/null +++ b/vendor/github.com/BixData/gluasocket/socket/socket.go @@ -0,0 +1,169 @@ +package gluasocket_socket + +import ( + "github.com/yuin/gopher-lua" +) + +// ---------------------------------------------------------------------------- + +func Loader(l *lua.LState) int { + if err := l.DoString(socketDotLua); err != nil { + l.RaiseError("Error loading socket.lua: %v", err) + return 0 + } + return 1 +} + +const socketDotLua = `----------------------------------------------------------------------------- +-- LuaSocket helper module +-- Author: Diego Nehab +----------------------------------------------------------------------------- + +----------------------------------------------------------------------------- +-- Declare module and import dependencies +----------------------------------------------------------------------------- +local base = _G +local string = require("string") +local math = require("math") +local socket = require("socket.core") +local except = require("socket.except") + +local _M = socket + +----------------------------------------------------------------------------- +-- Exported auxiliar functions +----------------------------------------------------------------------------- +function _M.connect4(address, port, laddress, lport) + return socket.connect(address, port, laddress, lport, "inet") +end + +function _M.connect6(address, port, laddress, lport) + return socket.connect(address, port, laddress, lport, "inet6") +end + +function _M.bind(host, port, backlog) + if host == "*" then host = "0.0.0.0" end + local addrinfo, err = socket.dns.getaddrinfo(host); + if not addrinfo then return nil, err end + local sock, res + err = "no info on address" + for i, alt in base.ipairs(addrinfo) do + if alt.family == "inet" then + sock, err = socket.tcp4() + else + sock, err = socket.tcp6() + end + if not sock then return nil, err end + sock:setoption("reuseaddr", true) + res, err = sock:bind(alt.addr, port) + if not res then + sock:close() + else + res, err = sock:listen(backlog) + if not res then + sock:close() + else + return sock + end + end + end + return nil, err +end + +_M.newtry = except.newtry +_M.try = _M.newtry() +_M.protect = except.protect + +function _M.choose(table) + return function(name, opt1, opt2) + if base.type(name) ~= "string" then + name, opt1, opt2 = "default", name, opt1 + end + local f = table[name or "nil"] + if not f then base.error("unknown key (".. base.tostring(name) ..")", 3) + else return f(opt1, opt2) end + end +end + +----------------------------------------------------------------------------- +-- Socket sources and sinks, conforming to LTN12 +----------------------------------------------------------------------------- +-- create namespaces inside LuaSocket namespace +local sourcet, sinkt = {}, {} +_M.sourcet = sourcet +_M.sinkt = sinkt + +_M.BLOCKSIZE = 2048 + +sinkt["close-when-done"] = function(sock) + return base.setmetatable({ + getfd = function() return sock:getfd() end, + dirty = function() return sock:dirty() end + }, { + __call = function(self, chunk, err) + if not chunk then + sock:close() + return 1 + else return sock:send(chunk) end + end + }) +end + +sinkt["keep-open"] = function(sock) + return base.setmetatable({ + getfd = function() return sock:getfd() end, + dirty = function() return sock:dirty() end + }, { + __call = function(self, chunk, err) + if chunk then return sock:send(chunk) + else return 1 end + end + }) +end + +sinkt["default"] = sinkt["keep-open"] + +_M.sink = _M.choose(sinkt) + +sourcet["by-length"] = function(sock, length) + return base.setmetatable({ + getfd = function() return sock:getfd() end, + dirty = function() return sock:dirty() end + }, { + __call = function() + if length <= 0 then return nil end + local size = math.min(socket.BLOCKSIZE, length) + local chunk, err = sock:receive(size) + if err then return nil, err end + length = length - string.len(chunk) + return chunk + end + }) +end + +sourcet["until-closed"] = function(sock) + local done + return base.setmetatable({ + getfd = function() return sock:getfd() end, + dirty = function() return sock:dirty() end + }, { + __call = function() + if done then return nil end + local chunk, err, partial = sock:receive(socket.BLOCKSIZE) + if not err then return chunk + elseif err == "closed" then + sock:close() + done = 1 + return partial + else return nil, err end + end + }) +end + + +sourcet["default"] = sourcet["until-closed"] + +_M.source = _M.choose(sourcet) + +return _M +` diff --git a/vendor/github.com/BixData/gluasocket/socketcore/client.go b/vendor/github.com/BixData/gluasocket/socketcore/client.go new file mode 100644 index 0000000..15cbff5 --- /dev/null +++ b/vendor/github.com/BixData/gluasocket/socketcore/client.go @@ -0,0 +1,45 @@ +package gluasocket_socketcore + +import ( + "bufio" + "net" + "time" + + "github.com/yuin/gopher-lua" +) + +const ( + CLIENT_TYPENAME = "tcp{client}" +) + +type Client struct { + Conn net.Conn + Timeout time.Duration + Reader *bufio.Reader +} + +var clientMethods = map[string]lua.LGFunction{ + "close": clientCloseMethod, + "dirty": clientDirtyMethod, + "getfd": clientGetFdMethod, + "getpeername": clientGetPeerNameMethod, + "getsockname": clientGetSockNameMethod, + "getstats": clientGetStatsMethod, + "receive": clientReceiveMethod, + "settimeout": clientSetTimeoutMethod, + "send": clientSendMethod, + "setoption": clientSetOptionMethod, + "setstats": clientSetStatsMethod, + "shutdown": clientShutdownMethod, +} + +// ---------------------------------------------------------------------------- + +func checkClient(L *lua.LState) *Client { + ud := L.CheckUserData(1) + if v, ok := ud.Value.(*Client); ok { + return v + } + L.ArgError(1, "client expected") + return nil +} diff --git a/vendor/github.com/BixData/gluasocket/socketcore/clientclose.go b/vendor/github.com/BixData/gluasocket/socketcore/clientclose.go new file mode 100644 index 0000000..ed5b9c4 --- /dev/null +++ b/vendor/github.com/BixData/gluasocket/socketcore/clientclose.go @@ -0,0 +1,13 @@ +package gluasocket_socketcore + +import ( + "github.com/yuin/gopher-lua" +) + +func clientCloseMethod(L *lua.LState) int { + client := checkClient(L) + if err := client.Conn.Close(); err != nil { + L.RaiseError(err.Error()) + } + return 0 +} diff --git a/vendor/github.com/BixData/gluasocket/socketcore/clientdirty.go b/vendor/github.com/BixData/gluasocket/socketcore/clientdirty.go new file mode 100644 index 0000000..a8bbe83 --- /dev/null +++ b/vendor/github.com/BixData/gluasocket/socketcore/clientdirty.go @@ -0,0 +1,10 @@ +package gluasocket_socketcore + +import ( + "github.com/yuin/gopher-lua" +) + +func clientDirtyMethod(L *lua.LState) int { + L.Push(lua.LBool(false)) + return 1 +} diff --git a/vendor/github.com/BixData/gluasocket/socketcore/clientgetfd.go b/vendor/github.com/BixData/gluasocket/socketcore/clientgetfd.go new file mode 100644 index 0000000..3b3ae9f --- /dev/null +++ b/vendor/github.com/BixData/gluasocket/socketcore/clientgetfd.go @@ -0,0 +1,18 @@ +package gluasocket_socketcore + +import ( + "net" + + "github.com/yuin/gopher-lua" +) + +func clientGetFdMethod(L *lua.LState) int { + client := checkClient(L) + if file, err := client.Conn.(*net.TCPConn).File(); err != nil { + L.RaiseError(err.Error()) + return 0 + } else { + L.Push(lua.LNumber(file.Fd())) + return 1 + } +} diff --git a/vendor/github.com/BixData/gluasocket/socketcore/clientgetpeername.go b/vendor/github.com/BixData/gluasocket/socketcore/clientgetpeername.go new file mode 100644 index 0000000..dbb06f1 --- /dev/null +++ b/vendor/github.com/BixData/gluasocket/socketcore/clientgetpeername.go @@ -0,0 +1,10 @@ +package gluasocket_socketcore + +import ( + "github.com/yuin/gopher-lua" +) + +func clientGetPeerNameMethod(L *lua.LState) int { + L.RaiseError("client:getpeername() not implemented yet") + return 0 +} diff --git a/vendor/github.com/BixData/gluasocket/socketcore/clientgetsockname.go b/vendor/github.com/BixData/gluasocket/socketcore/clientgetsockname.go new file mode 100644 index 0000000..4a4fbdb --- /dev/null +++ b/vendor/github.com/BixData/gluasocket/socketcore/clientgetsockname.go @@ -0,0 +1,10 @@ +package gluasocket_socketcore + +import ( + "github.com/yuin/gopher-lua" +) + +func clientGetSockNameMethod(L *lua.LState) int { + L.RaiseError("client:getsockname() not implemented yet") + return 0 +} diff --git a/vendor/github.com/BixData/gluasocket/socketcore/clientgetstats.go b/vendor/github.com/BixData/gluasocket/socketcore/clientgetstats.go new file mode 100644 index 0000000..b14ec4b --- /dev/null +++ b/vendor/github.com/BixData/gluasocket/socketcore/clientgetstats.go @@ -0,0 +1,10 @@ +package gluasocket_socketcore + +import ( + "github.com/yuin/gopher-lua" +) + +func clientGetStatsMethod(L *lua.LState) int { + L.RaiseError("client:getstats() not implemented yet") + return 0 +} diff --git a/vendor/github.com/BixData/gluasocket/socketcore/clientreceive.go b/vendor/github.com/BixData/gluasocket/socketcore/clientreceive.go new file mode 100644 index 0000000..1f84dcb --- /dev/null +++ b/vendor/github.com/BixData/gluasocket/socketcore/clientreceive.go @@ -0,0 +1,105 @@ +package gluasocket_socketcore + +import ( + "bytes" + "io" + "net" + "time" + + "github.com/yuin/gopher-lua" +) + +func clientReceiveMethod(L *lua.LState) int { + client := checkClient(L) + pattern := L.Get(2) + //prefix := "" // TODO L.CheckString(3) + + // Read a number of bytes from the socket + if pattern.Type() == lua.LTNumber { + if client.Timeout <= 0 { + client.Conn.SetDeadline(time.Time{}) + } else { + client.Conn.SetDeadline(time.Now().Add(client.Timeout)) + } + var buf bytes.Buffer + bytesToRead := L.ToInt(2) + for i := 0; i < bytesToRead; i++ { + byte, err := client.Reader.ReadByte() + if err == io.EOF { + break + } + if err != nil { + errstr := err.Error() + if err, ok := err.(net.Error); ok && err.Timeout() { + errstr = "timeout" + } + L.Push(lua.LNil) + L.Push(lua.LString(errstr)) + return 2 + } + buf.WriteByte(byte) + } + L.Push(lua.LString(string(buf.Bytes()))) + return 1 + } + + // Read a line of text from the socket. Line separators are not returned. + // This is the default pattern so nil is the same as "*l". + if pattern.Type() == lua.LTNil || (pattern.Type() == lua.LTString && pattern.String() == "*l") { + var buf bytes.Buffer + for { + if client.Timeout <= 0 { + client.Conn.SetDeadline(time.Time{}) + } else { + client.Conn.SetDeadline(time.Now().Add(client.Timeout)) + } + line, isPrefix, err := client.Reader.ReadLine() + if err != nil { + errstr := err.Error() + if err, ok := err.(net.Error); ok && err.Timeout() { + errstr = "timeout" + } + L.Push(lua.LNil) + L.Push(lua.LString(errstr)) + return 2 + } + buf.Write(line) + if !isPrefix { + break + } + } + L.Push(lua.LString(string(buf.Bytes()))) + return 1 + } + + // Read until the connection is closed + if pattern.Type() == lua.LTString && pattern.String() == "*a" { + if client.Timeout <= 0 { + client.Conn.SetDeadline(time.Time{}) + } else { + client.Conn.SetDeadline(time.Now().Add(client.Timeout)) + } + var buf bytes.Buffer + for { + byte, err := client.Reader.ReadByte() + if err == io.EOF { + break + } + if err != nil { + errstr := err.Error() + if err, ok := err.(net.Error); ok && err.Timeout() { + errstr = "timeout" + } + L.Push(lua.LNil) + L.Push(lua.LString(errstr)) + return 2 + } + buf.WriteByte(byte) + } + L.Push(lua.LString(string(buf.Bytes()))) + return 1 + } + + L.RaiseError("client:receive() not implemented yet") + return 0 +} diff --git a/vendor/github.com/BixData/gluasocket/socketcore/clientsend.go b/vendor/github.com/BixData/gluasocket/socketcore/clientsend.go new file mode 100644 index 0000000..dcb5122 --- /dev/null +++ b/vendor/github.com/BixData/gluasocket/socketcore/clientsend.go @@ -0,0 +1,22 @@ +package gluasocket_socketcore + +import ( + "github.com/yuin/gopher-lua" +) + +func clientSendMethod(L *lua.LState) int { + client := checkClient(L) + data := L.ToString(2) + i := L.OptInt(3, 1) + j := L.OptInt(4, len(data)+1) + + dataBytes := []byte(data) + if bytesSent, err := client.Conn.Write(dataBytes[i-1 : j-1]); err != nil { + L.Push(lua.LNil) + L.Push(lua.LString(err.Error())) + return 2 + } else { + L.Push(lua.LNumber(bytesSent)) + return 1 + } +} diff --git a/vendor/github.com/BixData/gluasocket/socketcore/clientsetoption.go b/vendor/github.com/BixData/gluasocket/socketcore/clientsetoption.go new file mode 100644 index 0000000..497fae7 --- /dev/null +++ b/vendor/github.com/BixData/gluasocket/socketcore/clientsetoption.go @@ -0,0 +1,10 @@ +package gluasocket_socketcore + +import ( + "github.com/yuin/gopher-lua" +) + +func clientSetOptionMethod(L *lua.LState) int { + L.RaiseError("client:setoption() not implemented yet") + return 0 +} diff --git a/vendor/github.com/BixData/gluasocket/socketcore/clientsetstats.go b/vendor/github.com/BixData/gluasocket/socketcore/clientsetstats.go new file mode 100644 index 0000000..b13f6fd --- /dev/null +++ b/vendor/github.com/BixData/gluasocket/socketcore/clientsetstats.go @@ -0,0 +1,10 @@ +package gluasocket_socketcore + +import ( + "github.com/yuin/gopher-lua" +) + +func clientSetStatsMethod(L *lua.LState) int { + L.RaiseError("client:setstats() not implemented yet") + return 0 +} diff --git a/vendor/github.com/BixData/gluasocket/socketcore/clientsettimeout.go b/vendor/github.com/BixData/gluasocket/socketcore/clientsettimeout.go new file mode 100644 index 0000000..b9cdacd --- /dev/null +++ b/vendor/github.com/BixData/gluasocket/socketcore/clientsettimeout.go @@ -0,0 +1,14 @@ +package gluasocket_socketcore + +import ( + "time" + + "github.com/yuin/gopher-lua" +) + +func clientSetTimeoutMethod(L *lua.LState) int { + client := checkClient(L) + timeout := L.CheckNumber(2) + client.Timeout = time.Duration(timeout * 1.0e9) + return 0 +} diff --git a/vendor/github.com/BixData/gluasocket/socketcore/clientshutdown.go b/vendor/github.com/BixData/gluasocket/socketcore/clientshutdown.go new file mode 100644 index 0000000..ce4dd5e --- /dev/null +++ b/vendor/github.com/BixData/gluasocket/socketcore/clientshutdown.go @@ -0,0 +1,10 @@ +package gluasocket_socketcore + +import ( + "github.com/yuin/gopher-lua" +) + +func clientShutdownMethod(L *lua.LState) int { + L.RaiseError("client:shutdown() not implemented yet") + return 0 +} diff --git a/vendor/github.com/BixData/gluasocket/socketcore/connect.go b/vendor/github.com/BixData/gluasocket/socketcore/connect.go new file mode 100644 index 0000000..15095e2 --- /dev/null +++ b/vendor/github.com/BixData/gluasocket/socketcore/connect.go @@ -0,0 +1,29 @@ +package gluasocket_socketcore + +import ( + "bufio" + "fmt" + "net" + + "github.com/yuin/gopher-lua" +) + +func connectFn(L *lua.LState) int { + hostname := L.ToString(1) + port := L.ToInt(2) + + conn, err := net.Dial("tcp", fmt.Sprintf("%s:%d", hostname, port)) + if err != nil { + L.Push(lua.LNil) + L.Push(lua.LString(err.Error())) + return 2 + } + + reader := bufio.NewReader(conn) + client := &Client{Conn: conn, Reader: reader} + ud := L.NewUserData() + ud.Value = client + L.SetMetatable(ud, L.GetTypeMetatable(CLIENT_TYPENAME)) + L.Push(ud) + return 1 +} diff --git a/vendor/github.com/BixData/gluasocket/socketcore/dns.go b/vendor/github.com/BixData/gluasocket/socketcore/dns.go new file mode 100644 index 0000000..a970e6c --- /dev/null +++ b/vendor/github.com/BixData/gluasocket/socketcore/dns.go @@ -0,0 +1,15 @@ +package gluasocket_socketcore + +import ( + "github.com/yuin/gopher-lua" +) + +type DNS struct { +} + +var dnsMethods = map[string]lua.LGFunction{ + "getaddrinfo": dnsGetAddrInfo, + "gethostname": dnsGetHostName, + "tohostname": dnsToHostName, + "toip": dnsToIp, +} diff --git a/vendor/github.com/BixData/gluasocket/socketcore/dnsgetaddrinfo.go b/vendor/github.com/BixData/gluasocket/socketcore/dnsgetaddrinfo.go new file mode 100644 index 0000000..587c2be --- /dev/null +++ b/vendor/github.com/BixData/gluasocket/socketcore/dnsgetaddrinfo.go @@ -0,0 +1,37 @@ +package gluasocket_socketcore + +import ( + "net" + + "github.com/yuin/gopher-lua" +) + +func dnsGetAddrInfo(L *lua.LState) int { + + // Read arguments + host := L.CheckString(1) + + // Handle + if host == "" { + return 0 + } + addrs, err := net.LookupHost(host) + if err != nil { + L.RaiseError(err.Error()) + return 0 + } + result := &lua.LTable{} + for _, addr := range addrs { + if addr == "::1" { + // best guess, according to https://stackoverflow.com/questions/5956516/getaddrinfo-and-ipv6 + continue + } + t := &lua.LTable{} + t.RawSetString("family", lua.LString("inet")) + t.RawSetString("addr", lua.LString(addr)) + result.Append(t) + } + + L.Push(result) + return 1 +} diff --git a/vendor/github.com/BixData/gluasocket/socketcore/dnsgethostname.go b/vendor/github.com/BixData/gluasocket/socketcore/dnsgethostname.go new file mode 100644 index 0000000..8c690bf --- /dev/null +++ b/vendor/github.com/BixData/gluasocket/socketcore/dnsgethostname.go @@ -0,0 +1,19 @@ +package gluasocket_socketcore + +import ( + "fmt" + "os" + + "github.com/yuin/gopher-lua" +) + +func dnsGetHostName(L *lua.LState) int { + hostname, err := os.Hostname() + if err != nil { + L.RaiseError(fmt.Sprintf("Failure detecting hostname: %v", err)) + return 0 + } + + L.Push(lua.LString(hostname)) + return 1 +} diff --git a/vendor/github.com/BixData/gluasocket/socketcore/dnstohostname.go b/vendor/github.com/BixData/gluasocket/socketcore/dnstohostname.go new file mode 100644 index 0000000..f5b1592 --- /dev/null +++ b/vendor/github.com/BixData/gluasocket/socketcore/dnstohostname.go @@ -0,0 +1,10 @@ +package gluasocket_socketcore + +import ( + "github.com/yuin/gopher-lua" +) + +func dnsToHostName(l *lua.LState) int { + l.RaiseError("socket.dns.tohostname(address) not implemented yet") + return 0 +} diff --git a/vendor/github.com/BixData/gluasocket/socketcore/dnstoip.go b/vendor/github.com/BixData/gluasocket/socketcore/dnstoip.go new file mode 100644 index 0000000..f1e2a5c --- /dev/null +++ b/vendor/github.com/BixData/gluasocket/socketcore/dnstoip.go @@ -0,0 +1,29 @@ +package gluasocket_socketcore + +import ( + "net" + "strings" + + "github.com/yuin/gopher-lua" +) + +func dnsToIp(L *lua.LState) int { + host := L.ToString(1) + if addrs, err := net.LookupHost(host); err != nil { + L.RaiseError(err.Error()) + return 0 + } else { + if len(addrs) < 1 { + L.Push(lua.LNil) + return 1 + } + for _, addr := range addrs { + if !strings.Contains(addr, ":") { + L.Push(lua.LString(addr)) + return 1 + } + } + L.Push(lua.LString(addrs[0])) + return 1 + } +} diff --git a/vendor/github.com/BixData/gluasocket/socketcore/gettime.go b/vendor/github.com/BixData/gluasocket/socketcore/gettime.go new file mode 100644 index 0000000..65b5dc1 --- /dev/null +++ b/vendor/github.com/BixData/gluasocket/socketcore/gettime.go @@ -0,0 +1,13 @@ +package gluasocket_socketcore + +import ( + "time" + + "github.com/yuin/gopher-lua" +) + +func gettimeFn(l *lua.LState) int { + now := time.Now() + l.Push(lua.LNumber(float64(now.UnixNano()) / 1.0e9)) + return 1 +} diff --git a/vendor/github.com/BixData/gluasocket/socketcore/master.go b/vendor/github.com/BixData/gluasocket/socketcore/master.go new file mode 100644 index 0000000..2bee042 --- /dev/null +++ b/vendor/github.com/BixData/gluasocket/socketcore/master.go @@ -0,0 +1,41 @@ +package gluasocket_socketcore + +import ( + "net" + "time" + + "github.com/yuin/gopher-lua" +) + +const ( + MASTER_TYPENAME = "tcp{master}" +) + +type Master struct { + Listener net.Listener + BindAddr string + BindPort lua.LValue + Timeout time.Duration + Family int + Options map[string]lua.LValue +} + +var masterMethods = map[string]lua.LGFunction{ + "bind": masterBindMethod, + "close": masterCloseMethod, + "connect": masterConnectMethod, + "listen": masterListenMethod, + "setoption": masterSetOptionMethod, + "settimeout": masterSetTimeoutMethod, +} + +// ---------------------------------------------------------------------------- + +func checkMaster(L *lua.LState) *Master { + ud := L.CheckUserData(1) + if v, ok := ud.Value.(*Master); ok { + return v + } + L.ArgError(1, "master expected") + return nil +} diff --git a/vendor/github.com/BixData/gluasocket/socketcore/masterbind.go b/vendor/github.com/BixData/gluasocket/socketcore/masterbind.go new file mode 100644 index 0000000..e87af67 --- /dev/null +++ b/vendor/github.com/BixData/gluasocket/socketcore/masterbind.go @@ -0,0 +1,13 @@ +package gluasocket_socketcore + +import ( + "github.com/yuin/gopher-lua" +) + +func masterBindMethod(L *lua.LState) int { + master := checkMaster(L) + master.BindAddr = L.CheckString(2) + master.BindPort = L.Get(3) + L.Push(lua.LNumber(1)) + return 1 +} diff --git a/vendor/github.com/BixData/gluasocket/socketcore/masterclose.go b/vendor/github.com/BixData/gluasocket/socketcore/masterclose.go new file mode 100644 index 0000000..6bd3be3 --- /dev/null +++ b/vendor/github.com/BixData/gluasocket/socketcore/masterclose.go @@ -0,0 +1,9 @@ +package gluasocket_socketcore + +import ( + "github.com/yuin/gopher-lua" +) + +func masterCloseMethod(L *lua.LState) int { + return 0 +} diff --git a/vendor/github.com/BixData/gluasocket/socketcore/masterconnect.go b/vendor/github.com/BixData/gluasocket/socketcore/masterconnect.go new file mode 100644 index 0000000..44a7ccd --- /dev/null +++ b/vendor/github.com/BixData/gluasocket/socketcore/masterconnect.go @@ -0,0 +1,30 @@ +package gluasocket_socketcore + +import ( + "bufio" + "fmt" + "net" + + "github.com/yuin/gopher-lua" +) + +func masterConnectMethod(L *lua.LState) int { + master := checkMaster(L) + hostname := L.ToString(2) + port := L.ToInt(3) + + conn, err := net.Dial("tcp", fmt.Sprintf("%s:%d", hostname, port)) + if err != nil { + L.Push(lua.LNil) + L.Push(lua.LString(err.Error())) + return 2 + } + + reader := bufio.NewReader(conn) + client := &Client{Conn: conn, Reader: reader, Timeout: master.Timeout} + ud := L.NewUserData() + ud.Value = client + L.SetMetatable(ud, L.GetTypeMetatable(CLIENT_TYPENAME)) + L.Push(ud) + return 1 +} diff --git a/vendor/github.com/BixData/gluasocket/socketcore/masterlisten.go b/vendor/github.com/BixData/gluasocket/socketcore/masterlisten.go new file mode 100644 index 0000000..94eacbb --- /dev/null +++ b/vendor/github.com/BixData/gluasocket/socketcore/masterlisten.go @@ -0,0 +1,24 @@ +package gluasocket_socketcore + +import ( + "fmt" + "net" + + "github.com/yuin/gopher-lua" +) + +func masterListenMethod(L *lua.LState) int { + master := checkMaster(L) + //backlog := L.CheckNumber(1) + + listener, err := net.Listen("tcp", fmt.Sprintf("%s:%s", master.BindAddr, master.BindPort)) + if err != nil { + L.Push(lua.LNil) + L.Push(lua.LString(err.Error())) + return 2 + } + + master.Listener = listener + L.Push(lua.LNumber(1)) + return 1 +} diff --git a/vendor/github.com/BixData/gluasocket/socketcore/mastersetoption.go b/vendor/github.com/BixData/gluasocket/socketcore/mastersetoption.go new file mode 100644 index 0000000..1f2524b --- /dev/null +++ b/vendor/github.com/BixData/gluasocket/socketcore/mastersetoption.go @@ -0,0 +1,15 @@ +package gluasocket_socketcore + +import ( + "github.com/yuin/gopher-lua" +) + +func masterSetOptionMethod(L *lua.LState) int { + master := checkMaster(L) + optionName := L.CheckString(2) /* obj, name, ... */ + if master.Options == nil { + master.Options = map[string]lua.LValue{} + } + master.Options[optionName] = L.Get(3) + return 0 +} diff --git a/vendor/github.com/BixData/gluasocket/socketcore/mastersettimeout.go b/vendor/github.com/BixData/gluasocket/socketcore/mastersettimeout.go new file mode 100644 index 0000000..2682ac5 --- /dev/null +++ b/vendor/github.com/BixData/gluasocket/socketcore/mastersettimeout.go @@ -0,0 +1,14 @@ +package gluasocket_socketcore + +import ( + "time" + + "github.com/yuin/gopher-lua" +) + +func masterSetTimeoutMethod(L *lua.LState) int { + master := checkMaster(L) + timeout := L.CheckNumber(2) + master.Timeout = time.Duration(timeout * 1.0e9) + return 0 +} diff --git a/vendor/github.com/BixData/gluasocket/socketcore/select.go b/vendor/github.com/BixData/gluasocket/socketcore/select.go new file mode 100644 index 0000000..99c3342 --- /dev/null +++ b/vendor/github.com/BixData/gluasocket/socketcore/select.go @@ -0,0 +1,32 @@ +package gluasocket_socketcore + +import ( + "time" + + "github.com/yuin/gopher-lua" +) + +func selectFn(L *lua.LState) int { + + // Read arguments + recvt := L.Get(1) + sendt := L.Get(2) + timeout := L.Get(3) + + // Handle select(nil, nil, timeout) + if recvt.Type() == lua.LTNil && sendt.Type() == lua.LTNil { + timeoutVal, ok := timeout.(lua.LNumber) + if !ok { + L.RaiseError("Malformed timeout in call to socket.select(?,?,timeout)") + return 0 + } + timeoutDuration := time.Duration(timeoutVal * 1.0e9) + time.Sleep(timeoutDuration) + L.Push(lua.LString("timeout")) + return 1 + } + + // TODO Handle socket select + L.RaiseError("socket.select(recvt,sendt,timeout) not implemented yet") + return 0 +} diff --git a/vendor/github.com/BixData/gluasocket/socketcore/skip.go b/vendor/github.com/BixData/gluasocket/socketcore/skip.go new file mode 100644 index 0000000..584c3c0 --- /dev/null +++ b/vendor/github.com/BixData/gluasocket/socketcore/skip.go @@ -0,0 +1,13 @@ +package gluasocket_socketcore + +import ( + "github.com/yuin/gopher-lua" +) + +func skipFn(L *lua.LState) int { + d := L.ToInt(1) + for i := 0; i < d; i++ { + L.Remove(2) + } + return L.GetTop() +} diff --git a/vendor/github.com/BixData/gluasocket/socketcore/sleep.go b/vendor/github.com/BixData/gluasocket/socketcore/sleep.go new file mode 100644 index 0000000..b3fbded --- /dev/null +++ b/vendor/github.com/BixData/gluasocket/socketcore/sleep.go @@ -0,0 +1,24 @@ +package gluasocket_socketcore + +import ( + "time" + + "github.com/yuin/gopher-lua" +) + +func sleepFn(L *lua.LState) int { + + // Read arguments + timeout := L.Get(1) + + // Handle + timeoutVal, ok := timeout.(lua.LNumber) + if !ok { + L.RaiseError("Malformed timeout in call to socket.sleep(time)") + return 0 + } + timeoutDuration := time.Duration(timeoutVal * 1.0e9) + time.Sleep(timeoutDuration) + + return 0 +} diff --git a/vendor/github.com/BixData/gluasocket/socketcore/socketcore.go b/vendor/github.com/BixData/gluasocket/socketcore/socketcore.go new file mode 100644 index 0000000..dbaccd1 --- /dev/null +++ b/vendor/github.com/BixData/gluasocket/socketcore/socketcore.go @@ -0,0 +1,64 @@ +package gluasocket_socketcore + +import ( + "github.com/yuin/gopher-lua" +) + +const ( + AF_UNSPEC = 0 + AF_INET = 2 + AF_INET6 = 23 +) + +// ---------------------------------------------------------------------------- + +var exports = map[string]lua.LGFunction{ + "connect": connectFn, + "gettime": gettimeFn, + "select": selectFn, + "skip": skipFn, + "sleep": sleepFn, + "tcp": tcpFn, + "tcp4": tcp4Fn, + "tcp6": tcp6Fn, + "udp": udpFn, +} + +// ---------------------------------------------------------------------------- + +func Loader(L *lua.LState) int { + mod := L.SetFuncs(L.NewTable(), exports) + L.Push(mod) + + L.SetField(mod, "_DEBUG", lua.LBool(false)) + L.SetField(mod, "_VERSION", lua.LString("0.0.0")) // TODO + + registerClientType(L) + registerMasterType(L) + + registerDNSTable(L, mod) + + return 1 +} + +// ---------------------------------------------------------------------------- + +func registerClientType(L *lua.LState) { + mt := L.NewTypeMetatable(CLIENT_TYPENAME) + L.SetField(mt, "__index", L.SetFuncs(L.NewTable(), clientMethods)) +} + +// ---------------------------------------------------------------------------- + +func registerDNSTable(L *lua.LState, mod *lua.LTable) { + table := L.NewTable() + L.SetFuncs(table, dnsMethods) + L.SetField(mod, "dns", table) +} + +// ---------------------------------------------------------------------------- + +func registerMasterType(L *lua.LState) { + mt := L.NewTypeMetatable(MASTER_TYPENAME) + L.SetField(mt, "__index", L.SetFuncs(L.NewTable(), masterMethods)) +} diff --git a/vendor/github.com/BixData/gluasocket/socketcore/tcp.go b/vendor/github.com/BixData/gluasocket/socketcore/tcp.go new file mode 100644 index 0000000..c06ba50 --- /dev/null +++ b/vendor/github.com/BixData/gluasocket/socketcore/tcp.go @@ -0,0 +1,14 @@ +package gluasocket_socketcore + +import ( + "github.com/yuin/gopher-lua" +) + +func tcpFn(L *lua.LState) int { + master := &Master{Family: AF_UNSPEC} + ud := L.NewUserData() + ud.Value = master + L.SetMetatable(ud, L.GetTypeMetatable(MASTER_TYPENAME)) + L.Push(ud) + return 1 +} diff --git a/vendor/github.com/BixData/gluasocket/socketcore/tcp4.go b/vendor/github.com/BixData/gluasocket/socketcore/tcp4.go new file mode 100644 index 0000000..ffe8243 --- /dev/null +++ b/vendor/github.com/BixData/gluasocket/socketcore/tcp4.go @@ -0,0 +1,14 @@ +package gluasocket_socketcore + +import ( + "github.com/yuin/gopher-lua" +) + +func tcp4Fn(L *lua.LState) int { + master := &Master{Family: AF_INET} + ud := L.NewUserData() + ud.Value = master + L.SetMetatable(ud, L.GetTypeMetatable(MASTER_TYPENAME)) + L.Push(ud) + return 1 +} diff --git a/vendor/github.com/BixData/gluasocket/socketcore/tcp6.go b/vendor/github.com/BixData/gluasocket/socketcore/tcp6.go new file mode 100644 index 0000000..5561ea2 --- /dev/null +++ b/vendor/github.com/BixData/gluasocket/socketcore/tcp6.go @@ -0,0 +1,14 @@ +package gluasocket_socketcore + +import ( + "github.com/yuin/gopher-lua" +) + +func tcp6Fn(L *lua.LState) int { + master := &Master{Family: AF_INET6} + ud := L.NewUserData() + ud.Value = master + L.SetMetatable(ud, L.GetTypeMetatable(MASTER_TYPENAME)) + L.Push(ud) + return 1 +} diff --git a/vendor/github.com/BixData/gluasocket/socketcore/udp.go b/vendor/github.com/BixData/gluasocket/socketcore/udp.go new file mode 100644 index 0000000..5eb4d40 --- /dev/null +++ b/vendor/github.com/BixData/gluasocket/socketcore/udp.go @@ -0,0 +1,10 @@ +package gluasocket_socketcore + +import ( + "github.com/yuin/gopher-lua" +) + +func udpFn(L *lua.LState) int { + L.RaiseError("socket.udp() not implemented yet") + return 0 +} diff --git a/vendor/github.com/BixData/gluasocket/socketexcept/socketexcept.go b/vendor/github.com/BixData/gluasocket/socketexcept/socketexcept.go new file mode 100644 index 0000000..395f92b --- /dev/null +++ b/vendor/github.com/BixData/gluasocket/socketexcept/socketexcept.go @@ -0,0 +1,93 @@ +package gluasocket_socketexcept + +import ( + "github.com/yuin/gopher-lua" +) + +// ---------------------------------------------------------------------------- + +func Loader(l *lua.LState) int { + if err := l.DoString(exceptDotLua); err != nil { + l.RaiseError("Error loading except.lua: %v", err) + return 0 + } + return 1 +} + +const exceptDotLua = `----------------------------------------------------------------------------- +-- Exception control +-- LuaSocket toolkit (but completely independent from other modules) +-- Author: Diego Nehab + +-- This provides support for simple exceptions in Lua. During the +-- development of the HTTP/FTP/SMTP support, it became aparent that +-- error checking was taking a substantial amount of the coding. These +-- function greatly simplify the task of checking errors. + +-- The main idea is that functions should return nil as its first return +-- value when it finds an error, and return an error message (or value) +-- following nil. In case of success, as long as the first value is not nil, +-- the other values don't matter. + +-- The idea is to nest function calls with the "try" function. This function +-- checks the first value, and, if it's falsy, wraps the second value +-- in a table with metatable and calls "error" on it. Otherwise, +-- it returns all values it received. + +-- The "newtry" function is a factory for "try" functions that call a finalizer +-- in protected mode before calling "error". + +-- The "protect" function returns a new function that behaves exactly like the +-- function it receives, but the new function catches exceptions +-- thrown by "try" functions and returns nil followed by the error message +-- instead. + +-- With these three function, it's easy to write functions that throw +-- exceptions on error, but that don't interrupt the user script. +----------------------------------------------------------------------------- + +local base = _G +local _M = {} + +local exception_metat = {} + +function exception_metat:__tostring() + return base.tostring(self[1]) +end + +local function do_nothing() end + +function _M.newtry(finalizer) + if finalizer == nil then finalizer = do_nothing end + return function(...) + local ok, err = ... + if ok then + return ... + else + base.pcall(finalizer) + base.error(base.setmetatable({err}, exception_metat)) + end + end +end + +local function handle_pcall_returns(ok, ...) + if ok then + return ... + else + local err = ... + if base.getmetatable(err) == exception_metat then + return nil, err[1] + else + base.error(err, 0) + end + end +end + +function _M.protect(func) + return function(...) + return handle_pcall_returns(base.pcall(func, ...)) + end +end + +return _M +` diff --git a/vendor/github.com/BixData/gluasocket/socketftp/ftp.go b/vendor/github.com/BixData/gluasocket/socketftp/ftp.go new file mode 100644 index 0000000..812c2aa --- /dev/null +++ b/vendor/github.com/BixData/gluasocket/socketftp/ftp.go @@ -0,0 +1,346 @@ +package gluasocket_socketftp + +import ( + "github.com/yuin/gopher-lua" +) + +// ---------------------------------------------------------------------------- + +func Loader(l *lua.LState) int { + if err := l.DoString(ftpDotLua); err != nil { + l.RaiseError("Error loading ftp.lua: %v", err) + return 0 + } + return 1 +} + +const ftpDotLua = `----------------------------------------------------------------------------- +-- FTP support for the Lua language +-- LuaSocket toolkit. +-- Author: Diego Nehab +----------------------------------------------------------------------------- + +----------------------------------------------------------------------------- +-- Declare module and import dependencies +----------------------------------------------------------------------------- +local base = _G +local table = require("table") +local string = require("string") +local math = require("math") +local socket = require("socket") +local url = require("socket.url") +local tp = require("socket.tp") +local ltn12 = require("ltn12") +socket.ftp = {} +local _M = socket.ftp +----------------------------------------------------------------------------- +-- Program constants +----------------------------------------------------------------------------- +-- timeout in seconds before the program gives up on a connection +_M.TIMEOUT = 60 +-- default port for ftp service +local PORT = 21 +-- this is the default anonymous password. used when no password is +-- provided in url. should be changed to your e-mail. +_M.USER = "ftp" +_M.PASSWORD = "anonymous@anonymous.org" + +----------------------------------------------------------------------------- +-- Low level FTP API +----------------------------------------------------------------------------- +local metat = { __index = {} } + +function _M.open(server, port, create) + local tp = socket.try(tp.connect(server, port or PORT, _M.TIMEOUT, create)) + local f = base.setmetatable({ tp = tp }, metat) + -- make sure everything gets closed in an exception + f.try = socket.newtry(function() f:close() end) + return f +end + +function metat.__index:portconnect() + self.try(self.server:settimeout(_M.TIMEOUT)) + self.data = self.try(self.server:accept()) + self.try(self.data:settimeout(_M.TIMEOUT)) +end + +function metat.__index:pasvconnect() + self.data = self.try(socket.tcp()) + self.try(self.data:settimeout(_M.TIMEOUT)) + self.try(self.data:connect(self.pasvt.address, self.pasvt.port)) +end + +function metat.__index:login(user, password) + self.try(self.tp:command("user", user or _M.USER)) + local code, reply = self.try(self.tp:check{"2..", 331}) + if code == 331 then + self.try(self.tp:command("pass", password or _M.PASSWORD)) + self.try(self.tp:check("2..")) + end + return 1 +end + +function metat.__index:pasv() + self.try(self.tp:command("pasv")) + local code, reply = self.try(self.tp:check("2..")) + local pattern = "(%d+)%D(%d+)%D(%d+)%D(%d+)%D(%d+)%D(%d+)" + local a, b, c, d, p1, p2 = socket.skip(2, string.find(reply, pattern)) + self.try(a and b and c and d and p1 and p2, reply) + self.pasvt = { + address = string.format("%d.%d.%d.%d", a, b, c, d), + port = p1*256 + p2 + } + if self.server then + self.server:close() + self.server = nil + end + return self.pasvt.address, self.pasvt.port +end + +function metat.__index:epsv() + self.try(self.tp:command("epsv")) + local code, reply = self.try(self.tp:check("229")) + local pattern = "%((.)(.-)%1(.-)%1(.-)%1%)" + local d, prt, address, port = string.match(reply, pattern) + self.try(port, "invalid epsv response") + self.pasvt = { + address = self.tp:getpeername(), + port = port + } + if self.server then + self.server:close() + self.server = nil + end + return self.pasvt.address, self.pasvt.port +end + + +function metat.__index:port(address, port) + self.pasvt = nil + if not address then + address, port = self.try(self.tp:getsockname()) + self.server = self.try(socket.bind(address, 0)) + address, port = self.try(self.server:getsockname()) + self.try(self.server:settimeout(_M.TIMEOUT)) + end + local pl = math.mod(port, 256) + local ph = (port - pl)/256 + local arg = string.gsub(string.format("%s,%d,%d", address, ph, pl), "%.", ",") + self.try(self.tp:command("port", arg)) + self.try(self.tp:check("2..")) + return 1 +end + +function metat.__index:eprt(family, address, port) + self.pasvt = nil + if not address then + address, port = self.try(self.tp:getsockname()) + self.server = self.try(socket.bind(address, 0)) + address, port = self.try(self.server:getsockname()) + self.try(self.server:settimeout(_M.TIMEOUT)) + end + local arg = string.format("|%s|%s|%d|", family, address, port) + self.try(self.tp:command("eprt", arg)) + self.try(self.tp:check("2..")) + return 1 +end + + +function metat.__index:send(sendt) + self.try(self.pasvt or self.server, "need port or pasv first") + -- if there is a pasvt table, we already sent a PASV command + -- we just get the data connection into self.data + if self.pasvt then self:pasvconnect() end + -- get the transfer argument and command + local argument = sendt.argument or + url.unescape(string.gsub(sendt.path or "", "^[/\\]", "")) + if argument == "" then argument = nil end + local command = sendt.command or "stor" + -- send the transfer command and check the reply + self.try(self.tp:command(command, argument)) + local code, reply = self.try(self.tp:check{"2..", "1.."}) + -- if there is not a pasvt table, then there is a server + -- and we already sent a PORT command + if not self.pasvt then self:portconnect() end + -- get the sink, source and step for the transfer + local step = sendt.step or ltn12.pump.step + local readt = { self.tp } + local checkstep = function(src, snk) + -- check status in control connection while downloading + local readyt = socket.select(readt, nil, 0) + if readyt[tp] then code = self.try(self.tp:check("2..")) end + return step(src, snk) + end + local sink = socket.sink("close-when-done", self.data) + -- transfer all data and check error + self.try(ltn12.pump.all(sendt.source, sink, checkstep)) + if string.find(code, "1..") then self.try(self.tp:check("2..")) end + -- done with data connection + self.data:close() + -- find out how many bytes were sent + local sent = socket.skip(1, self.data:getstats()) + self.data = nil + return sent +end + +function metat.__index:receive(recvt) + self.try(self.pasvt or self.server, "need port or pasv first") + if self.pasvt then self:pasvconnect() end + local argument = recvt.argument or + url.unescape(string.gsub(recvt.path or "", "^[/\\]", "")) + if argument == "" then argument = nil end + local command = recvt.command or "retr" + self.try(self.tp:command(command, argument)) + local code,reply = self.try(self.tp:check{"1..", "2.."}) + if (code >= 200) and (code <= 299) then + recvt.sink(reply) + return 1 + end + if not self.pasvt then self:portconnect() end + local source = socket.source("until-closed", self.data) + local step = recvt.step or ltn12.pump.step + self.try(ltn12.pump.all(source, recvt.sink, step)) + if string.find(code, "1..") then self.try(self.tp:check("2..")) end + self.data:close() + self.data = nil + return 1 +end + +function metat.__index:cwd(dir) + self.try(self.tp:command("cwd", dir)) + self.try(self.tp:check(250)) + return 1 +end + +function metat.__index:type(type) + self.try(self.tp:command("type", type)) + self.try(self.tp:check(200)) + return 1 +end + +function metat.__index:greet() + local code = self.try(self.tp:check{"1..", "2.."}) + if string.find(code, "1..") then self.try(self.tp:check("2..")) end + return 1 +end + +function metat.__index:quit() + self.try(self.tp:command("quit")) + self.try(self.tp:check("2..")) + return 1 +end + +function metat.__index:close() + if self.data then self.data:close() end + if self.server then self.server:close() end + return self.tp:close() +end + +----------------------------------------------------------------------------- +-- High level FTP API +----------------------------------------------------------------------------- +local function override(t) + if t.url then + local u = url.parse(t.url) + for i,v in base.pairs(t) do + u[i] = v + end + return u + else return t end +end + +local function tput(putt) + putt = override(putt) + socket.try(putt.host, "missing hostname") + local f = _M.open(putt.host, putt.port, putt.create) + f:greet() + f:login(putt.user, putt.password) + if putt.type then f:type(putt.type) end + f:epsv() + local sent = f:send(putt) + f:quit() + f:close() + return sent +end + +local default = { + path = "/", + scheme = "ftp" +} + +local function genericform(u) + local t = socket.try(url.parse(u, default)) + socket.try(t.scheme == "ftp", "wrong scheme '" .. t.scheme .. "'") + socket.try(t.host, "missing hostname") + local pat = "^type=(.)$" + if t.params then + t.type = socket.skip(2, string.find(t.params, pat)) + socket.try(t.type == "a" or t.type == "i", + "invalid type '" .. t.type .. "'") + end + return t +end + +_M.genericform = genericform + +local function sput(u, body) + local putt = genericform(u) + putt.source = ltn12.source.string(body) + return tput(putt) +end + +_M.put = socket.protect(function(putt, body) + if base.type(putt) == "string" then return sput(putt, body) + else return tput(putt) end +end) + +local function tget(gett) + gett = override(gett) + socket.try(gett.host, "missing hostname") + local f = _M.open(gett.host, gett.port, gett.create) + f:greet() + f:login(gett.user, gett.password) + if gett.type then f:type(gett.type) end + f:epsv() + f:receive(gett) + f:quit() + return f:close() +end + +local function sget(u) + local gett = genericform(u) + local t = {} + gett.sink = ltn12.sink.table(t) + tget(gett) + return table.concat(t) +end + +_M.command = socket.protect(function(cmdt) + cmdt = override(cmdt) + socket.try(cmdt.host, "missing hostname") + socket.try(cmdt.command, "missing command") + local f = _M.open(cmdt.host, cmdt.port, cmdt.create) + f:greet() + f:login(cmdt.user, cmdt.password) + if type(cmdt.command) == "table" then + local argument = cmdt.argument or {} + local check = cmdt.check or {} + for i,cmd in ipairs(cmdt.command) do + f.try(f.tp:command(cmd, argument[i])) + if check[i] then f.try(f.tp:check(check[i])) end + end + else + f.try(f.tp:command(cmdt.command, cmdt.argument)) + if cmdt.check then f.try(f.tp:check(cmdt.check)) end + end + f:quit() + return f:close() +end) + +_M.get = socket.protect(function(gett) + if base.type(gett) == "string" then return sget(gett) + else return tget(gett) end +end) + +return _M +` diff --git a/vendor/github.com/BixData/gluasocket/socketheaders/headers.go b/vendor/github.com/BixData/gluasocket/socketheaders/headers.go new file mode 100644 index 0000000..277e7ad --- /dev/null +++ b/vendor/github.com/BixData/gluasocket/socketheaders/headers.go @@ -0,0 +1,121 @@ +package gluasocket_socketheaders + +import ( + "github.com/yuin/gopher-lua" +) + +// ---------------------------------------------------------------------------- + +func Loader(l *lua.LState) int { + if err := l.DoString(headersDotLua); err != nil { + l.RaiseError("Error loading headers.lua: %v", err) + return 0 + } + return 1 +} + +const headersDotLua = `----------------------------------------------------------------------------- +-- Canonic header field capitalization +-- LuaSocket toolkit. +-- Author: Diego Nehab +----------------------------------------------------------------------------- +local socket = require("socket") +socket.headers = {} +local _M = socket.headers + +_M.canonic = { + ["accept"] = "Accept", + ["accept-charset"] = "Accept-Charset", + ["accept-encoding"] = "Accept-Encoding", + ["accept-language"] = "Accept-Language", + ["accept-ranges"] = "Accept-Ranges", + ["action"] = "Action", + ["alternate-recipient"] = "Alternate-Recipient", + ["age"] = "Age", + ["allow"] = "Allow", + ["arrival-date"] = "Arrival-Date", + ["authorization"] = "Authorization", + ["bcc"] = "Bcc", + ["cache-control"] = "Cache-Control", + ["cc"] = "Cc", + ["comments"] = "Comments", + ["connection"] = "Connection", + ["content-description"] = "Content-Description", + ["content-disposition"] = "Content-Disposition", + ["content-encoding"] = "Content-Encoding", + ["content-id"] = "Content-ID", + ["content-language"] = "Content-Language", + ["content-length"] = "Content-Length", + ["content-location"] = "Content-Location", + ["content-md5"] = "Content-MD5", + ["content-range"] = "Content-Range", + ["content-transfer-encoding"] = "Content-Transfer-Encoding", + ["content-type"] = "Content-Type", + ["cookie"] = "Cookie", + ["date"] = "Date", + ["diagnostic-code"] = "Diagnostic-Code", + ["dsn-gateway"] = "DSN-Gateway", + ["etag"] = "ETag", + ["expect"] = "Expect", + ["expires"] = "Expires", + ["final-log-id"] = "Final-Log-ID", + ["final-recipient"] = "Final-Recipient", + ["from"] = "From", + ["host"] = "Host", + ["if-match"] = "If-Match", + ["if-modified-since"] = "If-Modified-Since", + ["if-none-match"] = "If-None-Match", + ["if-range"] = "If-Range", + ["if-unmodified-since"] = "If-Unmodified-Since", + ["in-reply-to"] = "In-Reply-To", + ["keywords"] = "Keywords", + ["last-attempt-date"] = "Last-Attempt-Date", + ["last-modified"] = "Last-Modified", + ["location"] = "Location", + ["max-forwards"] = "Max-Forwards", + ["message-id"] = "Message-ID", + ["mime-version"] = "MIME-Version", + ["original-envelope-id"] = "Original-Envelope-ID", + ["original-recipient"] = "Original-Recipient", + ["pragma"] = "Pragma", + ["proxy-authenticate"] = "Proxy-Authenticate", + ["proxy-authorization"] = "Proxy-Authorization", + ["range"] = "Range", + ["received"] = "Received", + ["received-from-mta"] = "Received-From-MTA", + ["references"] = "References", + ["referer"] = "Referer", + ["remote-mta"] = "Remote-MTA", + ["reply-to"] = "Reply-To", + ["reporting-mta"] = "Reporting-MTA", + ["resent-bcc"] = "Resent-Bcc", + ["resent-cc"] = "Resent-Cc", + ["resent-date"] = "Resent-Date", + ["resent-from"] = "Resent-From", + ["resent-message-id"] = "Resent-Message-ID", + ["resent-reply-to"] = "Resent-Reply-To", + ["resent-sender"] = "Resent-Sender", + ["resent-to"] = "Resent-To", + ["retry-after"] = "Retry-After", + ["return-path"] = "Return-Path", + ["sender"] = "Sender", + ["server"] = "Server", + ["smtp-remote-recipient"] = "SMTP-Remote-Recipient", + ["status"] = "Status", + ["subject"] = "Subject", + ["te"] = "TE", + ["to"] = "To", + ["trailer"] = "Trailer", + ["transfer-encoding"] = "Transfer-Encoding", + ["upgrade"] = "Upgrade", + ["user-agent"] = "User-Agent", + ["vary"] = "Vary", + ["via"] = "Via", + ["warning"] = "Warning", + ["will-retry-until"] = "Will-Retry-Until", + ["www-authenticate"] = "WWW-Authenticate", + ["x-mailer"] = "X-Mailer", +} + +return _M +` diff --git a/vendor/github.com/BixData/gluasocket/sockethttp/http.go b/vendor/github.com/BixData/gluasocket/sockethttp/http.go new file mode 100644 index 0000000..d96110e --- /dev/null +++ b/vendor/github.com/BixData/gluasocket/sockethttp/http.go @@ -0,0 +1,19 @@ +package gluasocket_sockethttp + +import ( + "github.com/yuin/gopher-lua" +) + +// ---------------------------------------------------------------------------- + +var exports = map[string]lua.LGFunction{ + "request": requestFn, +} + +// ---------------------------------------------------------------------------- + +func Loader(L *lua.LState) int { + mod := L.SetFuncs(L.NewTable(), exports) + L.Push(mod) + return 1 +} diff --git a/vendor/github.com/BixData/gluasocket/sockethttp/request.go b/vendor/github.com/BixData/gluasocket/sockethttp/request.go new file mode 100644 index 0000000..b51d241 --- /dev/null +++ b/vendor/github.com/BixData/gluasocket/sockethttp/request.go @@ -0,0 +1,14 @@ +package gluasocket_sockethttp + +import ( + "github.com/yuin/gopher-lua" +) + +func requestFn(L *lua.LState) int { + if L.Get(1).Type() == lua.LTString { + return requestSimpleFn(L) + } + + L.RaiseError("http.request() not implemented yet") + return 0 +} diff --git a/vendor/github.com/BixData/gluasocket/sockethttp/requestSimple.go b/vendor/github.com/BixData/gluasocket/sockethttp/requestSimple.go new file mode 100644 index 0000000..a357141 --- /dev/null +++ b/vendor/github.com/BixData/gluasocket/sockethttp/requestSimple.go @@ -0,0 +1,61 @@ +package gluasocket_sockethttp + +import ( + "io/ioutil" + "net/http" + "net/url" + "strings" + "time" + + "github.com/yuin/gopher-lua" +) + +func requestSimpleFn(L *lua.LState) int { + httpClient := http.Client{Timeout: time.Second * 15} + urlParam := L.ToString(1) + + // LuaSocket allows webhdfs:// + if parsedUrl, err := url.Parse(urlParam); err != nil { + L.RaiseError(err.Error()) + return 0 + } else { + if parsedUrl.Scheme == "webhdfs" { + parsedUrl.Scheme = "http" + } + urlParam = parsedUrl.String() + } + + var res *http.Response + var err error + if L.Get(2).Type() == lua.LTNil { + res, err = httpClient.Get(urlParam) + } else { + body := L.ToString(2) + res, err = httpClient.Post(urlParam, "text/plain", strings.NewReader(body)) + } + if err != nil { + L.RaiseError(err.Error()) + return 0 + } + defer res.Body.Close() + + body, err := ioutil.ReadAll(res.Body) + if err != nil { + L.RaiseError(err.Error()) + return 0 + } + + L.Push(lua.LString(string(body))) + headers := createHeadersTable(L, res.Header) + L.Push(headers) + L.Push(lua.LNumber(res.StatusCode)) + return 3 +} + +func createHeadersTable(L *lua.LState, header http.Header) *lua.LTable { + table := L.NewTable() + for name, value := range header { + table.RawSetString(strings.ToLower(name), lua.LString(strings.Join(value, "\n"))) + } + return table +} diff --git a/vendor/github.com/BixData/gluasocket/socketsmtp/smtp.go b/vendor/github.com/BixData/gluasocket/socketsmtp/smtp.go new file mode 100644 index 0000000..4ecad3d --- /dev/null +++ b/vendor/github.com/BixData/gluasocket/socketsmtp/smtp.go @@ -0,0 +1,273 @@ +package gluasocket_socketsmtp + +import ( + "github.com/yuin/gopher-lua" +) + +// ---------------------------------------------------------------------------- + +func Loader(l *lua.LState) int { + if err := l.DoString(smtpDotLua); err != nil { + l.RaiseError("Error loading smtp.lua: %v", err) + return 0 + } + return 1 +} + +const smtpDotLua = `----------------------------------------------------------------------------- +-- SMTP client support for the Lua language. +-- LuaSocket toolkit. +-- Author: Diego Nehab +----------------------------------------------------------------------------- + +----------------------------------------------------------------------------- +-- Declare module and import dependencies +----------------------------------------------------------------------------- +local base = _G +local coroutine = require("coroutine") +local string = require("string") +local math = require("math") +local os = require("os") +local socket = require("socket") +local tp = require("socket.tp") +local ltn12 = require("ltn12") +local headers = require("socket.headers") +local mime = require("mime") + +socket.smtp = {} +local _M = socket.smtp + +----------------------------------------------------------------------------- +-- Program constants +----------------------------------------------------------------------------- +-- timeout for connection +_M.TIMEOUT = 60 +-- default server used to send e-mails +_M.SERVER = "localhost" +-- default port +_M.PORT = 25 +-- domain used in HELO command and default sendmail +-- If we are under a CGI, try to get from environment +_M.DOMAIN = os.getenv("SERVER_NAME") or "localhost" +-- default time zone (means we don't know) +_M.ZONE = "-0000" + +--------------------------------------------------------------------------- +-- Low level SMTP API +----------------------------------------------------------------------------- +local metat = { __index = {} } + +function metat.__index:greet(domain) + self.try(self.tp:check("2..")) + self.try(self.tp:command("EHLO", domain or _M.DOMAIN)) + return socket.skip(1, self.try(self.tp:check("2.."))) +end + +function metat.__index:mail(from) + self.try(self.tp:command("MAIL", "FROM:" .. from)) + return self.try(self.tp:check("2..")) +end + +function metat.__index:rcpt(to) + self.try(self.tp:command("RCPT", "TO:" .. to)) + return self.try(self.tp:check("2..")) +end + +function metat.__index:data(src, step) + self.try(self.tp:command("DATA")) + self.try(self.tp:check("3..")) + self.try(self.tp:source(src, step)) + self.try(self.tp:send("\r\n.\r\n")) + return self.try(self.tp:check("2..")) +end + +function metat.__index:quit() + self.try(self.tp:command("QUIT")) + return self.try(self.tp:check("2..")) +end + +function metat.__index:close() + return self.tp:close() +end + +function metat.__index:login(user, password) + self.try(self.tp:command("AUTH", "LOGIN")) + self.try(self.tp:check("3..")) + self.try(self.tp:send(mime.b64(user) .. "\r\n")) + self.try(self.tp:check("3..")) + self.try(self.tp:send(mime.b64(password) .. "\r\n")) + return self.try(self.tp:check("2..")) +end + +function metat.__index:plain(user, password) + local auth = "PLAIN " .. mime.b64("\0" .. user .. "\0" .. password) + self.try(self.tp:command("AUTH", auth)) + return self.try(self.tp:check("2..")) +end + +function metat.__index:auth(user, password, ext) + if not user or not password then return 1 end + if string.find(ext, "AUTH[^\n]+LOGIN") then + return self:login(user, password) + elseif string.find(ext, "AUTH[^\n]+PLAIN") then + return self:plain(user, password) + else + self.try(nil, "authentication not supported") + end +end + +-- send message or throw an exception +function metat.__index:send(mailt) + self:mail(mailt.from) + if base.type(mailt.rcpt) == "table" then + for i,v in base.ipairs(mailt.rcpt) do + self:rcpt(v) + end + else + self:rcpt(mailt.rcpt) + end + self:data(ltn12.source.chain(mailt.source, mime.stuff()), mailt.step) +end + +function _M.open(server, port, create) + local tp = socket.try(tp.connect(server or _M.SERVER, port or _M.PORT, + _M.TIMEOUT, create)) + local s = base.setmetatable({tp = tp}, metat) + -- make sure tp is closed if we get an exception + s.try = socket.newtry(function() + s:close() + end) + return s +end + +-- convert headers to lowercase +local function lower_headers(headers) + local lower = {} + for i,v in base.pairs(headers or lower) do + lower[string.lower(i)] = v + end + return lower +end + +--------------------------------------------------------------------------- +-- Multipart message source +----------------------------------------------------------------------------- +-- returns a hopefully unique mime boundary +local seqno = 0 +local function newboundary() + seqno = seqno + 1 + return string.format('%s%05d==%05u', os.date('%d%m%Y%H%M%S'), + math.random(0, 99999), seqno) +end + +-- send_message forward declaration +local send_message + +-- yield the headers all at once, it's faster +local function send_headers(tosend) + local canonic = headers.canonic + local h = "\r\n" + for f,v in base.pairs(tosend) do + h = (canonic[f] or f) .. ': ' .. v .. "\r\n" .. h + end + coroutine.yield(h) +end + +-- yield multipart message body from a multipart message table +local function send_multipart(mesgt) + -- make sure we have our boundary and send headers + local bd = newboundary() + local headers = lower_headers(mesgt.headers or {}) + headers['content-type'] = headers['content-type'] or 'multipart/mixed' + headers['content-type'] = headers['content-type'] .. + '; boundary="' .. bd .. '"' + send_headers(headers) + -- send preamble + if mesgt.body.preamble then + coroutine.yield(mesgt.body.preamble) + coroutine.yield("\r\n") + end + -- send each part separated by a boundary + for i, m in base.ipairs(mesgt.body) do + coroutine.yield("\r\n--" .. bd .. "\r\n") + send_message(m) + end + -- send last boundary + coroutine.yield("\r\n--" .. bd .. "--\r\n\r\n") + -- send epilogue + if mesgt.body.epilogue then + coroutine.yield(mesgt.body.epilogue) + coroutine.yield("\r\n") + end +end + +-- yield message body from a source +local function send_source(mesgt) + -- make sure we have a content-type + local headers = lower_headers(mesgt.headers or {}) + headers['content-type'] = headers['content-type'] or + 'text/plain; charset="iso-8859-1"' + send_headers(headers) + -- send body from source + while true do + local chunk, err = mesgt.body() + if err then coroutine.yield(nil, err) + elseif chunk then coroutine.yield(chunk) + else break end + end +end + +-- yield message body from a string +local function send_string(mesgt) + -- make sure we have a content-type + local headers = lower_headers(mesgt.headers or {}) + headers['content-type'] = headers['content-type'] or + 'text/plain; charset="iso-8859-1"' + send_headers(headers) + -- send body from string + coroutine.yield(mesgt.body) +end + +-- message source +function send_message(mesgt) + if base.type(mesgt.body) == "table" then send_multipart(mesgt) + elseif base.type(mesgt.body) == "function" then send_source(mesgt) + else send_string(mesgt) end +end + +-- set defaul headers +local function adjust_headers(mesgt) + local lower = lower_headers(mesgt.headers) + lower["date"] = lower["date"] or + os.date("!%a, %d %b %Y %H:%M:%S ") .. (mesgt.zone or _M.ZONE) + lower["x-mailer"] = lower["x-mailer"] or socket._VERSION + -- this can't be overriden + lower["mime-version"] = "1.0" + return lower +end + +function _M.message(mesgt) + mesgt.headers = adjust_headers(mesgt) + -- create and return message source + local co = coroutine.create(function() send_message(mesgt) end) + return function() + local ret, a, b = coroutine.resume(co) + if ret then return a, b + else return nil, a end + end +end + +--------------------------------------------------------------------------- +-- High level SMTP API +----------------------------------------------------------------------------- +_M.send = socket.protect(function(mailt) + local s = _M.open(mailt.server, mailt.port, mailt.create) + local ext = s:greet(mailt.domain) + s:auth(mailt.user, mailt.password, ext) + s:send(mailt) + s:quit() + return s:close() +end) + +return _M +` diff --git a/vendor/github.com/BixData/gluasocket/sockettp/tp.go b/vendor/github.com/BixData/gluasocket/sockettp/tp.go new file mode 100644 index 0000000..cae8dec --- /dev/null +++ b/vendor/github.com/BixData/gluasocket/sockettp/tp.go @@ -0,0 +1,151 @@ +package gluasocket_sockettp + +import ( + "github.com/yuin/gopher-lua" +) + +// ---------------------------------------------------------------------------- + +func Loader(l *lua.LState) int { + if err := l.DoString(tpDotLua); err != nil { + l.RaiseError("Error loading tp.lua: %v", err) + return 0 + } + return 1 +} + +const tpDotLua = `----------------------------------------------------------------------------- +-- Unified SMTP/FTP subsystem +-- LuaSocket toolkit. +-- Author: Diego Nehab +----------------------------------------------------------------------------- + +----------------------------------------------------------------------------- +-- Declare module and import dependencies +----------------------------------------------------------------------------- +local base = _G +local string = require("string") +local socket = require("socket") +local ltn12 = require("ltn12") + +socket.tp = {} +local _M = socket.tp + +----------------------------------------------------------------------------- +-- Program constants +----------------------------------------------------------------------------- +_M.TIMEOUT = 60 + +----------------------------------------------------------------------------- +-- Implementation +----------------------------------------------------------------------------- +-- gets server reply (works for SMTP and FTP) +local function get_reply(c) + local code, current, sep + local line, err = c:receive() + local reply = line + if err then return nil, err end + code, sep = socket.skip(2, string.find(line, "^(%d%d%d)(.?)")) + if not code then return nil, "invalid server reply" end + if sep == "-" then -- reply is multiline + repeat + line, err = c:receive() + if err then return nil, err end + current, sep = socket.skip(2, string.find(line, "^(%d%d%d)(.?)")) + reply = reply .. "\n" .. line + -- reply ends with same code + until code == current and sep == " " + end + return code, reply +end + +-- metatable for sock object +local metat = { __index = {} } + +function metat.__index:getpeername() + return self.c:getpeername() +end + +function metat.__index:getsockname() + return self.c:getpeername() +end + +function metat.__index:check(ok) + local code, reply = get_reply(self.c) + if not code then return nil, reply end + if base.type(ok) ~= "function" then + if base.type(ok) == "table" then + for i, v in base.ipairs(ok) do + if string.find(code, v) then + return base.tonumber(code), reply + end + end + return nil, reply + else + if string.find(code, ok) then return base.tonumber(code), reply + else return nil, reply end + end + else return ok(base.tonumber(code), reply) end +end + +function metat.__index:command(cmd, arg) + cmd = string.upper(cmd) + if arg then + return self.c:send(cmd .. " " .. arg.. "\r\n") + else + return self.c:send(cmd .. "\r\n") + end +end + +function metat.__index:sink(snk, pat) + local chunk, err = self.c:receive(pat) + return snk(chunk, err) +end + +function metat.__index:send(data) + return self.c:send(data) +end + +function metat.__index:receive(pat) + return self.c:receive(pat) +end + +function metat.__index:getfd() + return self.c:getfd() +end + +function metat.__index:dirty() + return self.c:dirty() +end + +function metat.__index:getcontrol() + return self.c +end + +function metat.__index:source(source, step) + local sink = socket.sink("keep-open", self.c) + local ret, err = ltn12.pump.all(source, sink, step or ltn12.pump.step) + return ret, err +end + +-- closes the underlying c +function metat.__index:close() + self.c:close() + return 1 +end + +-- connect with server and return c object +function _M.connect(host, port, timeout, create) + local c, e = (create or socket.tcp)() + if not c then return nil, e end + c:settimeout(timeout or _M.TIMEOUT) + local r, e = c:connect(host, port) + if not r then + c:close() + return nil, e + end + return base.setmetatable({c = c}, metat) +end + +return _M +` diff --git a/vendor/github.com/BixData/gluasocket/socketurl/url.go b/vendor/github.com/BixData/gluasocket/socketurl/url.go new file mode 100644 index 0000000..00044d1 --- /dev/null +++ b/vendor/github.com/BixData/gluasocket/socketurl/url.go @@ -0,0 +1,326 @@ +package gluasocket_socketurl + +import ( + "github.com/yuin/gopher-lua" +) + +// ---------------------------------------------------------------------------- + +func Loader(l *lua.LState) int { + if err := l.DoString(urlDotLua); err != nil { + l.RaiseError("Error loading url.lua: %v", err) + return 0 + } + return 1 +} + +const urlDotLua = `----------------------------------------------------------------------------- +-- URI parsing, composition and relative URL resolution +-- LuaSocket toolkit. +-- Author: Diego Nehab +----------------------------------------------------------------------------- + +----------------------------------------------------------------------------- +-- Declare module +----------------------------------------------------------------------------- +local string = require("string") +local base = _G +local table = require("table") +--local socket = require("socket") + +luasocketUrl = {} +local _M = luasocketUrl + +----------------------------------------------------------------------------- +-- Module version +----------------------------------------------------------------------------- +_M._VERSION = "URL 1.0.3" + +----------------------------------------------------------------------------- +-- Encodes a string into its escaped hexadecimal representation +-- Input +-- s: binary string to be encoded +-- Returns +-- escaped representation of string binary +----------------------------------------------------------------------------- +function _M.escape(s) + return (string.gsub(s, "([^A-Za-z0-9_])", function(c) + return string.format("%%%02x", string.byte(c)) + end)) +end + +----------------------------------------------------------------------------- +-- Protects a path segment, to prevent it from interfering with the +-- url parsing. +-- Input +-- s: binary string to be encoded +-- Returns +-- escaped representation of string binary +----------------------------------------------------------------------------- +local function make_set(t) + local s = {} + for i,v in base.ipairs(t) do + s[t[i]] = 1 + end + return s +end + +-- these are allowed within a path segment, along with alphanum +-- other characters must be escaped +local segment_set = make_set { + "-", "_", ".", "!", "~", "*", "'", "(", + ")", ":", "@", "&", "=", "+", "$", ",", +} + +local function protect_segment(s) + return string.gsub(s, "([^A-Za-z0-9_])", function (c) + if segment_set[c] then return c + else return string.format("%%%02X", string.byte(c)) end + end) +end + +----------------------------------------------------------------------------- +-- Unencodes a escaped hexadecimal string into its binary representation +-- Input +-- s: escaped hexadecimal string to be unencoded +-- Returns +-- unescaped binary representation of escaped hexadecimal binary +----------------------------------------------------------------------------- +function _M.unescape(s) + return (string.gsub(s, "%%(%x%x)", function(hex) + return string.char(base.tonumber(hex, 16)) + end)) +end + +----------------------------------------------------------------------------- +-- Builds a path from a base path and a relative path +-- Input +-- base_path +-- relative_path +-- Returns +-- corresponding absolute path +----------------------------------------------------------------------------- +local function absolute_path(base_path, relative_path) + if string.sub(relative_path, 1, 1) == "/" then return relative_path end + local path = string.gsub(base_path, "[^/]*$", "") + path = path .. relative_path + path = string.gsub(path, "([^/]*%./)", function (s) + if s ~= "./" then return s else return "" end + end) + path = string.gsub(path, "/%.$", "/") + local reduced + while reduced ~= path do + reduced = path + path = string.gsub(reduced, "([^/]*/%.%./)", function (s) + if s ~= "../../" then return "" else return s end + end) + end + path = string.gsub(reduced, "([^/]*/%.%.)$", function (s) + if s ~= "../.." then return "" else return s end + end) + return path +end + +----------------------------------------------------------------------------- +-- Parses a url and returns a table with all its parts according to RFC 2396 +-- The following grammar describes the names given to the URL parts +-- ::= :///;?# +-- ::= @: +-- ::= [:] +-- :: = {/} +-- Input +-- url: uniform resource locator of request +-- default: table with default values for each field +-- Returns +-- table with the following fields, where RFC naming conventions have +-- been preserved: +-- scheme, authority, userinfo, user, password, host, port, +-- path, params, query, fragment +-- Obs: +-- the leading '/' in {/} is considered part of +----------------------------------------------------------------------------- +function _M.parse(url, default) + -- initialize default parameters + local parsed = {} + for i,v in base.pairs(default or parsed) do parsed[i] = v end + -- empty url is parsed to nil + if not url or url == "" then return nil, "invalid url" end + -- remove whitespace + -- url = string.gsub(url, "%s", "") + -- get fragment + url = string.gsub(url, "#(.*)$", function(f) + parsed.fragment = f + return "" + end) + -- get scheme + url = string.gsub(url, "^([%w][%w%+%-%.]*)%:", + function(s) parsed.scheme = s; return "" end) + -- get authority + url = string.gsub(url, "^//([^/]*)", function(n) + parsed.authority = n + return "" + end) + -- get query string + url = string.gsub(url, "%?(.*)", function(q) + parsed.query = q + return "" + end) + -- get params + url = string.gsub(url, "%;(.*)", function(p) + parsed.params = p + return "" + end) + -- path is whatever was left + if url ~= "" then parsed.path = url end + local authority = parsed.authority + if not authority then return parsed end + authority = string.gsub(authority,"^([^@]*)@", + function(u) parsed.userinfo = u; return "" end) + authority = string.gsub(authority, ":([^:%]]*)$", + function(p) parsed.port = p; return "" end) + if authority ~= "" then + -- IPv6? + parsed.host = string.match(authority, "^%[(.+)%]$") or authority + end + local userinfo = parsed.userinfo + if not userinfo then return parsed end + userinfo = string.gsub(userinfo, ":([^:]*)$", + function(p) parsed.password = p; return "" end) + parsed.user = userinfo + return parsed +end + +----------------------------------------------------------------------------- +-- Rebuilds a parsed URL from its components. +-- Components are protected if any reserved or unallowed characters are found +-- Input +-- parsed: parsed URL, as returned by parse +-- Returns +-- a stringing with the corresponding URL +----------------------------------------------------------------------------- +function _M.build(parsed) + --local ppath = _M.parse_path(parsed.path or "") + --local url = _M.build_path(ppath) + local url = parsed.path or "" + if parsed.params then url = url .. ";" .. parsed.params end + if parsed.query then url = url .. "?" .. parsed.query end + local authority = parsed.authority + if parsed.host then + authority = parsed.host + if string.find(authority, ":") then -- IPv6? + authority = "[" .. authority .. "]" + end + if parsed.port then authority = authority .. ":" .. base.tostring(parsed.port) end + local userinfo = parsed.userinfo + if parsed.user then + userinfo = parsed.user + if parsed.password then + userinfo = userinfo .. ":" .. parsed.password + end + end + if userinfo then authority = userinfo .. "@" .. authority end + end + if authority then url = "//" .. authority .. url end + if parsed.scheme then url = parsed.scheme .. ":" .. url end + if parsed.fragment then url = url .. "#" .. parsed.fragment end + -- url = string.gsub(url, "%s", "") + return url +end + +----------------------------------------------------------------------------- +-- Builds a absolute URL from a base and a relative URL according to RFC 2396 +-- Input +-- base_url +-- relative_url +-- Returns +-- corresponding absolute url +----------------------------------------------------------------------------- +function _M.absolute(base_url, relative_url) + local base_parsed + if base.type(base_url) == "table" then + base_parsed = base_url + base_url = _M.build(base_parsed) + else + base_parsed = _M.parse(base_url) + end + local relative_parsed = _M.parse(relative_url) + if not base_parsed then return relative_url + elseif not relative_parsed then return base_url + elseif relative_parsed.scheme then return relative_url + else + relative_parsed.scheme = base_parsed.scheme + if not relative_parsed.authority then + relative_parsed.authority = base_parsed.authority + if not relative_parsed.path then + relative_parsed.path = base_parsed.path + if not relative_parsed.params then + relative_parsed.params = base_parsed.params + if not relative_parsed.query then + relative_parsed.query = base_parsed.query + end + end + else + relative_parsed.path = absolute_path(base_parsed.path or "", + relative_parsed.path) + end + end + return _M.build(relative_parsed) + end +end + +----------------------------------------------------------------------------- +-- Breaks a path into its segments, unescaping the segments +-- Input +-- path +-- Returns +-- segment: a table with one entry per segment +----------------------------------------------------------------------------- +function _M.parse_path(path) + local parsed = {} + path = path or "" + --path = string.gsub(path, "%s", "") + string.gsub(path, "([^/]+)", function (s) table.insert(parsed, s) end) + for i = 1, #parsed do + parsed[i] = _M.unescape(parsed[i]) + end + if string.sub(path, 1, 1) == "/" then parsed.is_absolute = 1 end + if string.sub(path, -1, -1) == "/" then parsed.is_directory = 1 end + return parsed +end + +----------------------------------------------------------------------------- +-- Builds a path component from its segments, escaping protected characters. +-- Input +-- parsed: path segments +-- unsafe: if true, segments are not protected before path is built +-- Returns +-- path: corresponding path stringing +----------------------------------------------------------------------------- +function _M.build_path(parsed, unsafe) + local path = "" + local n = #parsed + if unsafe then + for i = 1, n-1 do + path = path .. parsed[i] + path = path .. "/" + end + if n > 0 then + path = path .. parsed[n] + if parsed.is_directory then path = path .. "/" end + end + else + for i = 1, n-1 do + path = path .. protect_segment(parsed[i]) + path = path .. "/" + end + if n > 0 then + path = path .. protect_segment(parsed[n]) + if parsed.is_directory then path = path .. "/" end + end + end + if parsed.is_absolute then path = "/" .. path end + return path +end + +return _M +` diff --git a/vendor/github.com/StackExchange/wmi/LICENSE b/vendor/github.com/StackExchange/wmi/LICENSE new file mode 100644 index 0000000..ae80b67 --- /dev/null +++ b/vendor/github.com/StackExchange/wmi/LICENSE @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright (c) 2013 Stack Exchange + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/github.com/StackExchange/wmi/README.md b/vendor/github.com/StackExchange/wmi/README.md new file mode 100644 index 0000000..426d1a4 --- /dev/null +++ b/vendor/github.com/StackExchange/wmi/README.md @@ -0,0 +1,6 @@ +wmi +=== + +Package wmi provides a WQL interface to Windows WMI. + +Note: It interfaces with WMI on the local machine, therefore it only runs on Windows. diff --git a/vendor/github.com/StackExchange/wmi/swbemservices.go b/vendor/github.com/StackExchange/wmi/swbemservices.go new file mode 100644 index 0000000..3ff8756 --- /dev/null +++ b/vendor/github.com/StackExchange/wmi/swbemservices.go @@ -0,0 +1,260 @@ +// +build windows + +package wmi + +import ( + "fmt" + "reflect" + "runtime" + "sync" + + "github.com/go-ole/go-ole" + "github.com/go-ole/go-ole/oleutil" +) + +// SWbemServices is used to access wmi. See https://msdn.microsoft.com/en-us/library/aa393719(v=vs.85).aspx +type SWbemServices struct { + //TODO: track namespace. Not sure if we can re connect to a different namespace using the same instance + cWMIClient *Client //This could also be an embedded struct, but then we would need to branch on Client vs SWbemServices in the Query method + sWbemLocatorIUnknown *ole.IUnknown + sWbemLocatorIDispatch *ole.IDispatch + queries chan *queryRequest + closeError chan error + lQueryorClose sync.Mutex +} + +type queryRequest struct { + query string + dst interface{} + args []interface{} + finished chan error +} + +// InitializeSWbemServices will return a new SWbemServices object that can be used to query WMI +func InitializeSWbemServices(c *Client, connectServerArgs ...interface{}) (*SWbemServices, error) { + //fmt.Println("InitializeSWbemServices: Starting") + //TODO: implement connectServerArgs as optional argument for init with connectServer call + s := new(SWbemServices) + s.cWMIClient = c + s.queries = make(chan *queryRequest) + initError := make(chan error) + go s.process(initError) + + err, ok := <-initError + if ok { + return nil, err //Send error to caller + } + //fmt.Println("InitializeSWbemServices: Finished") + return s, nil +} + +// Close will clear and release all of the SWbemServices resources +func (s *SWbemServices) Close() error { + s.lQueryorClose.Lock() + if s == nil || s.sWbemLocatorIDispatch == nil { + s.lQueryorClose.Unlock() + return fmt.Errorf("SWbemServices is not Initialized") + } + if s.queries == nil { + s.lQueryorClose.Unlock() + return fmt.Errorf("SWbemServices has been closed") + } + //fmt.Println("Close: sending close request") + var result error + ce := make(chan error) + s.closeError = ce //Race condition if multiple callers to close. May need to lock here + close(s.queries) //Tell background to shut things down + s.lQueryorClose.Unlock() + err, ok := <-ce + if ok { + result = err + } + //fmt.Println("Close: finished") + return result +} + +func (s *SWbemServices) process(initError chan error) { + //fmt.Println("process: starting background thread initialization") + //All OLE/WMI calls must happen on the same initialized thead, so lock this goroutine + runtime.LockOSThread() + defer runtime.UnlockOSThread() + + err := ole.CoInitializeEx(0, ole.COINIT_MULTITHREADED) + if err != nil { + oleCode := err.(*ole.OleError).Code() + if oleCode != ole.S_OK && oleCode != S_FALSE { + initError <- fmt.Errorf("ole.CoInitializeEx error: %v", err) + return + } + } + defer ole.CoUninitialize() + + unknown, err := oleutil.CreateObject("WbemScripting.SWbemLocator") + if err != nil { + initError <- fmt.Errorf("CreateObject SWbemLocator error: %v", err) + return + } else if unknown == nil { + initError <- ErrNilCreateObject + return + } + defer unknown.Release() + s.sWbemLocatorIUnknown = unknown + + dispatch, err := s.sWbemLocatorIUnknown.QueryInterface(ole.IID_IDispatch) + if err != nil { + initError <- fmt.Errorf("SWbemLocator QueryInterface error: %v", err) + return + } + defer dispatch.Release() + s.sWbemLocatorIDispatch = dispatch + + // we can't do the ConnectServer call outside the loop unless we find a way to track and re-init the connectServerArgs + //fmt.Println("process: initialized. closing initError") + close(initError) + //fmt.Println("process: waiting for queries") + for q := range s.queries { + //fmt.Printf("process: new query: len(query)=%d\n", len(q.query)) + errQuery := s.queryBackground(q) + //fmt.Println("process: s.queryBackground finished") + if errQuery != nil { + q.finished <- errQuery + } + close(q.finished) + } + //fmt.Println("process: queries channel closed") + s.queries = nil //set channel to nil so we know it is closed + //TODO: I think the Release/Clear calls can panic if things are in a bad state. + //TODO: May need to recover from panics and send error to method caller instead. + close(s.closeError) +} + +// Query runs the WQL query using a SWbemServices instance and appends the values to dst. +// +// dst must have type *[]S or *[]*S, for some struct type S. Fields selected in +// the query must have the same name in dst. Supported types are all signed and +// unsigned integers, time.Time, string, bool, or a pointer to one of those. +// Array types are not supported. +// +// By default, the local machine and default namespace are used. These can be +// changed using connectServerArgs. See +// http://msdn.microsoft.com/en-us/library/aa393720.aspx for details. +func (s *SWbemServices) Query(query string, dst interface{}, connectServerArgs ...interface{}) error { + s.lQueryorClose.Lock() + if s == nil || s.sWbemLocatorIDispatch == nil { + s.lQueryorClose.Unlock() + return fmt.Errorf("SWbemServices is not Initialized") + } + if s.queries == nil { + s.lQueryorClose.Unlock() + return fmt.Errorf("SWbemServices has been closed") + } + + //fmt.Println("Query: Sending query request") + qr := queryRequest{ + query: query, + dst: dst, + args: connectServerArgs, + finished: make(chan error), + } + s.queries <- &qr + s.lQueryorClose.Unlock() + err, ok := <-qr.finished + if ok { + //fmt.Println("Query: Finished with error") + return err //Send error to caller + } + //fmt.Println("Query: Finished") + return nil +} + +func (s *SWbemServices) queryBackground(q *queryRequest) error { + if s == nil || s.sWbemLocatorIDispatch == nil { + return fmt.Errorf("SWbemServices is not Initialized") + } + wmi := s.sWbemLocatorIDispatch //Should just rename in the code, but this will help as we break things apart + //fmt.Println("queryBackground: Starting") + + dv := reflect.ValueOf(q.dst) + if dv.Kind() != reflect.Ptr || dv.IsNil() { + return ErrInvalidEntityType + } + dv = dv.Elem() + mat, elemType := checkMultiArg(dv) + if mat == multiArgTypeInvalid { + return ErrInvalidEntityType + } + + // service is a SWbemServices + serviceRaw, err := oleutil.CallMethod(wmi, "ConnectServer", q.args...) + if err != nil { + return err + } + service := serviceRaw.ToIDispatch() + defer serviceRaw.Clear() + + // result is a SWBemObjectSet + resultRaw, err := oleutil.CallMethod(service, "ExecQuery", q.query) + if err != nil { + return err + } + result := resultRaw.ToIDispatch() + defer resultRaw.Clear() + + count, err := oleInt64(result, "Count") + if err != nil { + return err + } + + enumProperty, err := result.GetProperty("_NewEnum") + if err != nil { + return err + } + defer enumProperty.Clear() + + enum, err := enumProperty.ToIUnknown().IEnumVARIANT(ole.IID_IEnumVariant) + if err != nil { + return err + } + if enum == nil { + return fmt.Errorf("can't get IEnumVARIANT, enum is nil") + } + defer enum.Release() + + // Initialize a slice with Count capacity + dv.Set(reflect.MakeSlice(dv.Type(), 0, int(count))) + + var errFieldMismatch error + for itemRaw, length, err := enum.Next(1); length > 0; itemRaw, length, err = enum.Next(1) { + if err != nil { + return err + } + + err := func() error { + // item is a SWbemObject, but really a Win32_Process + item := itemRaw.ToIDispatch() + defer item.Release() + + ev := reflect.New(elemType) + if err = s.cWMIClient.loadEntity(ev.Interface(), item); err != nil { + if _, ok := err.(*ErrFieldMismatch); ok { + // We continue loading entities even in the face of field mismatch errors. + // If we encounter any other error, that other error is returned. Otherwise, + // an ErrFieldMismatch is returned. + errFieldMismatch = err + } else { + return err + } + } + if mat != multiArgTypeStructPtr { + ev = ev.Elem() + } + dv.Set(reflect.Append(dv, ev)) + return nil + }() + if err != nil { + return err + } + } + //fmt.Println("queryBackground: Finished") + return errFieldMismatch +} diff --git a/vendor/github.com/StackExchange/wmi/wmi.go b/vendor/github.com/StackExchange/wmi/wmi.go new file mode 100644 index 0000000..bee3d45 --- /dev/null +++ b/vendor/github.com/StackExchange/wmi/wmi.go @@ -0,0 +1,490 @@ +// +build windows + +/* +Package wmi provides a WQL interface for WMI on Windows. + +Example code to print names of running processes: + + type Win32_Process struct { + Name string + } + + func main() { + var dst []Win32_Process + q := wmi.CreateQuery(&dst, "") + err := wmi.Query(q, &dst) + if err != nil { + log.Fatal(err) + } + for i, v := range dst { + println(i, v.Name) + } + } + +*/ +package wmi + +import ( + "bytes" + "errors" + "fmt" + "log" + "os" + "reflect" + "runtime" + "strconv" + "strings" + "sync" + "time" + + "github.com/go-ole/go-ole" + "github.com/go-ole/go-ole/oleutil" +) + +var l = log.New(os.Stdout, "", log.LstdFlags) + +var ( + ErrInvalidEntityType = errors.New("wmi: invalid entity type") + // ErrNilCreateObject is the error returned if CreateObject returns nil even + // if the error was nil. + ErrNilCreateObject = errors.New("wmi: create object returned nil") + lock sync.Mutex +) + +// S_FALSE is returned by CoInitializeEx if it was already called on this thread. +const S_FALSE = 0x00000001 + +// QueryNamespace invokes Query with the given namespace on the local machine. +func QueryNamespace(query string, dst interface{}, namespace string) error { + return Query(query, dst, nil, namespace) +} + +// Query runs the WQL query and appends the values to dst. +// +// dst must have type *[]S or *[]*S, for some struct type S. Fields selected in +// the query must have the same name in dst. Supported types are all signed and +// unsigned integers, time.Time, string, bool, or a pointer to one of those. +// Array types are not supported. +// +// By default, the local machine and default namespace are used. These can be +// changed using connectServerArgs. See +// http://msdn.microsoft.com/en-us/library/aa393720.aspx for details. +// +// Query is a wrapper around DefaultClient.Query. +func Query(query string, dst interface{}, connectServerArgs ...interface{}) error { + if DefaultClient.SWbemServicesClient == nil { + return DefaultClient.Query(query, dst, connectServerArgs...) + } + return DefaultClient.SWbemServicesClient.Query(query, dst, connectServerArgs...) +} + +// A Client is an WMI query client. +// +// Its zero value (DefaultClient) is a usable client. +type Client struct { + // NonePtrZero specifies if nil values for fields which aren't pointers + // should be returned as the field types zero value. + // + // Setting this to true allows stucts without pointer fields to be used + // without the risk failure should a nil value returned from WMI. + NonePtrZero bool + + // PtrNil specifies if nil values for pointer fields should be returned + // as nil. + // + // Setting this to true will set pointer fields to nil where WMI + // returned nil, otherwise the types zero value will be returned. + PtrNil bool + + // AllowMissingFields specifies that struct fields not present in the + // query result should not result in an error. + // + // Setting this to true allows custom queries to be used with full + // struct definitions instead of having to define multiple structs. + AllowMissingFields bool + + // SWbemServiceClient is an optional SWbemServices object that can be + // initialized and then reused across multiple queries. If it is null + // then the method will initialize a new temporary client each time. + SWbemServicesClient *SWbemServices +} + +// DefaultClient is the default Client and is used by Query, QueryNamespace +var DefaultClient = &Client{} + +// Query runs the WQL query and appends the values to dst. +// +// dst must have type *[]S or *[]*S, for some struct type S. Fields selected in +// the query must have the same name in dst. Supported types are all signed and +// unsigned integers, time.Time, string, bool, or a pointer to one of those. +// Array types are not supported. +// +// By default, the local machine and default namespace are used. These can be +// changed using connectServerArgs. See +// http://msdn.microsoft.com/en-us/library/aa393720.aspx for details. +func (c *Client) Query(query string, dst interface{}, connectServerArgs ...interface{}) error { + dv := reflect.ValueOf(dst) + if dv.Kind() != reflect.Ptr || dv.IsNil() { + return ErrInvalidEntityType + } + dv = dv.Elem() + mat, elemType := checkMultiArg(dv) + if mat == multiArgTypeInvalid { + return ErrInvalidEntityType + } + + lock.Lock() + defer lock.Unlock() + runtime.LockOSThread() + defer runtime.UnlockOSThread() + + err := ole.CoInitializeEx(0, ole.COINIT_MULTITHREADED) + if err != nil { + oleCode := err.(*ole.OleError).Code() + if oleCode != ole.S_OK && oleCode != S_FALSE { + return err + } + } + defer ole.CoUninitialize() + + unknown, err := oleutil.CreateObject("WbemScripting.SWbemLocator") + if err != nil { + return err + } else if unknown == nil { + return ErrNilCreateObject + } + defer unknown.Release() + + wmi, err := unknown.QueryInterface(ole.IID_IDispatch) + if err != nil { + return err + } + defer wmi.Release() + + // service is a SWbemServices + serviceRaw, err := oleutil.CallMethod(wmi, "ConnectServer", connectServerArgs...) + if err != nil { + return err + } + service := serviceRaw.ToIDispatch() + defer serviceRaw.Clear() + + // result is a SWBemObjectSet + resultRaw, err := oleutil.CallMethod(service, "ExecQuery", query) + if err != nil { + return err + } + result := resultRaw.ToIDispatch() + defer resultRaw.Clear() + + count, err := oleInt64(result, "Count") + if err != nil { + return err + } + + enumProperty, err := result.GetProperty("_NewEnum") + if err != nil { + return err + } + defer enumProperty.Clear() + + enum, err := enumProperty.ToIUnknown().IEnumVARIANT(ole.IID_IEnumVariant) + if err != nil { + return err + } + if enum == nil { + return fmt.Errorf("can't get IEnumVARIANT, enum is nil") + } + defer enum.Release() + + // Initialize a slice with Count capacity + dv.Set(reflect.MakeSlice(dv.Type(), 0, int(count))) + + var errFieldMismatch error + for itemRaw, length, err := enum.Next(1); length > 0; itemRaw, length, err = enum.Next(1) { + if err != nil { + return err + } + + err := func() error { + // item is a SWbemObject, but really a Win32_Process + item := itemRaw.ToIDispatch() + defer item.Release() + + ev := reflect.New(elemType) + if err = c.loadEntity(ev.Interface(), item); err != nil { + if _, ok := err.(*ErrFieldMismatch); ok { + // We continue loading entities even in the face of field mismatch errors. + // If we encounter any other error, that other error is returned. Otherwise, + // an ErrFieldMismatch is returned. + errFieldMismatch = err + } else { + return err + } + } + if mat != multiArgTypeStructPtr { + ev = ev.Elem() + } + dv.Set(reflect.Append(dv, ev)) + return nil + }() + if err != nil { + return err + } + } + return errFieldMismatch +} + +// ErrFieldMismatch is returned when a field is to be loaded into a different +// type than the one it was stored from, or when a field is missing or +// unexported in the destination struct. +// StructType is the type of the struct pointed to by the destination argument. +type ErrFieldMismatch struct { + StructType reflect.Type + FieldName string + Reason string +} + +func (e *ErrFieldMismatch) Error() string { + return fmt.Sprintf("wmi: cannot load field %q into a %q: %s", + e.FieldName, e.StructType, e.Reason) +} + +var timeType = reflect.TypeOf(time.Time{}) + +// loadEntity loads a SWbemObject into a struct pointer. +func (c *Client) loadEntity(dst interface{}, src *ole.IDispatch) (errFieldMismatch error) { + v := reflect.ValueOf(dst).Elem() + for i := 0; i < v.NumField(); i++ { + f := v.Field(i) + of := f + isPtr := f.Kind() == reflect.Ptr + if isPtr { + ptr := reflect.New(f.Type().Elem()) + f.Set(ptr) + f = f.Elem() + } + n := v.Type().Field(i).Name + if !f.CanSet() { + return &ErrFieldMismatch{ + StructType: of.Type(), + FieldName: n, + Reason: "CanSet() is false", + } + } + prop, err := oleutil.GetProperty(src, n) + if err != nil { + if !c.AllowMissingFields { + errFieldMismatch = &ErrFieldMismatch{ + StructType: of.Type(), + FieldName: n, + Reason: "no such struct field", + } + } + continue + } + defer prop.Clear() + + if prop.VT == 0x1 { //VT_NULL + continue + } + + switch val := prop.Value().(type) { + case int8, int16, int32, int64, int: + v := reflect.ValueOf(val).Int() + switch f.Kind() { + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + f.SetInt(v) + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: + f.SetUint(uint64(v)) + default: + return &ErrFieldMismatch{ + StructType: of.Type(), + FieldName: n, + Reason: "not an integer class", + } + } + case uint8, uint16, uint32, uint64: + v := reflect.ValueOf(val).Uint() + switch f.Kind() { + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + f.SetInt(int64(v)) + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: + f.SetUint(v) + default: + return &ErrFieldMismatch{ + StructType: of.Type(), + FieldName: n, + Reason: "not an integer class", + } + } + case string: + switch f.Kind() { + case reflect.String: + f.SetString(val) + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + iv, err := strconv.ParseInt(val, 10, 64) + if err != nil { + return err + } + f.SetInt(iv) + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: + uv, err := strconv.ParseUint(val, 10, 64) + if err != nil { + return err + } + f.SetUint(uv) + case reflect.Struct: + switch f.Type() { + case timeType: + if len(val) == 25 { + mins, err := strconv.Atoi(val[22:]) + if err != nil { + return err + } + val = val[:22] + fmt.Sprintf("%02d%02d", mins/60, mins%60) + } + t, err := time.Parse("20060102150405.000000-0700", val) + if err != nil { + return err + } + f.Set(reflect.ValueOf(t)) + } + } + case bool: + switch f.Kind() { + case reflect.Bool: + f.SetBool(val) + default: + return &ErrFieldMismatch{ + StructType: of.Type(), + FieldName: n, + Reason: "not a bool", + } + } + case float32: + switch f.Kind() { + case reflect.Float32: + f.SetFloat(float64(val)) + default: + return &ErrFieldMismatch{ + StructType: of.Type(), + FieldName: n, + Reason: "not a Float32", + } + } + default: + if f.Kind() == reflect.Slice { + switch f.Type().Elem().Kind() { + case reflect.String: + safeArray := prop.ToArray() + if safeArray != nil { + arr := safeArray.ToValueArray() + fArr := reflect.MakeSlice(f.Type(), len(arr), len(arr)) + for i, v := range arr { + s := fArr.Index(i) + s.SetString(v.(string)) + } + f.Set(fArr) + } + case reflect.Uint8: + safeArray := prop.ToArray() + if safeArray != nil { + arr := safeArray.ToValueArray() + fArr := reflect.MakeSlice(f.Type(), len(arr), len(arr)) + for i, v := range arr { + s := fArr.Index(i) + s.SetUint(reflect.ValueOf(v).Uint()) + } + f.Set(fArr) + } + default: + return &ErrFieldMismatch{ + StructType: of.Type(), + FieldName: n, + Reason: fmt.Sprintf("unsupported slice type (%T)", val), + } + } + } else { + typeof := reflect.TypeOf(val) + if typeof == nil && (isPtr || c.NonePtrZero) { + if (isPtr && c.PtrNil) || (!isPtr && c.NonePtrZero) { + of.Set(reflect.Zero(of.Type())) + } + break + } + return &ErrFieldMismatch{ + StructType: of.Type(), + FieldName: n, + Reason: fmt.Sprintf("unsupported type (%T)", val), + } + } + } + } + return errFieldMismatch +} + +type multiArgType int + +const ( + multiArgTypeInvalid multiArgType = iota + multiArgTypeStruct + multiArgTypeStructPtr +) + +// checkMultiArg checks that v has type []S, []*S for some struct type S. +// +// It returns what category the slice's elements are, and the reflect.Type +// that represents S. +func checkMultiArg(v reflect.Value) (m multiArgType, elemType reflect.Type) { + if v.Kind() != reflect.Slice { + return multiArgTypeInvalid, nil + } + elemType = v.Type().Elem() + switch elemType.Kind() { + case reflect.Struct: + return multiArgTypeStruct, elemType + case reflect.Ptr: + elemType = elemType.Elem() + if elemType.Kind() == reflect.Struct { + return multiArgTypeStructPtr, elemType + } + } + return multiArgTypeInvalid, nil +} + +func oleInt64(item *ole.IDispatch, prop string) (int64, error) { + v, err := oleutil.GetProperty(item, prop) + if err != nil { + return 0, err + } + defer v.Clear() + + i := int64(v.Val) + return i, nil +} + +// CreateQuery returns a WQL query string that queries all columns of src. where +// is an optional string that is appended to the query, to be used with WHERE +// clauses. In such a case, the "WHERE" string should appear at the beginning. +func CreateQuery(src interface{}, where string) string { + var b bytes.Buffer + b.WriteString("SELECT ") + s := reflect.Indirect(reflect.ValueOf(src)) + t := s.Type() + if s.Kind() == reflect.Slice { + t = t.Elem() + } + if t.Kind() != reflect.Struct { + return "" + } + var fields []string + for i := 0; i < t.NumField(); i++ { + fields = append(fields, t.Field(i).Name) + } + b.WriteString(strings.Join(fields, ", ")) + b.WriteString(" FROM ") + b.WriteString(t.Name()) + b.WriteString(" " + where) + return b.String() +} diff --git a/vendor/github.com/astaxie/beego/LICENSE b/vendor/github.com/astaxie/beego/LICENSE new file mode 100644 index 0000000..5dbd424 --- /dev/null +++ b/vendor/github.com/astaxie/beego/LICENSE @@ -0,0 +1,13 @@ +Copyright 2014 astaxie + +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. \ No newline at end of file diff --git a/vendor/github.com/astaxie/beego/logs/README.md b/vendor/github.com/astaxie/beego/logs/README.md new file mode 100644 index 0000000..c05bcc0 --- /dev/null +++ b/vendor/github.com/astaxie/beego/logs/README.md @@ -0,0 +1,72 @@ +## logs +logs is a Go logs manager. It can use many logs adapters. The repo is inspired by `database/sql` . + + +## How to install? + + go get github.com/astaxie/beego/logs + + +## What adapters are supported? + +As of now this logs support console, file,smtp and conn. + + +## How to use it? + +First you must import it + +```golang +import ( + "github.com/astaxie/beego/logs" +) +``` + +Then init a Log (example with console adapter) + +```golang +log := logs.NewLogger(10000) +log.SetLogger("console", "") +``` + +> the first params stand for how many channel + +Use it like this: + +```golang +log.Trace("trace") +log.Info("info") +log.Warn("warning") +log.Debug("debug") +log.Critical("critical") +``` + +## File adapter + +Configure file adapter like this: + +```golang +log := NewLogger(10000) +log.SetLogger("file", `{"filename":"test.log"}`) +``` + +## Conn adapter + +Configure like this: + +```golang +log := NewLogger(1000) +log.SetLogger("conn", `{"net":"tcp","addr":":7020"}`) +log.Info("info") +``` + +## Smtp adapter + +Configure like this: + +```golang +log := NewLogger(10000) +log.SetLogger("smtp", `{"username":"beegotest@gmail.com","password":"xxxxxxxx","host":"smtp.gmail.com:587","sendTos":["xiemengjun@gmail.com"]}`) +log.Critical("sendmail critical") +time.Sleep(time.Second * 30) +``` diff --git a/vendor/github.com/astaxie/beego/logs/accesslog.go b/vendor/github.com/astaxie/beego/logs/accesslog.go new file mode 100644 index 0000000..3ff9e20 --- /dev/null +++ b/vendor/github.com/astaxie/beego/logs/accesslog.go @@ -0,0 +1,83 @@ +// Copyright 2014 beego Author. All Rights Reserved. +// +// 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 logs + +import ( + "bytes" + "strings" + "encoding/json" + "fmt" + "time" +) + +const ( + apacheFormatPattern = "%s - - [%s] \"%s %d %d\" %f %s %s" + apacheFormat = "APACHE_FORMAT" + jsonFormat = "JSON_FORMAT" +) + +// AccessLogRecord struct for holding access log data. +type AccessLogRecord struct { + RemoteAddr string `json:"remote_addr"` + RequestTime time.Time `json:"request_time"` + RequestMethod string `json:"request_method"` + Request string `json:"request"` + ServerProtocol string `json:"server_protocol"` + Host string `json:"host"` + Status int `json:"status"` + BodyBytesSent int64 `json:"body_bytes_sent"` + ElapsedTime time.Duration `json:"elapsed_time"` + HTTPReferrer string `json:"http_referrer"` + HTTPUserAgent string `json:"http_user_agent"` + RemoteUser string `json:"remote_user"` +} + +func (r *AccessLogRecord) json() ([]byte, error) { + buffer := &bytes.Buffer{} + encoder := json.NewEncoder(buffer) + disableEscapeHTML(encoder) + + err := encoder.Encode(r) + return buffer.Bytes(), err +} + +func disableEscapeHTML(i interface{}) { + if e, ok := i.(interface { + SetEscapeHTML(bool) + }); ok { + e.SetEscapeHTML(false) + } +} + +// AccessLog - Format and print access log. +func AccessLog(r *AccessLogRecord, format string) { + var msg string + switch format { + case apacheFormat: + timeFormatted := r.RequestTime.Format("02/Jan/2006 03:04:05") + msg = fmt.Sprintf(apacheFormatPattern, r.RemoteAddr, timeFormatted, r.Request, r.Status, r.BodyBytesSent, + r.ElapsedTime.Seconds(), r.HTTPReferrer, r.HTTPUserAgent) + case jsonFormat: + fallthrough + default: + jsonData, err := r.json() + if err != nil { + msg = fmt.Sprintf(`{"Error": "%s"}`, err) + } else { + msg = string(jsonData) + } + } + beeLogger.writeMsg(levelLoggerImpl, strings.TrimSpace(msg)) +} diff --git a/vendor/github.com/astaxie/beego/logs/conn.go b/vendor/github.com/astaxie/beego/logs/conn.go new file mode 100644 index 0000000..afe0cbb --- /dev/null +++ b/vendor/github.com/astaxie/beego/logs/conn.go @@ -0,0 +1,117 @@ +// Copyright 2014 beego Author. All Rights Reserved. +// +// 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 logs + +import ( + "encoding/json" + "io" + "net" + "time" +) + +// connWriter implements LoggerInterface. +// it writes messages in keep-live tcp connection. +type connWriter struct { + lg *logWriter + innerWriter io.WriteCloser + ReconnectOnMsg bool `json:"reconnectOnMsg"` + Reconnect bool `json:"reconnect"` + Net string `json:"net"` + Addr string `json:"addr"` + Level int `json:"level"` +} + +// NewConn create new ConnWrite returning as LoggerInterface. +func NewConn() Logger { + conn := new(connWriter) + conn.Level = LevelTrace + return conn +} + +// Init init connection writer with json config. +// json config only need key "level". +func (c *connWriter) Init(jsonConfig string) error { + return json.Unmarshal([]byte(jsonConfig), c) +} + +// WriteMsg write message in connection. +// if connection is down, try to re-connect. +func (c *connWriter) WriteMsg(when time.Time, msg string, level int) error { + if level > c.Level { + return nil + } + if c.needToConnectOnMsg() { + err := c.connect() + if err != nil { + return err + } + } + + if c.ReconnectOnMsg { + defer c.innerWriter.Close() + } + + c.lg.writeln(when, msg) + return nil +} + +// Flush implementing method. empty. +func (c *connWriter) Flush() { + +} + +// Destroy destroy connection writer and close tcp listener. +func (c *connWriter) Destroy() { + if c.innerWriter != nil { + c.innerWriter.Close() + } +} + +func (c *connWriter) connect() error { + if c.innerWriter != nil { + c.innerWriter.Close() + c.innerWriter = nil + } + + conn, err := net.Dial(c.Net, c.Addr) + if err != nil { + return err + } + + if tcpConn, ok := conn.(*net.TCPConn); ok { + tcpConn.SetKeepAlive(true) + } + + c.innerWriter = conn + c.lg = newLogWriter(conn) + return nil +} + +func (c *connWriter) needToConnectOnMsg() bool { + if c.Reconnect { + c.Reconnect = false + return true + } + + if c.innerWriter == nil { + return true + } + + return c.ReconnectOnMsg +} + +func init() { + Register(AdapterConn, NewConn) +} diff --git a/vendor/github.com/astaxie/beego/logs/console.go b/vendor/github.com/astaxie/beego/logs/console.go new file mode 100644 index 0000000..3dcaee1 --- /dev/null +++ b/vendor/github.com/astaxie/beego/logs/console.go @@ -0,0 +1,99 @@ +// Copyright 2014 beego Author. All Rights Reserved. +// +// 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 logs + +import ( + "encoding/json" + "os" + "strings" + "time" + + "github.com/shiena/ansicolor" +) + +// brush is a color join function +type brush func(string) string + +// newBrush return a fix color Brush +func newBrush(color string) brush { + pre := "\033[" + reset := "\033[0m" + return func(text string) string { + return pre + color + "m" + text + reset + } +} + +var colors = []brush{ + newBrush("1;37"), // Emergency white + newBrush("1;36"), // Alert cyan + newBrush("1;35"), // Critical magenta + newBrush("1;31"), // Error red + newBrush("1;33"), // Warning yellow + newBrush("1;32"), // Notice green + newBrush("1;34"), // Informational blue + newBrush("1;44"), // Debug Background blue +} + +// consoleWriter implements LoggerInterface and writes messages to terminal. +type consoleWriter struct { + lg *logWriter + Level int `json:"level"` + Colorful bool `json:"color"` //this filed is useful only when system's terminal supports color +} + +// NewConsole create ConsoleWriter returning as LoggerInterface. +func NewConsole() Logger { + cw := &consoleWriter{ + lg: newLogWriter(ansicolor.NewAnsiColorWriter(os.Stdout)), + Level: LevelDebug, + Colorful: true, + } + return cw +} + +// Init init console logger. +// jsonConfig like '{"level":LevelTrace}'. +func (c *consoleWriter) Init(jsonConfig string) error { + if len(jsonConfig) == 0 { + return nil + } + return json.Unmarshal([]byte(jsonConfig), c) +} + +// WriteMsg write message in console. +func (c *consoleWriter) WriteMsg(when time.Time, msg string, level int) error { + if level > c.Level { + return nil + } + if c.Colorful { + msg = strings.Replace(msg, levelPrefix[level], colors[level](levelPrefix[level]), 1) + } + c.lg.writeln(when, msg) + return nil +} + +// Destroy implementing method. empty. +func (c *consoleWriter) Destroy() { + +} + +// Flush implementing method. empty. +func (c *consoleWriter) Flush() { + +} + +func init() { + Register(AdapterConsole, NewConsole) +} diff --git a/vendor/github.com/astaxie/beego/logs/file.go b/vendor/github.com/astaxie/beego/logs/file.go new file mode 100644 index 0000000..588f786 --- /dev/null +++ b/vendor/github.com/astaxie/beego/logs/file.go @@ -0,0 +1,405 @@ +// Copyright 2014 beego Author. All Rights Reserved. +// +// 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 logs + +import ( + "bytes" + "encoding/json" + "errors" + "fmt" + "io" + "os" + "path" + "path/filepath" + "strconv" + "strings" + "sync" + "time" +) + +// fileLogWriter implements LoggerInterface. +// It writes messages by lines limit, file size limit, or time frequency. +type fileLogWriter struct { + sync.RWMutex // write log order by order and atomic incr maxLinesCurLines and maxSizeCurSize + // The opened file + Filename string `json:"filename"` + fileWriter *os.File + + // Rotate at line + MaxLines int `json:"maxlines"` + maxLinesCurLines int + + MaxFiles int `json:"maxfiles"` + MaxFilesCurFiles int + + // Rotate at size + MaxSize int `json:"maxsize"` + maxSizeCurSize int + + // Rotate daily + Daily bool `json:"daily"` + MaxDays int64 `json:"maxdays"` + dailyOpenDate int + dailyOpenTime time.Time + + // Rotate hourly + Hourly bool `json:"hourly"` + MaxHours int64 `json:"maxhours"` + hourlyOpenDate int + hourlyOpenTime time.Time + + Rotate bool `json:"rotate"` + + Level int `json:"level"` + + Perm string `json:"perm"` + + RotatePerm string `json:"rotateperm"` + + fileNameOnly, suffix string // like "project.log", project is fileNameOnly and .log is suffix +} + +// newFileWriter create a FileLogWriter returning as LoggerInterface. +func newFileWriter() Logger { + w := &fileLogWriter{ + Daily: true, + MaxDays: 7, + Hourly: false, + MaxHours: 168, + Rotate: true, + RotatePerm: "0440", + Level: LevelTrace, + Perm: "0660", + MaxLines: 10000000, + MaxFiles: 999, + MaxSize: 1 << 28, + } + return w +} + +// Init file logger with json config. +// jsonConfig like: +// { +// "filename":"logs/beego.log", +// "maxLines":10000, +// "maxsize":1024, +// "daily":true, +// "maxDays":15, +// "rotate":true, +// "perm":"0600" +// } +func (w *fileLogWriter) Init(jsonConfig string) error { + err := json.Unmarshal([]byte(jsonConfig), w) + if err != nil { + return err + } + if len(w.Filename) == 0 { + return errors.New("jsonconfig must have filename") + } + w.suffix = filepath.Ext(w.Filename) + w.fileNameOnly = strings.TrimSuffix(w.Filename, w.suffix) + if w.suffix == "" { + w.suffix = ".log" + } + err = w.startLogger() + return err +} + +// start file logger. create log file and set to locker-inside file writer. +func (w *fileLogWriter) startLogger() error { + file, err := w.createLogFile() + if err != nil { + return err + } + if w.fileWriter != nil { + w.fileWriter.Close() + } + w.fileWriter = file + return w.initFd() +} + +func (w *fileLogWriter) needRotateDaily(size int, day int) bool { + return (w.MaxLines > 0 && w.maxLinesCurLines >= w.MaxLines) || + (w.MaxSize > 0 && w.maxSizeCurSize >= w.MaxSize) || + (w.Daily && day != w.dailyOpenDate) +} + +func (w *fileLogWriter) needRotateHourly(size int, hour int) bool { + return (w.MaxLines > 0 && w.maxLinesCurLines >= w.MaxLines) || + (w.MaxSize > 0 && w.maxSizeCurSize >= w.MaxSize) || + (w.Hourly && hour != w.hourlyOpenDate) + +} + +// WriteMsg write logger message into file. +func (w *fileLogWriter) WriteMsg(when time.Time, msg string, level int) error { + if level > w.Level { + return nil + } + hd, d, h := formatTimeHeader(when) + msg = string(hd) + msg + "\n" + if w.Rotate { + w.RLock() + if w.needRotateHourly(len(msg), h) { + w.RUnlock() + w.Lock() + if w.needRotateHourly(len(msg), h) { + if err := w.doRotate(when); err != nil { + fmt.Fprintf(os.Stderr, "FileLogWriter(%q): %s\n", w.Filename, err) + } + } + w.Unlock() + } else if w.needRotateDaily(len(msg), d) { + w.RUnlock() + w.Lock() + if w.needRotateDaily(len(msg), d) { + if err := w.doRotate(when); err != nil { + fmt.Fprintf(os.Stderr, "FileLogWriter(%q): %s\n", w.Filename, err) + } + } + w.Unlock() + } else { + w.RUnlock() + } + } + + w.Lock() + _, err := w.fileWriter.Write([]byte(msg)) + if err == nil { + w.maxLinesCurLines++ + w.maxSizeCurSize += len(msg) + } + w.Unlock() + return err +} + +func (w *fileLogWriter) createLogFile() (*os.File, error) { + // Open the log file + perm, err := strconv.ParseInt(w.Perm, 8, 64) + if err != nil { + return nil, err + } + + filepath := path.Dir(w.Filename) + os.MkdirAll(filepath, os.FileMode(perm)) + + fd, err := os.OpenFile(w.Filename, os.O_WRONLY|os.O_APPEND|os.O_CREATE, os.FileMode(perm)) + if err == nil { + // Make sure file perm is user set perm cause of `os.OpenFile` will obey umask + os.Chmod(w.Filename, os.FileMode(perm)) + } + return fd, err +} + +func (w *fileLogWriter) initFd() error { + fd := w.fileWriter + fInfo, err := fd.Stat() + if err != nil { + return fmt.Errorf("get stat err: %s", err) + } + w.maxSizeCurSize = int(fInfo.Size()) + w.dailyOpenTime = time.Now() + w.dailyOpenDate = w.dailyOpenTime.Day() + w.hourlyOpenTime = time.Now() + w.hourlyOpenDate = w.hourlyOpenTime.Hour() + w.maxLinesCurLines = 0 + if w.Hourly { + go w.hourlyRotate(w.hourlyOpenTime) + } else if w.Daily { + go w.dailyRotate(w.dailyOpenTime) + } + if fInfo.Size() > 0 && w.MaxLines > 0 { + count, err := w.lines() + if err != nil { + return err + } + w.maxLinesCurLines = count + } + return nil +} + +func (w *fileLogWriter) dailyRotate(openTime time.Time) { + y, m, d := openTime.Add(24 * time.Hour).Date() + nextDay := time.Date(y, m, d, 0, 0, 0, 0, openTime.Location()) + tm := time.NewTimer(time.Duration(nextDay.UnixNano() - openTime.UnixNano() + 100)) + <-tm.C + w.Lock() + if w.needRotateDaily(0, time.Now().Day()) { + if err := w.doRotate(time.Now()); err != nil { + fmt.Fprintf(os.Stderr, "FileLogWriter(%q): %s\n", w.Filename, err) + } + } + w.Unlock() +} + +func (w *fileLogWriter) hourlyRotate(openTime time.Time) { + y, m, d := openTime.Add(1 * time.Hour).Date() + h, _, _ := openTime.Add(1 * time.Hour).Clock() + nextHour := time.Date(y, m, d, h, 0, 0, 0, openTime.Location()) + tm := time.NewTimer(time.Duration(nextHour.UnixNano() - openTime.UnixNano() + 100)) + <-tm.C + w.Lock() + if w.needRotateHourly(0, time.Now().Hour()) { + if err := w.doRotate(time.Now()); err != nil { + fmt.Fprintf(os.Stderr, "FileLogWriter(%q): %s\n", w.Filename, err) + } + } + w.Unlock() +} + +func (w *fileLogWriter) lines() (int, error) { + fd, err := os.Open(w.Filename) + if err != nil { + return 0, err + } + defer fd.Close() + + buf := make([]byte, 32768) // 32k + count := 0 + lineSep := []byte{'\n'} + + for { + c, err := fd.Read(buf) + if err != nil && err != io.EOF { + return count, err + } + + count += bytes.Count(buf[:c], lineSep) + + if err == io.EOF { + break + } + } + + return count, nil +} + +// DoRotate means it need to write file in new file. +// new file name like xx.2013-01-01.log (daily) or xx.001.log (by line or size) +func (w *fileLogWriter) doRotate(logTime time.Time) error { + // file exists + // Find the next available number + num := w.MaxFilesCurFiles + 1 + fName := "" + format := "" + var openTime time.Time + rotatePerm, err := strconv.ParseInt(w.RotatePerm, 8, 64) + if err != nil { + return err + } + + _, err = os.Lstat(w.Filename) + if err != nil { + //even if the file is not exist or other ,we should RESTART the logger + goto RESTART_LOGGER + } + + if w.Hourly { + format = "2006010215" + openTime = w.hourlyOpenTime + } else if w.Daily { + format = "2006-01-02" + openTime = w.dailyOpenTime + } + + // only when one of them be setted, then the file would be splited + if w.MaxLines > 0 || w.MaxSize > 0 { + for ; err == nil && num <= w.MaxFiles; num++ { + fName = w.fileNameOnly + fmt.Sprintf(".%s.%03d%s", logTime.Format(format), num, w.suffix) + _, err = os.Lstat(fName) + } + } else { + fName = w.fileNameOnly + fmt.Sprintf(".%s.%03d%s", openTime.Format(format), num, w.suffix) + _, err = os.Lstat(fName) + w.MaxFilesCurFiles = num + } + + // return error if the last file checked still existed + if err == nil { + return fmt.Errorf("Rotate: Cannot find free log number to rename %s", w.Filename) + } + + // close fileWriter before rename + w.fileWriter.Close() + + // Rename the file to its new found name + // even if occurs error,we MUST guarantee to restart new logger + err = os.Rename(w.Filename, fName) + if err != nil { + goto RESTART_LOGGER + } + + err = os.Chmod(fName, os.FileMode(rotatePerm)) + +RESTART_LOGGER: + + startLoggerErr := w.startLogger() + go w.deleteOldLog() + + if startLoggerErr != nil { + return fmt.Errorf("Rotate StartLogger: %s", startLoggerErr) + } + if err != nil { + return fmt.Errorf("Rotate: %s", err) + } + return nil +} + +func (w *fileLogWriter) deleteOldLog() { + dir := filepath.Dir(w.Filename) + filepath.Walk(dir, func(path string, info os.FileInfo, err error) (returnErr error) { + defer func() { + if r := recover(); r != nil { + fmt.Fprintf(os.Stderr, "Unable to delete old log '%s', error: %v\n", path, r) + } + }() + + if info == nil { + return + } + if w.Hourly { + if !info.IsDir() && info.ModTime().Add(1 * time.Hour * time.Duration(w.MaxHours)).Before(time.Now()) { + if strings.HasPrefix(filepath.Base(path), filepath.Base(w.fileNameOnly)) && + strings.HasSuffix(filepath.Base(path), w.suffix) { + os.Remove(path) + } + } + } else if w.Daily { + if !info.IsDir() && info.ModTime().Add(24 * time.Hour * time.Duration(w.MaxDays)).Before(time.Now()) { + if strings.HasPrefix(filepath.Base(path), filepath.Base(w.fileNameOnly)) && + strings.HasSuffix(filepath.Base(path), w.suffix) { + os.Remove(path) + } + } + } + return + }) +} + +// Destroy close the file description, close file writer. +func (w *fileLogWriter) Destroy() { + w.fileWriter.Close() +} + +// Flush flush file logger. +// there are no buffering messages in file logger in memory. +// flush file means sync file from disk. +func (w *fileLogWriter) Flush() { + w.fileWriter.Sync() +} + +func init() { + Register(AdapterFile, newFileWriter) +} diff --git a/vendor/github.com/astaxie/beego/logs/jianliao.go b/vendor/github.com/astaxie/beego/logs/jianliao.go new file mode 100644 index 0000000..88ba0f9 --- /dev/null +++ b/vendor/github.com/astaxie/beego/logs/jianliao.go @@ -0,0 +1,72 @@ +package logs + +import ( + "encoding/json" + "fmt" + "net/http" + "net/url" + "time" +) + +// JLWriter implements beego LoggerInterface and is used to send jiaoliao webhook +type JLWriter struct { + AuthorName string `json:"authorname"` + Title string `json:"title"` + WebhookURL string `json:"webhookurl"` + RedirectURL string `json:"redirecturl,omitempty"` + ImageURL string `json:"imageurl,omitempty"` + Level int `json:"level"` +} + +// newJLWriter create jiaoliao writer. +func newJLWriter() Logger { + return &JLWriter{Level: LevelTrace} +} + +// Init JLWriter with json config string +func (s *JLWriter) Init(jsonconfig string) error { + return json.Unmarshal([]byte(jsonconfig), s) +} + +// WriteMsg write message in smtp writer. +// it will send an email with subject and only this message. +func (s *JLWriter) WriteMsg(when time.Time, msg string, level int) error { + if level > s.Level { + return nil + } + + text := fmt.Sprintf("%s %s", when.Format("2006-01-02 15:04:05"), msg) + + form := url.Values{} + form.Add("authorName", s.AuthorName) + form.Add("title", s.Title) + form.Add("text", text) + if s.RedirectURL != "" { + form.Add("redirectUrl", s.RedirectURL) + } + if s.ImageURL != "" { + form.Add("imageUrl", s.ImageURL) + } + + resp, err := http.PostForm(s.WebhookURL, form) + if err != nil { + return err + } + defer resp.Body.Close() + if resp.StatusCode != http.StatusOK { + return fmt.Errorf("Post webhook failed %s %d", resp.Status, resp.StatusCode) + } + return nil +} + +// Flush implementing method. empty. +func (s *JLWriter) Flush() { +} + +// Destroy implementing method. empty. +func (s *JLWriter) Destroy() { +} + +func init() { + Register(AdapterJianLiao, newJLWriter) +} diff --git a/vendor/github.com/astaxie/beego/logs/log.go b/vendor/github.com/astaxie/beego/logs/log.go new file mode 100644 index 0000000..49f3794 --- /dev/null +++ b/vendor/github.com/astaxie/beego/logs/log.go @@ -0,0 +1,665 @@ +// Copyright 2014 beego Author. All Rights Reserved. +// +// 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 logs provide a general log interface +// Usage: +// +// import "github.com/astaxie/beego/logs" +// +// log := NewLogger(10000) +// log.SetLogger("console", "") +// +// > the first params stand for how many channel +// +// Use it like this: +// +// log.Trace("trace") +// log.Info("info") +// log.Warn("warning") +// log.Debug("debug") +// log.Critical("critical") +// +// more docs http://beego.me/docs/module/logs.md +package logs + +import ( + "fmt" + "log" + "os" + "path" + "runtime" + "strconv" + "strings" + "sync" + "time" +) + +// RFC5424 log message levels. +const ( + LevelEmergency = iota + LevelAlert + LevelCritical + LevelError + LevelWarning + LevelNotice + LevelInformational + LevelDebug +) + +// levelLogLogger is defined to implement log.Logger +// the real log level will be LevelEmergency +const levelLoggerImpl = -1 + +// Name for adapter with beego official support +const ( + AdapterConsole = "console" + AdapterFile = "file" + AdapterMultiFile = "multifile" + AdapterMail = "smtp" + AdapterConn = "conn" + AdapterEs = "es" + AdapterJianLiao = "jianliao" + AdapterSlack = "slack" + AdapterAliLS = "alils" +) + +// Legacy log level constants to ensure backwards compatibility. +const ( + LevelInfo = LevelInformational + LevelTrace = LevelDebug + LevelWarn = LevelWarning +) + +type newLoggerFunc func() Logger + +// Logger defines the behavior of a log provider. +type Logger interface { + Init(config string) error + WriteMsg(when time.Time, msg string, level int) error + Destroy() + Flush() +} + +var adapters = make(map[string]newLoggerFunc) +var levelPrefix = [LevelDebug + 1]string{"[M]", "[A]", "[C]", "[E]", "[W]", "[N]", "[I]", "[D]"} + +// Register makes a log provide available by the provided name. +// If Register is called twice with the same name or if driver is nil, +// it panics. +func Register(name string, log newLoggerFunc) { + if log == nil { + panic("logs: Register provide is nil") + } + if _, dup := adapters[name]; dup { + panic("logs: Register called twice for provider " + name) + } + adapters[name] = log +} + +// BeeLogger is default logger in beego application. +// it can contain several providers and log message into all providers. +type BeeLogger struct { + lock sync.Mutex + level int + init bool + enableFuncCallDepth bool + loggerFuncCallDepth int + asynchronous bool + prefix string + msgChanLen int64 + msgChan chan *logMsg + signalChan chan string + wg sync.WaitGroup + outputs []*nameLogger +} + +const defaultAsyncMsgLen = 1e3 + +type nameLogger struct { + Logger + name string +} + +type logMsg struct { + level int + msg string + when time.Time +} + +var logMsgPool *sync.Pool + +// NewLogger returns a new BeeLogger. +// channelLen means the number of messages in chan(used where asynchronous is true). +// if the buffering chan is full, logger adapters write to file or other way. +func NewLogger(channelLens ...int64) *BeeLogger { + bl := new(BeeLogger) + bl.level = LevelDebug + bl.loggerFuncCallDepth = 2 + bl.msgChanLen = append(channelLens, 0)[0] + if bl.msgChanLen <= 0 { + bl.msgChanLen = defaultAsyncMsgLen + } + bl.signalChan = make(chan string, 1) + bl.setLogger(AdapterConsole) + return bl +} + +// Async set the log to asynchronous and start the goroutine +func (bl *BeeLogger) Async(msgLen ...int64) *BeeLogger { + bl.lock.Lock() + defer bl.lock.Unlock() + if bl.asynchronous { + return bl + } + bl.asynchronous = true + if len(msgLen) > 0 && msgLen[0] > 0 { + bl.msgChanLen = msgLen[0] + } + bl.msgChan = make(chan *logMsg, bl.msgChanLen) + logMsgPool = &sync.Pool{ + New: func() interface{} { + return &logMsg{} + }, + } + bl.wg.Add(1) + go bl.startLogger() + return bl +} + +// SetLogger provides a given logger adapter into BeeLogger with config string. +// config need to be correct JSON as string: {"interval":360}. +func (bl *BeeLogger) setLogger(adapterName string, configs ...string) error { + config := append(configs, "{}")[0] + for _, l := range bl.outputs { + if l.name == adapterName { + return fmt.Errorf("logs: duplicate adaptername %q (you have set this logger before)", adapterName) + } + } + + logAdapter, ok := adapters[adapterName] + if !ok { + return fmt.Errorf("logs: unknown adaptername %q (forgotten Register?)", adapterName) + } + + lg := logAdapter() + err := lg.Init(config) + if err != nil { + fmt.Fprintln(os.Stderr, "logs.BeeLogger.SetLogger: "+err.Error()) + return err + } + bl.outputs = append(bl.outputs, &nameLogger{name: adapterName, Logger: lg}) + return nil +} + +// SetLogger provides a given logger adapter into BeeLogger with config string. +// config need to be correct JSON as string: {"interval":360}. +func (bl *BeeLogger) SetLogger(adapterName string, configs ...string) error { + bl.lock.Lock() + defer bl.lock.Unlock() + if !bl.init { + bl.outputs = []*nameLogger{} + bl.init = true + } + return bl.setLogger(adapterName, configs...) +} + +// DelLogger remove a logger adapter in BeeLogger. +func (bl *BeeLogger) DelLogger(adapterName string) error { + bl.lock.Lock() + defer bl.lock.Unlock() + outputs := []*nameLogger{} + for _, lg := range bl.outputs { + if lg.name == adapterName { + lg.Destroy() + } else { + outputs = append(outputs, lg) + } + } + if len(outputs) == len(bl.outputs) { + return fmt.Errorf("logs: unknown adaptername %q (forgotten Register?)", adapterName) + } + bl.outputs = outputs + return nil +} + +func (bl *BeeLogger) writeToLoggers(when time.Time, msg string, level int) { + for _, l := range bl.outputs { + err := l.WriteMsg(when, msg, level) + if err != nil { + fmt.Fprintf(os.Stderr, "unable to WriteMsg to adapter:%v,error:%v\n", l.name, err) + } + } +} + +func (bl *BeeLogger) Write(p []byte) (n int, err error) { + if len(p) == 0 { + return 0, nil + } + // writeMsg will always add a '\n' character + if p[len(p)-1] == '\n' { + p = p[0 : len(p)-1] + } + // set levelLoggerImpl to ensure all log message will be write out + err = bl.writeMsg(levelLoggerImpl, string(p)) + if err == nil { + return len(p), err + } + return 0, err +} + +func (bl *BeeLogger) writeMsg(logLevel int, msg string, v ...interface{}) error { + if !bl.init { + bl.lock.Lock() + bl.setLogger(AdapterConsole) + bl.lock.Unlock() + } + + if len(v) > 0 { + msg = fmt.Sprintf(msg, v...) + } + + msg = bl.prefix + " " + msg + + when := time.Now() + if bl.enableFuncCallDepth { + _, file, line, ok := runtime.Caller(bl.loggerFuncCallDepth) + if !ok { + file = "???" + line = 0 + } + _, filename := path.Split(file) + msg = "[" + filename + ":" + strconv.Itoa(line) + "] " + msg + } + + //set level info in front of filename info + if logLevel == levelLoggerImpl { + // set to emergency to ensure all log will be print out correctly + logLevel = LevelEmergency + } else { + msg = levelPrefix[logLevel] + " " + msg + } + + if bl.asynchronous { + lm := logMsgPool.Get().(*logMsg) + lm.level = logLevel + lm.msg = msg + lm.when = when + bl.msgChan <- lm + } else { + bl.writeToLoggers(when, msg, logLevel) + } + return nil +} + +// SetLevel Set log message level. +// If message level (such as LevelDebug) is higher than logger level (such as LevelWarning), +// log providers will not even be sent the message. +func (bl *BeeLogger) SetLevel(l int) { + bl.level = l +} + +// GetLevel Get Current log message level. +func (bl *BeeLogger) GetLevel() int { + return bl.level +} + +// SetLogFuncCallDepth set log funcCallDepth +func (bl *BeeLogger) SetLogFuncCallDepth(d int) { + bl.loggerFuncCallDepth = d +} + +// GetLogFuncCallDepth return log funcCallDepth for wrapper +func (bl *BeeLogger) GetLogFuncCallDepth() int { + return bl.loggerFuncCallDepth +} + +// EnableFuncCallDepth enable log funcCallDepth +func (bl *BeeLogger) EnableFuncCallDepth(b bool) { + bl.enableFuncCallDepth = b +} + +// set prefix +func (bl *BeeLogger) SetPrefix(s string) { + bl.prefix = s +} + +// start logger chan reading. +// when chan is not empty, write logs. +func (bl *BeeLogger) startLogger() { + gameOver := false + for { + select { + case bm := <-bl.msgChan: + bl.writeToLoggers(bm.when, bm.msg, bm.level) + logMsgPool.Put(bm) + case sg := <-bl.signalChan: + // Now should only send "flush" or "close" to bl.signalChan + bl.flush() + if sg == "close" { + for _, l := range bl.outputs { + l.Destroy() + } + bl.outputs = nil + gameOver = true + } + bl.wg.Done() + } + if gameOver { + break + } + } +} + +// Emergency Log EMERGENCY level message. +func (bl *BeeLogger) Emergency(format string, v ...interface{}) { + if LevelEmergency > bl.level { + return + } + bl.writeMsg(LevelEmergency, format, v...) +} + +// Alert Log ALERT level message. +func (bl *BeeLogger) Alert(format string, v ...interface{}) { + if LevelAlert > bl.level { + return + } + bl.writeMsg(LevelAlert, format, v...) +} + +// Critical Log CRITICAL level message. +func (bl *BeeLogger) Critical(format string, v ...interface{}) { + if LevelCritical > bl.level { + return + } + bl.writeMsg(LevelCritical, format, v...) +} + +// Error Log ERROR level message. +func (bl *BeeLogger) Error(format string, v ...interface{}) { + if LevelError > bl.level { + return + } + bl.writeMsg(LevelError, format, v...) +} + +// Warning Log WARNING level message. +func (bl *BeeLogger) Warning(format string, v ...interface{}) { + if LevelWarn > bl.level { + return + } + bl.writeMsg(LevelWarn, format, v...) +} + +// Notice Log NOTICE level message. +func (bl *BeeLogger) Notice(format string, v ...interface{}) { + if LevelNotice > bl.level { + return + } + bl.writeMsg(LevelNotice, format, v...) +} + +// Informational Log INFORMATIONAL level message. +func (bl *BeeLogger) Informational(format string, v ...interface{}) { + if LevelInfo > bl.level { + return + } + bl.writeMsg(LevelInfo, format, v...) +} + +// Debug Log DEBUG level message. +func (bl *BeeLogger) Debug(format string, v ...interface{}) { + if LevelDebug > bl.level { + return + } + bl.writeMsg(LevelDebug, format, v...) +} + +// Warn Log WARN level message. +// compatibility alias for Warning() +func (bl *BeeLogger) Warn(format string, v ...interface{}) { + if LevelWarn > bl.level { + return + } + bl.writeMsg(LevelWarn, format, v...) +} + +// Info Log INFO level message. +// compatibility alias for Informational() +func (bl *BeeLogger) Info(format string, v ...interface{}) { + if LevelInfo > bl.level { + return + } + bl.writeMsg(LevelInfo, format, v...) +} + +// Trace Log TRACE level message. +// compatibility alias for Debug() +func (bl *BeeLogger) Trace(format string, v ...interface{}) { + if LevelDebug > bl.level { + return + } + bl.writeMsg(LevelDebug, format, v...) +} + +// Flush flush all chan data. +func (bl *BeeLogger) Flush() { + if bl.asynchronous { + bl.signalChan <- "flush" + bl.wg.Wait() + bl.wg.Add(1) + return + } + bl.flush() +} + +// Close close logger, flush all chan data and destroy all adapters in BeeLogger. +func (bl *BeeLogger) Close() { + if bl.asynchronous { + bl.signalChan <- "close" + bl.wg.Wait() + close(bl.msgChan) + } else { + bl.flush() + for _, l := range bl.outputs { + l.Destroy() + } + bl.outputs = nil + } + close(bl.signalChan) +} + +// Reset close all outputs, and set bl.outputs to nil +func (bl *BeeLogger) Reset() { + bl.Flush() + for _, l := range bl.outputs { + l.Destroy() + } + bl.outputs = nil +} + +func (bl *BeeLogger) flush() { + if bl.asynchronous { + for { + if len(bl.msgChan) > 0 { + bm := <-bl.msgChan + bl.writeToLoggers(bm.when, bm.msg, bm.level) + logMsgPool.Put(bm) + continue + } + break + } + } + for _, l := range bl.outputs { + l.Flush() + } +} + +// beeLogger references the used application logger. +var beeLogger = NewLogger() + +// GetBeeLogger returns the default BeeLogger +func GetBeeLogger() *BeeLogger { + return beeLogger +} + +var beeLoggerMap = struct { + sync.RWMutex + logs map[string]*log.Logger +}{ + logs: map[string]*log.Logger{}, +} + +// GetLogger returns the default BeeLogger +func GetLogger(prefixes ...string) *log.Logger { + prefix := append(prefixes, "")[0] + if prefix != "" { + prefix = fmt.Sprintf(`[%s] `, strings.ToUpper(prefix)) + } + beeLoggerMap.RLock() + l, ok := beeLoggerMap.logs[prefix] + if ok { + beeLoggerMap.RUnlock() + return l + } + beeLoggerMap.RUnlock() + beeLoggerMap.Lock() + defer beeLoggerMap.Unlock() + l, ok = beeLoggerMap.logs[prefix] + if !ok { + l = log.New(beeLogger, prefix, 0) + beeLoggerMap.logs[prefix] = l + } + return l +} + +// Reset will remove all the adapter +func Reset() { + beeLogger.Reset() +} + +// Async set the beelogger with Async mode and hold msglen messages +func Async(msgLen ...int64) *BeeLogger { + return beeLogger.Async(msgLen...) +} + +// SetLevel sets the global log level used by the simple logger. +func SetLevel(l int) { + beeLogger.SetLevel(l) +} + +// SetPrefix sets the prefix +func SetPrefix(s string) { + beeLogger.SetPrefix(s) +} + +// EnableFuncCallDepth enable log funcCallDepth +func EnableFuncCallDepth(b bool) { + beeLogger.enableFuncCallDepth = b +} + +// SetLogFuncCall set the CallDepth, default is 4 +func SetLogFuncCall(b bool) { + beeLogger.EnableFuncCallDepth(b) + beeLogger.SetLogFuncCallDepth(4) +} + +// SetLogFuncCallDepth set log funcCallDepth +func SetLogFuncCallDepth(d int) { + beeLogger.loggerFuncCallDepth = d +} + +// SetLogger sets a new logger. +func SetLogger(adapter string, config ...string) error { + return beeLogger.SetLogger(adapter, config...) +} + +// Emergency logs a message at emergency level. +func Emergency(f interface{}, v ...interface{}) { + beeLogger.Emergency(formatLog(f, v...)) +} + +// Alert logs a message at alert level. +func Alert(f interface{}, v ...interface{}) { + beeLogger.Alert(formatLog(f, v...)) +} + +// Critical logs a message at critical level. +func Critical(f interface{}, v ...interface{}) { + beeLogger.Critical(formatLog(f, v...)) +} + +// Error logs a message at error level. +func Error(f interface{}, v ...interface{}) { + beeLogger.Error(formatLog(f, v...)) +} + +// Warning logs a message at warning level. +func Warning(f interface{}, v ...interface{}) { + beeLogger.Warn(formatLog(f, v...)) +} + +// Warn compatibility alias for Warning() +func Warn(f interface{}, v ...interface{}) { + beeLogger.Warn(formatLog(f, v...)) +} + +// Notice logs a message at notice level. +func Notice(f interface{}, v ...interface{}) { + beeLogger.Notice(formatLog(f, v...)) +} + +// Informational logs a message at info level. +func Informational(f interface{}, v ...interface{}) { + beeLogger.Info(formatLog(f, v...)) +} + +// Info compatibility alias for Warning() +func Info(f interface{}, v ...interface{}) { + beeLogger.Info(formatLog(f, v...)) +} + +// Debug logs a message at debug level. +func Debug(f interface{}, v ...interface{}) { + beeLogger.Debug(formatLog(f, v...)) +} + +// Trace logs a message at trace level. +// compatibility alias for Warning() +func Trace(f interface{}, v ...interface{}) { + beeLogger.Trace(formatLog(f, v...)) +} + +func formatLog(f interface{}, v ...interface{}) string { + var msg string + switch f.(type) { + case string: + msg = f.(string) + if len(v) == 0 { + return msg + } + if strings.Contains(msg, "%") && !strings.Contains(msg, "%%") { + //format string + } else { + //do not contain format char + msg += strings.Repeat(" %v", len(v)) + } + default: + msg = fmt.Sprint(f) + if len(v) == 0 { + return msg + } + msg += strings.Repeat(" %v", len(v)) + } + return fmt.Sprintf(msg, v...) +} diff --git a/vendor/github.com/astaxie/beego/logs/logger.go b/vendor/github.com/astaxie/beego/logs/logger.go new file mode 100644 index 0000000..c7cf8a5 --- /dev/null +++ b/vendor/github.com/astaxie/beego/logs/logger.go @@ -0,0 +1,175 @@ +// Copyright 2014 beego Author. All Rights Reserved. +// +// 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 logs + +import ( + "io" + "runtime" + "sync" + "time" +) + +type logWriter struct { + sync.Mutex + writer io.Writer +} + +func newLogWriter(wr io.Writer) *logWriter { + return &logWriter{writer: wr} +} + +func (lg *logWriter) writeln(when time.Time, msg string) { + lg.Lock() + h, _, _ := formatTimeHeader(when) + lg.writer.Write(append(append(h, msg...), '\n')) + lg.Unlock() +} + +const ( + y1 = `0123456789` + y2 = `0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789` + y3 = `0000000000111111111122222222223333333333444444444455555555556666666666777777777788888888889999999999` + y4 = `0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789` + mo1 = `000000000111` + mo2 = `123456789012` + d1 = `0000000001111111111222222222233` + d2 = `1234567890123456789012345678901` + h1 = `000000000011111111112222` + h2 = `012345678901234567890123` + mi1 = `000000000011111111112222222222333333333344444444445555555555` + mi2 = `012345678901234567890123456789012345678901234567890123456789` + s1 = `000000000011111111112222222222333333333344444444445555555555` + s2 = `012345678901234567890123456789012345678901234567890123456789` + ns1 = `0123456789` +) + +func formatTimeHeader(when time.Time) ([]byte, int, int) { + y, mo, d := when.Date() + h, mi, s := when.Clock() + ns := when.Nanosecond() / 1000000 + //len("2006/01/02 15:04:05.123 ")==24 + var buf [24]byte + + buf[0] = y1[y/1000%10] + buf[1] = y2[y/100] + buf[2] = y3[y-y/100*100] + buf[3] = y4[y-y/100*100] + buf[4] = '/' + buf[5] = mo1[mo-1] + buf[6] = mo2[mo-1] + buf[7] = '/' + buf[8] = d1[d-1] + buf[9] = d2[d-1] + buf[10] = ' ' + buf[11] = h1[h] + buf[12] = h2[h] + buf[13] = ':' + buf[14] = mi1[mi] + buf[15] = mi2[mi] + buf[16] = ':' + buf[17] = s1[s] + buf[18] = s2[s] + buf[19] = '.' + buf[20] = ns1[ns/100] + buf[21] = ns1[ns%100/10] + buf[22] = ns1[ns%10] + + buf[23] = ' ' + + return buf[0:], d, h +} + +var ( + green = string([]byte{27, 91, 57, 55, 59, 52, 50, 109}) + white = string([]byte{27, 91, 57, 48, 59, 52, 55, 109}) + yellow = string([]byte{27, 91, 57, 55, 59, 52, 51, 109}) + red = string([]byte{27, 91, 57, 55, 59, 52, 49, 109}) + blue = string([]byte{27, 91, 57, 55, 59, 52, 52, 109}) + magenta = string([]byte{27, 91, 57, 55, 59, 52, 53, 109}) + cyan = string([]byte{27, 91, 57, 55, 59, 52, 54, 109}) + + w32Green = string([]byte{27, 91, 52, 50, 109}) + w32White = string([]byte{27, 91, 52, 55, 109}) + w32Yellow = string([]byte{27, 91, 52, 51, 109}) + w32Red = string([]byte{27, 91, 52, 49, 109}) + w32Blue = string([]byte{27, 91, 52, 52, 109}) + w32Magenta = string([]byte{27, 91, 52, 53, 109}) + w32Cyan = string([]byte{27, 91, 52, 54, 109}) + + reset = string([]byte{27, 91, 48, 109}) +) + +var once sync.Once +var colorMap map[string]string + +func initColor() { + if runtime.GOOS == "windows" { + green = w32Green + white = w32White + yellow = w32Yellow + red = w32Red + blue = w32Blue + magenta = w32Magenta + cyan = w32Cyan + } + colorMap = map[string]string{ + //by color + "green": green, + "white": white, + "yellow": yellow, + "red": red, + //by method + "GET": blue, + "POST": cyan, + "PUT": yellow, + "DELETE": red, + "PATCH": green, + "HEAD": magenta, + "OPTIONS": white, + } +} + +// ColorByStatus return color by http code +// 2xx return Green +// 3xx return White +// 4xx return Yellow +// 5xx return Red +func ColorByStatus(code int) string { + once.Do(initColor) + switch { + case code >= 200 && code < 300: + return colorMap["green"] + case code >= 300 && code < 400: + return colorMap["white"] + case code >= 400 && code < 500: + return colorMap["yellow"] + default: + return colorMap["red"] + } +} + +// ColorByMethod return color by http code +func ColorByMethod(method string) string { + once.Do(initColor) + if c := colorMap[method]; c != "" { + return c + } + return reset +} + +// ResetColor return reset color +func ResetColor() string { + return reset +} diff --git a/vendor/github.com/astaxie/beego/logs/multifile.go b/vendor/github.com/astaxie/beego/logs/multifile.go new file mode 100644 index 0000000..9016827 --- /dev/null +++ b/vendor/github.com/astaxie/beego/logs/multifile.go @@ -0,0 +1,119 @@ +// Copyright 2014 beego Author. All Rights Reserved. +// +// 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 logs + +import ( + "encoding/json" + "time" +) + +// A filesLogWriter manages several fileLogWriter +// filesLogWriter will write logs to the file in json configuration and write the same level log to correspond file +// means if the file name in configuration is project.log filesLogWriter will create project.error.log/project.debug.log +// and write the error-level logs to project.error.log and write the debug-level logs to project.debug.log +// the rotate attribute also acts like fileLogWriter +type multiFileLogWriter struct { + writers [LevelDebug + 1 + 1]*fileLogWriter // the last one for fullLogWriter + fullLogWriter *fileLogWriter + Separate []string `json:"separate"` +} + +var levelNames = [...]string{"emergency", "alert", "critical", "error", "warning", "notice", "info", "debug"} + +// Init file logger with json config. +// jsonConfig like: +// { +// "filename":"logs/beego.log", +// "maxLines":0, +// "maxsize":0, +// "daily":true, +// "maxDays":15, +// "rotate":true, +// "perm":0600, +// "separate":["emergency", "alert", "critical", "error", "warning", "notice", "info", "debug"], +// } + +func (f *multiFileLogWriter) Init(config string) error { + writer := newFileWriter().(*fileLogWriter) + err := writer.Init(config) + if err != nil { + return err + } + f.fullLogWriter = writer + f.writers[LevelDebug+1] = writer + + //unmarshal "separate" field to f.Separate + json.Unmarshal([]byte(config), f) + + jsonMap := map[string]interface{}{} + json.Unmarshal([]byte(config), &jsonMap) + + for i := LevelEmergency; i < LevelDebug+1; i++ { + for _, v := range f.Separate { + if v == levelNames[i] { + jsonMap["filename"] = f.fullLogWriter.fileNameOnly + "." + levelNames[i] + f.fullLogWriter.suffix + jsonMap["level"] = i + bs, _ := json.Marshal(jsonMap) + writer = newFileWriter().(*fileLogWriter) + err := writer.Init(string(bs)) + if err != nil { + return err + } + f.writers[i] = writer + } + } + } + + return nil +} + +func (f *multiFileLogWriter) Destroy() { + for i := 0; i < len(f.writers); i++ { + if f.writers[i] != nil { + f.writers[i].Destroy() + } + } +} + +func (f *multiFileLogWriter) WriteMsg(when time.Time, msg string, level int) error { + if f.fullLogWriter != nil { + f.fullLogWriter.WriteMsg(when, msg, level) + } + for i := 0; i < len(f.writers)-1; i++ { + if f.writers[i] != nil { + if level == f.writers[i].Level { + f.writers[i].WriteMsg(when, msg, level) + } + } + } + return nil +} + +func (f *multiFileLogWriter) Flush() { + for i := 0; i < len(f.writers); i++ { + if f.writers[i] != nil { + f.writers[i].Flush() + } + } +} + +// newFilesWriter create a FileLogWriter returning as LoggerInterface. +func newFilesWriter() Logger { + return &multiFileLogWriter{} +} + +func init() { + Register(AdapterMultiFile, newFilesWriter) +} diff --git a/vendor/github.com/astaxie/beego/logs/slack.go b/vendor/github.com/astaxie/beego/logs/slack.go new file mode 100644 index 0000000..1cd2e5a --- /dev/null +++ b/vendor/github.com/astaxie/beego/logs/slack.go @@ -0,0 +1,60 @@ +package logs + +import ( + "encoding/json" + "fmt" + "net/http" + "net/url" + "time" +) + +// SLACKWriter implements beego LoggerInterface and is used to send jiaoliao webhook +type SLACKWriter struct { + WebhookURL string `json:"webhookurl"` + Level int `json:"level"` +} + +// newSLACKWriter create jiaoliao writer. +func newSLACKWriter() Logger { + return &SLACKWriter{Level: LevelTrace} +} + +// Init SLACKWriter with json config string +func (s *SLACKWriter) Init(jsonconfig string) error { + return json.Unmarshal([]byte(jsonconfig), s) +} + +// WriteMsg write message in smtp writer. +// it will send an email with subject and only this message. +func (s *SLACKWriter) WriteMsg(when time.Time, msg string, level int) error { + if level > s.Level { + return nil + } + + text := fmt.Sprintf("{\"text\": \"%s %s\"}", when.Format("2006-01-02 15:04:05"), msg) + + form := url.Values{} + form.Add("payload", text) + + resp, err := http.PostForm(s.WebhookURL, form) + if err != nil { + return err + } + defer resp.Body.Close() + if resp.StatusCode != http.StatusOK { + return fmt.Errorf("Post webhook failed %s %d", resp.Status, resp.StatusCode) + } + return nil +} + +// Flush implementing method. empty. +func (s *SLACKWriter) Flush() { +} + +// Destroy implementing method. empty. +func (s *SLACKWriter) Destroy() { +} + +func init() { + Register(AdapterSlack, newSLACKWriter) +} diff --git a/vendor/github.com/astaxie/beego/logs/smtp.go b/vendor/github.com/astaxie/beego/logs/smtp.go new file mode 100644 index 0000000..6208d7b --- /dev/null +++ b/vendor/github.com/astaxie/beego/logs/smtp.go @@ -0,0 +1,149 @@ +// Copyright 2014 beego Author. All Rights Reserved. +// +// 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 logs + +import ( + "crypto/tls" + "encoding/json" + "fmt" + "net" + "net/smtp" + "strings" + "time" +) + +// SMTPWriter implements LoggerInterface and is used to send emails via given SMTP-server. +type SMTPWriter struct { + Username string `json:"username"` + Password string `json:"password"` + Host string `json:"host"` + Subject string `json:"subject"` + FromAddress string `json:"fromAddress"` + RecipientAddresses []string `json:"sendTos"` + Level int `json:"level"` +} + +// NewSMTPWriter create smtp writer. +func newSMTPWriter() Logger { + return &SMTPWriter{Level: LevelTrace} +} + +// Init smtp writer with json config. +// config like: +// { +// "username":"example@gmail.com", +// "password:"password", +// "host":"smtp.gmail.com:465", +// "subject":"email title", +// "fromAddress":"from@example.com", +// "sendTos":["email1","email2"], +// "level":LevelError +// } +func (s *SMTPWriter) Init(jsonconfig string) error { + return json.Unmarshal([]byte(jsonconfig), s) +} + +func (s *SMTPWriter) getSMTPAuth(host string) smtp.Auth { + if len(strings.Trim(s.Username, " ")) == 0 && len(strings.Trim(s.Password, " ")) == 0 { + return nil + } + return smtp.PlainAuth( + "", + s.Username, + s.Password, + host, + ) +} + +func (s *SMTPWriter) sendMail(hostAddressWithPort string, auth smtp.Auth, fromAddress string, recipients []string, msgContent []byte) error { + client, err := smtp.Dial(hostAddressWithPort) + if err != nil { + return err + } + + host, _, _ := net.SplitHostPort(hostAddressWithPort) + tlsConn := &tls.Config{ + InsecureSkipVerify: true, + ServerName: host, + } + if err = client.StartTLS(tlsConn); err != nil { + return err + } + + if auth != nil { + if err = client.Auth(auth); err != nil { + return err + } + } + + if err = client.Mail(fromAddress); err != nil { + return err + } + + for _, rec := range recipients { + if err = client.Rcpt(rec); err != nil { + return err + } + } + + w, err := client.Data() + if err != nil { + return err + } + _, err = w.Write(msgContent) + if err != nil { + return err + } + + err = w.Close() + if err != nil { + return err + } + + return client.Quit() +} + +// WriteMsg write message in smtp writer. +// it will send an email with subject and only this message. +func (s *SMTPWriter) WriteMsg(when time.Time, msg string, level int) error { + if level > s.Level { + return nil + } + + hp := strings.Split(s.Host, ":") + + // Set up authentication information. + auth := s.getSMTPAuth(hp[0]) + + // Connect to the server, authenticate, set the sender and recipient, + // and send the email all in one step. + contentType := "Content-Type: text/plain" + "; charset=UTF-8" + mailmsg := []byte("To: " + strings.Join(s.RecipientAddresses, ";") + "\r\nFrom: " + s.FromAddress + "<" + s.FromAddress + + ">\r\nSubject: " + s.Subject + "\r\n" + contentType + "\r\n\r\n" + fmt.Sprintf(".%s", when.Format("2006-01-02 15:04:05")) + msg) + + return s.sendMail(s.Host, auth, s.FromAddress, s.RecipientAddresses, mailmsg) +} + +// Flush implementing method. empty. +func (s *SMTPWriter) Flush() { +} + +// Destroy implementing method. empty. +func (s *SMTPWriter) Destroy() { +} + +func init() { + Register(AdapterMail, newSMTPWriter) +} diff --git a/vendor/github.com/cznic/mathutil/AUTHORS b/vendor/github.com/cznic/mathutil/AUTHORS new file mode 100644 index 0000000..c0a01b6 --- /dev/null +++ b/vendor/github.com/cznic/mathutil/AUTHORS @@ -0,0 +1,13 @@ +# This file lists authors for copyright purposes. This file is distinct from +# the CONTRIBUTORS files. See the latter for an explanation. +# +# Names should be added to this file as: +# Name or Organization +# +# The email address is not required for organizations. +# +# Please keep the list sorted. + +CZ.NIC z.s.p.o. +Edward Betts +Jan Mercl <0xjnml@gmail.com> diff --git a/vendor/github.com/cznic/mathutil/CONTRIBUTORS b/vendor/github.com/cznic/mathutil/CONTRIBUTORS new file mode 100644 index 0000000..8f2b983 --- /dev/null +++ b/vendor/github.com/cznic/mathutil/CONTRIBUTORS @@ -0,0 +1,14 @@ +# This file lists people who contributed code to this repository. The AUTHORS +# file lists the copyright holders; this file lists people. +# +# Names should be added to this file like so: +# Name +# +# Please keep the list sorted. + +Bodecker DellaMaria +Edward Betts +Faiz Abbasi +Gary Burd +Jan Mercl <0xjnml@gmail.com> +Muhammad Surya diff --git a/vendor/github.com/cznic/mathutil/LICENSE b/vendor/github.com/cznic/mathutil/LICENSE new file mode 100644 index 0000000..128a1b6 --- /dev/null +++ b/vendor/github.com/cznic/mathutil/LICENSE @@ -0,0 +1,27 @@ +Copyright (c) 2014 The mathutil Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the names of the authors nor the names of the +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/cznic/mathutil/Makefile b/vendor/github.com/cznic/mathutil/Makefile new file mode 100644 index 0000000..a9f9e8a --- /dev/null +++ b/vendor/github.com/cznic/mathutil/Makefile @@ -0,0 +1,57 @@ +# Copyright (c) 2016 The mathutil Authors. All rights reserved. +# Use of this source code is governed by a BSD-style +# license that can be found in the LICENSE file. + +.PHONY: all clean cover cpu editor internalError later mem nuke todo edit + +grep=--include=*.go --include=*.l --include=*.y --include=*.yy +ngrep='TODOOK\|parser\.go\|scanner\.go\|.*_string\.go' + +all: editor + go vet 2>&1 | grep -v $(ngrep) || true + golint 2>&1 | grep -v $(ngrep) || true + make todo + unused . || true + misspell *.go + gosimple || true + unconvert || true + maligned || true + +clean: + go clean + rm -f *~ *.test *.out + +cover: + t=$(shell tempfile) ; go test -coverprofile $$t && go tool cover -html $$t && unlink $$t + +cpu: clean + go test -run @ -bench . -cpuprofile cpu.out + go tool pprof -lines *.test cpu.out + +edit: + @ 1>/dev/null 2>/dev/null gvim -p Makefile *.go + +editor: + gofmt -l -s -w *.go + go test + go build + +internalError: + egrep -ho '"internal error.*"' *.go | sort | cat -n + +later: + @grep -n $(grep) LATER * || true + @grep -n $(grep) MAYBE * || true + +mem: clean + go test -run @ -bench . -memprofile mem.out -memprofilerate 1 -timeout 24h + go tool pprof -lines -web -alloc_space *.test mem.out + +nuke: clean + go clean -i + +todo: + @grep -nr $(grep) ^[[:space:]]*_[[:space:]]*=[[:space:]][[:alpha:]][[:alnum:]]* * | grep -v $(ngrep) || true + @grep -nr $(grep) TODO * | grep -v $(ngrep) || true + @grep -nr $(grep) BUG * | grep -v $(ngrep) || true + @grep -nr $(grep) [^[:alpha:]]println * | grep -v $(ngrep) || true diff --git a/vendor/github.com/cznic/mathutil/README b/vendor/github.com/cznic/mathutil/README new file mode 100644 index 0000000..a9ee59c --- /dev/null +++ b/vendor/github.com/cznic/mathutil/README @@ -0,0 +1,10 @@ +This is a goinstall-able mirror of modified code already published at: +http://git.nic.cz/redmine/projects/gornd/repository + +Packages in this repository: + +Install: $ go get github.com/cznic/mathutil +Godocs: http://godoc.org/github.com/cznic/mathutil + +Install: $ go get github.com/cznic/mathutil/mersenne +Godocs: http://godoc.org/github.com/cznic/mathutil/mersenne diff --git a/vendor/github.com/cznic/mathutil/README.md b/vendor/github.com/cznic/mathutil/README.md new file mode 100644 index 0000000..3294a65 --- /dev/null +++ b/vendor/github.com/cznic/mathutil/README.md @@ -0,0 +1,5 @@ +`github.com/cznic/mathutil` has moved to [`modernc.org/mathutil`](https://godoc.org/modernc.org/mathutil) ([vcs](https://gitlab.com/cznic/mathutil)). + +Please update your import paths to `modernc.org/mathutil`. + +This repo is now archived. diff --git a/vendor/github.com/cznic/mathutil/binarylog.go b/vendor/github.com/cznic/mathutil/binarylog.go new file mode 100644 index 0000000..40df459 --- /dev/null +++ b/vendor/github.com/cznic/mathutil/binarylog.go @@ -0,0 +1,88 @@ +// Copyright (c) 2016 The mathutil Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package mathutil + +import ( + "math/big" + + "github.com/remyoudompheng/bigfft" +) + +type float struct { + n *big.Int + fracBits int + maxFracBits int +} + +func newFloat(n *big.Int, fracBits, maxFracBits int) float { + f := float{n: n, fracBits: fracBits, maxFracBits: maxFracBits} + f.normalize() + return f +} + +func (f *float) normalize() { + n := f.n.BitLen() + if n == 0 { + return + } + + if n := f.fracBits - f.maxFracBits; n > 0 { + bit := f.n.Bit(n - 1) + f.n.Rsh(f.n, uint(n)) + if bit != 0 { + f.n.Add(f.n, _1) + } + f.fracBits -= n + } + + var i int + for ; f.fracBits > 0 && i <= f.fracBits && f.n.Bit(i) == 0; i++ { + f.fracBits-- + } + + if i != 0 { + f.n.Rsh(f.n, uint(i)) + } +} + +func (f *float) eq1() bool { return f.fracBits == 0 && f.n.BitLen() == 1 } +func (f *float) ge2() bool { return f.n.BitLen() > f.fracBits+1 } + +func (f *float) div2() { + f.fracBits++ + f.normalize() +} + +func (f *float) sqr() { + f.n = bigfft.Mul(f.n, f.n) + f.fracBits *= 2 + f.normalize() +} + +// BinaryLog computes the binary logarithm of n. The result consists of a +// characteristic and a mantissa having precision mantissaBits. The value of +// the binary logarithm is +// +// characteristic + mantissa*(2^-mantissaBits) +// +// BinaryLog panics for n <= 0 or mantissaBits < 0. +func BinaryLog(n *big.Int, mantissaBits int) (characteristic int, mantissa *big.Int) { + if n.Sign() <= 0 || mantissaBits < 0 { + panic("invalid argument of BinaryLog") + } + + characteristic = n.BitLen() - 1 + mantissa = big.NewInt(0) + x := newFloat(n, characteristic, mantissaBits) + for ; mantissaBits != 0 && !x.eq1(); mantissaBits-- { + x.sqr() + mantissa.Lsh(mantissa, 1) + if x.ge2() { + mantissa.SetBit(mantissa, 0, 1) + x.div2() + } + } + return characteristic, mantissa +} diff --git a/vendor/github.com/cznic/mathutil/bits.go b/vendor/github.com/cznic/mathutil/bits.go new file mode 100644 index 0000000..fee4c03 --- /dev/null +++ b/vendor/github.com/cznic/mathutil/bits.go @@ -0,0 +1,207 @@ +// Copyright (c) 2014 The mathutil Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package mathutil + +import ( + "math/big" +) + +// BitLenByte returns the bit width of the non zero part of n. +func BitLenByte(n byte) int { + return log2[n] + 1 +} + +// BitLenUint16 returns the bit width of the non zero part of n. +func BitLenUint16(n uint16) int { + if b := n >> 8; b != 0 { + return log2[b] + 8 + 1 + } + + return log2[n] + 1 +} + +// BitLenUint32 returns the bit width of the non zero part of n. +func BitLenUint32(n uint32) int { + if b := n >> 24; b != 0 { + return log2[b] + 24 + 1 + } + + if b := n >> 16; b != 0 { + return log2[b] + 16 + 1 + } + + if b := n >> 8; b != 0 { + return log2[b] + 8 + 1 + } + + return log2[n] + 1 +} + +// BitLen returns the bit width of the non zero part of n. +func BitLen(n int) int { // Should handle correctly [future] 64 bit Go ints + if IntBits == 64 { + return BitLenUint64(uint64(n)) + } + + if b := byte(n >> 24); b != 0 { + return log2[b] + 24 + 1 + } + + if b := byte(n >> 16); b != 0 { + return log2[b] + 16 + 1 + } + + if b := byte(n >> 8); b != 0 { + return log2[b] + 8 + 1 + } + + return log2[byte(n)] + 1 +} + +// BitLenUint returns the bit width of the non zero part of n. +func BitLenUint(n uint) int { // Should handle correctly [future] 64 bit Go uints + if IntBits == 64 { + return BitLenUint64(uint64(n)) + } + + if b := n >> 24; b != 0 { + return log2[b] + 24 + 1 + } + + if b := n >> 16; b != 0 { + return log2[b] + 16 + 1 + } + + if b := n >> 8; b != 0 { + return log2[b] + 8 + 1 + } + + return log2[n] + 1 +} + +// BitLenUint64 returns the bit width of the non zero part of n. +func BitLenUint64(n uint64) int { + if b := n >> 56; b != 0 { + return log2[b] + 56 + 1 + } + + if b := n >> 48; b != 0 { + return log2[b] + 48 + 1 + } + + if b := n >> 40; b != 0 { + return log2[b] + 40 + 1 + } + + if b := n >> 32; b != 0 { + return log2[b] + 32 + 1 + } + + if b := n >> 24; b != 0 { + return log2[b] + 24 + 1 + } + + if b := n >> 16; b != 0 { + return log2[b] + 16 + 1 + } + + if b := n >> 8; b != 0 { + return log2[b] + 8 + 1 + } + + return log2[n] + 1 +} + +// BitLenUintptr returns the bit width of the non zero part of n. +func BitLenUintptr(n uintptr) int { + if b := n >> 56; b != 0 { + return log2[b] + 56 + 1 + } + + if b := n >> 48; b != 0 { + return log2[b] + 48 + 1 + } + + if b := n >> 40; b != 0 { + return log2[b] + 40 + 1 + } + + if b := n >> 32; b != 0 { + return log2[b] + 32 + 1 + } + + if b := n >> 24; b != 0 { + return log2[b] + 24 + 1 + } + + if b := n >> 16; b != 0 { + return log2[b] + 16 + 1 + } + + if b := n >> 8; b != 0 { + return log2[b] + 8 + 1 + } + + return log2[n] + 1 +} + +// PopCountByte returns population count of n (number of bits set in n). +func PopCountByte(n byte) int { + return int(popcnt[n]) +} + +// PopCountUint16 returns population count of n (number of bits set in n). +func PopCountUint16(n uint16) int { + return int(popcnt[byte(n>>8)]) + int(popcnt[byte(n)]) +} + +// PopCountUint32 returns population count of n (number of bits set in n). +func PopCountUint32(n uint32) int { + return int(popcnt[byte(n>>24)]) + int(popcnt[byte(n>>16)]) + + int(popcnt[byte(n>>8)]) + int(popcnt[byte(n)]) +} + +// PopCount returns population count of n (number of bits set in n). +func PopCount(n int) int { // Should handle correctly [future] 64 bit Go ints + if IntBits == 64 { + return PopCountUint64(uint64(n)) + } + + return PopCountUint32(uint32(n)) +} + +// PopCountUint returns population count of n (number of bits set in n). +func PopCountUint(n uint) int { // Should handle correctly [future] 64 bit Go uints + if IntBits == 64 { + return PopCountUint64(uint64(n)) + } + + return PopCountUint32(uint32(n)) +} + +// PopCountUintptr returns population count of n (number of bits set in n). +func PopCountUintptr(n uintptr) int { + if UintPtrBits == 64 { + return PopCountUint64(uint64(n)) + } + + return PopCountUint32(uint32(n)) +} + +// PopCountUint64 returns population count of n (number of bits set in n). +func PopCountUint64(n uint64) int { + return int(popcnt[byte(n>>56)]) + int(popcnt[byte(n>>48)]) + + int(popcnt[byte(n>>40)]) + int(popcnt[byte(n>>32)]) + + int(popcnt[byte(n>>24)]) + int(popcnt[byte(n>>16)]) + + int(popcnt[byte(n>>8)]) + int(popcnt[byte(n)]) +} + +// PopCountBigInt returns population count of |n| (number of bits set in |n|). +func PopCountBigInt(n *big.Int) (r int) { + for _, v := range n.Bits() { + r += PopCountUintptr(uintptr(v)) + } + return +} diff --git a/vendor/github.com/cznic/mathutil/envelope.go b/vendor/github.com/cznic/mathutil/envelope.go new file mode 100644 index 0000000..ff8e601 --- /dev/null +++ b/vendor/github.com/cznic/mathutil/envelope.go @@ -0,0 +1,46 @@ +// Copyright (c) 2014 The mathutil Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package mathutil + +import ( + "math" +) + +// Approximation type determines approximation methods used by e.g. Envelope. +type Approximation int + +// Specific approximation method tags +const ( + _ Approximation = iota + Linear // As named + Sinusoidal // Smooth for all derivations +) + +// Envelope is an utility for defining simple curves using a small (usually) +// set of data points. Envelope returns a value defined by x, points and +// approximation. The value of x must be in [0,1) otherwise the result is +// undefined or the function may panic. Points are interpreted as dividing the +// [0,1) interval in len(points)-1 sections, so len(points) must be > 1 or the +// function may panic. According to the left and right points closing/adjacent +// to the section the resulting value is interpolated using the chosen +// approximation method. Unsupported values of approximation are silently +// interpreted as 'Linear'. +func Envelope(x float64, points []float64, approximation Approximation) float64 { + step := 1 / float64(len(points)-1) + fslot := math.Floor(x / step) + mod := x - fslot*step + slot := int(fslot) + l, r := points[slot], points[slot+1] + rmod := mod / step + switch approximation { + case Sinusoidal: + k := (math.Sin(math.Pi*(rmod-0.5)) + 1) / 2 + return l + (r-l)*k + case Linear: + fallthrough + default: + return l + (r-l)*rmod + } +} diff --git a/vendor/github.com/cznic/mathutil/int.go b/vendor/github.com/cznic/mathutil/int.go new file mode 100644 index 0000000..8255c42 --- /dev/null +++ b/vendor/github.com/cznic/mathutil/int.go @@ -0,0 +1,155 @@ +// Copyright (c) 2018 The mathutil Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package mathutil + +import ( + "fmt" + "math" + "math/big" +) + +var ( + // The maximun Int128 value. + MaxInt128 *big.Int + // The minimun Int128 value. + MinInt128 *big.Int +) + +func init() { + MaxInt128 = big.NewInt(0) + MaxInt128.SetBit(MaxInt128, 127, 1) + MaxInt128.Sub(MaxInt128, _1) + MinInt128 = big.NewInt(0) + MinInt128.Set(MaxInt128) + MinInt128.Add(MinInt128, _1) + MinInt128.Neg(MinInt128) +} + +// Int128 is an 128 bit integer. +type Int128 struct { + Lo int64 // Bits 63..0. + Hi int64 // Bits 127..64. +} + +// Add returns the sum of x and y and a carry indication. +func (x Int128) Add(y Int128) (r Int128, cy bool) { + r.Lo = x.Lo + y.Lo + r.Hi = x.Hi + y.Hi + if uint64(r.Lo) < uint64(x.Lo) { + r.Hi++ + } + return r, (r.Cmp(x) < 0) == (y.Sign() >= 0) +} + +// BigInt returns x in the form of a big.Int. +func (x Int128) BigInt() *big.Int { + r := big.NewInt(x.Hi) + r.Lsh(r, 64) + lo := big.NewInt(0) + lo.SetUint64(uint64(x.Lo)) + return r.Add(r, lo) +} + +// Cmp compares x and y and returns: +// +// -1 if x < y +// 0 if x == y +// +1 if x > y +func (x Int128) Cmp(y Int128) int { + if x.Hi > y.Hi { + return 1 + } + + if x.Hi < y.Hi { + return -1 + } + + if uint64(x.Lo) > uint64(y.Lo) { + return 1 + } + + if uint64(x.Lo) < uint64(y.Lo) { + return -1 + } + + return 0 +} + +// Neg returns -x and an indication that x was not equal to MinInt128. +func (x Int128) Neg() (r Int128, ok bool) { + if x == (Int128{Hi: math.MinInt64}) { + return x, false + } + + x.Lo = ^x.Lo + x.Hi = ^x.Hi + r, _ = x.Add(Int128{Lo: 1}) + return r, true +} + +// SetBigInt sets x to y, returns x and an error, if any. +func (x *Int128) SetBigInt(y *big.Int) (r Int128, err error) { + if y.Cmp(MaxInt128) > 0 { + return *x, fmt.Errorf("%T.SetInt: overflow", x) + } + if y.Cmp(MinInt128) < 0 { + return *x, fmt.Errorf("%T.SetInt: underflow", x) + } + neg := y.Sign() < 0 + var z big.Int + z.Set(y) + if neg { + z.Neg(&z) + } + r.Lo = z.Int64() + z.Rsh(&z, 64) + r.Hi = z.Int64() + if neg { + r, _ = r.Neg() + } + *x = r + return r, nil +} + +// SetInt64 sets x to y and returns x. +func (x *Int128) SetInt64(y int64) (r Int128) { + r.Lo = y + if y >= 0 { + r.Hi = 0 + *x = r + return r + } + + r.Hi = -1 + *x = r + return r +} + +// SetInt64 sets x to y and returns x. +func (x *Int128) SetUint64(y uint64) (r Int128) { + r = Int128{Lo: int64(y)} + *x = r + return r +} + +// Sign returns: +// +// -1 if x < 0 +// 0 if x == 0 +// +1 if x > 0 +func (x Int128) Sign() int { + if x.Hi < 0 { + return -1 + } + + if x.Hi != 0 || x.Lo != 0 { + return 1 + } + + return 0 +} + +// String implements fmt.Stringer() +func (x Int128) String() string { return x.BigInt().String() } diff --git a/vendor/github.com/cznic/mathutil/mathutil.go b/vendor/github.com/cznic/mathutil/mathutil.go new file mode 100644 index 0000000..87cf7a3 --- /dev/null +++ b/vendor/github.com/cznic/mathutil/mathutil.go @@ -0,0 +1,1418 @@ +// Copyright (c) 2014 The mathutil Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package mathutil provides utilities supplementing the standard 'math' and +// 'math/rand' packages. +// +// Release history and compatibility issues +// +// 2018-10-21 Added BinaryLog +// +// 2018-04-25: New functions for determinig Max/Min of nullable values. Ex: +// func MaxPtr(a, b *int) *int { +// func MinPtr(a, b *int) *int { +// func MaxBytePtr(a, b *byte) *byte { +// func MinBytePtr(a, b *byte) *byte { +// ... +// +// 2017-10-14: New variadic functions for Max/Min. Ex: +// func MaxVal(val int, vals ...int) int { +// func MinVal(val int, vals ...int) int { +// func MaxByteVal(val byte, vals ...byte) byte { +// func MinByteVal(val byte, vals ...byte) byte { +// ... +// +// 2016-10-10: New functions QuadPolyDiscriminant and QuadPolyFactors. +// +// 2013-12-13: The following functions have been REMOVED +// +// func Uint64ToBigInt(n uint64) *big.Int +// func Uint64FromBigInt(n *big.Int) (uint64, bool) +// +// 2013-05-13: The following functions are now DEPRECATED +// +// func Uint64ToBigInt(n uint64) *big.Int +// func Uint64FromBigInt(n *big.Int) (uint64, bool) +// +// These functions will be REMOVED with Go release 1.1+1. +// +// 2013-01-21: The following functions have been REMOVED +// +// func MaxInt() int +// func MinInt() int +// func MaxUint() uint +// func UintPtrBits() int +// +// They are now replaced by untyped constants +// +// MaxInt +// MinInt +// MaxUint +// UintPtrBits +// +// Additionally one more untyped constant was added +// +// IntBits +// +// This change breaks any existing code depending on the above removed +// functions. They should have not been published in the first place, that was +// unfortunate. Instead, defining such architecture and/or implementation +// specific integer limits and bit widths as untyped constants improves +// performance and allows for static dead code elimination if it depends on +// these values. Thanks to minux for pointing it out in the mail list +// (https://groups.google.com/d/msg/golang-nuts/tlPpLW6aJw8/NT3mpToH-a4J). +// +// 2012-12-12: The following functions will be DEPRECATED with Go release +// 1.0.3+1 and REMOVED with Go release 1.0.3+2, b/c of +// http://code.google.com/p/go/source/detail?r=954a79ee3ea8 +// +// func Uint64ToBigInt(n uint64) *big.Int +// func Uint64FromBigInt(n *big.Int) (uint64, bool) +package mathutil + +import ( + "math" + "math/big" +) + +// Architecture and/or implementation specific integer limits and bit widths. +const ( + MaxInt = 1<<(IntBits-1) - 1 + MinInt = -MaxInt - 1 + MaxUint = 1<>32&1 + ^uint(0)>>16&1 + ^uint(0)>>8&1 + 3) + UintPtrBits = 1 << (^uintptr(0)>>32&1 + ^uintptr(0)>>16&1 + ^uintptr(0)>>8&1 + 3) +) + +var ( + _m1 = big.NewInt(-1) + _1 = big.NewInt(1) + _2 = big.NewInt(2) +) + +// GCDByte returns the greatest common divisor of a and b. Based on: +// http://en.wikipedia.org/wiki/Euclidean_algorithm#Implementations +func GCDByte(a, b byte) byte { + for b != 0 { + a, b = b, a%b + } + return a +} + +// GCDUint16 returns the greatest common divisor of a and b. +func GCDUint16(a, b uint16) uint16 { + for b != 0 { + a, b = b, a%b + } + return a +} + +// GCDUint32 returns the greatest common divisor of a and b. +func GCDUint32(a, b uint32) uint32 { + for b != 0 { + a, b = b, a%b + } + return a +} + +// GCDUint64 returns the greatest common divisor of a and b. +func GCDUint64(a, b uint64) uint64 { + for b != 0 { + a, b = b, a%b + } + return a +} + +// ISqrt returns floor(sqrt(n)). Typical run time is few hundreds of ns. +func ISqrt(n uint32) (x uint32) { + if n == 0 { + return + } + + if n >= math.MaxUint16*math.MaxUint16 { + return math.MaxUint16 + } + + var px, nx uint32 + for x = n; ; px, x = x, nx { + nx = (x + n/x) / 2 + if nx == x || nx == px { + break + } + } + return +} + +// SqrtUint64 returns floor(sqrt(n)). Typical run time is about 0.5 µs. +func SqrtUint64(n uint64) (x uint64) { + if n == 0 { + return + } + + if n >= math.MaxUint32*math.MaxUint32 { + return math.MaxUint32 + } + + var px, nx uint64 + for x = n; ; px, x = x, nx { + nx = (x + n/x) / 2 + if nx == x || nx == px { + break + } + } + return +} + +// SqrtBig returns floor(sqrt(n)). It panics on n < 0. +func SqrtBig(n *big.Int) (x *big.Int) { + switch n.Sign() { + case -1: + panic(-1) + case 0: + return big.NewInt(0) + } + + var px, nx big.Int + x = big.NewInt(0) + x.SetBit(x, n.BitLen()/2+1, 1) + for { + nx.Rsh(nx.Add(x, nx.Div(n, x)), 1) + if nx.Cmp(x) == 0 || nx.Cmp(&px) == 0 { + break + } + px.Set(x) + x.Set(&nx) + } + return +} + +// Log2Byte returns log base 2 of n. It's the same as index of the highest +// bit set in n. For n == 0 -1 is returned. +func Log2Byte(n byte) int { + return log2[n] +} + +// Log2Uint16 returns log base 2 of n. It's the same as index of the highest +// bit set in n. For n == 0 -1 is returned. +func Log2Uint16(n uint16) int { + if b := n >> 8; b != 0 { + return log2[b] + 8 + } + + return log2[n] +} + +// Log2Uint32 returns log base 2 of n. It's the same as index of the highest +// bit set in n. For n == 0 -1 is returned. +func Log2Uint32(n uint32) int { + if b := n >> 24; b != 0 { + return log2[b] + 24 + } + + if b := n >> 16; b != 0 { + return log2[b] + 16 + } + + if b := n >> 8; b != 0 { + return log2[b] + 8 + } + + return log2[n] +} + +// Log2Uint64 returns log base 2 of n. It's the same as index of the highest +// bit set in n. For n == 0 -1 is returned. +func Log2Uint64(n uint64) int { + if b := n >> 56; b != 0 { + return log2[b] + 56 + } + + if b := n >> 48; b != 0 { + return log2[b] + 48 + } + + if b := n >> 40; b != 0 { + return log2[b] + 40 + } + + if b := n >> 32; b != 0 { + return log2[b] + 32 + } + + if b := n >> 24; b != 0 { + return log2[b] + 24 + } + + if b := n >> 16; b != 0 { + return log2[b] + 16 + } + + if b := n >> 8; b != 0 { + return log2[b] + 8 + } + + return log2[n] +} + +// ModPowByte computes (b^e)%m. It panics for m == 0 || b == e == 0. +// +// See also: http://en.wikipedia.org/wiki/Modular_exponentiation#Right-to-left_binary_method +func ModPowByte(b, e, m byte) byte { + if b == 0 && e == 0 { + panic(0) + } + + if m == 1 { + return 0 + } + + r := uint16(1) + for b, m := uint16(b), uint16(m); e > 0; b, e = b*b%m, e>>1 { + if e&1 == 1 { + r = r * b % m + } + } + return byte(r) +} + +// ModPowUint16 computes (b^e)%m. It panics for m == 0 || b == e == 0. +func ModPowUint16(b, e, m uint16) uint16 { + if b == 0 && e == 0 { + panic(0) + } + + if m == 1 { + return 0 + } + + r := uint32(1) + for b, m := uint32(b), uint32(m); e > 0; b, e = b*b%m, e>>1 { + if e&1 == 1 { + r = r * b % m + } + } + return uint16(r) +} + +// ModPowUint32 computes (b^e)%m. It panics for m == 0 || b == e == 0. +func ModPowUint32(b, e, m uint32) uint32 { + if b == 0 && e == 0 { + panic(0) + } + + if m == 1 { + return 0 + } + + r := uint64(1) + for b, m := uint64(b), uint64(m); e > 0; b, e = b*b%m, e>>1 { + if e&1 == 1 { + r = r * b % m + } + } + return uint32(r) +} + +// ModPowUint64 computes (b^e)%m. It panics for m == 0 || b == e == 0. +func ModPowUint64(b, e, m uint64) (r uint64) { + if b == 0 && e == 0 { + panic(0) + } + + if m == 1 { + return 0 + } + + return modPowBigInt(big.NewInt(0).SetUint64(b), big.NewInt(0).SetUint64(e), big.NewInt(0).SetUint64(m)).Uint64() +} + +func modPowBigInt(b, e, m *big.Int) (r *big.Int) { + r = big.NewInt(1) + for i, n := 0, e.BitLen(); i < n; i++ { + if e.Bit(i) != 0 { + r.Mod(r.Mul(r, b), m) + } + b.Mod(b.Mul(b, b), m) + } + return +} + +// ModPowBigInt computes (b^e)%m. Returns nil for e < 0. It panics for m == 0 || b == e == 0. +func ModPowBigInt(b, e, m *big.Int) (r *big.Int) { + if b.Sign() == 0 && e.Sign() == 0 { + panic(0) + } + + if m.Cmp(_1) == 0 { + return big.NewInt(0) + } + + if e.Sign() < 0 { + return + } + + return modPowBigInt(big.NewInt(0).Set(b), big.NewInt(0).Set(e), m) +} + +var uint64ToBigIntDelta big.Int + +func init() { + uint64ToBigIntDelta.SetBit(&uint64ToBigIntDelta, 63, 1) +} + +var uintptrBits int + +func init() { + x := uint64(math.MaxUint64) + uintptrBits = BitLenUintptr(uintptr(x)) +} + +// UintptrBits returns the bit width of an uintptr at the executing machine. +func UintptrBits() int { + return uintptrBits +} + +// AddUint128_64 returns the uint128 sum of uint64 a and b. +func AddUint128_64(a, b uint64) (hi uint64, lo uint64) { + lo = a + b + if lo < a { + hi = 1 + } + return hi, lo +} + +// MulUint128_64 returns the uint128 bit product of uint64 a and b. +func MulUint128_64(a, b uint64) (hi, lo uint64) { + /* + 2^(2 W) ahi bhi + 2^W alo bhi + 2^W ahi blo + alo blo + + FEDCBA98 76543210 FEDCBA98 76543210 + ---- alo*blo ---- + ---- alo*bhi ---- + ---- ahi*blo ---- + ---- ahi*bhi ---- + */ + const w = 32 + const m = 1<>w, b>>w, a&m, b&m + lo = alo * blo + mid1 := alo * bhi + mid2 := ahi * blo + c1, lo := AddUint128_64(lo, mid1<>w+mid2>>w+c1+c2) + return +} + +// PowerizeBigInt returns (e, p) such that e is the smallest number for which p +// == b^e is greater or equal n. For n < 0 or b < 2 (0, nil) is returned. +// +// NOTE: Run time for large values of n (above about 2^1e6 ~= 1e300000) can be +// significant and/or unacceptabe. For any smaller values of n the function +// typically performs in sub second time. For "small" values of n (cca bellow +// 2^1e3 ~= 1e300) the same can be easily below 10 µs. +// +// A special (and trivial) case of b == 2 is handled separately and performs +// much faster. +func PowerizeBigInt(b, n *big.Int) (e uint32, p *big.Int) { + switch { + case b.Cmp(_2) < 0 || n.Sign() < 0: + return + case n.Sign() == 0 || n.Cmp(_1) == 0: + return 0, big.NewInt(1) + case b.Cmp(_2) == 0: + p = big.NewInt(0) + e = uint32(n.BitLen() - 1) + p.SetBit(p, int(e), 1) + if p.Cmp(n) < 0 { + p.Mul(p, _2) + e++ + } + return + } + + bw := b.BitLen() + nw := n.BitLen() + p = big.NewInt(1) + var bb, r big.Int + for { + switch p.Cmp(n) { + case -1: + x := uint32((nw - p.BitLen()) / bw) + if x == 0 { + x = 1 + } + e += x + switch x { + case 1: + p.Mul(p, b) + default: + r.Set(_1) + bb.Set(b) + e := x + for { + if e&1 != 0 { + r.Mul(&r, &bb) + } + if e >>= 1; e == 0 { + break + } + + bb.Mul(&bb, &bb) + } + p.Mul(p, &r) + } + case 0, 1: + return + } + } +} + +// PowerizeUint32BigInt returns (e, p) such that e is the smallest number for +// which p == b^e is greater or equal n. For n < 0 or b < 2 (0, nil) is +// returned. +// +// More info: see PowerizeBigInt. +func PowerizeUint32BigInt(b uint32, n *big.Int) (e uint32, p *big.Int) { + switch { + case b < 2 || n.Sign() < 0: + return + case n.Sign() == 0 || n.Cmp(_1) == 0: + return 0, big.NewInt(1) + case b == 2: + p = big.NewInt(0) + e = uint32(n.BitLen() - 1) + p.SetBit(p, int(e), 1) + if p.Cmp(n) < 0 { + p.Mul(p, _2) + e++ + } + return + } + + var bb big.Int + bb.SetInt64(int64(b)) + return PowerizeBigInt(&bb, n) +} + +/* +ProbablyPrimeUint32 returns true if n is prime or n is a pseudoprime to base a. +It implements the Miller-Rabin primality test for one specific value of 'a' and +k == 1. + +Wrt pseudocode shown at +http://en.wikipedia.org/wiki/Miller-Rabin_primality_test#Algorithm_and_running_time + + Input: n > 3, an odd integer to be tested for primality; + Input: k, a parameter that determines the accuracy of the test + Output: composite if n is composite, otherwise probably prime + write n − 1 as 2^s·d with d odd by factoring powers of 2 from n − 1 + LOOP: repeat k times: + pick a random integer a in the range [2, n − 2] + x ← a^d mod n + if x = 1 or x = n − 1 then do next LOOP + for r = 1 .. s − 1 + x ← x^2 mod n + if x = 1 then return composite + if x = n − 1 then do next LOOP + return composite + return probably prime + +... this function behaves like passing 1 for 'k' and additionally a +fixed/non-random 'a'. Otherwise it's the same algorithm. + +See also: http://mathworld.wolfram.com/Rabin-MillerStrongPseudoprimeTest.html +*/ +func ProbablyPrimeUint32(n, a uint32) bool { + d, s := n-1, 0 + for ; d&1 == 0; d, s = d>>1, s+1 { + } + x := uint64(ModPowUint32(a, d, n)) + if x == 1 || uint32(x) == n-1 { + return true + } + + for ; s > 1; s-- { + if x = x * x % uint64(n); x == 1 { + return false + } + + if uint32(x) == n-1 { + return true + } + } + return false +} + +// ProbablyPrimeUint64_32 returns true if n is prime or n is a pseudoprime to +// base a. It implements the Miller-Rabin primality test for one specific value +// of 'a' and k == 1. See also ProbablyPrimeUint32. +func ProbablyPrimeUint64_32(n uint64, a uint32) bool { + d, s := n-1, 0 + for ; d&1 == 0; d, s = d>>1, s+1 { + } + x := ModPowUint64(uint64(a), d, n) + if x == 1 || x == n-1 { + return true + } + + bx, bn := big.NewInt(0).SetUint64(x), big.NewInt(0).SetUint64(n) + for ; s > 1; s-- { + if x = bx.Mod(bx.Mul(bx, bx), bn).Uint64(); x == 1 { + return false + } + + if x == n-1 { + return true + } + } + return false +} + +// ProbablyPrimeBigInt_32 returns true if n is prime or n is a pseudoprime to +// base a. It implements the Miller-Rabin primality test for one specific value +// of 'a' and k == 1. See also ProbablyPrimeUint32. +func ProbablyPrimeBigInt_32(n *big.Int, a uint32) bool { + var d big.Int + d.Set(n) + d.Sub(&d, _1) // d <- n-1 + s := 0 + for ; d.Bit(s) == 0; s++ { + } + nMinus1 := big.NewInt(0).Set(&d) + d.Rsh(&d, uint(s)) + + x := ModPowBigInt(big.NewInt(int64(a)), &d, n) + if x.Cmp(_1) == 0 || x.Cmp(nMinus1) == 0 { + return true + } + + for ; s > 1; s-- { + if x = x.Mod(x.Mul(x, x), n); x.Cmp(_1) == 0 { + return false + } + + if x.Cmp(nMinus1) == 0 { + return true + } + } + return false +} + +// ProbablyPrimeBigInt returns true if n is prime or n is a pseudoprime to base +// a. It implements the Miller-Rabin primality test for one specific value of +// 'a' and k == 1. See also ProbablyPrimeUint32. +func ProbablyPrimeBigInt(n, a *big.Int) bool { + var d big.Int + d.Set(n) + d.Sub(&d, _1) // d <- n-1 + s := 0 + for ; d.Bit(s) == 0; s++ { + } + nMinus1 := big.NewInt(0).Set(&d) + d.Rsh(&d, uint(s)) + + x := ModPowBigInt(a, &d, n) + if x.Cmp(_1) == 0 || x.Cmp(nMinus1) == 0 { + return true + } + + for ; s > 1; s-- { + if x = x.Mod(x.Mul(x, x), n); x.Cmp(_1) == 0 { + return false + } + + if x.Cmp(nMinus1) == 0 { + return true + } + } + return false +} + +// Max returns the larger of a and b. +func Max(a, b int) int { + if a > b { + return a + } + + return b +} + +// Min returns the smaller of a and b. +func Min(a, b int) int { + if a < b { + return a + } + + return b +} + +// MaxPtr returns a pointer to the larger of a and b, or nil. +func MaxPtr(a, b *int) *int { + if a == nil { + return b + } + if b == nil { + return a + } + if *a > *b { + return a + } + + return b +} + +// MinPtr returns a pointer to the smaller of a and b, or nil. +func MinPtr(a, b *int) *int { + if a == nil { + return b + } + if b == nil { + return a + } + if *a < *b { + return a + } + + return b +} + +// MaxVal returns the largest argument passed. +func MaxVal(val int, vals ...int) int { + res := val + for _, v := range vals { + if v > res { + res = v + } + } + return res +} + +// MinVal returns the smallest argument passed. +func MinVal(val int, vals ...int) int { + res := val + for _, v := range vals { + if v < res { + res = v + } + } + return res +} + +// Clamp returns a value restricted between lo and hi. +func Clamp(v, lo, hi int) int { + return Min(Max(v, lo), hi) +} + +// UMax returns the larger of a and b. +func UMax(a, b uint) uint { + if a > b { + return a + } + + return b +} + +// UMin returns the smaller of a and b. +func UMin(a, b uint) uint { + if a < b { + return a + } + + return b +} + +// UMaxPtr returns a pointer to the larger of a and b, or nil. +func UMaxPtr(a, b *uint) *uint { + if a == nil { + return b + } + if b == nil { + return a + } + if *a > *b { + return a + } + + return b +} + +// UMinPtr returns a pointer to the smaller of a and b, or nil. +func UMinPtr(a, b *uint) *uint { + if a == nil { + return b + } + if b == nil { + return a + } + if *a < *b { + return a + } + + return b +} + +// UMaxVal returns the largest argument passed. +func UMaxVal(val uint, vals ...uint) uint { + res := val + for _, v := range vals { + if v > res { + res = v + } + } + return res +} + +// UMinVal returns the smallest argument passed. +func UMinVal(val uint, vals ...uint) uint { + res := val + for _, v := range vals { + if v < res { + res = v + } + } + return res +} + +// UClamp returns a value restricted between lo and hi. +func UClamp(v, lo, hi uint) uint { + return UMin(UMax(v, lo), hi) +} + +// MaxByte returns the larger of a and b. +func MaxByte(a, b byte) byte { + if a > b { + return a + } + + return b +} + +// MinByte returns the smaller of a and b. +func MinByte(a, b byte) byte { + if a < b { + return a + } + + return b +} + +// MaxBytePtr returns a pointer to the larger of a and b, or nil. +func MaxBytePtr(a, b *byte) *byte { + if a == nil { + return b + } + if b == nil { + return a + } + if *a > *b { + return a + } + + return b +} + +// MinBytePtr returns a pointer to the smaller of a and b, or nil. +func MinBytePtr(a, b *byte) *byte { + if a == nil { + return b + } + if b == nil { + return a + } + if *a < *b { + return a + } + + return b +} + +// MaxByteVal returns the largest argument passed. +func MaxByteVal(val byte, vals ...byte) byte { + res := val + for _, v := range vals { + if v > res { + res = v + } + } + return res +} + +// MinByteVal returns the smallest argument passed. +func MinByteVal(val byte, vals ...byte) byte { + res := val + for _, v := range vals { + if v < res { + res = v + } + } + return res +} + +// ClampByte returns a value restricted between lo and hi. +func ClampByte(v, lo, hi byte) byte { + return MinByte(MaxByte(v, lo), hi) +} + +// MaxInt8 returns the larger of a and b. +func MaxInt8(a, b int8) int8 { + if a > b { + return a + } + + return b +} + +// MinInt8 returns the smaller of a and b. +func MinInt8(a, b int8) int8 { + if a < b { + return a + } + + return b +} + +// MaxInt8Ptr returns a pointer to the larger of a and b, or nil. +func MaxInt8Ptr(a, b *int8) *int8 { + if a == nil { + return b + } + if b == nil { + return a + } + if *a > *b { + return a + } + + return b +} + +// MinInt8Ptr returns a pointer to the smaller of a and b, or nil. +func MinInt8Ptr(a, b *int8) *int8 { + if a == nil { + return b + } + if b == nil { + return a + } + if *a < *b { + return a + } + + return b +} + +// MaxInt8Val returns the largest argument passed. +func MaxInt8Val(val int8, vals ...int8) int8 { + res := val + for _, v := range vals { + if v > res { + res = v + } + } + return res +} + +// MinInt8Val returns the smallest argument passed. +func MinInt8Val(val int8, vals ...int8) int8 { + res := val + for _, v := range vals { + if v < res { + res = v + } + } + return res +} + +// ClampInt8 returns a value restricted between lo and hi. +func ClampInt8(v, lo, hi int8) int8 { + return MinInt8(MaxInt8(v, lo), hi) +} + +// MaxUint16 returns the larger of a and b. +func MaxUint16(a, b uint16) uint16 { + if a > b { + return a + } + + return b +} + +// MinUint16 returns the smaller of a and b. +func MinUint16(a, b uint16) uint16 { + if a < b { + return a + } + + return b +} + +// MaxUint16Ptr returns a pointer to the larger of a and b, or nil. +func MaxUint16Ptr(a, b *uint16) *uint16 { + if a == nil { + return b + } + if b == nil { + return a + } + if *a > *b { + return a + } + + return b +} + +// MinUint16Ptr returns a pointer to the smaller of a and b, or nil. +func MinUint16Ptr(a, b *uint16) *uint16 { + if a == nil { + return b + } + if b == nil { + return a + } + if *a < *b { + return a + } + + return b +} + +// MaxUint16Val returns the largest argument passed. +func MaxUint16Val(val uint16, vals ...uint16) uint16 { + res := val + for _, v := range vals { + if v > res { + res = v + } + } + return res +} + +// MinUint16Val returns the smallest argument passed. +func MinUint16Val(val uint16, vals ...uint16) uint16 { + res := val + for _, v := range vals { + if v < res { + res = v + } + } + return res +} + +// ClampUint16 returns a value restricted between lo and hi. +func ClampUint16(v, lo, hi uint16) uint16 { + return MinUint16(MaxUint16(v, lo), hi) +} + +// MaxInt16 returns the larger of a and b. +func MaxInt16(a, b int16) int16 { + if a > b { + return a + } + + return b +} + +// MinInt16 returns the smaller of a and b. +func MinInt16(a, b int16) int16 { + if a < b { + return a + } + + return b +} + +// MaxInt16Ptr returns a pointer to the larger of a and b, or nil. +func MaxInt16Ptr(a, b *int16) *int16 { + if a == nil { + return b + } + if b == nil { + return a + } + if *a > *b { + return a + } + + return b +} + +// MinInt16Ptr returns a pointer to the smaller of a and b, or nil. +func MinInt16Ptr(a, b *int16) *int16 { + if a == nil { + return b + } + if b == nil { + return a + } + if *a < *b { + return a + } + + return b +} + +// MaxInt16Val returns the largest argument passed. +func MaxInt16Val(val int16, vals ...int16) int16 { + res := val + for _, v := range vals { + if v > res { + res = v + } + } + return res +} + +// MinInt16Val returns the smallest argument passed. +func MinInt16Val(val int16, vals ...int16) int16 { + res := val + for _, v := range vals { + if v < res { + res = v + } + } + return res +} + +// ClampInt16 returns a value restricted between lo and hi. +func ClampInt16(v, lo, hi int16) int16 { + return MinInt16(MaxInt16(v, lo), hi) +} + +// MaxUint32 returns the larger of a and b. +func MaxUint32(a, b uint32) uint32 { + if a > b { + return a + } + + return b +} + +// MinUint32 returns the smaller of a and b. +func MinUint32(a, b uint32) uint32 { + if a < b { + return a + } + + return b +} + +// MaxUint32Ptr returns a pointer to the larger of a and b, or nil. +func MaxUint32Ptr(a, b *uint32) *uint32 { + if a == nil { + return b + } + if b == nil { + return a + } + if *a > *b { + return a + } + + return b +} + +// MinUint32Ptr returns a pointer to the smaller of a and b, or nil. +func MinUint32Ptr(a, b *uint32) *uint32 { + if a == nil { + return b + } + if b == nil { + return a + } + if *a < *b { + return a + } + + return b +} + +// MaxUint32Val returns the largest argument passed. +func MaxUint32Val(val uint32, vals ...uint32) uint32 { + res := val + for _, v := range vals { + if v > res { + res = v + } + } + return res +} + +// MinUint32Val returns the smallest argument passed. +func MinUint32Val(val uint32, vals ...uint32) uint32 { + res := val + for _, v := range vals { + if v < res { + res = v + } + } + return res +} + +// ClampUint32 returns a value restricted between lo and hi. +func ClampUint32(v, lo, hi uint32) uint32 { + return MinUint32(MaxUint32(v, lo), hi) +} + +// MaxInt32 returns the larger of a and b. +func MaxInt32(a, b int32) int32 { + if a > b { + return a + } + + return b +} + +// MinInt32 returns the smaller of a and b. +func MinInt32(a, b int32) int32 { + if a < b { + return a + } + + return b +} + +// MaxInt32Ptr returns a pointer to the larger of a and b, or nil. +func MaxInt32Ptr(a, b *int32) *int32 { + if a == nil { + return b + } + if b == nil { + return a + } + if *a > *b { + return a + } + + return b +} + +// MinInt32Ptr returns a pointer to the smaller of a and b, or nil. +func MinInt32Ptr(a, b *int32) *int32 { + if a == nil { + return b + } + if b == nil { + return a + } + if *a < *b { + return a + } + + return b +} + +// MaxInt32Val returns the largest argument passed. +func MaxInt32Val(val int32, vals ...int32) int32 { + res := val + for _, v := range vals { + if v > res { + res = v + } + } + return res +} + +// MinInt32Val returns the smallest argument passed. +func MinInt32Val(val int32, vals ...int32) int32 { + res := val + for _, v := range vals { + if v < res { + res = v + } + } + return res +} + +// ClampInt32 returns a value restricted between lo and hi. +func ClampInt32(v, lo, hi int32) int32 { + return MinInt32(MaxInt32(v, lo), hi) +} + +// MaxUint64 returns the larger of a and b. +func MaxUint64(a, b uint64) uint64 { + if a > b { + return a + } + + return b +} + +// MinUint64 returns the smaller of a and b. +func MinUint64(a, b uint64) uint64 { + if a < b { + return a + } + + return b +} + +// MaxUint64Ptr returns a pointer to the larger of a and b, or nil. +func MaxUint64Ptr(a, b *uint64) *uint64 { + if a == nil { + return b + } + if b == nil { + return a + } + if *a > *b { + return a + } + + return b +} + +// MinUint64Ptr returns a pointer to the smaller of a and b, or nil. +func MinUint64Ptr(a, b *uint64) *uint64 { + if a == nil { + return b + } + if b == nil { + return a + } + if *a < *b { + return a + } + + return b +} + +// MaxUint64Val returns the largest argument passed. +func MaxUint64Val(val uint64, vals ...uint64) uint64 { + res := val + for _, v := range vals { + if v > res { + res = v + } + } + return res +} + +// MinUint64Val returns the smallest argument passed. +func MinUint64Val(val uint64, vals ...uint64) uint64 { + res := val + for _, v := range vals { + if v < res { + res = v + } + } + return res +} + +// ClampUint64 returns a value restricted between lo and hi. +func ClampUint64(v, lo, hi uint64) uint64 { + return MinUint64(MaxUint64(v, lo), hi) +} + +// MaxInt64 returns the larger of a and b. +func MaxInt64(a, b int64) int64 { + if a > b { + return a + } + + return b +} + +// MinInt64 returns the smaller of a and b. +func MinInt64(a, b int64) int64 { + if a < b { + return a + } + + return b +} + +// MaxInt64Ptr returns a pointer to the larger of a and b, or nil. +func MaxInt64Ptr(a, b *int64) *int64 { + if a == nil { + return b + } + if b == nil { + return a + } + if *a > *b { + return a + } + + return b +} + +// MinInt64Ptr returns a pointer to the smaller of a and b, or nil. +func MinInt64Ptr(a, b *int64) *int64 { + if a == nil { + return b + } + if b == nil { + return a + } + if *a < *b { + return a + } + + return b +} + +// MaxInt64Val returns the largest argument passed. +func MaxInt64Val(val int64, vals ...int64) int64 { + res := val + for _, v := range vals { + if v > res { + res = v + } + } + return res +} + +// MinInt64Val returns the smallest argument passed. +func MinInt64Val(val int64, vals ...int64) int64 { + res := val + for _, v := range vals { + if v < res { + res = v + } + } + return res +} + +// ClampInt64 returns a value restricted between lo and hi. +func ClampInt64(v, lo, hi int64) int64 { + return MinInt64(MaxInt64(v, lo), hi) +} + +// ToBase produces n in base b. For example +// +// ToBase(2047, 22) -> [1, 5, 4] +// +// 1 * 22^0 1 +// 5 * 22^1 110 +// 4 * 22^2 1936 +// ---- +// 2047 +// +// ToBase panics for bases < 2. +func ToBase(n *big.Int, b int) []int { + var nn big.Int + nn.Set(n) + if b < 2 { + panic("invalid base") + } + + k := 1 + switch nn.Sign() { + case -1: + nn.Neg(&nn) + k = -1 + case 0: + return []int{0} + } + + bb := big.NewInt(int64(b)) + var r []int + rem := big.NewInt(0) + for nn.Sign() != 0 { + nn.QuoRem(&nn, bb, rem) + r = append(r, k*int(rem.Int64())) + } + return r +} diff --git a/vendor/github.com/cznic/mathutil/nist-sts-2-1-1-report b/vendor/github.com/cznic/mathutil/nist-sts-2-1-1-report new file mode 100644 index 0000000..20e686c --- /dev/null +++ b/vendor/github.com/cznic/mathutil/nist-sts-2-1-1-report @@ -0,0 +1,267 @@ +$ ./example -max 100000000 > rnd.dat +$ ./assess 1000000 + G E N E R A T O R S E L E C T I O N + ______________________________________ + + [0] Input File [1] Linear Congruential + [2] Quadratic Congruential I [3] Quadratic Congruential II + [4] Cubic Congruential [5] XOR + [6] Modular Exponentiation [7] Blum-Blum-Shub + [8] Micali-Schnorr [9] G Using SHA-1 + + Enter Choice: 0 + + + User Prescribed Input File: rnd.dat + + S T A T I S T I C A L T E S T S + _________________________________ + + [01] Frequency [02] Block Frequency + [03] Cumulative Sums [04] Runs + [05] Longest Run of Ones [06] Rank + [07] Discrete Fourier Transform [08] Nonperiodic Template Matchings + [09] Overlapping Template Matchings [10] Universal Statistical + [11] Approximate Entropy [12] Random Excursions + [13] Random Excursions Variant [14] Serial + [15] Linear Complexity + + INSTRUCTIONS + Enter 0 if you DO NOT want to apply all of the + statistical tests to each sequence and 1 if you DO. + + Enter Choice: 1 + + P a r a m e t e r A d j u s t m e n t s + ----------------------------------------- + [1] Block Frequency Test - block length(M): 128 + [2] NonOverlapping Template Test - block length(m): 9 + [3] Overlapping Template Test - block length(m): 9 + [4] Approximate Entropy Test - block length(m): 10 + [5] Serial Test - block length(m): 16 + [6] Linear Complexity Test - block length(M): 500 + + Select Test (0 to continue): 0 + + How many bitstreams? 200 + + Input File Format: + [0] ASCII - A sequence of ASCII 0's and 1's + [1] Binary - Each byte in data file contains 8 bits of data + + Select input mode: 1 + + Statistical Testing In Progress......... + + Statistical Testing Complete!!!!!!!!!!!! + +$ cat experiments/AlgorithmTesting/finalAnalysisReport.txt +------------------------------------------------------------------------------ +RESULTS FOR THE UNIFORMITY OF P-VALUES AND THE PROPORTION OF PASSING SEQUENCES +------------------------------------------------------------------------------ + generator is +------------------------------------------------------------------------------ + C1 C2 C3 C4 C5 C6 C7 C8 C9 C10 P-VALUE PROPORTION STATISTICAL TEST +------------------------------------------------------------------------------ + 28 22 17 19 15 8 24 23 19 25 0.093720 198/200 Frequency + 20 18 24 14 18 17 16 28 21 24 0.504219 199/200 BlockFrequency + 25 22 17 24 19 21 22 15 16 19 0.825505 197/200 CumulativeSums + 27 17 16 22 14 26 14 25 19 20 0.304126 199/200 CumulativeSums + 22 19 14 23 22 22 13 28 13 24 0.224821 199/200 Runs + 20 24 18 21 15 13 22 23 24 20 0.719747 197/200 LongestRun + 22 26 18 22 26 15 17 22 20 12 0.410055 199/200 Rank + 25 22 26 22 20 16 20 20 16 13 0.585209 195/200 FFT + 22 11 15 26 33 24 21 13 14 21 0.013102 197/200 NonOverlappingTemplate + 17 11 16 27 19 24 19 20 28 19 0.219006 200/200 NonOverlappingTemplate + 23 27 24 15 21 11 18 27 15 19 0.162606 197/200 NonOverlappingTemplate + 21 18 13 20 19 23 20 17 26 23 0.749884 197/200 NonOverlappingTemplate + 24 22 24 24 24 21 13 15 17 16 0.494392 196/200 NonOverlappingTemplate + 24 16 23 15 23 18 25 16 18 22 0.699313 199/200 NonOverlappingTemplate + 19 23 21 16 27 18 17 20 18 21 0.859637 198/200 NonOverlappingTemplate + 12 20 16 19 26 14 30 20 24 19 0.141256 198/200 NonOverlappingTemplate + 18 21 17 21 20 14 25 19 24 21 0.859637 198/200 NonOverlappingTemplate + 24 25 21 18 23 15 23 17 16 18 0.749884 199/200 NonOverlappingTemplate + 20 22 22 18 16 22 28 16 14 22 0.574903 198/200 NonOverlappingTemplate + 18 23 22 17 24 25 19 16 23 13 0.626709 199/200 NonOverlappingTemplate + 17 22 14 19 21 21 18 19 24 25 0.842937 198/200 NonOverlappingTemplate + 18 17 26 21 22 15 22 18 21 20 0.883171 197/200 NonOverlappingTemplate + 19 25 16 32 15 19 20 18 16 20 0.236810 199/200 NonOverlappingTemplate + 19 18 15 21 24 22 18 21 20 22 0.964295 200/200 NonOverlappingTemplate + 21 14 17 23 26 19 20 22 20 18 0.834308 196/200 NonOverlappingTemplate + 15 21 17 27 26 23 21 17 24 9 0.129620 198/200 NonOverlappingTemplate + 25 17 19 19 18 22 21 22 21 16 0.951205 196/200 NonOverlappingTemplate + 20 19 24 21 19 24 16 18 17 22 0.946308 197/200 NonOverlappingTemplate + 27 16 19 18 23 19 22 17 22 17 0.807412 197/200 NonOverlappingTemplate + 14 18 21 23 23 20 14 22 20 25 0.719747 198/200 NonOverlappingTemplate + 18 22 19 12 24 25 25 22 18 15 0.474986 198/200 NonOverlappingTemplate + 21 18 23 17 19 18 28 19 20 17 0.825505 198/200 NonOverlappingTemplate + 20 19 15 16 27 20 26 17 20 20 0.657933 198/200 NonOverlappingTemplate + 17 25 21 21 11 19 22 16 27 21 0.401199 198/200 NonOverlappingTemplate + 19 16 15 18 24 19 25 25 19 20 0.769527 199/200 NonOverlappingTemplate + 18 20 20 26 20 12 24 25 19 16 0.524101 198/200 NonOverlappingTemplate + 14 16 18 23 21 21 19 19 28 21 0.668321 197/200 NonOverlappingTemplate + 21 20 23 25 21 22 19 17 14 18 0.875539 197/200 NonOverlappingTemplate + 14 16 29 22 23 13 20 29 17 17 0.099513 197/200 NonOverlappingTemplate + 14 19 27 19 17 23 18 24 20 19 0.709558 199/200 NonOverlappingTemplate + 18 15 21 19 27 22 21 23 17 17 0.779188 198/200 NonOverlappingTemplate + 13 23 13 22 22 23 22 21 21 20 0.689019 199/200 NonOverlappingTemplate + 17 14 26 26 16 21 30 15 21 14 0.096578 199/200 NonOverlappingTemplate + 18 21 24 23 21 13 23 23 19 15 0.719747 197/200 NonOverlappingTemplate + 19 21 14 32 20 15 16 18 24 21 0.202268 199/200 NonOverlappingTemplate + 27 22 20 21 21 14 15 22 14 24 0.474986 196/200 NonOverlappingTemplate + 31 12 25 11 21 18 19 16 24 23 0.050305 197/200 NonOverlappingTemplate + 17 26 20 22 15 27 22 19 12 20 0.383827 199/200 NonOverlappingTemplate + 15 22 14 14 31 15 27 18 23 21 0.078086 194/200 NonOverlappingTemplate + 19 19 14 15 24 21 25 21 20 22 0.788728 197/200 NonOverlappingTemplate + 20 21 19 22 25 18 13 24 28 10 0.153763 195/200 NonOverlappingTemplate + 23 17 21 25 21 20 13 30 14 16 0.196920 196/200 NonOverlappingTemplate + 17 31 17 22 16 15 28 23 11 20 0.050305 197/200 NonOverlappingTemplate + 15 21 26 27 15 18 19 21 18 20 0.605916 198/200 NonOverlappingTemplate + 23 18 15 14 20 21 20 20 20 29 0.554420 200/200 NonOverlappingTemplate + 22 19 19 18 19 17 22 21 31 12 0.311542 199/200 NonOverlappingTemplate + 16 22 23 21 19 19 18 24 21 17 0.960198 197/200 NonOverlappingTemplate + 21 21 17 20 16 23 25 22 18 17 0.917870 200/200 NonOverlappingTemplate + 27 17 17 16 21 20 22 18 21 21 0.859637 197/200 NonOverlappingTemplate + 18 24 15 27 18 21 18 16 24 19 0.657933 199/200 NonOverlappingTemplate + 13 16 21 21 15 25 18 22 29 20 0.326749 198/200 NonOverlappingTemplate + 18 17 23 23 15 19 26 30 11 18 0.125927 198/200 NonOverlappingTemplate + 30 21 18 22 17 21 15 17 21 18 0.544254 195/200 NonOverlappingTemplate + 12 18 19 24 16 24 18 24 28 17 0.311542 199/200 NonOverlappingTemplate + 20 15 23 15 18 30 23 18 17 21 0.410055 196/200 NonOverlappingTemplate + 15 18 23 16 29 21 22 16 19 21 0.544254 200/200 NonOverlappingTemplate + 18 16 27 13 21 22 22 21 16 24 0.534146 199/200 NonOverlappingTemplate + 20 25 18 21 16 21 17 28 21 13 0.484646 200/200 NonOverlappingTemplate + 23 22 13 22 14 20 26 18 19 23 0.574903 197/200 NonOverlappingTemplate + 21 24 25 13 19 22 18 13 24 21 0.504219 199/200 NonOverlappingTemplate + 19 13 18 25 22 15 23 28 19 18 0.410055 195/200 NonOverlappingTemplate + 20 15 27 22 26 26 14 13 21 16 0.181557 198/200 NonOverlappingTemplate + 18 18 19 23 18 20 19 21 24 20 0.991468 200/200 NonOverlappingTemplate + 18 23 17 14 20 25 22 22 22 17 0.816537 198/200 NonOverlappingTemplate + 26 15 15 11 23 21 21 16 36 16 0.005557 196/200 NonOverlappingTemplate + 27 13 21 23 21 16 19 20 16 24 0.544254 198/200 NonOverlappingTemplate + 16 15 32 17 20 23 22 19 20 16 0.262249 200/200 NonOverlappingTemplate + 26 19 24 13 24 16 18 18 13 29 0.137282 199/200 NonOverlappingTemplate + 15 18 14 27 32 21 15 20 19 19 0.112047 198/200 NonOverlappingTemplate + 22 23 22 18 20 23 19 22 16 15 0.924076 196/200 NonOverlappingTemplate + 18 17 21 22 14 17 22 24 20 25 0.798139 199/200 NonOverlappingTemplate + 15 17 19 24 21 23 17 25 23 16 0.739918 196/200 NonOverlappingTemplate + 22 11 15 26 32 25 21 13 14 21 0.017305 197/200 NonOverlappingTemplate + 22 16 19 23 22 21 21 19 17 20 0.985788 200/200 NonOverlappingTemplate + 22 28 18 24 14 20 23 21 20 10 0.230755 198/200 NonOverlappingTemplate + 14 13 22 28 14 28 17 22 23 19 0.129620 197/200 NonOverlappingTemplate + 22 16 22 20 21 21 16 19 18 25 0.935716 198/200 NonOverlappingTemplate + 15 20 23 17 19 22 21 23 18 22 0.951205 200/200 NonOverlappingTemplate + 20 24 21 19 17 19 19 24 15 22 0.930026 198/200 NonOverlappingTemplate + 18 21 15 21 17 28 24 22 20 14 0.534146 200/200 NonOverlappingTemplate + 19 15 19 19 20 20 15 25 23 25 0.779188 198/200 NonOverlappingTemplate + 17 24 25 16 15 21 18 19 23 22 0.788728 198/200 NonOverlappingTemplate + 15 20 18 25 24 15 21 31 18 13 0.141256 200/200 NonOverlappingTemplate + 24 17 19 20 18 21 15 22 24 20 0.924076 196/200 NonOverlappingTemplate + 23 18 17 21 17 28 23 21 18 14 0.605916 197/200 NonOverlappingTemplate + 21 19 22 23 16 17 20 21 22 19 0.985788 200/200 NonOverlappingTemplate + 27 17 21 27 24 15 15 17 15 22 0.304126 199/200 NonOverlappingTemplate + 25 28 20 24 13 14 16 22 19 19 0.304126 197/200 NonOverlappingTemplate + 27 16 14 24 22 18 24 20 18 17 0.564639 196/200 NonOverlappingTemplate + 18 18 24 19 19 19 26 11 27 19 0.375313 195/200 NonOverlappingTemplate + 20 15 29 19 26 16 21 11 18 25 0.141256 197/200 NonOverlappingTemplate + 19 14 21 25 11 23 22 25 26 14 0.176657 199/200 NonOverlappingTemplate + 18 23 20 17 19 18 29 22 26 8 0.102526 199/200 NonOverlappingTemplate + 22 17 18 16 18 20 19 19 25 26 0.834308 198/200 NonOverlappingTemplate + 25 18 14 16 16 24 18 18 30 21 0.268917 198/200 NonOverlappingTemplate + 24 21 23 13 12 22 20 23 20 22 0.554420 196/200 NonOverlappingTemplate + 18 21 21 30 22 17 19 14 18 20 0.534146 197/200 NonOverlappingTemplate + 25 20 22 21 15 18 17 20 17 25 0.825505 199/200 NonOverlappingTemplate + 18 21 22 21 18 20 26 16 20 18 0.941144 197/200 NonOverlappingTemplate + 23 18 22 25 12 16 17 19 26 22 0.474986 198/200 NonOverlappingTemplate + 22 18 29 23 19 23 17 17 15 17 0.534146 198/200 NonOverlappingTemplate + 19 21 17 26 18 15 22 26 15 21 0.626709 197/200 NonOverlappingTemplate + 16 20 20 23 18 21 18 18 25 21 0.955835 199/200 NonOverlappingTemplate + 23 21 20 21 22 10 15 27 15 26 0.186566 198/200 NonOverlappingTemplate + 18 26 20 26 26 18 17 17 20 12 0.358641 198/200 NonOverlappingTemplate + 24 20 21 18 24 12 19 27 14 21 0.401199 195/200 NonOverlappingTemplate + 16 25 15 21 24 18 18 25 22 16 0.657933 199/200 NonOverlappingTemplate + 24 14 17 26 15 17 17 25 21 24 0.428095 200/200 NonOverlappingTemplate + 22 24 11 20 22 24 19 18 12 28 0.176657 196/200 NonOverlappingTemplate + 27 16 27 18 27 14 13 16 21 21 0.141256 197/200 NonOverlappingTemplate + 23 25 20 18 23 17 15 23 19 17 0.834308 196/200 NonOverlappingTemplate + 19 21 20 27 16 16 18 25 16 22 0.678686 199/200 NonOverlappingTemplate + 25 22 21 19 15 19 22 19 25 13 0.657933 197/200 NonOverlappingTemplate + 19 28 21 25 20 12 18 13 29 15 0.073417 198/200 NonOverlappingTemplate + 20 24 21 19 21 15 17 24 20 19 0.941144 198/200 NonOverlappingTemplate + 18 29 23 17 24 19 17 18 16 19 0.585209 200/200 NonOverlappingTemplate + 18 28 18 16 25 21 18 20 14 22 0.544254 198/200 NonOverlappingTemplate + 22 19 23 22 22 21 21 26 12 12 0.401199 199/200 NonOverlappingTemplate + 22 15 25 16 21 27 14 22 21 17 0.484646 199/200 NonOverlappingTemplate + 18 25 20 23 30 17 13 22 18 14 0.213309 200/200 NonOverlappingTemplate + 20 23 21 21 23 29 16 13 16 18 0.410055 199/200 NonOverlappingTemplate + 21 19 16 22 31 18 20 17 18 18 0.514124 198/200 NonOverlappingTemplate + 26 22 12 14 23 17 21 24 21 20 0.455937 197/200 NonOverlappingTemplate + 21 17 18 17 14 32 21 26 18 16 0.162606 197/200 NonOverlappingTemplate + 22 24 22 23 11 15 17 18 29 19 0.230755 198/200 NonOverlappingTemplate + 19 27 20 19 23 15 24 15 21 17 0.657933 198/200 NonOverlappingTemplate + 20 25 16 10 24 13 23 21 21 27 0.149495 200/200 NonOverlappingTemplate + 19 21 21 27 17 17 19 21 21 17 0.904708 200/200 NonOverlappingTemplate + 18 23 15 19 24 21 23 21 13 23 0.719747 198/200 NonOverlappingTemplate + 26 16 28 19 19 18 17 17 16 24 0.474986 199/200 NonOverlappingTemplate + 24 32 17 18 20 13 18 18 19 21 0.236810 195/200 NonOverlappingTemplate + 26 25 18 17 12 19 20 23 21 19 0.585209 196/200 NonOverlappingTemplate + 18 26 25 12 18 16 24 19 18 24 0.410055 199/200 NonOverlappingTemplate + 27 21 22 27 21 14 18 14 23 13 0.219006 197/200 NonOverlappingTemplate + 18 23 24 16 19 21 16 26 20 17 0.798139 199/200 NonOverlappingTemplate + 19 30 15 27 14 19 24 11 22 19 0.073417 198/200 NonOverlappingTemplate + 20 23 22 20 22 15 22 21 18 17 0.964295 198/200 NonOverlappingTemplate + 22 31 16 26 13 19 17 22 24 10 0.037566 197/200 NonOverlappingTemplate + 18 24 22 14 23 19 16 18 19 27 0.637119 197/200 NonOverlappingTemplate + 19 20 21 22 21 18 19 22 20 18 0.999438 198/200 NonOverlappingTemplate + 27 15 21 18 28 18 15 23 18 17 0.375313 195/200 NonOverlappingTemplate + 26 23 20 20 23 19 20 23 14 12 0.514124 199/200 NonOverlappingTemplate + 18 19 11 15 21 24 20 26 23 23 0.428095 198/200 NonOverlappingTemplate + 19 16 21 25 19 21 15 24 24 16 0.749884 197/200 NonOverlappingTemplate + 17 26 23 18 20 26 23 14 18 15 0.494392 198/200 NonOverlappingTemplate + 15 17 19 24 21 23 17 25 23 16 0.739918 196/200 NonOverlappingTemplate + 26 19 20 20 24 22 22 13 14 20 0.605916 198/200 OverlappingTemplate + 29 24 17 21 18 13 18 21 17 22 0.446556 196/200 Universal + 22 18 22 20 20 21 22 21 18 16 0.992952 198/200 ApproximateEntropy + 14 8 13 9 11 13 13 8 7 10 0.719747 106/106 RandomExcursions + 13 18 9 7 12 12 9 6 12 8 0.236810 104/106 RandomExcursions + 11 15 10 7 11 14 9 6 12 11 0.595549 106/106 RandomExcursions + 15 7 12 12 9 11 16 8 10 6 0.350485 106/106 RandomExcursions + 10 10 12 16 10 12 10 7 13 6 0.554420 106/106 RandomExcursions + 8 7 12 10 11 16 11 13 10 8 0.657933 106/106 RandomExcursions + 9 6 12 12 14 9 11 13 10 10 0.816537 104/106 RandomExcursions + 10 10 7 12 11 9 10 13 14 10 0.911413 105/106 RandomExcursions + 8 8 12 9 10 5 13 12 17 12 0.319084 104/106 RandomExcursionsVariant + 5 11 10 11 7 11 10 15 11 15 0.455937 104/106 RandomExcursionsVariant + 6 12 11 8 12 12 12 13 13 7 0.699313 104/106 RandomExcursionsVariant + 14 10 11 6 12 9 8 12 11 13 0.779188 104/106 RandomExcursionsVariant + 12 12 10 7 17 6 6 12 13 11 0.262249 103/106 RandomExcursionsVariant + 13 8 14 13 7 6 6 13 15 11 0.249284 102/106 RandomExcursionsVariant + 12 12 12 13 7 9 6 13 12 10 0.739918 105/106 RandomExcursionsVariant + 13 15 12 8 9 10 6 9 14 10 0.574903 106/106 RandomExcursionsVariant + 10 15 9 12 14 10 8 11 7 10 0.739918 105/106 RandomExcursionsVariant + 13 12 8 11 12 11 9 10 11 9 0.978072 103/106 RandomExcursionsVariant + 10 13 12 12 8 13 8 9 14 7 0.739918 104/106 RandomExcursionsVariant + 12 10 10 14 7 8 7 13 14 11 0.657933 106/106 RandomExcursionsVariant + 10 13 10 10 13 10 12 6 10 12 0.897763 106/106 RandomExcursionsVariant + 9 12 15 8 13 8 12 8 11 10 0.779188 106/106 RandomExcursionsVariant + 9 13 15 10 10 10 8 14 6 11 0.616305 106/106 RandomExcursionsVariant + 7 17 9 12 9 11 10 16 4 11 0.129620 106/106 RandomExcursionsVariant + 10 9 10 15 7 12 7 8 12 16 0.419021 106/106 RandomExcursionsVariant + 9 12 11 8 8 9 15 12 9 13 0.798139 106/106 RandomExcursionsVariant + 17 34 11 22 22 17 19 20 13 25 0.026057 199/200 Serial + 22 20 16 22 20 18 20 18 23 21 0.989786 199/200 Serial + 12 33 25 29 21 11 21 15 14 19 0.003996 199/200 LinearComplexity + + +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +The minimum pass rate for each statistical test with the exception of the +random excursion (variant) test is approximately = 193 for a +sample size = 200 binary sequences. + +The minimum pass rate for the random excursion (variant) test +is approximately = 101 for a sample size = 106 binary sequences. + +For further guidelines construct a probability table using the MAPLE program +provided in the addendum section of the documentation. +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +$ diff --git a/vendor/github.com/cznic/mathutil/permute.go b/vendor/github.com/cznic/mathutil/permute.go new file mode 100644 index 0000000..82ad791 --- /dev/null +++ b/vendor/github.com/cznic/mathutil/permute.go @@ -0,0 +1,39 @@ +// Copyright (c) 2014 The mathutil Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package mathutil + +import ( + "sort" +) + +// PermutationFirst generates the first permutation of data. +func PermutationFirst(data sort.Interface) { + sort.Sort(data) +} + +// PermutationNext generates the next permutation of data if possible and +// return true. Return false if there is no more permutation left. Based on +// the algorithm described here: +// http://en.wikipedia.org/wiki/Permutation#Generation_in_lexicographic_order +func PermutationNext(data sort.Interface) bool { + var k, l int + for k = data.Len() - 2; ; k-- { // 1. + if k < 0 { + return false + } + + if data.Less(k, k+1) { + break + } + } + for l = data.Len() - 1; !data.Less(k, l); l-- { // 2. + } + data.Swap(k, l) // 3. + for i, j := k+1, data.Len()-1; i < j; i++ { // 4. + data.Swap(i, j) + j-- + } + return true +} diff --git a/vendor/github.com/cznic/mathutil/poly.go b/vendor/github.com/cznic/mathutil/poly.go new file mode 100644 index 0000000..52b58ff --- /dev/null +++ b/vendor/github.com/cznic/mathutil/poly.go @@ -0,0 +1,248 @@ +// Copyright (c) 2016 The mathutil Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package mathutil + +import ( + "fmt" + "math/big" +) + +func abs(n int) uint64 { + if n >= 0 { + return uint64(n) + } + + return uint64(-n) +} + +// QuadPolyDiscriminant returns the discriminant of a quadratic polynomial in +// one variable of the form a*x^2+b*x+c with integer coefficients a, b, c, or +// an error on overflow. +// +// ds is the square of the discriminant. If |ds| is a square number, d is set +// to sqrt(|ds|), otherwise d is < 0. +func QuadPolyDiscriminant(a, b, c int) (ds, d int, _ error) { + if 2*BitLenUint64(abs(b)) > IntBits-1 || + 2+BitLenUint64(abs(a))+BitLenUint64(abs(c)) > IntBits-1 { + return 0, 0, fmt.Errorf("overflow") + } + + ds = b*b - 4*a*c + s := ds + if s < 0 { + s = -s + } + d64 := SqrtUint64(uint64(s)) + if d64*d64 != uint64(s) { + return ds, -1, nil + } + + return ds, int(d64), nil +} + +// PolyFactor describes an irreducible factor of a polynomial in one variable +// with integer coefficients P, Q of the form P*x+Q. +type PolyFactor struct { + P, Q int +} + +// QuadPolyFactors returns the content and the irreducible factors of the +// primitive part of a quadratic polynomial in one variable with integer +// coefficients a, b, c of the form a*x^2+b*x+c in integers, or an error on +// overflow. +// +// If the factorization in integers does not exists, the return value is (0, +// nil, nil). +// +// See also: +// https://en.wikipedia.org/wiki/Factorization_of_polynomials#Primitive_part.E2.80.93content_factorization +func QuadPolyFactors(a, b, c int) (content int, primitivePart []PolyFactor, _ error) { + content = int(GCDUint64(abs(a), GCDUint64(abs(b), abs(c)))) + switch { + case content == 0: + content = 1 + case content > 0: + if a < 0 || a == 0 && b < 0 { + content = -content + } + } + a /= content + b /= content + c /= content + if a == 0 { + if b == 0 { + return content, []PolyFactor{{0, c}}, nil + } + + if b < 0 && c < 0 { + b = -b + c = -c + } + if b < 0 { + b = -b + c = -c + } + return content, []PolyFactor{{b, c}}, nil + } + + ds, d, err := QuadPolyDiscriminant(a, b, c) + if err != nil { + return 0, nil, err + } + + if ds < 0 || d < 0 { + return 0, nil, nil + } + + x1num := -b + d + x1denom := 2 * a + gcd := int(GCDUint64(abs(x1num), abs(x1denom))) + x1num /= gcd + x1denom /= gcd + + x2num := -b - d + x2denom := 2 * a + gcd = int(GCDUint64(abs(x2num), abs(x2denom))) + x2num /= gcd + x2denom /= gcd + + return content, []PolyFactor{{x1denom, -x1num}, {x2denom, -x2num}}, nil +} + +// QuadPolyDiscriminantBig returns the discriminant of a quadratic polynomial +// in one variable of the form a*x^2+b*x+c with integer coefficients a, b, c. +// +// ds is the square of the discriminant. If |ds| is a square number, d is set +// to sqrt(|ds|), otherwise d is nil. +func QuadPolyDiscriminantBig(a, b, c *big.Int) (ds, d *big.Int) { + ds = big.NewInt(0).Set(b) + ds.Mul(ds, b) + x := big.NewInt(4) + x.Mul(x, a) + x.Mul(x, c) + ds.Sub(ds, x) + + s := big.NewInt(0).Set(ds) + if s.Sign() < 0 { + s.Neg(s) + } + + if s.Bit(1) != 0 { // s is not a square number + return ds, nil + } + + d = SqrtBig(s) + x.Set(d) + x.Mul(x, x) + if x.Cmp(s) != 0 { // s is not a square number + d = nil + } + return ds, d +} + +// PolyFactorBig describes an irreducible factor of a polynomial in one +// variable with integer coefficients P, Q of the form P*x+Q. +type PolyFactorBig struct { + P, Q *big.Int +} + +// QuadPolyFactorsBig returns the content and the irreducible factors of the +// primitive part of a quadratic polynomial in one variable with integer +// coefficients a, b, c of the form a*x^2+b*x+c in integers. +// +// If the factorization in integers does not exists, the return value is (nil, +// nil). +// +// See also: +// https://en.wikipedia.org/wiki/Factorization_of_polynomials#Primitive_part.E2.80.93content_factorization +func QuadPolyFactorsBig(a, b, c *big.Int) (content *big.Int, primitivePart []PolyFactorBig) { + content = bigGCD(bigAbs(a), bigGCD(bigAbs(b), bigAbs(c))) + switch { + case content.Sign() == 0: + content.SetInt64(1) + case content.Sign() > 0: + if a.Sign() < 0 || a.Sign() == 0 && b.Sign() < 0 { + content = bigNeg(content) + } + } + a = bigDiv(a, content) + b = bigDiv(b, content) + c = bigDiv(c, content) + + if a.Sign() == 0 { + if b.Sign() == 0 { + return content, []PolyFactorBig{{big.NewInt(0), c}} + } + + if b.Sign() < 0 && c.Sign() < 0 { + b = bigNeg(b) + c = bigNeg(c) + } + if b.Sign() < 0 { + b = bigNeg(b) + c = bigNeg(c) + } + return content, []PolyFactorBig{{b, c}} + } + + ds, d := QuadPolyDiscriminantBig(a, b, c) + if ds.Sign() < 0 || d == nil { + return nil, nil + } + + x1num := bigAdd(bigNeg(b), d) + x1denom := bigMul(_2, a) + gcd := bigGCD(bigAbs(x1num), bigAbs(x1denom)) + x1num = bigDiv(x1num, gcd) + x1denom = bigDiv(x1denom, gcd) + + x2num := bigAdd(bigNeg(b), bigNeg(d)) + x2denom := bigMul(_2, a) + gcd = bigGCD(bigAbs(x2num), bigAbs(x2denom)) + x2num = bigDiv(x2num, gcd) + x2denom = bigDiv(x2denom, gcd) + + return content, []PolyFactorBig{{x1denom, bigNeg(x1num)}, {x2denom, bigNeg(x2num)}} +} + +func bigAbs(n *big.Int) *big.Int { + n = big.NewInt(0).Set(n) + if n.Sign() >= 0 { + return n + } + + return n.Neg(n) +} + +func bigDiv(a, b *big.Int) *big.Int { + a = big.NewInt(0).Set(a) + return a.Div(a, b) +} + +func bigGCD(a, b *big.Int) *big.Int { + a = big.NewInt(0).Set(a) + b = big.NewInt(0).Set(b) + for b.Sign() != 0 { + c := big.NewInt(0) + c.Mod(a, b) + a, b = b, c + } + return a +} + +func bigNeg(n *big.Int) *big.Int { + n = big.NewInt(0).Set(n) + return n.Neg(n) +} + +func bigMul(a, b *big.Int) *big.Int { + r := big.NewInt(0).Set(a) + return r.Mul(r, b) +} + +func bigAdd(a, b *big.Int) *big.Int { + r := big.NewInt(0).Set(a) + return r.Add(r, b) +} diff --git a/vendor/github.com/cznic/mathutil/primes.go b/vendor/github.com/cznic/mathutil/primes.go new file mode 100644 index 0000000..bd10fe6 --- /dev/null +++ b/vendor/github.com/cznic/mathutil/primes.go @@ -0,0 +1,335 @@ +// Copyright (c) 2014 The mathutil Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package mathutil + +import ( + "math" +) + +// IsPrimeUint16 returns true if n is prime. Typical run time is few ns. +func IsPrimeUint16(n uint16) bool { + return n > 0 && primes16[n-1] == 1 +} + +// NextPrimeUint16 returns first prime > n and true if successful or an +// undefined value and false if there is no next prime in the uint16 limits. +// Typical run time is few ns. +func NextPrimeUint16(n uint16) (p uint16, ok bool) { + return n + uint16(primes16[n]), n < 65521 +} + +// IsPrime returns true if n is prime. Typical run time is about 100 ns. +// +//TODO rename to IsPrimeUint32 +func IsPrime(n uint32) bool { + switch { + case n&1 == 0: + return n == 2 + case n%3 == 0: + return n == 3 + case n%5 == 0: + return n == 5 + case n%7 == 0: + return n == 7 + case n%11 == 0: + return n == 11 + case n%13 == 0: + return n == 13 + case n%17 == 0: + return n == 17 + case n%19 == 0: + return n == 19 + case n%23 == 0: + return n == 23 + case n%29 == 0: + return n == 29 + case n%31 == 0: + return n == 31 + case n%37 == 0: + return n == 37 + case n%41 == 0: + return n == 41 + case n%43 == 0: + return n == 43 + case n%47 == 0: + return n == 47 + case n%53 == 0: + return n == 53 // Benchmarked optimum + case n < 65536: + // use table data + return IsPrimeUint16(uint16(n)) + default: + mod := ModPowUint32(2, (n+1)/2, n) + if mod != 2 && mod != n-2 { + return false + } + blk := &lohi[n>>24] + lo, hi := blk.lo, blk.hi + for lo <= hi { + index := (lo + hi) >> 1 + liar := liars[index] + switch { + case n > liar: + lo = index + 1 + case n < liar: + hi = index - 1 + default: + return false + } + } + return true + } +} + +// IsPrimeUint64 returns true if n is prime. Typical run time is few tens of µs. +// +// SPRP bases: http://miller-rabin.appspot.com +func IsPrimeUint64(n uint64) bool { + switch { + case n%2 == 0: + return n == 2 + case n%3 == 0: + return n == 3 + case n%5 == 0: + return n == 5 + case n%7 == 0: + return n == 7 + case n%11 == 0: + return n == 11 + case n%13 == 0: + return n == 13 + case n%17 == 0: + return n == 17 + case n%19 == 0: + return n == 19 + case n%23 == 0: + return n == 23 + case n%29 == 0: + return n == 29 + case n%31 == 0: + return n == 31 + case n%37 == 0: + return n == 37 + case n%41 == 0: + return n == 41 + case n%43 == 0: + return n == 43 + case n%47 == 0: + return n == 47 + case n%53 == 0: + return n == 53 + case n%59 == 0: + return n == 59 + case n%61 == 0: + return n == 61 + case n%67 == 0: + return n == 67 + case n%71 == 0: + return n == 71 + case n%73 == 0: + return n == 73 + case n%79 == 0: + return n == 79 + case n%83 == 0: + return n == 83 + case n%89 == 0: + return n == 89 // Benchmarked optimum + case n <= math.MaxUint16: + return IsPrimeUint16(uint16(n)) + case n <= math.MaxUint32: + return ProbablyPrimeUint32(uint32(n), 11000544) && + ProbablyPrimeUint32(uint32(n), 31481107) + case n < 105936894253: + return ProbablyPrimeUint64_32(n, 2) && + ProbablyPrimeUint64_32(n, 1005905886) && + ProbablyPrimeUint64_32(n, 1340600841) + case n < 31858317218647: + return ProbablyPrimeUint64_32(n, 2) && + ProbablyPrimeUint64_32(n, 642735) && + ProbablyPrimeUint64_32(n, 553174392) && + ProbablyPrimeUint64_32(n, 3046413974) + case n < 3071837692357849: + return ProbablyPrimeUint64_32(n, 2) && + ProbablyPrimeUint64_32(n, 75088) && + ProbablyPrimeUint64_32(n, 642735) && + ProbablyPrimeUint64_32(n, 203659041) && + ProbablyPrimeUint64_32(n, 3613982119) + default: + return ProbablyPrimeUint64_32(n, 2) && + ProbablyPrimeUint64_32(n, 325) && + ProbablyPrimeUint64_32(n, 9375) && + ProbablyPrimeUint64_32(n, 28178) && + ProbablyPrimeUint64_32(n, 450775) && + ProbablyPrimeUint64_32(n, 9780504) && + ProbablyPrimeUint64_32(n, 1795265022) + } +} + +// NextPrime returns first prime > n and true if successful or an undefined value and false if there +// is no next prime in the uint32 limits. Typical run time is about 2 µs. +// +//TODO rename to NextPrimeUint32 +func NextPrime(n uint32) (p uint32, ok bool) { + switch { + case n < 65521: + p16, _ := NextPrimeUint16(uint16(n)) + return uint32(p16), true + case n >= math.MaxUint32-4: + return + } + + n++ + var d0, d uint32 + switch mod := n % 6; mod { + case 0: + d0, d = 1, 4 + case 1: + d = 4 + case 2, 3, 4: + d0, d = 5-mod, 2 + case 5: + d = 2 + } + + p = n + d0 + if p < n { // overflow + return + } + + for { + if IsPrime(p) { + return p, true + } + + p0 := p + p += d + if p < p0 { // overflow + break + } + + d ^= 6 + } + return +} + +// NextPrimeUint64 returns first prime > n and true if successful or an undefined value and false if there +// is no next prime in the uint64 limits. Typical run time is in hundreds of µs. +func NextPrimeUint64(n uint64) (p uint64, ok bool) { + switch { + case n < 65521: + p16, _ := NextPrimeUint16(uint16(n)) + return uint64(p16), true + case n >= 18446744073709551557: // last uint64 prime + return + } + + n++ + var d0, d uint64 + switch mod := n % 6; mod { + case 0: + d0, d = 1, 4 + case 1: + d = 4 + case 2, 3, 4: + d0, d = 5-mod, 2 + case 5: + d = 2 + } + + p = n + d0 + if p < n { // overflow + return + } + + for { + if ok = IsPrimeUint64(p); ok { + break + } + + p0 := p + p += d + if p < p0 { // overflow + break + } + + d ^= 6 + } + return +} + +// FactorTerm is one term of an integer factorization. +type FactorTerm struct { + Prime uint32 // The divisor + Power uint32 // Term == Prime^Power +} + +// FactorTerms represent a factorization of an integer +type FactorTerms []FactorTerm + +// FactorInt returns prime factorization of n > 1 or nil otherwise. +// Resulting factors are ordered by Prime. Typical run time is few µs. +func FactorInt(n uint32) (f FactorTerms) { + switch { + case n < 2: + return + case IsPrime(n): + return []FactorTerm{{n, 1}} + } + + f, w := make([]FactorTerm, 9), 0 + for p := 2; p < len(primes16); p += int(primes16[p]) { + if uint(p*p) > uint(n) { + break + } + + power := uint32(0) + for n%uint32(p) == 0 { + n /= uint32(p) + power++ + } + if power != 0 { + f[w] = FactorTerm{uint32(p), power} + w++ + } + if n == 1 { + break + } + } + if n != 1 { + f[w] = FactorTerm{n, 1} + w++ + } + return f[:w] +} + +// PrimorialProductsUint32 returns a slice of numbers in [lo, hi] which are a +// product of max 'max' primorials. The slice is not sorted. +// +// See also: http://en.wikipedia.org/wiki/Primorial +func PrimorialProductsUint32(lo, hi, max uint32) (r []uint32) { + lo64, hi64 := int64(lo), int64(hi) + if max > 31 { // N/A + max = 31 + } + + var f func(int64, int64, uint32) + f = func(n, p int64, emax uint32) { + e := uint32(1) + for n <= hi64 && e <= emax { + n *= p + if n >= lo64 && n <= hi64 { + r = append(r, uint32(n)) + } + if n < hi64 { + p, _ := NextPrime(uint32(p)) + f(n, int64(p), e) + } + e++ + } + } + + f(1, 2, max) + return +} diff --git a/vendor/github.com/cznic/mathutil/rat.go b/vendor/github.com/cznic/mathutil/rat.go new file mode 100644 index 0000000..91b1c6f --- /dev/null +++ b/vendor/github.com/cznic/mathutil/rat.go @@ -0,0 +1,27 @@ +// Copyright (c) 2014 The mathutil Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package mathutil + +// QCmpUint32 compares a/b and c/d and returns: +// +// -1 if a/b < c/d +// 0 if a/b == c/d +// +1 if a/b > c/d +// +func QCmpUint32(a, b, c, d uint32) int { + switch x, y := uint64(a)*uint64(d), uint64(b)*uint64(c); { + case x < y: + return -1 + case x == y: + return 0 + default: // x > y + return 1 + } +} + +// QScaleUint32 returns a such that a/b >= c/d. +func QScaleUint32(b, c, d uint32) (a uint64) { + return 1 + (uint64(b)*uint64(c))/uint64(d) +} diff --git a/vendor/github.com/cznic/mathutil/rnd.go b/vendor/github.com/cznic/mathutil/rnd.go new file mode 100644 index 0000000..9132dc0 --- /dev/null +++ b/vendor/github.com/cznic/mathutil/rnd.go @@ -0,0 +1,383 @@ +// Copyright (c) 2014 The mathutil Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package mathutil + +import ( + "fmt" + "math" + "math/big" +) + +// FC32 is a full cycle PRNG covering the 32 bit signed integer range. +// In contrast to full cycle generators shown at e.g. http://en.wikipedia.org/wiki/Full_cycle, +// this code doesn't produce values at constant delta (mod cycle length). +// The 32 bit limit is per this implementation, the algorithm used has no intrinsic limit on the cycle size. +// Properties include: +// - Adjustable limits on creation (hi, lo). +// - Positionable/randomly accessible (Pos, Seek). +// - Repeatable (deterministic). +// - Can run forward or backward (Next, Prev). +// - For a billion numbers cycle the Next/Prev PRN can be produced in cca 100-150ns. +// That's like 5-10 times slower compared to PRNs generated using the (non FC) rand package. +type FC32 struct { + cycle int64 // On average: 3 * delta / 2, (HQ: 2 * delta) + delta int64 // hi - lo + factors [][]int64 // This trades some space for hopefully a bit of speed (multiple adding vs multiplying). + lo int + mods []int // pos % set + pos int64 // Within cycle. + primes []int64 // Ordered. ∏ primes == cycle. + set []int64 // Reordered primes (magnitude order bases) according to seed. +} + +// NewFC32 returns a newly created FC32 adjusted for the closed interval [lo, hi] or an Error if any. +// If hq == true then trade some generation time for improved (pseudo)randomness. +func NewFC32(lo, hi int, hq bool) (r *FC32, err error) { + if lo > hi { + return nil, fmt.Errorf("invalid range %d > %d", lo, hi) + } + + if uint64(hi)-uint64(lo) > math.MaxUint32 { + return nil, fmt.Errorf("range out of int32 limits %d, %d", lo, hi) + } + + delta := int64(hi) - int64(lo) + // Find the primorial covering whole delta + n, set, p := int64(1), []int64{}, uint32(2) + if hq { + p++ + } + for { + set = append(set, int64(p)) + n *= int64(p) + if n > delta { + break + } + p, _ = NextPrime(p) + } + + // Adjust the set so n ∊ [delta, 2 * delta] (HQ: [delta, 3 * delta]) + // while keeping the cardinality of the set (correlates with the statistic "randomness quality") + // at max, i.e. discard atmost one member. + i := -1 // no candidate prime + if n > 2*(delta+1) { + for j, p := range set { + q := n / p + if q < delta+1 { + break + } + + i = j // mark the highest candidate prime set index + } + } + if i >= 0 { // shrink the inner cycle + n = n / set[i] + set = delete(set, i) + } + r = &FC32{ + cycle: n, + delta: delta, + factors: make([][]int64, len(set)), + lo: lo, + mods: make([]int, len(set)), + primes: set, + } + r.Seed(1) // the default seed should be always non zero + return +} + +// Cycle reports the length of the inner FCPRNG cycle. +// Cycle is atmost the double (HQ: triple) of the generator period (hi - lo + 1). +func (r *FC32) Cycle() int64 { + return r.cycle +} + +// Next returns the first PRN after Pos. +func (r *FC32) Next() int { + return r.step(1) +} + +// Pos reports the current position within the inner cycle. +func (r *FC32) Pos() int64 { + return r.pos +} + +// Prev return the first PRN before Pos. +func (r *FC32) Prev() int { + return r.step(-1) +} + +// Seed uses the provided seed value to initialize the generator to a deterministic state. +// A zero seed produces a "canonical" generator with worse randomness than for most non zero seeds. +// Still, the FC property holds for any seed value. +func (r *FC32) Seed(seed int64) { + u := uint64(seed) + r.set = mix(r.primes, &u) + n := int64(1) + for i, p := range r.set { + k := make([]int64, p) + v := int64(0) + for j := range k { + k[j] = v + v += n + } + n *= p + r.factors[i] = mix(k, &u) + } +} + +// Seek sets Pos to |pos| % Cycle. +func (r *FC32) Seek(pos int64) { //vet:ignore + if pos < 0 { + pos = -pos + } + pos %= r.cycle + r.pos = pos + for i, p := range r.set { + r.mods[i] = int(pos % p) + } +} + +func (r *FC32) step(dir int) int { + for { // avg loops per step: 3/2 (HQ: 2) + y := int64(0) + pos := r.pos + pos += int64(dir) + switch { + case pos < 0: + pos = r.cycle - 1 + case pos >= r.cycle: + pos = 0 + } + r.pos = pos + for i, mod := range r.mods { + mod += dir + p := int(r.set[i]) + switch { + case mod < 0: + mod = p - 1 + case mod >= p: + mod = 0 + } + r.mods[i] = mod + y += r.factors[i][mod] + } + if y <= r.delta { + return int(y) + r.lo + } + } +} + +func delete(set []int64, i int) (y []int64) { + for j, v := range set { + if j != i { + y = append(y, v) + } + } + return +} + +func mix(set []int64, seed *uint64) (y []int64) { + for len(set) != 0 { + *seed = rol(*seed) + i := int(*seed % uint64(len(set))) + y = append(y, set[i]) + set = delete(set, i) + } + return +} + +func rol(u uint64) (y uint64) { + y = u << 1 + if int64(u) < 0 { + y |= 1 + } + return +} + +// FCBig is a full cycle PRNG covering ranges outside of the int32 limits. +// For more info see the FC32 docs. +// Next/Prev PRN on a 1e15 cycle can be produced in about 2 µsec. +type FCBig struct { + cycle *big.Int // On average: 3 * delta / 2, (HQ: 2 * delta) + delta *big.Int // hi - lo + factors [][]*big.Int // This trades some space for hopefully a bit of speed (multiple adding vs multiplying). + lo *big.Int + mods []int // pos % set + pos *big.Int // Within cycle. + primes []int64 // Ordered. ∏ primes == cycle. + set []int64 // Reordered primes (magnitude order bases) according to seed. +} + +// NewFCBig returns a newly created FCBig adjusted for the closed interval [lo, hi] or an Error if any. +// If hq == true then trade some generation time for improved (pseudo)randomness. +func NewFCBig(lo, hi *big.Int, hq bool) (r *FCBig, err error) { + if lo.Cmp(hi) > 0 { + return nil, fmt.Errorf("invalid range %d > %d", lo, hi) + } + + delta := big.NewInt(0) + delta.Add(delta, hi).Sub(delta, lo) + + // Find the primorial covering whole delta + n, set, pp, p := big.NewInt(1), []int64{}, big.NewInt(0), uint32(2) + if hq { + p++ + } + for { + set = append(set, int64(p)) + pp.SetInt64(int64(p)) + n.Mul(n, pp) + if n.Cmp(delta) > 0 { + break + } + p, _ = NextPrime(p) + } + + // Adjust the set so n ∊ [delta, 2 * delta] (HQ: [delta, 3 * delta]) + // while keeping the cardinality of the set (correlates with the statistic "randomness quality") + // at max, i.e. discard atmost one member. + dd1 := big.NewInt(1) + dd1.Add(dd1, delta) + dd2 := big.NewInt(0) + dd2.Lsh(dd1, 1) + i := -1 // no candidate prime + if n.Cmp(dd2) > 0 { + q := big.NewInt(0) + for j, p := range set { + pp.SetInt64(p) + q.Set(n) + q.Div(q, pp) + if q.Cmp(dd1) < 0 { + break + } + + i = j // mark the highest candidate prime set index + } + } + if i >= 0 { // shrink the inner cycle + pp.SetInt64(set[i]) + n.Div(n, pp) + set = delete(set, i) + } + r = &FCBig{ + cycle: n, + delta: delta, + factors: make([][]*big.Int, len(set)), + lo: lo, + mods: make([]int, len(set)), + pos: big.NewInt(0), + primes: set, + } + r.Seed(1) // the default seed should be always non zero + return +} + +// Cycle reports the length of the inner FCPRNG cycle. +// Cycle is atmost the double (HQ: triple) of the generator period (hi - lo + 1). +func (r *FCBig) Cycle() *big.Int { + return r.cycle +} + +// Next returns the first PRN after Pos. +func (r *FCBig) Next() *big.Int { + return r.step(1) +} + +// Pos reports the current position within the inner cycle. +func (r *FCBig) Pos() *big.Int { + return r.pos +} + +// Prev return the first PRN before Pos. +func (r *FCBig) Prev() *big.Int { + return r.step(-1) +} + +// Seed uses the provided seed value to initialize the generator to a deterministic state. +// A zero seed produces a "canonical" generator with worse randomness than for most non zero seeds. +// Still, the FC property holds for any seed value. +func (r *FCBig) Seed(seed int64) { + u := uint64(seed) + r.set = mix(r.primes, &u) + n := big.NewInt(1) + v := big.NewInt(0) + pp := big.NewInt(0) + for i, p := range r.set { + k := make([]*big.Int, p) + v.SetInt64(0) + for j := range k { + k[j] = big.NewInt(0) + k[j].Set(v) + v.Add(v, n) + } + pp.SetInt64(p) + n.Mul(n, pp) + r.factors[i] = mixBig(k, &u) + } +} + +// Seek sets Pos to |pos| % Cycle. +func (r *FCBig) Seek(pos *big.Int) { + r.pos.Set(pos) + r.pos.Abs(r.pos) + r.pos.Mod(r.pos, r.cycle) + mod := big.NewInt(0) + pp := big.NewInt(0) + for i, p := range r.set { + pp.SetInt64(p) + r.mods[i] = int(mod.Mod(r.pos, pp).Int64()) + } +} + +func (r *FCBig) step(dir int) (y *big.Int) { + y = big.NewInt(0) + d := big.NewInt(int64(dir)) + for { // avg loops per step: 3/2 (HQ: 2) + r.pos.Add(r.pos, d) + switch { + case r.pos.Sign() < 0: + r.pos.Add(r.pos, r.cycle) + case r.pos.Cmp(r.cycle) >= 0: + r.pos.SetInt64(0) + } + for i, mod := range r.mods { + mod += dir + p := int(r.set[i]) + switch { + case mod < 0: + mod = p - 1 + case mod >= p: + mod = 0 + } + r.mods[i] = mod + y.Add(y, r.factors[i][mod]) + } + if y.Cmp(r.delta) <= 0 { + y.Add(y, r.lo) + return + } + y.SetInt64(0) + } +} + +func deleteBig(set []*big.Int, i int) (y []*big.Int) { + for j, v := range set { + if j != i { + y = append(y, v) + } + } + return +} + +func mixBig(set []*big.Int, seed *uint64) (y []*big.Int) { + for len(set) != 0 { + *seed = rol(*seed) + i := int(*seed % uint64(len(set))) + y = append(y, set[i]) + set = deleteBig(set, i) + } + return +} diff --git a/vendor/github.com/cznic/mathutil/tables.go b/vendor/github.com/cznic/mathutil/tables.go new file mode 100644 index 0000000..f32952c --- /dev/null +++ b/vendor/github.com/cznic/mathutil/tables.go @@ -0,0 +1,6995 @@ +// Copyright (c) 2014 The mathutil Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// "Static" data + +package mathutil + +var ( + // Set bits count in a byte + popcnt = [256]byte{ + 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, // 0 + 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, // 1 + 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, // 2 + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, // 3 + 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, // 4 + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, // 5 + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, // 6 + 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, // 7 + 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, // 8 + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, // 9 + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, // 10 + 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, // 11 + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, // 12 + 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, // 13 + 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, // 14 + 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8, // 15 + } + + // Highest set bit index in a byte + log2 = [256]int{ + -1, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, // 0 + + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, // 1 + + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, // 2 + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, // 3 + + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, // 4 + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, // 5 + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, // 6 + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, // 7 + + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // 8 + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // 9 + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // 10 + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // 11 + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // 12 + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // 13 + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // 14 + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // 15 + } + + // "Predivisors": 2-53 + liars = [3660]uint32{ + 31621, 42799, 49141, 49981, 65077, 65281, 80581, 83333, 88357, 90751, + 104653, 130561, 164737, 188057, 194221, 196093, 215749, 219781, 220729, 253241, + 256999, 271951, 280601, 282133, 357761, 390937, 458989, 486737, 489997, 514447, + 580337, 587861, 611701, 647089, 653333, 657901, 665281, 665333, 688213, 710533, + 721801, 722261, 738541, 741751, 742813, 745889, 769757, 818201, 838861, 873181, + 877099, 916327, 976873, 983401, 1016801, 1018921, 1053761, 1064053, 1073021, 1082401, + 1109461, 1132657, 1145257, 1168513, 1194649, 1207361, 1251949, 1252697, 1302451, 1325843, + 1357441, 1373653, 1397419, 1441091, 1493857, 1507963, 1509709, 1530787, 1584133, 1678541, + 1690501, 1730977, 1735841, 1811573, 1876393, 1969417, 1987021, 2004403, 2081713, 2163001, + 2181961, 2205967, 2261953, 2264369, 2269093, 2284453, 2304167, 2387797, 2487941, 2510569, + 2670361, 2746477, 2748023, 2757241, 2811271, 2909197, 2944261, 2976487, 3048841, 3090091, + 3116107, 3125281, 3225601, 3363121, 3375041, 3400013, 3413533, 3429037, 3539101, 3542533, + 3567481, 3568661, 3605429, 3656449, 3763801, 3828001, 3898129, 3911197, 3985921, 4072729, + 4181921, 4188889, 4209661, 4360621, 4469471, 4480477, 4513841, 4835209, 4863127, 4869313, + 4877641, 4922413, 5016191, 5044033, 5095177, 5173169, 5173601, 5176153, 5256091, 5271841, + 5284333, 5351537, 5489641, 5590621, 5672041, 5919187, 6027193, 6118141, 6140161, 6159301, + 6189121, 6226193, 6233977, 6236257, 6278533, 6334351, 6368689, 6386993, 6631549, 6658669, + 6779137, 6787327, 6836233, 6952037, 6955541, 6998881, 7017193, 7232321, 7306261, 7306561, + 7429117, 7462001, 7674967, 7725901, 7759937, 7820201, 7883731, 8036033, 8095447, 8239477, + 8384513, 8534233, 8725753, 8727391, 8902741, 9006401, 9056501, 9073513, 9131401, 9345541, + 9371251, 9439201, 9480461, 9533701, 9564169, 9567673, 9588151, 9591661, 9729301, 9774181, + 9863461, 10024561, 10084177, 10323769, 10331141, 10386241, 10425511, 10610063, 10700761, 10712857, + 10763653, 10974881, 11081459, 11115037, 11335501, 11541307, 11585293, 11592397, 11777599, 12032021, + 12096613, 12263131, 12322133, 12327121, 12599233, 12854437, 13057787, 13338371, 13446253, 13500313, + 13635289, 13694761, 13747361, 13773061, 14026897, 14154337, 14179537, 14324473, 14469841, 14671801, + 14676481, 14709241, 14794081, 14796289, 14865121, 15101893, 15139199, 15162941, 15188557, 15220951, + 15247621, 15479777, 15525241, 15603391, 15621409, 15700301, 15802681, 15976747, 15978007, 16070429, + 16132321, 16149169, 16153633, 16324001, 16349477, 16360381, 16705021, 16773121, 16822081, 16843009, + 16853077, 16879501, 16973393, 17098369, 17116837, 17134043, 17208601, 17236801, 17327773, 17375249, + 17405537, 17585969, 17870561, 18067501, 18073817, 18366937, 18443701, 18454921, 18535177, 18653353, + 18740971, 19328653, 19384289, 19404139, 19471033, 19607561, 20261251, 20417311, 20647621, 20968501, + 21042001, 21303343, 21306157, 21359521, 21397381, 21400481, 21623659, 21654533, 22075579, 22087477, + 22369621, 22591301, 22669501, 22711873, 22849481, 22953673, 23247901, 23382529, 23464033, 23577497, + 23634181, 23734901, 23828017, 23872213, 23963869, 24214051, 24356377, 25080101, 25150501, 25276421, + 25326001, 25457833, 25629913, 25696133, 25768261, 25909453, 26280073, 26377921, 26821601, 26840269, + 26877421, 26886817, 27108397, 27118601, 27219697, 27271151, 27279409, 27331921, 27380831, 27392041, + 27409541, 27491237, 27509653, 27664033, 27798461, 27808463, 28325881, 28527049, 28572961, 29111881, + 29214541, 29581501, 30022129, 30090817, 30185569, 30219757, 30295141, 30338593, 30388753, 30418957, + 30576151, 30662497, 30740417, 30881551, 30894307, 31040833, 31166803, 31436123, 31735621, 31759121, + 32091781, 32095057, 32168117, 32285041, 32497921, 32676481, 33146717, 33298337, 33600533, 33627301, + 33704101, 33872593, 34003061, 34043101, 34124641, 34540801, 34856167, 34944001, 35576599, 35703361, + 35820937, 35851037, 36291193, 36307981, 36861901, 36919681, 36974341, 37109467, 37376509, 37439201, + 37964809, 37988497, 38010307, 38046817, 38118763, 38210323, 39465091, 39512773, 39655153, 39684157, + 40165093, 40238797, 40315441, 40361197, 40629601, 40782589, 40827473, 40987201, 41121433, 41568101, + 41604109, 41642681, 41662297, 41840809, 42009217, 42485119, 42623017, 42984589, 43224397, 43363601, + 43661257, 44070841, 44314129, 44465221, 44482901, 45100177, 45175201, 45219329, 45414433, 45819541, + 45879941, 46094401, 46325029, 46386589, 46469809, 46517857, 46679761, 46860001, 47220367, 47903701, + 47918581, 48064021, 48191653, 48269761, 48316969, 48400753, 48448661, 48551161, 48563089, 49075417, + 49303801, 49411801, 49459801, 50155733, 50201089, 50443201, 50523661, 51030601, 51129781, 51302353, + 51500521, 52072021, 52119289, 52204237, 53283169, 53399449, 53656021, 53675623, 53695721, 53711113, + 54029741, 54449431, 55109401, 55176097, 55318957, 55729957, 56052361, 56420033, 56479897, 56810137, + 57762433, 58003213, 58422409, 58449847, 58509977, 58679941, 58755877, 59631211, 59840537, 59913157, + 59953741, 60155201, 60352921, 60547831, 60566431, 60581401, 60696661, 60738257, 60957361, 61201009, + 61219789, 61377109, 61832377, 62756641, 63001801, 63002501, 63065281, 63167743, 63318169, 63328469, + 63346999, 63388033, 64148717, 64605041, 64735897, 65144501, 65254393, 65301013, 65350801, 65359477, + 66096253, 67194401, 67642513, 67928221, 68102641, 68154001, 68165761, 68512867, 68621701, 68839597, + 69030901, 69128641, 69176647, 69228967, 69231061, 69485281, 69612061, 69885649, 70149631, 70463489, + 70593931, 70728121, 71079661, 71734417, 72498253, 72543547, 73562833, 73645001, 74411131, 74927161, + 75140137, 75565873, 76725091, 76745101, 77533123, 77648941, 77812153, 77817979, 78939089, 79398901, + 79411201, 79417801, 79464533, 79786523, 80142761, 80146909, 80375707, 80556337, 80687881, 80891009, + 81433591, 81954133, 82273201, 82506439, 82870517, 82929001, 83083001, 83103329, 83204801, 84164033, + 84350561, 84421081, 84487457, 84998503, 85328717, 85519337, 85823401, 86027329, 86438857, 86530621, + 86999837, 87499651, 87694261, 88256449, 88368853, 88661861, 89308771, 89784581, 90270613, 90278161, + 90341197, 90665789, 90698401, 91433281, 91659283, 92438581, 92625121, 93431521, 93541537, 93571633, + 93643201, 93677761, 93926197, 94316401, 94502701, 95451361, 95452781, 96135601, 96618397, 96791881, + 96888641, 96895441, 96904081, 96925921, 97255801, 97496449, 97796953, 97863529, 97924217, 99036001, + 99115297, 99486889, 99789673, 99898801, 100463443, 100618933, 100943201, 101152133, 101218921, 101270251, + 101276579, 101649241, 102004421, 102678031, 102690677, 102690901, 103301633, 104078857, 104524421, 104988673, + 105305443, 105919633, 106485121, 106622353, 106743073, 107360641, 107543333, 108596953, 109231229, 109437751, + 109541461, 109879837, 110135821, 110139499, 110312773, 110413333, 110717861, 111370141, 111654401, 112032001, + 112402981, 112828801, 113589601, 113605201, 113730481, 113892589, 114305441, 114329881, 114701341, 114842677, + 114910489, 115039081, 115174681, 115497901, 115804501, 115873801, 116090081, 116321617, 116617289, 116682721, + 116696161, 116998669, 117987841, 118466401, 118901521, 119092801, 119204809, 119261113, 119327041, 119558011, + 119743537, 119940853, 120296677, 120517021, 120838609, 121062001, 121374241, 121472359, 121609489, 122166307, + 122396737, 122941981, 123481777, 123671671, 123877081, 123987793, 124145473, 124630273, 124818601, 125284141, + 125686241, 125848577, 126132553, 127050067, 128079409, 128124151, 128396921, 128468957, 128665319, 128987429, + 129205781, 129256273, 129357061, 129461617, 129524669, 130556329, 130693393, 130944133, 131023201, 131567929, + 131938561, 132332201, 132338881, 132440521, 132575071, 133216381, 133302781, 133467517, 133800661, 134696801, + 134767153, 134868029, 135263269, 135296053, 135308881, 135945853, 135969401, 136043641, 136661201, 136722433, + 137415821, 137763037, 138030721, 138403981, 138828821, 139295701, 139487041, 140197051, 142525333, 142922413, + 143106133, 143168581, 145348529, 146156617, 146272901, 146659801, 146843929, 146884393, 147028001, 147287141, + 148109473, 148171769, 148910653, 149389633, 150379693, 150960239, 150988753, 151533377, 151589881, 152716537, + 152922001, 152991841, 153369061, 153589801, 153754873, 153928133, 154287451, 154513633, 154944533, 155203361, + 156114061, 156532799, 157069189, 157368661, 157405249, 157725829, 158068153, 158192317, 158397247, 158496911, + 158544401, 158895281, 160348189, 160378861, 160491329, 160587841, 160672201, 160730389, 161184013, 161216021, + 161289649, 161304001, 161423377, 162026869, 162067441, 162690481, 162771337, 162776041, 163442551, 163954561, + 164111281, 165061909, 165224321, 165938653, 166082309, 166339057, 166406561, 166827943, 167579497, 167582377, + 167692141, 167881121, 168566501, 169655641, 170640961, 170782921, 170856533, 171454321, 172116181, 172436713, + 172947529, 173401621, 174479729, 176030977, 176597821, 176609441, 176977921, 177167233, 177254533, 177693521, + 177927641, 177951973, 178837201, 178956971, 179083601, 179285137, 179820257, 180115489, 180497633, 180703451, + 181285001, 181285537, 181542601, 181647497, 182383111, 183677341, 184411567, 185653333, 186183469, 186393481, + 186983521, 187050529, 187667969, 187761241, 188516329, 188985961, 189714193, 189738361, 189941761, 190212181, + 190382161, 190913297, 191233813, 191648161, 191981609, 192346153, 192857761, 193330237, 193638337, 193949641, + 194556451, 196035001, 196049701, 196231393, 198982759, 199674721, 200143351, 200753281, 201261061, 202130197, + 202156813, 202538857, 203505697, 204280501, 204582457, 204766381, 205057561, 206304961, 206453509, 206504033, + 206529737, 207008569, 207030541, 207132481, 207477001, 207618781, 208051201, 208969223, 209246701, 209404369, + 209990881, 210592873, 210842113, 213035761, 214038533, 214110541, 214852609, 214858717, 215436241, 216821881, + 217123069, 217875571, 218603617, 218642029, 218947121, 219621781, 220531501, 220883521, 221368153, 221415781, + 221884001, 222010721, 222630193, 223449463, 223625851, 223782263, 224074369, 224136013, 224769241, 224957893, + 225853633, 226359547, 226450297, 227132641, 227444101, 227475481, 228652201, 228842209, 228988033, 229589413, + 230357761, 231383461, 231405701, 231927781, 232114433, 232460821, 232771501, 233110081, 234869009, 235426913, + 235928071, 237791143, 238001653, 238833421, 240068041, 240371713, 240694513, 240785047, 241505377, 242067841, + 242650717, 242860069, 243583201, 243955141, 244883981, 245006623, 245950561, 246099317, 246282511, 246434761, + 246658441, 247318957, 247321301, 247416101, 249582481, 250436033, 250958401, 250988173, 251528401, 251663837, + 251855893, 252853921, 253610281, 253893397, 255416897, 256831433, 257590661, 258020473, 258043229, 258234401, + 258944401, 259763093, 259765747, 260156101, 260518801, 260736341, 260963389, 261186001, 261703417, 262979501, + 263428181, 264269449, 264384469, 265020001, 265584133, 265735969, 265836161, 266790481, 266925601, 270525737, + 271272569, 271763467, 271826629, 271950829, 273361789, 273480637, 274701913, 274810241, 274919401, 275283401, + 275619961, 276018913, 276131137, 276542401, 276638321, 277787141, 278943061, 279377281, 280885153, 282253141, + 282471853, 282769771, 283900961, 284166877, 284301751, 284736091, 284834299, 285820501, 286316801, 287160301, + 287449091, 287715121, 288099001, 288117721, 288735277, 290643601, 290706781, 290953921, 291088513, 291461633, + 292153681, 292290181, 292433321, 292902481, 293346637, 293847721, 293938261, 295419097, 295743017, 297624961, + 297798961, 298212601, 299367877, 299736181, 301413001, 302635351, 304080001, 307629401, 307694323, 307972801, + 308483209, 309666361, 310474249, 310978027, 311177213, 311411629, 311655829, 311671361, 312408113, 312614021, + 314184487, 315034513, 315351521, 317137969, 317365933, 317641171, 317796119, 319053281, 319374577, 319440769, + 319726177, 320326003, 321324589, 321850849, 322469701, 322941881, 324477697, 325028089, 325352101, 325546873, + 326266051, 326405713, 326469137, 326628721, 326694301, 326695141, 327073601, 327093409, 327398009, 328302901, + 329153653, 329769721, 330198331, 330759617, 331658081, 331934989, 337135501, 337420679, 337665901, 337783981, + 338125537, 338458807, 338914369, 339195097, 339492169, 339794641, 341958121, 341994131, 343017529, 343052833, + 344201441, 344255551, 344776301, 346080391, 348989101, 349752913, 350031973, 350244577, 351058753, 351177769, + 352802803, 352932337, 353815801, 353932801, 354062809, 356604421, 356836819, 357348601, 357872971, 358416577, + 359394751, 359727073, 360145633, 360375181, 360787771, 361307521, 361312337, 362569201, 363170837, 363430637, + 364550761, 365077373, 365231401, 366487201, 366532321, 366652201, 367559501, 367632301, 368016949, 368476501, + 369667561, 371011801, 371611153, 372167101, 373012777, 373533617, 373669453, 373906513, 374346361, 374988661, + 376957153, 377192353, 377334497, 377458849, 377806687, 377869031, 378792649, 379732501, 380137633, 382304161, + 384100001, 385175113, 385319089, 387072661, 388695301, 390609941, 390612221, 391014937, 392679737, 393611653, + 394723177, 396864469, 399156661, 399302581, 399647221, 400385701, 400557109, 401100881, 403095967, 403293313, + 405739681, 405782623, 407737201, 407889161, 409302001, 409458241, 410613809, 410680357, 411618241, 411851389, + 412836689, 413138881, 413429801, 413778817, 414216461, 414368641, 415200361, 415204501, 415476343, 416964241, + 417767201, 417779909, 418044563, 418226581, 418616161, 418617281, 418667401, 419184481, 420607441, 421942951, + 422429041, 422928101, 423384001, 423465001, 424175761, 424411501, 424431541, 425967301, 426174101, 426219649, + 426770437, 426783811, 427294141, 428180191, 428758201, 429135841, 429509837, 430046857, 430381921, 430646401, + 430733701, 432227449, 434042801, 435016187, 435358657, 435993301, 436465501, 437247841, 437462101, 437597101, + 437866087, 439309261, 441354497, 441650591, 441758461, 442050577, 442181291, 442543553, 444660421, 445429693, + 446414621, 446619617, 449501761, 450807481, 450866021, 450872573, 452990401, 453366029, 453967739, 454745773, + 455198563, 457274161, 457320533, 459785089, 460251733, 460585861, 461151121, 461272267, 461329601, 462587329, + 462639409, 462701513, 464012033, 464955857, 465505633, 466290949, 466758181, 467100937, 468410113, 468950021, + 470120257, 470268137, 470644021, 471535373, 471664513, 472814413, 473581057, 474892741, 474970501, 474983881, + 475723849, 478614067, 479962009, 480668347, 481153501, 481239361, 482488393, 482824669, 482921297, 483006889, + 483029821, 483945601, 484200289, 486063001, 486902929, 487896601, 488104681, 488169289, 488585521, 488656981, + 489994201, 490950461, 491738801, 493108481, 494288677, 495909871, 496109729, 496560349, 497148599, 497285713, + 498662561, 498706651, 498905189, 500747293, 501172241, 501472333, 502686713, 504870241, 505473263, 505532773, + 505798213, 506349421, 507142567, 507323521, 508606771, 509302873, 509551201, 510925609, 511098521, 511215521, + 511611673, 512330281, 514738981, 516045197, 516259657, 516764063, 517662001, 518216201, 518548801, 521501473, + 522390109, 522758233, 523756711, 526067821, 526359289, 526686889, 528013333, 528043753, 528220117, 530630701, + 531095029, 531681281, 532126801, 532758241, 532800133, 533429881, 534782293, 535252867, 535428577, 535517581, + 536003333, 536114197, 536342419, 536870911, 540207097, 540621181, 540654409, 540680141, 542497201, 542536457, + 544861633, 545550433, 545622401, 546102481, 546117301, 546322201, 548080513, 548989561, 549308761, 550132741, + 550230409, 550635373, 550853137, 551313001, 552573793, 553027201, 554487121, 554599051, 554964001, 555321007, + 555465601, 556001377, 556069849, 556095433, 556114609, 557165209, 558235109, 558900821, 558977761, 561448487, + 562367821, 563298061, 563947141, 564298489, 564689381, 565664761, 565707061, 567358513, 567596401, 568902001, + 568967221, 569332177, 569495809, 570941881, 572123521, 572228929, 572430769, 572567353, 572936869, 573817861, + 573862021, 574998841, 575326033, 576724219, 577210181, 577352641, 577613261, 579606301, 579956653, 581618143, + 582389641, 582799951, 585261637, 586706821, 587343541, 588049001, 591242653, 591822001, 592467451, 592468777, + 593682169, 593728489, 595405201, 595590841, 597537361, 597717121, 599135767, 599945293, 600893921, 601606487, + 602379181, 604584221, 605454917, 605961049, 606872449, 607148653, 607750681, 608421637, 608917753, 609361567, + 609813781, 611097401, 611374453, 611770513, 611812321, 611817421, 612006253, 613849601, 614742241, 615361183, + 615760133, 615895897, 616280897, 617087701, 619239457, 619365121, 619480601, 620169409, 620544961, 620755537, + 621769669, 622137601, 623735953, 624303241, 624732421, 625060801, 625482001, 626717471, 627886657, 628868467, + 629134081, 630496621, 630622753, 630811513, 631767943, 631974613, 633289807, 635155291, 635291077, 635319361, + 636287653, 636337073, 636936697, 638502913, 638837761, 639305921, 639807781, 640650931, 640977373, 643036321, + 643316461, 643552909, 644004817, 644453633, 644457551, 644731357, 644900257, 645556481, 648056449, 648328801, + 651011329, 651064681, 651151801, 651514753, 652469641, 653235841, 653260633, 655264369, 657732349, 659526601, + 659846021, 660095641, 660754117, 661122881, 661207177, 662134201, 663760681, 665462081, 668498321, 670976641, + 670987021, 671716921, 672103001, 672108193, 673778827, 675260477, 676359391, 678481693, 680983817, 681019921, + 681124207, 681303241, 682528687, 683316001, 683362681, 684350833, 686059921, 687741401, 689537441, 690035713, + 690562601, 691131349, 692535637, 693456521, 694116893, 696042901, 696321949, 696998251, 697821857, 698192041, + 698819711, 702683101, 705303457, 705351583, 706728377, 707691601, 709409993, 710382401, 710617861, 710721001, + 714490481, 717096641, 717653129, 717831211, 720767521, 722955773, 724160251, 724969087, 725508241, 731276521, + 732805681, 734166217, 736668013, 739444021, 739576801, 740988151, 741182401, 741214237, 742017181, 742550401, + 744500641, 745493761, 745745461, 746331041, 747406801, 748638001, 749172821, 749640161, 750632137, 751226401, + 751705597, 752186593, 753233717, 753574537, 753594001, 754020361, 754874257, 756205633, 756271909, 756980137, + 758581651, 758687581, 758901701, 759252367, 759266621, 759638881, 762699649, 763907741, 764033999, 764240611, + 765378241, 766303693, 766823797, 770201221, 770909107, 770937931, 771043201, 771337891, 772495777, 773131927, + 773807401, 775368901, 775896181, 776443769, 777218989, 781471001, 782823281, 784450393, 784777393, 784783477, + 784966297, 787085857, 787209277, 788046901, 788931361, 789082001, 790453049, 791118043, 792144161, 792145729, + 794201333, 794399041, 794937601, 795064909, 796072003, 796200901, 796560703, 797418997, 797834017, 799162561, + 799630753, 799898833, 799916101, 801093011, 801227269, 801866647, 804978721, 805505957, 805771501, 807115753, + 807218413, 808214161, 809790881, 810023881, 810455101, 811110301, 811478533, 811607777, 811730923, 815430533, + 815796413, 816024161, 816215401, 816549121, 817832329, 818401321, 819466201, 819743233, 822018961, 822531841, + 824389441, 826004467, 829512001, 830664451, 831933901, 832048447, 832127489, 832169857, 833610751, 837766217, + 839268139, 839280691, 839908217, 840749761, 841217653, 841660961, 842785841, 842824981, 842960981, 843161887, + 844545271, 845376533, 846961321, 848090377, 848755969, 849548671, 852432769, 854094781, 854868257, 855734401, + 857100421, 857902861, 858687103, 859096477, 860334301, 862082677, 862678081, 863196181, 863609113, 863984881, + 865242841, 867022747, 867110501, 867638201, 868088341, 868111597, 868691401, 870985223, 871157233, 871195561, + 871908481, 876850801, 877542481, 878492941, 878940833, 879995689, 880870513, 880922657, 883276549, 884304037, + 884952001, 886180429, 887795221, 888868441, 892740853, 893692819, 894264337, 896901461, 897087361, 897283213, + 899019353, 900736411, 901848301, 902566501, 903108821, 903390643, 905040953, 907378669, 907670501, 907711561, + 908005249, 910202509, 910867481, 911484421, 914348737, 914906539, 920375821, 920696653, 921858631, 922845241, + 923437213, 926756881, 927106561, 927877001, 929159941, 930530701, 932148253, 933729421, 935794081, 936421141, + 937675393, 938376181, 939947009, 940123801, 941056273, 941734657, 943271569, 944832533, 946034057, 946787377, + 947878081, 949317217, 949697233, 952893881, 954924013, 957600541, 957631249, 958131157, 958735681, 960269377, + 960946321, 962442001, 962489557, 962523169, 964412837, 965501857, 967266451, 967287751, 967790401, 968283247, + 968413217, 968751241, 969528337, 970586713, 971975071, 974113601, 974471243, 974774401, 975576281, 976396961, + 977483449, 979363153, 980056507, 980725201, 981484561, 983456377, 984133441, 984252001, 985052881, 985075681, + 987842101, 994133479, 995586373, 995650921, 997836841, 998489017, 998590601, 998596741, 998724481, 999828727, + 1002261781, 1003062061, 1005402133, 1005833971, 1006800829, 1008777001, 1008839999, 1009025263, 1009140161, 1011319501, + 1011333061, 1011570457, 1011909271, 1012438391, 1013833153, 1015339441, 1015626151, 1017748057, 1020515761, 1021281301, + 1022336611, 1024041853, 1024123501, 1024605121, 1025035129, 1026738161, 1027744453, 1028494429, 1034252929, 1034958601, + 1040234231, 1049584313, 1050102901, 1050535501, 1054999441, 1055009117, 1056121453, 1057426651, 1063212481, 1065508321, + 1065602281, 1066972301, 1069388497, 1070639389, 1070941987, 1071512749, 1071643249, 1072898711, 1073159281, 1073288581, + 1073484823, 1075100041, 1077133397, 1078467589, 1081798061, 1082472553, 1084241341, 1084444481, 1090858081, 1093150081, + 1093352833, 1093526353, 1094042321, 1097416321, 1098743563, 1100624857, 1101623381, 1101673501, 1102573501, 1102750013, + 1104194521, 1105038871, 1106529761, 1106580817, 1106595493, 1107138961, 1108135381, 1109304913, 1110582947, 1111205873, + 1111939201, 1112671603, 1114277221, 1116379301, 1117202557, 1117785881, 1117828001, 1117890019, 1119412321, 1120076281, + 1120981021, 1121176981, 1123406047, 1123625501, 1123727617, 1124396521, 1125038377, 1127040769, 1130933429, 1134367777, + 1138289041, 1138607233, 1139137057, 1140573601, 1142466151, 1147434289, 1148578201, 1150229761, 1151670001, 1153164097, + 1153440289, 1154343961, 1154691409, 1154987209, 1155939709, 1156761911, 1156993373, 1157839381, 1159421509, 1160844821, + 1163098249, 1163227759, 1164218641, 1165717129, 1166475601, 1166598217, 1168221121, 1168256953, 1168492417, 1173229201, + 1173545533, 1174300093, 1180970407, 1181566219, 1183338241, 1184554801, 1186325981, 1187235193, 1191153937, 1191216133, + 1192314817, 1192412033, 1192903531, 1193229577, 1193557093, 1195524181, 1196852273, 1198650961, 1198880261, 1200456577, + 1200778753, 1202142061, 1204205449, 1205606533, 1205772499, 1209998077, 1210393801, 1210562701, 1210653541, 1213619761, + 1217181061, 1217823517, 1217924159, 1219816261, 1219858921, 1220114377, 1221127013, 1222861271, 1223531677, 1223941657, + 1225128829, 1226230297, 1226855293, 1227220801, 1229491063, 1229751667, 1230446653, 1231362793, 1232445677, 1234125721, + 1234646533, 1235188597, 1235864033, 1236313501, 1236442421, 1238825569, 1242171349, 1242858317, 1249166881, 1249785941, + 1250656621, 1252236421, 1254277909, 1255665613, 1257102001, 1258903981, 1260332137, 1263293281, 1264145401, 1265477791, + 1266003461, 1266273793, 1266425101, 1267345081, 1269295201, 1269835201, 1270193401, 1270489621, 1270667353, 1272558739, + 1272866167, 1282447477, 1282568741, 1285636801, 1286298133, 1286298263, 1296613501, 1297443913, 1299072721, 1299784141, + 1299963601, 1301509249, 1301926081, 1302745481, 1306836001, 1307004641, 1307520469, 1307823661, 1308758533, 1308998741, + 1309723213, 1309983901, 1310329567, 1311255661, 1311616153, 1312332001, 1312573123, 1313396221, 1315858381, 1316169541, + 1318126321, 1318717531, 1319978701, 1319992181, 1320793813, 1321058213, 1323668917, 1325172421, 1325329297, 1328256247, + 1329174601, 1329431689, 1331973329, 1341010577, 1341926401, 1343575381, 1344597577, 1344975721, 1345514101, 1345523401, + 1347387361, 1348964401, 1350685001, 1351126261, 1352453257, 1353051517, 1356241321, 1356328121, 1357459183, 1362463807, + 1362515701, 1362742561, 1365662917, 1366587661, 1366608377, 1368769681, 1371908137, 1372681861, 1375322101, 1376799577, + 1378646179, 1379464633, 1382453333, 1383283129, 1385656829, 1386705433, 1388972353, 1389353941, 1389975149, 1391890033, + 1393851553, 1394640941, 1394746081, 1394942473, 1397357851, 1398883201, 1400859847, 1401840833, 1404008369, 1404253369, + 1406826241, 1406851249, 1409372779, 1413803197, 1414154827, 1414529533, 1415969101, 1417986901, 1421475031, 1424503849, + 1425860101, 1426319563, 1426534201, 1427771089, 1428966001, 1432354901, 1435091377, 1438648993, 1440231941, 1440922891, + 1441139641, 1441678411, 1442945689, 1443388481, 1443742273, 1446298309, 1446434677, 1446818651, 1448921633, 1451635201, + 1454282449, 1454445413, 1456527461, 1457378449, 1461307717, 1463065501, 1463178817, 1463992661, 1464568381, 1465908193, + 1465945417, 1468540477, 1468824787, 1469059481, 1469960377, 1470080501, 1470650851, 1471628401, 1472221921, 1473580001, + 1477289941, 1481626513, 1482274513, 1482876673, 1483873861, 1483918801, 1485061471, 1486564301, 1493114149, 1495190699, + 1497221281, 1497965713, 1499971457, 1499989177, 1500142001, 1501165097, 1502171117, 1502403121, 1503240559, 1503705601, + 1504139521, 1504832033, 1507746241, 1509156013, 1510870241, 1511558533, 1515175087, 1515785041, 1517039371, 1518014689, + 1518290707, 1520190341, 1521221473, 1522302121, 1526732803, 1529648231, 1529819971, 1530495289, 1532419099, 1532569681, + 1532755369, 1533343261, 1534063081, 1535020133, 1536112001, 1536251047, 1536883357, 1537433899, 1537641691, 1538012449, + 1539583921, 1539804001, 1540454761, 1540550413, 1541047813, 1541849761, 1541955409, 1544145121, 1545019813, 1545177581, + 1546106773, 1546340401, 1546508057, 1547140841, 1547543161, 1547712601, 1550924873, 1554270481, 1557118081, 1560312001, + 1560620041, 1561800833, 1565893201, 1566594551, 1567830241, 1568916311, 1574362441, 1574601601, 1577983489, 1578009401, + 1580449201, 1581576641, 1581714481, 1582783777, 1583230241, 1583658649, 1586436193, 1587650401, 1590394313, 1593706201, + 1595647351, 1595887921, 1598197201, 1602517949, 1603765021, 1603810561, 1603994701, 1609916491, 1609935913, 1612121473, + 1614508267, 1617795181, 1617921667, 1619447741, 1620646177, 1627103521, 1627898401, 1628692201, 1630062253, 1630307617, + 1631314609, 1632286673, 1632513601, 1633044241, 1636185601, 1637434657, 1637436457, 1637930893, 1638294661, 1639351981, + 1639846391, 1641971701, 1642814653, 1644637051, 1645413001, 1647225529, 1648076041, 1649430889, 1650265549, 1650682153, + 1654940509, 1655660761, 1656229921, 1656280033, 1656917377, 1659009601, 1661202113, 1668037621, 1668926629, 1669893661, + 1671603667, 1671714241, 1672125131, 1674091141, 1674658133, 1675978193, 1678274581, 1679130641, 1680901381, 1683174533, + 1685433413, 1686001861, 1687248001, 1691745821, 1692605041, 1694128129, 1695158921, 1696893101, 1698707377, 1699279441, + 1700250049, 1709909293, 1710753001, 1712392321, 1714322377, 1716160321, 1716714793, 1716774481, 1718013133, 1718088301, + 1719197621, 1721061497, 1721986313, 1722007169, 1722685777, 1725675451, 1726372441, 1731048937, 1731995497, 1732924001, + 1734059291, 1734285601, 1735071913, 1736481601, 1738687469, 1740214841, 1742288881, 1742815621, 1743166441, 1744605097, + 1746692641, 1746721681, 1749124829, 1750412161, 1754818561, 1757148121, 1760014561, 1766984389, 1767234613, 1769091241, + 1769267761, 1770236893, 1771303801, 1772267281, 1773582977, 1776439261, 1776820033, 1779649381, 1779892577, 1784306273, + 1784638309, 1785843547, 1786005521, 1787934881, 1790023861, 1791426787, 1792442737, 1792588813, 1794814103, 1801558201, + 1801774081, 1802510669, 1803768091, 1804906517, 1805947313, 1809888967, 1816408273, 1817067169, 1819829749, 1820306953, + 1821514633, 1828682101, 1828887061, 1831258601, 1835114401, 1837156049, 1837599769, 1839568981, 1841034961, 1841099261, + 1841479501, 1844028961, 1846171781, 1847811673, 1849964117, 1850233897, 1850598961, 1852496761, 1853926777, 1854084649, + 1854940231, 1856689453, 1857221281, 1858098497, 1858197961, 1860373241, 1861026133, 1861880689, 1862880401, 1866409861, + 1867906721, 1868682241, 1871987041, 1872937057, 1873177693, 1874634721, 1874849929, 1878691753, 1879111697, 1879623157, + 1879775501, 1883509633, 1883785681, 1885915841, 1894909141, 1894955311, 1897700113, 1899081757, 1899525601, 1900687381, + 1903447841, 1904658913, 1905958891, 1908088001, 1909566073, 1910134309, 1911197947, 1912950241, 1914303841, 1915391521, + 1916987593, 1917397637, 1920301951, 1921309633, 1922092567, 1922687293, 1923224689, 1923311317, 1923845801, 1924201501, + 1925042737, 1928903971, 1929862849, 1930403333, 1930447501, 1930534453, 1930915169, 1934350351, 1938264241, 1940048881, + 1943951041, 1944125633, 1945042181, 1950987193, 1952513369, 1952968753, 1957705177, 1959659857, 1960708261, 1963149553, + 1965007601, 1968002149, 1970065681, 1974474049, 1977257441, 1982123893, 1982826961, 1988071801, 1988713189, 1988835713, + 1988965861, 1989192277, 1991063449, 1995784961, 1995830761, 1996231189, 1996339649, 1997844157, 1998780001, 1999053601, + 1999111801, 1999743661, 2004299641, 2007646961, 2013554869, 2013834961, 2016481477, 2017021333, 2017509601, 2019564769, + 2021392369, 2021884343, 2027675701, 2028279793, 2028631361, 2028812399, 2029830409, 2030600833, 2036224321, 2043173273, + 2049293401, 2050617713, 2052149221, 2054711381, 2055634561, 2057267941, 2057835781, 2058072041, 2059739221, 2062612033, + 2068867841, 2070739441, 2072624761, 2076192007, 2081039297, 2081551753, 2082146617, 2083034113, 2083997441, 2085453649, + 2085882661, 2086645009, 2093300401, 2095627153, 2096046457, 2097317377, 2100292841, 2101470541, 2101744837, 2104994449, + 2106147457, 2107148761, 2114643217, 2115769633, 2115986557, 2116483027, 2116541221, 2117031263, 2117555641, 2118621097, + 2120096161, 2123601751, 2124078653, 2124691213, 2127197489, 2128104001, 2129304997, 2130134533, 2131004737, 2131811501, + 2140699681, 2140771609, 2141340833, 2144961253, 2147418113, 2147429509, 2152627801, 2154446641, 2155416251, 2156151313, + 2164282177, 2168431201, 2170282969, 2172155819, 2173499329, 2173540951, 2173579801, 2175126601, 2175406201, 2175646177, + 2177374321, 2177645557, 2178082901, 2178939221, 2180221201, 2182281601, 2182802689, 2185362233, 2187717761, 2193980881, + 2199617701, 2200115713, 2201924341, 2202101761, 2202205897, 2203649197, 2203856497, 2206095589, 2210578759, 2213431729, + 2216960929, 2217879901, 2219072017, 2224252801, 2229468697, 2231332357, 2233031701, 2240507821, 2241880033, 2241982009, + 2244932281, 2245519981, 2246762899, 2248354153, 2251732033, 2254314241, 2254757077, 2256197761, 2256748777, 2256751837, + 2262861901, 2269307587, 2274584089, 2283289681, 2284416181, 2289251669, 2289624793, 2290316377, 2290910257, 2291205461, + 2292068143, 2295209281, 2296995121, 2299190401, 2300628601, 2300795353, 2301745249, 2304120001, 2308966661, 2309241601, + 2309405617, 2311558021, 2311575001, 2315137261, 2320527613, 2323147201, 2324867399, 2329584217, 2330569541, 2331181621, + 2335341601, 2338157597, 2338728001, 2340460487, 2345907961, 2347597981, 2352371251, 2354453561, 2355230749, 2355320101, + 2355622721, 2355649921, 2355735089, 2358534361, 2360261989, 2370771181, 2370928337, 2371350101, 2372976563, 2374232977, + 2375415841, 2377166401, 2378309041, 2381782597, 2382678101, 2383164577, 2385574201, 2389072321, 2389544977, 2393708761, + 2394311233, 2398393661, 2404912501, 2411128441, 2412172153, 2412675721, 2413973071, 2422296241, 2423401681, 2425249601, + 2428648967, 2428870753, 2428986913, 2429407961, 2430697513, 2431136401, 2431144801, 2432761633, 2432860273, 2433791593, + 2434964321, 2434974433, 2435091221, 2436691321, 2437907779, 2438778413, 2442050353, 2442454561, 2443708961, 2444950561, + 2448039497, 2448374689, 2453473049, 2454285751, 2456536681, 2457846161, 2463713281, 2471205361, 2473120961, 2473189441, + 2473823353, 2474308069, 2474676949, 2476283239, 2477814193, 2478643907, 2480147521, 2480343553, 2482435981, 2482682131, + 2484408301, 2486017249, 2488420801, 2488591117, 2492480233, 2494660033, 2494984321, 2495834329, 2499327041, 2501012599, + 2501771329, 2502525637, 2504008609, 2506529257, 2506733189, 2507121037, 2508178843, 2513230891, 2516684801, 2519297089, + 2525070241, 2526566041, 2528291341, 2529410281, 2529827821, 2529854713, 2530351561, 2532630787, 2533465661, 2533797017, + 2535516173, 2537105761, 2539406281, 2539736257, 2540469901, 2541660367, 2542479481, 2544590161, 2545934077, 2548051801, + 2550139253, 2550780277, 2551365769, 2552418761, 2553272929, 2555391481, 2561945401, 2564536201, 2565186137, 2570087521, + 2571180247, 2575060949, 2575737361, 2577345541, 2582092189, 2582246701, 2582952769, 2583322381, 2584460701, 2588054401, + 2588582089, 2590663681, 2593065721, 2595276353, 2597289241, 2597294701, 2598933481, 2600611861, 2602343521, 2602378721, + 2604465013, 2604803701, 2611122229, 2611461529, 2613382201, 2614688801, 2616180821, 2617563031, 2621080741, 2621977627, + 2622993661, 2624549929, 2625903601, 2626783921, 2627284987, 2630643401, 2632605049, 2634284801, 2634804481, 2634820813, + 2638067881, 2639099233, 2642159809, 2642582251, 2646751249, 2646790033, 2648662777, 2649907201, 2650820329, 2651507713, + 2654716321, 2656494271, 2658630913, 2658696301, 2659265701, 2668095181, 2668469431, 2670972949, 2672605657, 2672651521, + 2676053333, 2677147201, 2677821121, 2678785621, 2681041843, 2682823681, 2683742491, 2684284441, 2687655169, 2688124001, + 2689427281, 2690408533, 2690867401, 2693739751, 2695115473, 2700818017, 2700891839, 2701878941, 2704957909, 2706863833, + 2707661501, 2716157989, 2716275007, 2717428033, 2719319513, 2721666817, 2721721939, 2723859001, 2725357249, 2733156029, + 2736316301, 2738184697, 2740336561, 2744329909, 2746021741, 2753333227, 2753538001, 2759392633, 2765323397, 2766006253, + 2767672189, 2769080161, 2769602333, 2774295577, 2777887297, 2778304273, 2779477741, 2781117721, 2781226477, 2786028337, + 2787998641, 2789218909, 2800352011, 2805762961, 2809635901, 2812672981, 2814748201, 2823570433, 2824256377, 2824804693, + 2824854913, 2828205397, 2832384133, 2832743713, 2837697773, 2837917633, 2840634109, 2840871041, 2841190381, 2847894377, + 2848466281, 2848722131, 2855046421, 2855071801, 2855512909, 2862066481, 2865483601, 2866005139, 2866527841, 2870377309, + 2871536561, 2872527733, 2872948321, 2874382853, 2877769501, 2881429741, 2882370481, 2885594497, 2887955533, 2890316801, + 2890414873, 2892426029, 2894667781, 2895004927, 2899294889, 2903776129, 2915953633, 2916247819, 2918295451, 2920691161, + 2923042141, 2924158001, 2929062533, 2929106753, 2930831641, 2931708097, 2932327549, 2936227603, 2936958181, 2941174897, + 2941343633, 2944555681, 2944677961, 2945208001, 2945549881, 2951136343, 2956724317, 2957320351, 2965700233, 2967053953, + 2968206601, 2974506841, 2975377429, 2976930001, 2978766341, 2980689601, 2986025677, 2987414977, 2990152901, 2993462713, + 2993495041, 2994098281, 2994415201, 2998202353, 2998919873, 3000688381, 3001561441, 3002647829, 3004443679, 3009628301, + 3011421841, 3014101261, 3015502181, 3016957381, 3017444761, 3018147217, 3018576689, 3019916461, 3025350343, 3026575553, + 3028586471, 3030393901, 3033332641, 3034402681, 3034817209, 3035375047, 3036079729, 3037295801, 3037781251, 3038880473, + 3039681457, 3041984353, 3042630533, 3048159841, 3050190163, 3056100623, 3056160929, 3057886591, 3058670677, 3059397793, + 3063685633, 3065998717, 3076505209, 3077122133, 3079496551, 3082054697, 3082068013, 3083053387, 3083537689, 3083884651, + 3088408429, 3089013313, 3091019777, 3094763851, 3099670657, 3103800701, 3112974481, 3114125071, 3115667521, 3120445697, + 3122287981, 3129914881, 3133899409, 3135040133, 3143282221, 3145410761, 3150972917, 3156599161, 3156643141, 3157579861, + 3163106953, 3166504273, 3167442721, 3170262409, 3172658653, 3175204531, 3175255717, 3178375201, 3181356263, 3181391641, + 3182606857, 3182655361, 3182891401, 3185472001, 3187035113, 3187421077, 3187939921, 3196397821, 3196431829, 3197565001, + 3197632441, 3197911001, 3197911741, 3199164901, 3205663921, 3207297773, 3208902491, 3212465437, 3215031751, 3217412881, + 3219808411, 3221580281, 3222693421, 3224143441, 3225081473, 3227082823, 3227209057, 3229131137, 3233558021, 3237992101, + 3242533897, 3248236309, 3250348417, 3250700737, 3252148621, 3257334541, 3258647809, 3258892801, 3261114601, 3263097641, + 3263568901, 3263626957, 3264820001, 3265122451, 3267417677, 3268506541, 3268841941, 3270933121, 3271999249, 3272030401, + 3272702497, 3274264033, 3275671969, 3276075709, 3277047649, 3278640289, 3280067129, 3282974857, 3287174129, 3288757249, + 3295362727, 3296403601, 3299246833, 3302322241, 3304307341, 3305829073, 3306686659, 3306957593, 3310858777, 3312489577, + 3312536569, 3313196881, 3315139717, 3320669437, 3323308501, 3323590463, 3323829169, 3328354801, 3332800021, 3334350781, + 3340214413, 3342005633, 3344191241, 3346172189, 3347908801, 3349218881, 3350993969, 3352091557, 3355382857, 3355953001, + 3357417181, 3359737921, 3360511981, 3369139201, 3371024521, 3371452921, 3371693063, 3372667121, 3373086601, 3381052177, + 3381901921, 3385842877, 3386603221, 3387014401, 3387487351, 3389030261, 3395091311, 3399205591, 3399890413, 3402234749, + 3407609221, 3407772817, 3407952169, 3408135121, 3409339393, 3411250081, 3411574801, 3411829693, 3412575097, 3415379701, + 3415832137, 3417522841, 3420143941, 3421845001, 3423222757, 3423580481, 3427050673, 3428133103, 3429457921, 3429982081, + 3430804297, 3432695921, 3432997537, 3433458073, 3434575327, 3435973837, 3440195713, 3443704261, 3449768513, 3450717901, + 3453900913, 3458257741, 3461861761, 3463907761, 3464236901, 3466158361, 3470716657, 3474335437, 3480174001, 3482161261, + 3485747521, 3489958697, 3491763493, 3492178873, 3492883081, 3493262761, 3497607433, 3504132113, 3512030497, 3512291021, + 3512369857, 3513604657, 3516565057, 3519318721, 3524086333, 3525088961, 3529119361, 3529864391, 3532687201, 3533662129, + 3533856913, 3538213381, 3542303047, 3543203333, 3548378341, 3549286001, 3549988261, 3552158521, 3553567057, 3557646401, + 3562963973, 3563340457, 3566428301, 3574891757, 3582711841, 3583249921, 3583604161, 3584800801, 3586833253, 3587553971, + 3589937261, 3590409439, 3593276353, 3594110081, 3596491907, 3596815169, 3598772761, 3602006101, 3605151241, 3611571121, + 3612298321, 3612825221, 3614770573, 3616574081, 3620631169, 3628526287, 3630596257, 3631828481, 3632452741, 3635993089, + 3649116277, 3649965281, 3650158849, 3651572609, 3656355841, 3658730893, 3662387977, 3662503093, 3663084541, 3668926801, + 3669587533, 3672754633, 3677180797, 3679657997, 3682471321, 3685647701, 3685775741, 3692307161, 3695628133, 3697278427, + 3700801861, 3705582073, 3705623281, 3708123301, 3708905341, 3709626961, 3712887289, 3713287801, 3713448769, 3718226401, + 3721486081, 3723410161, 3723699373, 3725016749, 3727828501, 3729097633, 3733761739, 3736293461, 3745192001, 3746101189, + 3749383681, 3751554581, 3751782737, 3754680403, 3756668401, 3759781369, 3760622689, 3760896133, 3762110881, 3767640601, + 3773061337, 3774337201, 3784123501, 3787491457, 3798040471, 3798626833, 3799111681, 3800084401, 3805699501, 3807112123, + 3807308269, 3807749821, 3809018947, 3813919453, 3817561777, 3817706621, 3821233121, 3827035237, 3832807681, 3833208961, + 3842941741, 3846174151, 3846532801, 3847106803, 3850058689, 3852800033, 3863326897, 3865604023, 3867183937, 3874471147, + 3874523017, 3875096893, 3875965417, 3886515361, 3886643801, 3887423437, 3887635753, 3891892421, 3891919417, 3894053311, + 3896079281, 3897241129, 3897869201, 3898906129, 3900327241, 3903711841, 3905533721, 3905876501, 3907577521, 3907752241, + 3912174421, 3914880337, 3914923211, 3915467341, 3915604421, 3915921241, 3918227437, 3922321561, 3926912669, 3929293061, + 3934940833, 3935864017, 3936123601, 3945165841, 3947233201, 3947383201, 3953408801, 3953949421, 3955572001, 3958597301, + 3958930441, 3959578801, 3960728641, 3962037061, 3966350203, 3967343161, 3971095301, 3973556837, 3979485931, 3982017601, + 3987528793, 3987960913, 3991124341, 3992697997, 3997536427, 4005660961, 4007365741, 4011996871, 4015548769, 4017684529, + 4018283501, 4020144133, 4026822577, 4027012021, 4027518961, 4028465873, 4028771849, 4031223841, 4034969401, 4034993269, + 4035498409, 4036395581, 4042538497, 4044601751, 4044884689, 4048493983, 4053267217, 4054039841, 4057195309, 4058433931, + 4059776533, 4060942381, 4061009971, 4064633821, 4067039461, 4067887501, 4068671881, 4071644893, 4075241633, 4075721921, + 4076009857, 4079665633, 4079682361, 4083376067, 4085074909, 4088147617, 4088838913, 4092929149, 4098258707, 4099180801, + 4100934241, 4103745689, 4105691393, 4108970251, 4109461709, 4109711581, 4110320663, 4113013141, 4115891893, 4117058221, + 4117447441, 4121286907, 4127050621, 4129914673, 4133928761, 4135847101, 4136916001, 4137262541, 4138838401, 4139015987, + 4150174393, 4155375349, 4157008813, 4162880401, 4166032873, 4183664101, 4185636781, 4186561633, 4187360341, 4191864013, + 4192060699, 4195843037, 4196323561, 4204344601, 4206006229, 4206295433, 4212105409, 4215885697, 4218900001, 4220122321, + 4232966251, 4234224601, 4237212061, 4243744201, 4244022301, 4244663651, 4247990917, 4250920459, 4251904273, 4255695013, + 4257003353, 4261352869, 4271267333, 4275011401, 4277526901, 4278305651, 4282867213, 4285148981, 4293088801, 4294901761, + } + + primes16 = [65536]byte{ + 2, 1, 1, 2, 1, 2, 1, 4, 3, 2, // 0-9 + 1, 2, 1, 4, 3, 2, 1, 2, 1, 4, // 10-19 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 20-29 + 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 30-39 + 1, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 40-49 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 50-59 + 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 60-69 + 1, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 70-79 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 80-89 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 90-99 + 1, 2, 1, 4, 3, 2, 1, 2, 1, 4, // 100-109 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 110-119 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 120-129 + 1, 6, 5, 4, 3, 2, 1, 2, 1, 10, // 130-139 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 140-149 + 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 150-159 + 3, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 160-169 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 170-179 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 180-189 + 1, 2, 1, 4, 3, 2, 1, 2, 1, 12, // 190-199 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 200-209 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 210-219 + 3, 2, 1, 4, 3, 2, 1, 2, 1, 4, // 220-229 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 230-239 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 240-249 + 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 250-259 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 260-269 + 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 270-279 + 1, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 280-289 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 290-299 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 300-309 + 1, 2, 1, 4, 3, 2, 1, 14, 13, 12, // 310-319 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 320-329 + 1, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 330-339 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 4, // 340-349 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 350-359 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 360-369 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 370-379 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 380-389 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 390-399 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 400-409 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 410-419 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 420-429 + 1, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 430-439 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 440-449 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 450-459 + 1, 2, 1, 4, 3, 2, 1, 12, 11, 10, // 460-469 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 470-479 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 480-489 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 490-499 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 500-509 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 510-519 + 1, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 520-529 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 530-539 + 1, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 540-549 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 550-559 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 560-569 + 1, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 570-579 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 580-589 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 590-599 + 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 600-609 + 3, 2, 1, 4, 3, 2, 1, 2, 1, 12, // 610-619 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 620-629 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 630-639 + 1, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 640-649 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 650-659 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 660-669 + 3, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 670-679 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 680-689 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 690-699 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 700-709 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 710-719 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 720-729 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 730-739 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 740-749 + 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 750-759 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 760-769 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 770-779 + 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 780-789 + 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 790-799 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 800-809 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 810-819 + 1, 2, 1, 4, 3, 2, 1, 2, 1, 10, // 820-829 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 830-839 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 840-849 + 3, 2, 1, 4, 3, 2, 1, 2, 1, 4, // 850-859 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 860-869 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 870-879 + 1, 2, 1, 4, 3, 2, 1, 20, 19, 18, // 880-889 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 890-899 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 900-909 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 910-919 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 920-929 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 930-939 + 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 940-949 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 950-959 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 960-969 + 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 970-979 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 980-989 + 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 990-999 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 1000-1009 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 1010-1019 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 1020-1029 + 1, 2, 1, 6, 5, 4, 3, 2, 1, 10, // 1030-1039 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 1040-1049 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 1050-1059 + 1, 2, 1, 6, 5, 4, 3, 2, 1, 18, // 1060-1069 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 1070-1079 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 1080-1089 + 1, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 1090-1099 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 1100-1109 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 1110-1119 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 22, // 1120-1129 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 1130-1139 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 1140-1149 + 1, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 1150-1159 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 1160-1169 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 1170-1179 + 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 1180-1189 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 1190-1199 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 1200-1209 + 3, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 1210-1219 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 1220-1229 + 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 1230-1239 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 1240-1249 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 1250-1259 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 1260-1269 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 4, // 1270-1279 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 1280-1289 + 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 1290-1299 + 1, 2, 1, 4, 3, 2, 1, 12, 11, 10, // 1300-1309 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 1310-1319 + 1, 6, 5, 4, 3, 2, 1, 34, 33, 32, // 1320-1329 + 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, // 1330-1339 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 1340-1349 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 1350-1359 + 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 1360-1369 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 1370-1379 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 1380-1389 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 1390-1399 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 1400-1409 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 1410-1419 + 3, 2, 1, 4, 3, 2, 1, 2, 1, 4, // 1420-1429 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 1430-1439 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 1440-1449 + 1, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 1450-1459 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 1460-1469 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 1470-1479 + 1, 2, 1, 4, 3, 2, 1, 2, 1, 4, // 1480-1489 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 1490-1499 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 1500-1509 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 1510-1519 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 1520-1529 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 1530-1539 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 1540-1549 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 1550-1559 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 1560-1569 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 1570-1579 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 1580-1589 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 1590-1599 + 1, 6, 5, 4, 3, 2, 1, 2, 1, 4, // 1600-1609 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 1610-1619 + 1, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 1620-1629 + 7, 6, 5, 4, 3, 2, 1, 20, 19, 18, // 1630-1639 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 1640-1649 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 1650-1659 + 3, 2, 1, 4, 3, 2, 1, 2, 1, 24, // 1660-1669 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 1670-1679 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 1680-1689 + 3, 2, 1, 4, 3, 2, 1, 2, 1, 10, // 1690-1699 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 1700-1709 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 1710-1719 + 1, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 1720-1729 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 1730-1739 + 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 1740-1749 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 18, // 1750-1759 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 1760-1769 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 1770-1779 + 3, 2, 1, 4, 3, 2, 1, 2, 1, 12, // 1780-1789 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 1790-1799 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 1800-1809 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 1810-1819 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 1820-1829 + 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 1830-1839 + 7, 6, 5, 4, 3, 2, 1, 14, 13, 12, // 1840-1849 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 1850-1859 + 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 1860-1869 + 1, 2, 1, 4, 3, 2, 1, 2, 1, 10, // 1870-1879 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 1880-1889 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 1890-1899 + 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 1900-1909 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 1910-1919 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 1920-1929 + 1, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 1930-1939 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 1940-1949 + 1, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 1950-1959 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 1960-1969 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 1970-1979 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 1980-1989 + 3, 2, 1, 4, 3, 2, 1, 2, 1, 4, // 1990-1999 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 2000-2009 + 1, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 2010-2019 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 10, // 2020-2029 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 2030-2039 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 2040-2049 + 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 2050-2059 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 2060-2069 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 2070-2079 + 1, 2, 1, 4, 3, 2, 1, 2, 1, 10, // 2080-2089 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 2090-2099 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 2100-2109 + 1, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 2110-2119 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 2120-2129 + 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 2130-2139 + 1, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 2140-2149 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 2150-2159 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 2160-2169 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 24, // 2170-2179 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 2180-2189 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 2190-2199 + 3, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 2200-2209 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 2210-2219 + 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 2220-2229 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 4, // 2230-2239 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 2240-2249 + 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 2250-2259 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 4, // 2260-2269 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 2270-2279 + 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 2280-2289 + 3, 2, 1, 4, 3, 2, 1, 12, 11, 10, // 2290-2299 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 2300-2309 + 1, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 2310-2319 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 2320-2329 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 2330-2339 + 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 2340-2349 + 1, 6, 5, 4, 3, 2, 1, 14, 13, 12, // 2350-2359 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 2360-2369 + 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 2370-2379 + 1, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 2380-2389 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 2390-2399 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 2400-2409 + 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 2410-2419 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 2420-2429 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 2430-2439 + 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 2440-2449 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 2450-2459 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 2460-2469 + 3, 2, 1, 4, 3, 2, 1, 26, 25, 24, // 2470-2479 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 2480-2489 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 2490-2499 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 2500-2509 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 2510-2519 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 2520-2529 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 2530-2539 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 2540-2549 + 1, 6, 5, 4, 3, 2, 1, 22, 21, 20, // 2550-2559 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 2560-2569 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 2570-2579 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 2580-2589 + 1, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 2590-2599 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 2600-2609 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 2610-2619 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 2620-2629 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 2630-2639 + 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 2640-2649 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 4, // 2650-2659 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 2660-2669 + 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 2670-2679 + 3, 2, 1, 4, 3, 2, 1, 2, 1, 4, // 2680-2689 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 2690-2699 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 2700-2709 + 1, 2, 1, 6, 5, 4, 3, 2, 1, 10, // 2710-2719 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 2720-2729 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 2730-2739 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 2740-2749 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 2750-2759 + 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 2760-2769 + 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 2770-2779 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 2780-2789 + 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 2790-2799 + 1, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 2800-2809 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 2810-2819 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 2820-2829 + 3, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 2830-2839 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 2840-2849 + 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 2850-2859 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 2860-2869 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 2870-2879 + 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 2880-2889 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 2890-2899 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 2900-2909 + 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 2910-2919 + 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 2920-2929 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 2930-2939 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 2940-2949 + 3, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 2950-2959 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 2960-2969 + 1, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 2970-2979 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 2980-2989 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 2990-2999 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 3000-3009 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 3010-3019 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 3020-3029 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 3030-3039 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 3040-3049 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 3050-3059 + 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 3060-3069 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 3070-3079 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 20, // 3080-3089 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 3090-3099 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 3100-3109 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 3110-3119 + 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 3120-3129 + 7, 6, 5, 4, 3, 2, 1, 26, 25, 24, // 3130-3139 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 3140-3149 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 3150-3159 + 3, 2, 1, 4, 3, 2, 1, 2, 1, 12, // 3160-3169 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 3170-3179 + 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 3180-3189 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 3190-3199 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 3200-3209 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 3210-3219 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 22, // 3220-3229 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 3230-3239 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 3240-3249 + 1, 2, 1, 4, 3, 2, 1, 2, 1, 12, // 3250-3259 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 3260-3269 + 1, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 3270-3279 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 3280-3289 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 3290-3299 + 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 3300-3309 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 3310-3319 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 3320-3329 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 3330-3339 + 3, 2, 1, 4, 3, 2, 1, 12, 11, 10, // 3340-3349 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 3350-3359 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 3360-3369 + 1, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 3370-3379 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 3380-3389 + 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 3390-3399 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 3400-3409 + 3, 2, 1, 20, 19, 18, 17, 16, 15, 14, // 3410-3419 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 3420-3429 + 3, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 3430-3439 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 3440-3449 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 3450-3459 + 1, 2, 1, 4, 3, 2, 1, 2, 1, 22, // 3460-3469 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 3470-3479 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 3480-3489 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 3490-3499 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 3500-3509 + 1, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 3510-3519 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 4, // 3520-3529 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 3530-3539 + 1, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 3540-3549 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 12, // 3550-3559 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 3560-3569 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 3570-3579 + 1, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 3580-3589 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 3590-3599 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 3600-3609 + 3, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 3610-3619 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 3620-3629 + 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 3630-3639 + 3, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 3640-3649 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 3650-3659 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 3660-3669 + 1, 2, 1, 4, 3, 2, 1, 14, 13, 12, // 3670-3679 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 3680-3689 + 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 3690-3699 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 3700-3709 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 3710-3719 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 3720-3729 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 22, // 3730-3739 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 3740-3749 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 3750-3759 + 1, 6, 5, 4, 3, 2, 1, 2, 1, 10, // 3760-3769 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 3770-3779 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 3780-3789 + 3, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 3790-3799 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 3800-3809 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 3810-3819 + 1, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 3820-3829 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 3830-3839 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 3840-3849 + 1, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 3850-3859 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 3860-3869 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 3870-3879 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 3880-3889 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 3890-3899 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 3900-3909 + 1, 6, 5, 4, 3, 2, 1, 2, 1, 4, // 3910-3919 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 3920-3929 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 3930-3939 + 3, 2, 1, 4, 3, 2, 1, 20, 19, 18, // 3940-3949 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 3950-3959 + 7, 6, 5, 4, 3, 2, 1, 22, 21, 20, // 3960-3969 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 3970-3979 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 3980-3989 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 3990-3999 + 1, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 4000-4009 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 4010-4019 + 1, 6, 5, 4, 3, 2, 1, 22, 21, 20, // 4020-4029 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 4030-4039 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 4040-4049 + 1, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 4050-4059 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 4060-4069 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 4070-4079 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 4080-4089 + 1, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 4090-4099 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 4100-4109 + 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 4110-4119 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 4, // 4120-4129 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 14, // 4130-4139 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 4140-4149 + 3, 2, 1, 4, 3, 2, 1, 2, 1, 18, // 4150-4159 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 4160-4169 + 7, 6, 5, 4, 3, 2, 1, 24, 23, 22, // 4170-4179 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 4180-4189 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 4190-4199 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 4200-4209 + 1, 6, 5, 4, 3, 2, 1, 2, 1, 10, // 4210-4219 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 4220-4229 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 4230-4239 + 1, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 4240-4249 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 4250-4259 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 4260-4269 + 1, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 4270-4279 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 4280-4289 + 7, 6, 5, 4, 3, 2, 1, 30, 29, 28, // 4290-4299 + 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 4300-4309 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 4310-4319 + 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 4320-4329 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 10, // 4330-4339 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 4340-4349 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 4350-4359 + 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 4360-4369 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 4370-4379 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 4380-4389 + 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 4390-4399 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 4400-4409 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 4410-4419 + 1, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 4420-4429 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 4430-4439 + 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 4440-4449 + 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 4450-4459 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 4460-4469 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 4470-4479 + 1, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 4480-4489 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 4490-4499 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 4500-4509 + 3, 2, 1, 4, 3, 2, 1, 2, 1, 4, // 4510-4519 + 3, 2, 1, 24, 23, 22, 21, 20, 19, 18, // 4520-4529 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 4530-4539 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 12, // 4540-4549 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 4550-4559 + 1, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 4560-4569 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 4570-4579 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 4580-4589 + 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 4590-4599 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 4600-4609 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 4610-4619 + 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 4620-4629 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 4, // 4630-4639 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 4640-4649 + 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 4650-4659 + 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 4660-4669 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 4670-4679 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 4680-4689 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 4690-4699 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 4700-4709 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 4710-4719 + 1, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 4720-4729 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 4730-4739 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 4740-4749 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 24, // 4750-4759 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 4760-4769 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 4770-4779 + 3, 2, 1, 4, 3, 2, 1, 2, 1, 4, // 4780-4789 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 4790-4799 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 4800-4809 + 3, 2, 1, 4, 3, 2, 1, 14, 13, 12, // 4810-4819 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 4820-4829 + 1, 30, 29, 28, 27, 26, 25, 24, 23, 22, // 4830-4839 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 4840-4849 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 4850-4859 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 4860-4869 + 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 4870-4879 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 4880-4889 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 4890-4899 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 10, // 4900-4909 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 4910-4919 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 4920-4929 + 1, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 4930-4939 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 4940-4949 + 1, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 4950-4959 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 4, // 4960-4969 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 4970-4979 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 4980-4989 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 4990-4999 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 5000-5009 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 5010-5019 + 1, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 5020-5029 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 5030-5039 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 5040-5049 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 5050-5059 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 5060-5069 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 5070-5079 + 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 5080-5089 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 5090-5099 + 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 5100-5109 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 28, // 5110-5119 + 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 5120-5129 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 5130-5139 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 5140-5149 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 5150-5159 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 5160-5169 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 5170-5179 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 5180-5189 + 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 5190-5199 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 5200-5209 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 5210-5219 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 5220-5229 + 1, 2, 1, 4, 3, 2, 1, 24, 23, 22, // 5230-5239 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 5240-5249 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 5250-5259 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 5260-5269 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 5270-5279 + 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 5280-5289 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 5290-5299 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 14, // 5300-5309 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 5310-5319 + 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 5320-5329 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 5330-5339 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 5340-5349 + 1, 30, 29, 28, 27, 26, 25, 24, 23, 22, // 5350-5359 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 5360-5369 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 5370-5379 + 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 5380-5389 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 5390-5399 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 5400-5409 + 3, 2, 1, 4, 3, 2, 1, 2, 1, 12, // 5410-5419 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 5420-5429 + 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 5430-5439 + 1, 2, 1, 6, 5, 4, 3, 2, 1, 22, // 5440-5449 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 5450-5459 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 5460-5469 + 1, 6, 5, 4, 3, 2, 1, 2, 1, 4, // 5470-5479 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 5480-5489 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 5490-5499 + 1, 2, 1, 4, 3, 2, 1, 12, 11, 10, // 5500-5509 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 5510-5519 + 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 5520-5529 + 1, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 5530-5539 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 5540-5549 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 5550-5559 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 5560-5569 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 5570-5579 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 5580-5589 + 1, 32, 31, 30, 29, 28, 27, 26, 25, 24, // 5590-5599 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 5600-5609 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 5610-5619 + 3, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 5620-5629 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 5630-5639 + 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 5640-5649 + 1, 2, 1, 4, 3, 2, 1, 2, 1, 10, // 5650-5659 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 5660-5669 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 5670-5679 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 5680-5689 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 5690-5699 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 5700-5709 + 1, 6, 5, 4, 3, 2, 1, 20, 19, 18, // 5710-5719 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 5720-5729 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 5730-5739 + 1, 2, 1, 6, 5, 4, 3, 2, 1, 30, // 5740-5749 + 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 5750-5759 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 5760-5769 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 5770-5779 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 5780-5789 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 5790-5799 + 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 5800-5809 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 5810-5819 + 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 5820-5829 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 5830-5839 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 5840-5849 + 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 5850-5859 + 1, 6, 5, 4, 3, 2, 1, 2, 1, 10, // 5860-5869 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 5870-5879 + 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 5880-5889 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 5890-5899 + 3, 2, 1, 20, 19, 18, 17, 16, 15, 14, // 5900-5909 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 5910-5919 + 3, 2, 1, 4, 3, 2, 1, 12, 11, 10, // 5920-5929 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 5930-5939 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 5940-5949 + 3, 2, 1, 28, 27, 26, 25, 24, 23, 22, // 5950-5959 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 5960-5969 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 5970-5979 + 1, 6, 5, 4, 3, 2, 1, 20, 19, 18, // 5980-5989 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 5990-5999 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 6000-6009 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 6010-6019 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 6020-6029 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 6030-6039 + 3, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 6040-6049 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 6050-6059 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 6060-6069 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 10, // 6070-6079 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 6080-6089 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 6090-6099 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 6100-6109 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 6110-6119 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 6120-6129 + 1, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 6130-6139 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 6140-6149 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 6150-6159 + 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 6160-6169 + 3, 2, 1, 24, 23, 22, 21, 20, 19, 18, // 6170-6179 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 6180-6189 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 4, // 6190-6199 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 6200-6209 + 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 6210-6219 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 6220-6229 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 6230-6239 + 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 6240-6249 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 6250-6259 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 6260-6269 + 1, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 6270-6279 + 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 6280-6289 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 6290-6299 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 6300-6309 + 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 6310-6319 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 6320-6329 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 6330-6339 + 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 6340-6349 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 6350-6359 + 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 6360-6369 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 10, // 6370-6379 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 6380-6389 + 7, 6, 5, 4, 3, 2, 1, 24, 23, 22, // 6390-6399 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 6400-6409 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 6410-6419 + 1, 6, 5, 4, 3, 2, 1, 22, 21, 20, // 6420-6429 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 6430-6439 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 6440-6449 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 6450-6459 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 6460-6469 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 6470-6479 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 6480-6489 + 1, 30, 29, 28, 27, 26, 25, 24, 23, 22, // 6490-6499 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 6500-6509 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 6510-6519 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 6520-6529 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 6530-6539 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 6540-6549 + 1, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 6550-6559 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 6560-6569 + 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 6570-6579 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 6580-6589 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 6590-6599 + 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 6600-6609 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 6610-6619 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 6620-6629 + 7, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 6630-6639 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 6640-6649 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 6650-6659 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 6660-6669 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 10, // 6670-6679 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 6680-6689 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 6690-6699 + 1, 2, 1, 6, 5, 4, 3, 2, 1, 10, // 6700-6709 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 6710-6719 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 6720-6729 + 3, 2, 1, 4, 3, 2, 1, 24, 23, 22, // 6730-6739 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 6740-6749 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 6750-6759 + 1, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 6760-6769 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 6770-6779 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 6780-6789 + 1, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 6790-6799 + 3, 2, 1, 20, 19, 18, 17, 16, 15, 14, // 6800-6809 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 6810-6819 + 3, 2, 1, 4, 3, 2, 1, 2, 1, 4, // 6820-6829 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 6830-6839 + 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 6840-6849 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 6850-6859 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 6860-6869 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 6870-6879 + 3, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 6880-6889 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 6890-6899 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 6900-6909 + 1, 6, 5, 4, 3, 2, 1, 30, 29, 28, // 6910-6919 + 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 6920-6929 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 6930-6939 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 10, // 6940-6949 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 6950-6959 + 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 6960-6969 + 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 6970-6979 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 6980-6989 + 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 6990-6999 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 7000-7009 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 7010-7019 + 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 7020-7029 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 7030-7039 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 7040-7049 + 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 7050-7059 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 7060-7069 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 24, // 7070-7079 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 7080-7089 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 7090-7099 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 7100-7109 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 7110-7119 + 1, 6, 5, 4, 3, 2, 1, 2, 1, 22, // 7120-7129 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 7130-7139 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 7140-7149 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 7150-7159 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 7160-7169 + 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 7170-7179 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 7180-7189 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 7190-7199 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 7200-7209 + 1, 2, 1, 6, 5, 4, 3, 2, 1, 10, // 7210-7219 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 7220-7229 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 7230-7239 + 3, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 7240-7249 + 3, 2, 1, 30, 29, 28, 27, 26, 25, 24, // 7250-7259 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 7260-7269 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 7270-7279 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 7280-7289 + 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 7290-7299 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 12, // 7300-7309 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 7310-7319 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 7320-7329 + 1, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 7330-7339 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 7340-7349 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 7350-7359 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 24, // 7360-7369 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 7370-7379 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 7380-7389 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 7390-7399 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 7400-7409 + 1, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 7410-7419 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 7420-7429 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 7430-7439 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 7440-7449 + 1, 6, 5, 4, 3, 2, 1, 2, 1, 18, // 7450-7459 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 7460-7469 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 7470-7479 + 1, 6, 5, 4, 3, 2, 1, 2, 1, 10, // 7480-7489 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 7490-7499 + 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 7500-7509 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 7510-7519 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 7520-7529 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 7530-7539 + 1, 6, 5, 4, 3, 2, 1, 2, 1, 10, // 7540-7549 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 7550-7559 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 7560-7569 + 3, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 7570-7579 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 7580-7589 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 7590-7599 + 3, 2, 1, 4, 3, 2, 1, 14, 13, 12, // 7600-7609 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 7610-7619 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 7620-7629 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 7630-7639 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 20, // 7640-7649 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 7650-7659 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 7660-7669 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 7670-7679 + 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 7680-7689 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 7690-7699 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 7700-7709 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 7710-7719 + 3, 2, 1, 4, 3, 2, 1, 14, 13, 12, // 7720-7729 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 7730-7739 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 7740-7749 + 3, 2, 1, 4, 3, 2, 1, 2, 1, 30, // 7750-7759 + 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 7760-7769 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 7770-7779 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 7780-7789 + 3, 2, 1, 24, 23, 22, 21, 20, 19, 18, // 7790-7799 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 7800-7809 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 7810-7819 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 7820-7829 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 7830-7839 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 7840-7849 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 7850-7859 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 7860-7869 + 3, 2, 1, 4, 3, 2, 1, 2, 1, 4, // 7870-7879 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 7880-7889 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 7890-7899 + 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 7900-7909 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 7910-7919 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 7920-7929 + 3, 2, 1, 4, 3, 2, 1, 12, 11, 10, // 7930-7939 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 7940-7949 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 7950-7959 + 3, 2, 1, 30, 29, 28, 27, 26, 25, 24, // 7960-7969 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 7970-7979 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 7980-7989 + 3, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 7990-7999 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 8000-8009 + 1, 6, 5, 4, 3, 2, 1, 22, 21, 20, // 8010-8019 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 8020-8029 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 8030-8039 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 8040-8049 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 10, // 8050-8059 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 8060-8069 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 8070-8079 + 1, 6, 5, 4, 3, 2, 1, 2, 1, 4, // 8080-8089 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 8090-8099 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 8100-8109 + 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 8110-8119 + 3, 2, 1, 24, 23, 22, 21, 20, 19, 18, // 8120-8129 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 8130-8139 + 7, 6, 5, 4, 3, 2, 1, 14, 13, 12, // 8140-8149 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 8150-8159 + 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 8160-8169 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 8170-8179 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 8180-8189 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 8190-8199 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 8200-8209 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 8210-8219 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 8220-8229 + 1, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 8230-8239 + 3, 2, 1, 20, 19, 18, 17, 16, 15, 14, // 8240-8249 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 8250-8259 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 8260-8269 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 8270-8279 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 8280-8289 + 1, 2, 1, 4, 3, 2, 1, 14, 13, 12, // 8290-8299 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 8300-8309 + 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 8310-8319 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 24, // 8320-8329 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 8330-8339 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 8340-8349 + 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 8350-8359 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 8360-8369 + 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 8370-8379 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 30, // 8380-8389 + 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 8390-8399 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 8400-8409 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 8410-8419 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 8420-8429 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 8430-8439 + 3, 2, 1, 4, 3, 2, 1, 14, 13, 12, // 8440-8449 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 8450-8459 + 1, 6, 5, 4, 3, 2, 1, 34, 33, 32, // 8460-8469 + 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, // 8470-8479 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 8480-8489 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 8490-8499 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 8500-8509 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 8510-8519 + 1, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 8520-8529 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 4, // 8530-8539 + 3, 2, 1, 20, 19, 18, 17, 16, 15, 14, // 8540-8549 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 8550-8559 + 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 8560-8569 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 8570-8579 + 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 8580-8589 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 10, // 8590-8599 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 8600-8609 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 8610-8619 + 3, 2, 1, 4, 3, 2, 1, 2, 1, 12, // 8620-8629 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 8630-8639 + 1, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 8640-8649 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 8650-8659 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 8660-8669 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 8670-8679 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 8680-8689 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 8690-8699 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 8700-8709 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 8710-8719 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 8720-8729 + 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 8730-8739 + 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 8740-8749 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 8750-8759 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 8760-8769 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 8770-8779 + 3, 2, 1, 20, 19, 18, 17, 16, 15, 14, // 8780-8789 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 8790-8799 + 3, 2, 1, 4, 3, 2, 1, 12, 11, 10, // 8800-8809 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 8810-8819 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 8820-8829 + 1, 6, 5, 4, 3, 2, 1, 2, 1, 10, // 8830-8839 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 8840-8849 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 8850-8859 + 1, 2, 1, 4, 3, 2, 1, 20, 19, 18, // 8860-8869 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 8870-8879 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 8880-8889 + 3, 2, 1, 30, 29, 28, 27, 26, 25, 24, // 8890-8899 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 8900-8909 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 8910-8919 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 8920-8929 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 8930-8939 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 8940-8949 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 8950-8959 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 8960-8969 + 1, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 8970-8979 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 8980-8989 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 8990-8999 + 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 9000-9009 + 1, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 9010-9019 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 9020-9029 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 9030-9039 + 1, 2, 1, 6, 5, 4, 3, 2, 1, 10, // 9040-9049 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 9050-9059 + 7, 6, 5, 4, 3, 2, 1, 24, 23, 22, // 9060-9069 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 9070-9079 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 9080-9089 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 9090-9099 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 18, // 9100-9109 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 9110-9119 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 9120-9129 + 3, 2, 1, 4, 3, 2, 1, 14, 13, 12, // 9130-9139 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 9140-9149 + 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 9150-9159 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 9160-9169 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 9170-9179 + 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 9180-9189 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 9190-9199 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 9200-9209 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 9210-9219 + 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 9220-9229 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 9230-9239 + 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 9240-9249 + 7, 6, 5, 4, 3, 2, 1, 20, 19, 18, // 9250-9259 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 9260-9269 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 9270-9279 + 1, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 9280-9289 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 9290-9299 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 9300-9309 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 9310-9319 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 9320-9329 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 9330-9339 + 1, 2, 1, 6, 5, 4, 3, 2, 1, 22, // 9340-9349 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 9350-9359 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 9360-9369 + 1, 6, 5, 4, 3, 2, 1, 14, 13, 12, // 9370-9379 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 9380-9389 + 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 9390-9399 + 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 9400-9409 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 9410-9419 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 9420-9429 + 1, 2, 1, 4, 3, 2, 1, 2, 1, 22, // 9430-9439 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 9440-9449 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 9450-9459 + 1, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 9460-9469 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 9470-9479 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 9480-9489 + 1, 6, 5, 4, 3, 2, 1, 14, 13, 12, // 9490-9499 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 9500-9509 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 9510-9519 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 9520-9529 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 9530-9539 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 9540-9549 + 1, 36, 35, 34, 33, 32, 31, 30, 29, 28, // 9550-9559 + 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 9560-9569 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 9570-9579 + 7, 6, 5, 4, 3, 2, 1, 14, 13, 12, // 9580-9589 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 9590-9599 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 9600-9609 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 9610-9619 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 9620-9629 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 9630-9639 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 9640-9649 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 9650-9659 + 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 9660-9669 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 10, // 9670-9679 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 9680-9689 + 7, 6, 5, 4, 3, 2, 1, 22, 21, 20, // 9690-9699 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 9700-9709 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 9710-9719 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 9720-9729 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 9730-9739 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 18, // 9740-9749 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 9750-9759 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 12, // 9760-9769 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 9770-9779 + 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 9780-9789 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 9790-9799 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 9800-9809 + 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 9810-9819 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 9820-9829 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 9830-9839 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 9840-9849 + 1, 6, 5, 4, 3, 2, 1, 2, 1, 12, // 9850-9859 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 9860-9869 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 9870-9879 + 3, 2, 1, 4, 3, 2, 1, 14, 13, 12, // 9880-9889 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 9890-9899 + 1, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 9900-9909 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 9910-9919 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 9920-9929 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 9930-9939 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 9940-9949 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 9950-9959 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 9960-9969 + 3, 2, 1, 34, 33, 32, 31, 30, 29, 28, // 9970-9979 + 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 9980-9989 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 9990-9999 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 28, // 10000-10009 + 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 10010-10019 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 10020-10029 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 22, // 10030-10039 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 10040-10049 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 10050-10059 + 1, 6, 5, 4, 3, 2, 1, 2, 1, 10, // 10060-10069 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 10070-10079 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 10080-10089 + 1, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 10090-10099 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 10100-10109 + 1, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 10110-10119 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 10120-10129 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 10130-10139 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 10140-10149 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 10150-10159 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 10160-10169 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 10170-10179 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 10180-10189 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 10190-10199 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 10200-10209 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 10210-10219 + 3, 2, 1, 20, 19, 18, 17, 16, 15, 14, // 10220-10229 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 10230-10239 + 3, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 10240-10249 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 10250-10259 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 10260-10269 + 1, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 10270-10279 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 10280-10289 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 10290-10299 + 1, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 10300-10309 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 10310-10319 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 10320-10329 + 1, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 10330-10339 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 10340-10349 + 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 10350-10359 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 22, // 10360-10369 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 10370-10379 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 10380-10389 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 28, // 10390-10399 + 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 10400-10409 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 10410-10419 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 4, // 10420-10429 + 3, 2, 1, 20, 19, 18, 17, 16, 15, 14, // 10430-10439 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 10440-10449 + 3, 2, 1, 4, 3, 2, 1, 2, 1, 4, // 10450-10459 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 10460-10469 + 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 10470-10479 + 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 10480-10489 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 10490-10499 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 10500-10509 + 3, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 10510-10519 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 10520-10529 + 1, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 10530-10539 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 10540-10549 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 10550-10559 + 7, 6, 5, 4, 3, 2, 1, 22, 21, 20, // 10560-10569 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 10570-10579 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 10580-10589 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 10590-10599 + 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 10600-10609 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 10610-10619 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 10620-10629 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 10630-10639 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 10640-10649 + 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 10650-10659 + 3, 2, 1, 4, 3, 2, 1, 20, 19, 18, // 10660-10669 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 10670-10679 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 10680-10689 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 10690-10699 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 10700-10709 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 10710-10719 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 10720-10729 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 14, // 10730-10739 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 10740-10749 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 10750-10759 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 10760-10769 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 10770-10779 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 10780-10789 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 32, // 10790-10799 + 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, // 10800-10809 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 10810-10819 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 10820-10829 + 1, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 10830-10839 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 10840-10849 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 10850-10859 + 1, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 10860-10869 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 10870-10879 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 10880-10889 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 10890-10899 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 28, // 10900-10909 + 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 10910-10919 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 10920-10929 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 10, // 10930-10939 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 10940-10949 + 7, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 10950-10959 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 10960-10969 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 10970-10979 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 10980-10989 + 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 10990-10999 + 3, 2, 1, 24, 23, 22, 21, 20, 19, 18, // 11000-11009 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 11010-11019 + 7, 6, 5, 4, 3, 2, 1, 20, 19, 18, // 11020-11029 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 11030-11039 + 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 11040-11049 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 10, // 11050-11059 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 11060-11069 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 11070-11079 + 3, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 11080-11089 + 3, 2, 1, 20, 19, 18, 17, 16, 15, 14, // 11090-11099 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 11100-11109 + 3, 2, 1, 4, 3, 2, 1, 2, 1, 12, // 11110-11119 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 11120-11129 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 11130-11139 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 11140-11149 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 11150-11159 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 11160-11169 + 1, 2, 1, 4, 3, 2, 1, 20, 19, 18, // 11170-11179 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 11180-11189 + 7, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 11190-11199 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 11200-11209 + 3, 2, 1, 26, 25, 24, 23, 22, 21, 20, // 11210-11219 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 11220-11229 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 11230-11239 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 11240-11249 + 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 11250-11259 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 11260-11269 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 11270-11279 + 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 11280-11289 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 11290-11299 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 11300-11309 + 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 11310-11319 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 22, // 11320-11329 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 11330-11339 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 11340-11349 + 1, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 11350-11359 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 11360-11369 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 11370-11379 + 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 11380-11389 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 11390-11399 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 11400-11409 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 11410-11419 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 11420-11429 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 11430-11439 + 3, 2, 1, 4, 3, 2, 1, 20, 19, 18, // 11440-11449 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 11450-11459 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 11460-11469 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 11470-11479 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 11480-11489 + 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 11490-11499 + 3, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 11500-11509 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 11510-11519 + 7, 6, 5, 4, 3, 2, 1, 22, 21, 20, // 11520-11529 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 11530-11539 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 11540-11549 + 1, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 11550-11559 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 11560-11569 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 11570-11579 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 11580-11589 + 3, 2, 1, 4, 3, 2, 1, 20, 19, 18, // 11590-11599 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 11600-11609 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 11610-11619 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 11620-11629 + 3, 2, 1, 24, 23, 22, 21, 20, 19, 18, // 11630-11639 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 11640-11649 + 7, 6, 5, 4, 3, 2, 1, 20, 19, 18, // 11650-11659 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 11660-11669 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 11670-11679 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 11680-11689 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 11690-11699 + 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 11700-11709 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 12, // 11710-11719 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 11720-11729 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 11730-11739 + 3, 2, 1, 34, 33, 32, 31, 30, 29, 28, // 11740-11749 + 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 11750-11759 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 11760-11769 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 4, // 11770-11779 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 11780-11789 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 11790-11799 + 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 11800-11809 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 11810-11819 + 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 11820-11829 + 1, 2, 1, 6, 5, 4, 3, 2, 1, 24, // 11830-11839 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 11840-11849 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 11850-11859 + 3, 2, 1, 4, 3, 2, 1, 20, 19, 18, // 11860-11869 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 11870-11879 + 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 11880-11889 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 11890-11899 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 14, // 11900-11909 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 11910-11919 + 3, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 11920-11929 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 11930-11939 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 11940-11949 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 10, // 11950-11959 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 11960-11969 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 11970-11979 + 1, 6, 5, 4, 3, 2, 1, 20, 19, 18, // 11980-11989 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 11990-11999 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 12000-12009 + 1, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 12010-12019 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 12020-12029 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 12030-12039 + 1, 2, 1, 6, 5, 4, 3, 2, 1, 22, // 12040-12049 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 12050-12059 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 12060-12069 + 1, 2, 1, 24, 23, 22, 21, 20, 19, 18, // 12070-12079 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 12080-12089 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 12090-12099 + 1, 6, 5, 4, 3, 2, 1, 2, 1, 4, // 12100-12109 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 24, // 12110-12119 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 12120-12129 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 12130-12139 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 12140-12149 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 12150-12159 + 1, 2, 1, 34, 33, 32, 31, 30, 29, 28, // 12160-12169 + 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 12170-12179 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 12180-12189 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 12190-12199 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 12200-12209 + 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 12210-12219 + 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 12220-12229 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 12230-12239 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 12240-12249 + 1, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 12250-12259 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 12260-12269 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 12270-12279 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 12280-12289 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 12290-12299 + 1, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 12300-12309 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 12310-12319 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 14, // 12320-12329 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 12330-12339 + 3, 2, 1, 4, 3, 2, 1, 26, 25, 24, // 12340-12349 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 12350-12359 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 12360-12369 + 3, 2, 1, 4, 3, 2, 1, 2, 1, 12, // 12370-12379 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 12380-12389 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 12390-12399 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 12400-12409 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 12410-12419 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 12420-12429 + 3, 2, 1, 4, 3, 2, 1, 14, 13, 12, // 12430-12439 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 12440-12449 + 1, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 12450-12459 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 12460-12469 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 12470-12479 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 12480-12489 + 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 12490-12499 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 12500-12509 + 1, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 12510-12519 + 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 12520-12529 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 12530-12539 + 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 12540-12549 + 3, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 12550-12559 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 12560-12569 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 12570-12579 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 12580-12589 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 12590-12599 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 12600-12609 + 1, 2, 1, 6, 5, 4, 3, 2, 1, 18, // 12610-12619 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 12620-12629 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 12630-12639 + 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 12640-12649 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 12650-12659 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 12660-12669 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 12670-12679 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 12680-12689 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 12690-12699 + 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 12700-12709 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 12710-12719 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 12720-12729 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 12730-12739 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 12740-12749 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 12750-12759 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 12760-12769 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 12770-12779 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 12780-12789 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 12790-12799 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 12800-12809 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 12810-12819 + 1, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 12820-12829 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 12830-12839 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 12840-12849 + 3, 2, 1, 36, 35, 34, 33, 32, 31, 30, // 12850-12859 + 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 12860-12869 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 12870-12879 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 12880-12889 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 12890-12899 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 12900-12909 + 1, 6, 5, 4, 3, 2, 1, 2, 1, 4, // 12910-12919 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 12920-12929 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 12930-12939 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 12940-12949 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 12950-12959 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 12960-12969 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 12970-12979 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 12980-12989 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 12990-12999 + 1, 2, 1, 4, 3, 2, 1, 2, 1, 24, // 13000-13009 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 13010-13019 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 13020-13029 + 3, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 13030-13039 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 14, // 13040-13049 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 13050-13059 + 3, 2, 1, 30, 29, 28, 27, 26, 25, 24, // 13060-13069 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 13070-13079 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 13080-13089 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 13090-13099 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 13100-13109 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 13110-13119 + 1, 6, 5, 4, 3, 2, 1, 20, 19, 18, // 13120-13129 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 13130-13139 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 13140-13149 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 13150-13159 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 13160-13169 + 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 13170-13179 + 3, 2, 1, 4, 3, 2, 1, 30, 29, 28, // 13180-13189 + 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 13190-13199 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 13200-13209 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 10, // 13210-13219 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 13220-13229 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 13230-13239 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 13240-13249 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 13250-13259 + 7, 6, 5, 4, 3, 2, 1, 24, 23, 22, // 13260-13269 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 13270-13279 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 13280-13289 + 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 13290-13299 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 13300-13309 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 13310-13319 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 13320-13329 + 1, 6, 5, 4, 3, 2, 1, 2, 1, 28, // 13330-13339 + 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 13340-13349 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 13350-13359 + 7, 6, 5, 4, 3, 2, 1, 14, 13, 12, // 13360-13369 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 13370-13379 + 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 13380-13389 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 12, // 13390-13399 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 13400-13409 + 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 13410-13419 + 1, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 13420-13429 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 13430-13439 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 13440-13449 + 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 13450-13459 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 13460-13469 + 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 13470-13479 + 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 13480-13489 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 13490-13499 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 13500-13509 + 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 13510-13519 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 13520-13529 + 7, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 13530-13539 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 13540-13549 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 13550-13559 + 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 13560-13569 + 7, 6, 5, 4, 3, 2, 1, 14, 13, 12, // 13570-13579 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 13580-13589 + 1, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 13590-13599 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 13600-13609 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 13610-13619 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 13620-13629 + 3, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 13630-13639 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 20, // 13640-13649 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 13650-13659 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 13660-13669 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 13670-13679 + 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 13680-13689 + 1, 2, 1, 4, 3, 2, 1, 12, 11, 10, // 13690-13699 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 13700-13709 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 13710-13719 + 1, 2, 1, 6, 5, 4, 3, 2, 1, 22, // 13720-13729 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 13730-13739 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 13740-13749 + 1, 6, 5, 4, 3, 2, 1, 2, 1, 4, // 13750-13759 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 13760-13769 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 13770-13779 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 13780-13789 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 13790-13799 + 7, 6, 5, 4, 3, 2, 1, 22, 21, 20, // 13800-13809 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 13810-13819 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 13820-13829 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 13830-13839 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 13840-13849 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 13850-13859 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 13860-13869 + 3, 2, 1, 4, 3, 2, 1, 2, 1, 4, // 13870-13879 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 13880-13889 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 13890-13899 + 1, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 13900-13909 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 13910-13919 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 13920-13929 + 1, 2, 1, 30, 29, 28, 27, 26, 25, 24, // 13930-13939 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 13940-13949 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 13950-13959 + 3, 2, 1, 4, 3, 2, 1, 30, 29, 28, // 13960-13969 + 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 13970-13979 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 13980-13989 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 10, // 13990-13999 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 14000-14009 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 14010-14019 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 14020-14029 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 14030-14039 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 14040-14049 + 1, 6, 5, 4, 3, 2, 1, 14, 13, 12, // 14050-14059 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 14060-14069 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 14070-14079 + 1, 2, 1, 4, 3, 2, 1, 20, 19, 18, // 14080-14089 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 14090-14099 + 7, 6, 5, 4, 3, 2, 1, 36, 35, 34, // 14100-14109 + 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, // 14110-14119 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 14120-14129 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 14130-14139 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 14140-14149 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 14, // 14150-14159 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 14160-14169 + 3, 2, 1, 4, 3, 2, 1, 20, 19, 18, // 14170-14179 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 14180-14189 + 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 14190-14199 + 7, 6, 5, 4, 3, 2, 1, 14, 13, 12, // 14200-14209 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 14210-14219 + 1, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 14220-14229 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 14230-14239 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 14240-14249 + 1, 30, 29, 28, 27, 26, 25, 24, 23, 22, // 14250-14259 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 14260-14269 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 14270-14279 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 14280-14289 + 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 14290-14299 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 14300-14309 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 14310-14319 + 1, 2, 1, 4, 3, 2, 1, 14, 13, 12, // 14320-14329 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 14330-14339 + 1, 6, 5, 4, 3, 2, 1, 22, 21, 20, // 14340-14349 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 14350-14359 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 14360-14369 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 14370-14379 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 12, // 14380-14389 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 14390-14399 + 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 14400-14409 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 14410-14419 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 14420-14429 + 1, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 14430-14439 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 12, // 14440-14449 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 14450-14459 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 14460-14469 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 14470-14479 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 14480-14489 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 14490-14499 + 3, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 14500-14509 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 14510-14519 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 14520-14529 + 3, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 14530-14539 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 14540-14549 + 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 14550-14559 + 1, 2, 1, 28, 27, 26, 25, 24, 23, 22, // 14560-14569 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 14570-14579 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 14580-14589 + 1, 2, 1, 28, 27, 26, 25, 24, 23, 22, // 14590-14599 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 14600-14609 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 14610-14619 + 1, 6, 5, 4, 3, 2, 1, 2, 1, 4, // 14620-14629 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 14, // 14630-14639 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 14640-14649 + 3, 2, 1, 4, 3, 2, 1, 12, 11, 10, // 14650-14659 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 14660-14669 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 14670-14679 + 3, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 14680-14689 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 14690-14699 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 14700-14709 + 3, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 14710-14719 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 14720-14729 + 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 14730-14739 + 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 14740-14749 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 14750-14759 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 14760-14769 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 14770-14779 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 14780-14789 + 7, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 14790-14799 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 14800-14809 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 14810-14819 + 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 14820-14829 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 14830-14839 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 14840-14849 + 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 14850-14859 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 10, // 14860-14869 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 14870-14879 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 14880-14889 + 1, 6, 5, 4, 3, 2, 1, 26, 25, 24, // 14890-14899 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 14900-14909 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 14910-14919 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 10, // 14920-14929 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 14930-14939 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 14940-14949 + 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 14950-14959 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 14960-14969 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 14970-14979 + 3, 2, 1, 30, 29, 28, 27, 26, 25, 24, // 14980-14989 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 14990-14999 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 15000-15009 + 3, 2, 1, 4, 3, 2, 1, 14, 13, 12, // 15010-15019 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 15020-15029 + 1, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 15030-15039 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 15040-15049 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 15050-15059 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 15060-15069 + 3, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 15070-15079 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 15080-15089 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 15090-15099 + 1, 6, 5, 4, 3, 2, 1, 14, 13, 12, // 15100-15109 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 15110-15119 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 15120-15129 + 1, 6, 5, 4, 3, 2, 1, 2, 1, 10, // 15130-15139 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 15140-15149 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 15150-15159 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 15160-15169 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 15170-15179 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 15180-15189 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 18, // 15190-15199 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 15200-15209 + 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 15210-15219 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 15220-15229 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 15230-15239 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 15240-15249 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 15250-15259 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 15260-15269 + 1, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 15270-15279 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 10, // 15280-15289 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 15290-15299 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 15300-15309 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 10, // 15310-15319 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 15320-15329 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 15330-15339 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 15340-15349 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 15350-15359 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 15360-15369 + 3, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 15370-15379 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 15380-15389 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 15390-15399 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 15400-15409 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 15410-15419 + 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 15420-15429 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 15430-15439 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 15440-15449 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 15450-15459 + 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 15460-15469 + 3, 2, 1, 20, 19, 18, 17, 16, 15, 14, // 15470-15479 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 15480-15489 + 3, 2, 1, 4, 3, 2, 1, 14, 13, 12, // 15490-15499 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 15500-15509 + 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 15510-15519 + 7, 6, 5, 4, 3, 2, 1, 14, 13, 12, // 15520-15529 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 15530-15539 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 15540-15549 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 15550-15559 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 15560-15569 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 15570-15579 + 1, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 15580-15589 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 15590-15599 + 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 15600-15609 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 15610-15619 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 15620-15629 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 15630-15639 + 1, 2, 1, 4, 3, 2, 1, 2, 1, 12, // 15640-15649 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 15650-15659 + 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 15660-15669 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 15670-15679 + 3, 2, 1, 44, 43, 42, 41, 40, 39, 38, // 15680-15689 + 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, // 15690-15699 + 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 15700-15709 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 15710-15719 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 15720-15729 + 1, 2, 1, 4, 3, 2, 1, 2, 1, 10, // 15730-15739 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 15740-15749 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 15750-15759 + 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 15760-15769 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 15770-15779 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 15780-15789 + 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 15790-15799 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 15800-15809 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 15810-15819 + 3, 2, 1, 36, 35, 34, 33, 32, 31, 30, // 15820-15829 + 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 15830-15839 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 15840-15849 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 15850-15859 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 15860-15869 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 15870-15879 + 1, 6, 5, 4, 3, 2, 1, 2, 1, 12, // 15880-15889 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 15890-15899 + 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 15900-15909 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 15910-15919 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 15920-15929 + 7, 6, 5, 4, 3, 2, 1, 22, 21, 20, // 15930-15939 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 15940-15949 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 15950-15959 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 15960-15969 + 1, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 15970-15979 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 15980-15989 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 15990-15999 + 1, 6, 5, 4, 3, 2, 1, 26, 25, 24, // 16000-16009 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 16010-16019 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 16020-16029 + 3, 2, 1, 24, 23, 22, 21, 20, 19, 18, // 16030-16039 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 16040-16049 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 16050-16059 + 1, 2, 1, 4, 3, 2, 1, 2, 1, 4, // 16060-16069 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 16070-16079 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 16080-16089 + 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 16090-16099 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 16100-16109 + 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 16110-16119 + 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 16120-16129 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 16130-16139 + 1, 42, 41, 40, 39, 38, 37, 36, 35, 34, // 16140-16149 + 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, // 16150-16159 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 16160-16169 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 16170-16179 + 3, 2, 1, 4, 3, 2, 1, 2, 1, 4, // 16180-16189 + 3, 2, 1, 24, 23, 22, 21, 20, 19, 18, // 16190-16199 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 16200-16209 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 16210-16219 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 16220-16229 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 16230-16239 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 16240-16249 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 16250-16259 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 16260-16269 + 3, 2, 1, 28, 27, 26, 25, 24, 23, 22, // 16270-16279 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 16280-16289 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 16290-16299 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 16300-16309 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 16310-16319 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 16320-16329 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 10, // 16330-16339 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 16340-16349 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 16350-16359 + 1, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 16360-16369 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 16370-16379 + 1, 30, 29, 28, 27, 26, 25, 24, 23, 22, // 16380-16389 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 16390-16399 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 16400-16409 + 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 16410-16419 + 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 16420-16429 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 16430-16439 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 16440-16449 + 1, 2, 1, 24, 23, 22, 21, 20, 19, 18, // 16450-16459 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 16460-16469 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 16470-16479 + 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 16480-16489 + 3, 2, 1, 26, 25, 24, 23, 22, 21, 20, // 16490-16499 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 16500-16509 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 16510-16519 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 16520-16529 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 16530-16539 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 16540-16549 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 16550-16559 + 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 16560-16569 + 3, 2, 1, 30, 29, 28, 27, 26, 25, 24, // 16570-16579 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 16580-16589 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 16590-16599 + 3, 2, 1, 4, 3, 2, 1, 12, 11, 10, // 16600-16609 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 16610-16619 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 16620-16629 + 1, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 16630-16639 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 16640-16649 + 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 16650-16659 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 16660-16669 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 16670-16679 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 16680-16689 + 1, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 16690-16699 + 3, 2, 1, 26, 25, 24, 23, 22, 21, 20, // 16700-16709 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 16710-16719 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 16720-16729 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 16730-16739 + 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 16740-16749 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 16750-16759 + 3, 2, 1, 24, 23, 22, 21, 20, 19, 18, // 16760-16769 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 16770-16779 + 7, 6, 5, 4, 3, 2, 1, 24, 23, 22, // 16780-16789 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 16790-16799 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 16800-16809 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 16810-16819 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 16820-16829 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 16830-16839 + 3, 2, 1, 28, 27, 26, 25, 24, 23, 22, // 16840-16849 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 16850-16859 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 16860-16869 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 16870-16879 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 16880-16889 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 16890-16899 + 1, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 16900-16909 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 16910-16919 + 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 16920-16929 + 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 16930-16939 + 3, 2, 1, 20, 19, 18, 17, 16, 15, 14, // 16940-16949 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 16950-16959 + 3, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 16960-16969 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 16970-16979 + 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 16980-16989 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 16990-16999 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 17000-17009 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 17010-17019 + 1, 6, 5, 4, 3, 2, 1, 2, 1, 4, // 17020-17029 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 17030-17039 + 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 17040-17049 + 3, 2, 1, 24, 23, 22, 21, 20, 19, 18, // 17050-17059 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 17060-17069 + 7, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 17070-17079 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 17080-17089 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 17090-17099 + 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 17100-17109 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 17110-17119 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 17120-17129 + 7, 6, 5, 4, 3, 2, 1, 22, 21, 20, // 17130-17139 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 17140-17149 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 17150-17159 + 7, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 17160-17169 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 17170-17179 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 17180-17189 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 17190-17199 + 3, 2, 1, 4, 3, 2, 1, 2, 1, 22, // 17200-17209 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 17210-17219 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 17220-17229 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 17230-17239 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 17240-17249 + 7, 6, 5, 4, 3, 2, 1, 34, 33, 32, // 17250-17259 + 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, // 17260-17269 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 17270-17279 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 17280-17289 + 1, 2, 1, 6, 5, 4, 3, 2, 1, 18, // 17290-17299 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 17300-17309 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 17310-17319 + 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 17320-17329 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 17330-17339 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 17340-17349 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 17350-17359 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 17360-17369 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 17370-17379 + 3, 2, 1, 4, 3, 2, 1, 2, 1, 4, // 17380-17389 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 17390-17399 + 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 17400-17409 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 12, // 17410-17419 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 17420-17429 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 17430-17439 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 18, // 17440-17449 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 17450-17459 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 17460-17469 + 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 17470-17479 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 17480-17489 + 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 17490-17499 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 17500-17509 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 20, // 17510-17519 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 17520-17529 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 17530-17539 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 17540-17549 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 17550-17559 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 17560-17569 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 17570-17579 + 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 17580-17589 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 10, // 17590-17599 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 17600-17609 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 17610-17619 + 3, 2, 1, 4, 3, 2, 1, 30, 29, 28, // 17620-17629 + 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 17630-17639 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 17640-17649 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 10, // 17650-17659 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 17660-17669 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 17670-17679 + 1, 2, 1, 24, 23, 22, 21, 20, 19, 18, // 17680-17689 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 17690-17699 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 17700-17709 + 3, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 17710-17719 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 17720-17729 + 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 17730-17739 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 12, // 17740-17749 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 17750-17759 + 1, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 17760-17769 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 17770-17779 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 17780-17789 + 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 17790-17799 + 7, 6, 5, 4, 3, 2, 1, 20, 19, 18, // 17800-17809 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 17810-17819 + 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 17820-17829 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 12, // 17830-17839 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 17840-17849 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 17850-17859 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 17860-17869 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 17870-17879 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 17880-17889 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 17890-17899 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 17900-17909 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 17910-17919 + 1, 2, 1, 6, 5, 4, 3, 2, 1, 10, // 17920-17929 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 17930-17939 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 17940-17949 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 12, // 17950-17959 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 17960-17969 + 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 17970-17979 + 1, 6, 5, 4, 3, 2, 1, 2, 1, 24, // 17980-17989 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 17990-17999 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 18000-18009 + 3, 2, 1, 28, 27, 26, 25, 24, 23, 22, // 18010-18019 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 18020-18029 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 18030-18039 + 1, 2, 1, 4, 3, 2, 1, 2, 1, 10, // 18040-18049 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 18050-18059 + 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 18060-18069 + 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 18070-18079 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 18080-18089 + 7, 6, 5, 4, 3, 2, 1, 22, 21, 20, // 18090-18099 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 18100-18109 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 18110-18119 + 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 18120-18129 + 1, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 18130-18139 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 20, // 18140-18149 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 18150-18159 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 18160-18169 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 18170-18179 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 18180-18189 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 18190-18199 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 18200-18209 + 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 18210-18219 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 18220-18229 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 18230-18239 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 18240-18249 + 1, 2, 1, 4, 3, 2, 1, 12, 11, 10, // 18250-18259 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 18260-18269 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 18270-18279 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 12, // 18280-18289 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 18290-18299 + 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 18300-18309 + 1, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 18310-18319 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 18320-18329 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 18330-18339 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 18340-18349 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 18350-18359 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 18360-18369 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 18370-18379 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 18380-18389 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 18390-18399 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 18400-18409 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 18410-18419 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 18420-18429 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 18430-18439 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 18440-18449 + 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 18450-18459 + 1, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 18460-18469 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 18470-18479 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 18480-18489 + 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 18490-18499 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 18500-18509 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 18510-18519 + 1, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 18520-18529 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 18530-18539 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 18540-18549 + 3, 2, 1, 30, 29, 28, 27, 26, 25, 24, // 18550-18559 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 18560-18569 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 18570-18579 + 3, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 18580-18589 + 3, 2, 1, 24, 23, 22, 21, 20, 19, 18, // 18590-18599 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 18600-18609 + 7, 6, 5, 4, 3, 2, 1, 20, 19, 18, // 18610-18619 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 18620-18629 + 7, 6, 5, 4, 3, 2, 1, 24, 23, 22, // 18630-18639 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 18640-18649 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 18650-18659 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 18660-18669 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 18670-18679 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 18680-18689 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 18690-18699 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 18700-18709 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 18710-18719 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 18720-18729 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 18730-18739 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 18740-18749 + 7, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 18750-18759 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 18760-18769 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 18770-18779 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 18780-18789 + 3, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 18790-18799 + 3, 2, 1, 36, 35, 34, 33, 32, 31, 30, // 18800-18809 + 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 18810-18819 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 18820-18829 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 20, // 18830-18839 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 18840-18849 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 18850-18859 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 30, // 18860-18869 + 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 18870-18879 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 18880-18889 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 18890-18899 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 18900-18909 + 1, 2, 1, 4, 3, 2, 1, 2, 1, 28, // 18910-18919 + 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 18920-18929 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 18930-18939 + 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 18940-18949 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 18950-18959 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 18960-18969 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 22, // 18970-18979 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 18980-18989 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 18990-18999 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 19000-19009 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 19010-19019 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 19020-19029 + 1, 6, 5, 4, 3, 2, 1, 14, 13, 12, // 19030-19039 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 19040-19049 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 19050-19059 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 19060-19069 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 19070-19079 + 1, 6, 5, 4, 3, 2, 1, 34, 33, 32, // 19080-19089 + 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, // 19090-19099 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 19100-19109 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 19110-19119 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 19120-19129 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 19130-19139 + 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 19140-19149 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 19150-19159 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 19160-19169 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 19170-19179 + 1, 2, 1, 24, 23, 22, 21, 20, 19, 18, // 19180-19189 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 19190-19199 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 19200-19209 + 1, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 19210-19219 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 19220-19229 + 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 19230-19239 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 19240-19249 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 19250-19259 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 19260-19269 + 3, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 19270-19279 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 19280-19289 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 19290-19299 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 19300-19309 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 19310-19319 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 19320-19329 + 3, 2, 1, 40, 39, 38, 37, 36, 35, 34, // 19330-19339 + 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, // 19340-19349 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 19350-19359 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 19360-19369 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 19370-19379 + 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 19380-19389 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 19390-19399 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 19400-19409 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 19410-19419 + 1, 2, 1, 4, 3, 2, 1, 2, 1, 4, // 19420-19429 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 19430-19439 + 1, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 19440-19449 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 19450-19459 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 19460-19469 + 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 19470-19479 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 19480-19489 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 19490-19499 + 1, 6, 5, 4, 3, 2, 1, 24, 23, 22, // 19500-19509 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 19510-19519 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 19520-19529 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 19530-19539 + 1, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 19540-19549 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 19550-19559 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 19560-19569 + 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 19570-19579 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 19580-19589 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 19590-19599 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 52, // 19600-19609 + 51, 50, 49, 48, 47, 46, 45, 44, 43, 42, // 19610-19619 + 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, // 19620-19629 + 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, // 19630-19639 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 19640-19649 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 19650-19659 + 1, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 19660-19669 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 19670-19679 + 1, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 19680-19689 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 10, // 19690-19699 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 19700-19709 + 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 19710-19719 + 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 19720-19729 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 19730-19739 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 19740-19749 + 1, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 19750-19759 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 19760-19769 + 7, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 19770-19779 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 19780-19789 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 19790-19799 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 19800-19809 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 22, // 19810-19819 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 19820-19829 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 19830-19839 + 1, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 19840-19849 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 19850-19859 + 1, 6, 5, 4, 3, 2, 1, 22, 21, 20, // 19860-19869 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 19870-19879 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 19880-19889 + 1, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 19890-19899 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 19900-19909 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 19910-19919 + 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 19920-19929 + 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 19930-19939 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 19940-19949 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 19950-19959 + 1, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 19960-19969 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 19970-19979 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 19980-19989 + 1, 2, 1, 4, 3, 2, 1, 14, 13, 12, // 19990-19999 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 20000-20009 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 20010-20019 + 1, 2, 1, 6, 5, 4, 3, 2, 1, 18, // 20020-20029 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 20030-20039 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 20040-20049 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 20050-20059 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 20060-20069 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 20070-20079 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 20080-20089 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 20090-20099 + 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 20100-20109 + 3, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 20110-20119 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 14, // 20120-20129 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 20130-20139 + 3, 2, 1, 4, 3, 2, 1, 2, 1, 12, // 20140-20149 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 20150-20159 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 20160-20169 + 3, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 20170-20179 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 20180-20189 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 20190-20199 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 20200-20209 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 20210-20219 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 20220-20229 + 1, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 20230-20239 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 20240-20249 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 20250-20259 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 20260-20269 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 20270-20279 + 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 20280-20289 + 7, 6, 5, 4, 3, 2, 1, 26, 25, 24, // 20290-20299 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 20300-20309 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 20310-20319 + 3, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 20320-20329 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 20330-20339 + 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 20340-20349 + 3, 2, 1, 4, 3, 2, 1, 2, 1, 10, // 20350-20359 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 20, // 20360-20369 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 20370-20379 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 20380-20389 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 20390-20399 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 20400-20409 + 1, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 20410-20419 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 20420-20429 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 20430-20439 + 1, 2, 1, 34, 33, 32, 31, 30, 29, 28, // 20440-20449 + 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 20450-20459 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 20460-20469 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 4, // 20470-20479 + 3, 2, 1, 24, 23, 22, 21, 20, 19, 18, // 20480-20489 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 20490-20499 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 12, // 20500-20509 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 20510-20519 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 20520-20529 + 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 20530-20539 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 20540-20549 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 20550-20559 + 3, 2, 1, 30, 29, 28, 27, 26, 25, 24, // 20560-20569 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 20570-20579 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 20580-20589 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 20590-20599 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 20600-20609 + 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 20610-20619 + 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 20620-20629 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 20630-20639 + 1, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 20640-20649 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 20650-20659 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 20660-20669 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 20670-20679 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 20680-20689 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 20690-20699 + 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 20700-20709 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 12, // 20710-20719 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 20720-20729 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 20730-20739 + 3, 2, 1, 4, 3, 2, 1, 2, 1, 4, // 20740-20749 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 20750-20759 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 20760-20769 + 1, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 20770-20779 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 20780-20789 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 20790-20799 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 40, // 20800-20809 + 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, // 20810-20819 + 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 20820-20829 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 20830-20839 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 20840-20849 + 7, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 20850-20859 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 20860-20869 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 20870-20879 + 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 20880-20889 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 4, // 20890-20899 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 20900-20909 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 20910-20919 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 20920-20929 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 20930-20939 + 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 20940-20949 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 20950-20959 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 20960-20969 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 20970-20979 + 1, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 20980-20989 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 20990-20999 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 21000-21009 + 1, 2, 1, 4, 3, 2, 1, 2, 1, 4, // 21010-21019 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 21020-21029 + 1, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 21030-21039 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 21040-21049 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 21050-21059 + 1, 6, 5, 4, 3, 2, 1, 22, 21, 20, // 21060-21069 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 21070-21079 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 21080-21089 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 21090-21099 + 1, 6, 5, 4, 3, 2, 1, 14, 13, 12, // 21100-21109 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 21110-21119 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 21120-21129 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 21130-21139 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 21140-21149 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 21150-21159 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 10, // 21160-21169 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 21170-21179 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 21180-21189 + 1, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 21190-21199 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 21200-21209 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 21210-21219 + 1, 6, 5, 4, 3, 2, 1, 20, 19, 18, // 21220-21229 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 21230-21239 + 7, 6, 5, 4, 3, 2, 1, 22, 21, 20, // 21240-21249 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 21250-21259 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 21260-21269 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 21270-21279 + 3, 2, 1, 30, 29, 28, 27, 26, 25, 24, // 21280-21289 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 21290-21299 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 21300-21309 + 3, 2, 1, 4, 3, 2, 1, 2, 1, 4, // 21310-21319 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 21320-21329 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 21330-21339 + 1, 6, 5, 4, 3, 2, 1, 30, 29, 28, // 21340-21349 + 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 21350-21359 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 21360-21369 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 4, // 21370-21379 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 21380-21389 + 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 21390-21399 + 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 21400-21409 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 21410-21419 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 21420-21429 + 3, 2, 1, 34, 33, 32, 31, 30, 29, 28, // 21430-21439 + 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 21440-21449 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 21450-21459 + 7, 6, 5, 4, 3, 2, 1, 14, 13, 12, // 21460-21469 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 21470-21479 + 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 21480-21489 + 1, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 21490-21499 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 21500-21509 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 21510-21519 + 1, 2, 1, 6, 5, 4, 3, 2, 1, 28, // 21520-21529 + 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 21530-21539 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 21540-21549 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 4, // 21550-21559 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 21560-21569 + 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 21570-21579 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 10, // 21580-21589 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 21590-21599 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 21600-21609 + 1, 2, 1, 4, 3, 2, 1, 30, 29, 28, // 21610-21619 + 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 21620-21629 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 21630-21639 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 12, // 21640-21649 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 21650-21659 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 21660-21669 + 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 21670-21679 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 21680-21689 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 21690-21699 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 21700-21709 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 21710-21719 + 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 21720-21729 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 12, // 21730-21739 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 21740-21749 + 1, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 21750-21759 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 21760-21769 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 21770-21779 + 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 21780-21789 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 21790-21799 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 21800-21809 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 21810-21819 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 21820-21829 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 21830-21839 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 21840-21849 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 21850-21859 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 21860-21869 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 21870-21879 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 21880-21889 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 21890-21899 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 21900-21909 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 21910-21919 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 21920-21929 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 21930-21939 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 21940-21949 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 21950-21959 + 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 21960-21969 + 7, 6, 5, 4, 3, 2, 1, 14, 13, 12, // 21970-21979 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 21980-21989 + 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 21990-21999 + 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 22000-22009 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 22010-22019 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 22020-22029 + 1, 6, 5, 4, 3, 2, 1, 2, 1, 12, // 22030-22039 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 22040-22049 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 22050-22059 + 3, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 22060-22069 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 22070-22079 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 22080-22089 + 1, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 22090-22099 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 22100-22109 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 22110-22119 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 22120-22129 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 22130-22139 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 22140-22149 + 3, 2, 1, 4, 3, 2, 1, 2, 1, 12, // 22150-22159 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 22160-22169 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 22170-22179 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 22180-22189 + 3, 2, 1, 36, 35, 34, 33, 32, 31, 30, // 22190-22199 + 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 22200-22209 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 22210-22219 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 22220-22229 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 22230-22239 + 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 22240-22249 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 22250-22259 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 22260-22269 + 1, 2, 1, 4, 3, 2, 1, 2, 1, 4, // 22270-22279 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 22280-22289 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 22290-22299 + 3, 2, 1, 4, 3, 2, 1, 36, 35, 34, // 22300-22309 + 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, // 22310-22319 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 22320-22329 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 22330-22339 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 18, // 22340-22349 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 22350-22359 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 12, // 22360-22369 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 22370-22379 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 22380-22389 + 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 22390-22399 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 24, // 22400-22409 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 22410-22419 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 22420-22429 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 22430-22439 + 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 22440-22449 + 3, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 22450-22459 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 22460-22469 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 22470-22479 + 1, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 22480-22489 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 22490-22499 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 22500-22509 + 1, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 22510-22519 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 22520-22529 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 22530-22539 + 1, 2, 1, 6, 5, 4, 3, 2, 1, 18, // 22540-22549 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 22550-22559 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 22560-22569 + 1, 2, 1, 40, 39, 38, 37, 36, 35, 34, // 22570-22579 + 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, // 22580-22589 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 22590-22599 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 22600-22609 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 22610-22619 + 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 22620-22629 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 4, // 22630-22639 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 22640-22649 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 22650-22659 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 22660-22669 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 22670-22679 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 22680-22689 + 1, 6, 5, 4, 3, 2, 1, 2, 1, 10, // 22690-22699 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 22700-22709 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 22710-22719 + 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 22720-22729 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 22730-22739 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 22740-22749 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 22750-22759 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 22760-22769 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 22770-22779 + 3, 2, 1, 4, 3, 2, 1, 20, 19, 18, // 22780-22789 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 22790-22799 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 22800-22809 + 1, 6, 5, 4, 3, 2, 1, 36, 35, 34, // 22810-22819 + 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, // 22820-22829 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 22830-22839 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 22840-22849 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 22850-22859 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 22860-22869 + 1, 6, 5, 4, 3, 2, 1, 24, 23, 22, // 22870-22879 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 22880-22889 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 22890-22899 + 1, 6, 5, 4, 3, 2, 1, 14, 13, 12, // 22900-22909 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 22910-22919 + 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 22920-22929 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 22930-22939 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 22940-22949 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 22950-22959 + 1, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 22960-22969 + 3, 2, 1, 20, 19, 18, 17, 16, 15, 14, // 22970-22979 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 22980-22989 + 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 22990-22999 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 23000-23009 + 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 23010-23019 + 1, 6, 5, 4, 3, 2, 1, 2, 1, 10, // 23020-23029 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 23030-23039 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 23040-23049 + 3, 2, 1, 4, 3, 2, 1, 2, 1, 4, // 23050-23059 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 23060-23069 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 23070-23079 + 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 23080-23089 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 23090-23099 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 23100-23109 + 7, 6, 5, 4, 3, 2, 1, 14, 13, 12, // 23110-23119 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 23120-23129 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 23130-23139 + 3, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 23140-23149 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 23150-23159 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 23160-23169 + 3, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 23170-23179 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 23180-23189 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 23190-23199 + 1, 2, 1, 6, 5, 4, 3, 2, 1, 18, // 23200-23209 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 23210-23219 + 7, 6, 5, 4, 3, 2, 1, 24, 23, 22, // 23220-23229 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 23230-23239 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 23240-23249 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 23250-23259 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 23260-23269 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 23270-23279 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 23280-23289 + 1, 2, 1, 4, 3, 2, 1, 14, 13, 12, // 23290-23299 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 23300-23309 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 23310-23319 + 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 23320-23329 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 18, // 23330-23339 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 23340-23349 + 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 23350-23359 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 23360-23369 + 1, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 23370-23379 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 23380-23389 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 23390-23399 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 23400-23409 + 7, 6, 5, 4, 3, 2, 1, 14, 13, 12, // 23410-23419 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 23420-23429 + 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 23430-23439 + 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 23440-23449 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 23450-23459 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 23460-23469 + 3, 2, 1, 24, 23, 22, 21, 20, 19, 18, // 23470-23479 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 23480-23489 + 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 23490-23499 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 22, // 23500-23509 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 23510-23519 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 23520-23529 + 1, 6, 5, 4, 3, 2, 1, 2, 1, 10, // 23530-23539 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 23540-23549 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 23550-23559 + 1, 2, 1, 4, 3, 2, 1, 14, 13, 12, // 23560-23569 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 23570-23579 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 23580-23589 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 23590-23599 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 14, // 23600-23609 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 23610-23619 + 3, 2, 1, 4, 3, 2, 1, 2, 1, 4, // 23620-23629 + 3, 2, 1, 30, 29, 28, 27, 26, 25, 24, // 23630-23639 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 23640-23649 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 23650-23659 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 23660-23669 + 1, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 23670-23679 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 30, // 23680-23689 + 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 23690-23699 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 23700-23709 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 22, // 23710-23719 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 23720-23729 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 23730-23739 + 1, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 23740-23749 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 23750-23759 + 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 23760-23769 + 3, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 23770-23779 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 23780-23789 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 23790-23799 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 23800-23809 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 23810-23819 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 23820-23829 + 1, 2, 1, 24, 23, 22, 21, 20, 19, 18, // 23830-23839 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 23840-23849 + 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 23850-23859 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 23860-23869 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 23870-23879 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 23880-23889 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 10, // 23890-23899 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 23900-23909 + 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 23910-23919 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 28, // 23920-23929 + 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 23930-23939 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 23940-23949 + 7, 6, 5, 4, 3, 2, 1, 14, 13, 12, // 23950-23959 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 23960-23969 + 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 23970-23979 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 23980-23989 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 23990-23999 + 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 24000-24009 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 24010-24019 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 14, // 24020-24029 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 24030-24039 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 24040-24049 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 24050-24059 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 24060-24069 + 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 24070-24079 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 24080-24089 + 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 24090-24099 + 3, 2, 1, 4, 3, 2, 1, 2, 1, 4, // 24100-24109 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 24110-24119 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 24120-24129 + 3, 2, 1, 4, 3, 2, 1, 14, 13, 12, // 24130-24139 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 24140-24149 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 24150-24159 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 24160-24169 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 24170-24179 + 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 24180-24189 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 24190-24199 + 3, 2, 1, 20, 19, 18, 17, 16, 15, 14, // 24200-24209 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 24210-24219 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 10, // 24220-24229 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 24230-24239 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 24240-24249 + 1, 30, 29, 28, 27, 26, 25, 24, 23, 22, // 24250-24259 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 24260-24269 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 24270-24279 + 1, 36, 35, 34, 33, 32, 31, 30, 29, 28, // 24280-24289 + 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 24290-24299 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 24300-24309 + 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 24310-24319 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 24320-24329 + 7, 6, 5, 4, 3, 2, 1, 22, 21, 20, // 24330-24339 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 24340-24349 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 24350-24359 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 24360-24369 + 1, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 24370-24379 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 24380-24389 + 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 24390-24399 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 24400-24409 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 24410-24419 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 24420-24429 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 24430-24439 + 3, 2, 1, 26, 25, 24, 23, 22, 21, 20, // 24440-24449 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 24450-24459 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 24460-24469 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 24470-24479 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 24480-24489 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 24490-24499 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 24500-24509 + 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 24510-24519 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 24520-24529 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 24530-24539 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 24540-24549 + 1, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 24550-24559 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 24560-24569 + 1, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 24570-24579 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 24580-24589 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 24590-24599 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 24600-24609 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 24610-24619 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 24620-24629 + 1, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 24630-24639 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 24640-24649 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 24650-24659 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 24660-24669 + 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 24670-24679 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 24680-24689 + 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 24690-24699 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 24, // 24700-24709 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 24710-24719 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 24720-24729 + 3, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 24730-24739 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 24740-24749 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 24750-24759 + 3, 2, 1, 4, 3, 2, 1, 14, 13, 12, // 24760-24769 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 24770-24779 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 24780-24789 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 10, // 24790-24799 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 24800-24809 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 24810-24819 + 1, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 24820-24829 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 24830-24839 + 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 24840-24849 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 24850-24859 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 24860-24869 + 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 24870-24879 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 24880-24889 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 24890-24899 + 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 24900-24909 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 4, // 24910-24919 + 3, 2, 1, 20, 19, 18, 17, 16, 15, 14, // 24920-24929 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 24930-24939 + 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 24940-24949 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 24950-24959 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 24960-24969 + 1, 6, 5, 4, 3, 2, 1, 2, 1, 10, // 24970-24979 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 24, // 24980-24989 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 24990-24999 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 25000-25009 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 25010-25019 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 25020-25029 + 1, 2, 1, 4, 3, 2, 1, 20, 19, 18, // 25030-25039 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 25040-25049 + 7, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 25050-25059 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 25060-25069 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 25070-25079 + 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 25080-25089 + 7, 6, 5, 4, 3, 2, 1, 14, 13, 12, // 25090-25099 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 25100-25109 + 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 25110-25119 + 1, 6, 5, 4, 3, 2, 1, 20, 19, 18, // 25120-25129 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 25130-25139 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 25140-25149 + 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 25150-25159 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 25160-25169 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 25170-25179 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 30, // 25180-25189 + 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 25190-25199 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 25200-25209 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 25210-25219 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 25220-25229 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 25230-25239 + 3, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 25240-25249 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 25250-25259 + 1, 40, 39, 38, 37, 36, 35, 34, 33, 32, // 25260-25269 + 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, // 25270-25279 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 25280-25289 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 25290-25299 + 1, 2, 1, 4, 3, 2, 1, 2, 1, 12, // 25300-25309 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 25310-25319 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 25320-25329 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 25330-25339 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 25340-25349 + 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 25350-25359 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 25360-25369 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 25370-25379 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 25380-25389 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 25390-25399 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 25400-25409 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 25410-25419 + 3, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 25420-25429 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 25430-25439 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 25440-25449 + 3, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 25450-25459 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 25460-25469 + 1, 52, 51, 50, 49, 48, 47, 46, 45, 44, // 25470-25479 + 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, // 25480-25489 + 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, // 25490-25499 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 25500-25509 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 25510-25519 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 25520-25529 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 25530-25539 + 1, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 25540-25549 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 25550-25559 + 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 25560-25569 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 4, // 25570-25579 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 25580-25589 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 25590-25599 + 1, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 25600-25609 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 25610-25619 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 25620-25629 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 25630-25639 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 25640-25649 + 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 25650-25659 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 25660-25669 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 14, // 25670-25679 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 25680-25689 + 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 25690-25699 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 25700-25709 + 7, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 25710-25719 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 25720-25729 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 25730-25739 + 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 25740-25749 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 25750-25759 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 25760-25769 + 1, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 25770-25779 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 25780-25789 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 25790-25799 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 25800-25809 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 22, // 25810-25819 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 25820-25829 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 25830-25839 + 1, 6, 5, 4, 3, 2, 1, 2, 1, 18, // 25840-25849 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 25850-25859 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 25860-25869 + 3, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 25870-25879 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 25880-25889 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 25890-25899 + 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 25900-25909 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 25910-25919 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 25920-25929 + 1, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 25930-25939 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 25940-25949 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 25950-25959 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 25960-25969 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 25970-25979 + 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 25980-25989 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 4, // 25990-25999 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 26000-26009 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 26010-26019 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 26020-26029 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 26030-26039 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 26040-26049 + 3, 2, 1, 30, 29, 28, 27, 26, 25, 24, // 26050-26059 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 26060-26069 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 26070-26079 + 3, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 26080-26089 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 26090-26099 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 26100-26109 + 1, 2, 1, 6, 5, 4, 3, 2, 1, 22, // 26110-26119 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 26120-26129 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 26130-26139 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 26140-26149 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 26150-26159 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 26160-26169 + 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 26170-26179 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 14, // 26180-26189 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 26190-26199 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 18, // 26200-26209 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 26210-26219 + 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 26220-26229 + 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 26230-26239 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 26240-26249 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 26250-26259 + 1, 2, 1, 4, 3, 2, 1, 26, 25, 24, // 26260-26269 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 26270-26279 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 26280-26289 + 3, 2, 1, 4, 3, 2, 1, 12, 11, 10, // 26290-26299 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 26300-26309 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 26310-26319 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 26320-26329 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 26330-26339 + 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 26340-26349 + 7, 6, 5, 4, 3, 2, 1, 14, 13, 12, // 26350-26359 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 26360-26369 + 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 26370-26379 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 26380-26389 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 26390-26399 + 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 26400-26409 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 26410-26419 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 26420-26429 + 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 26430-26439 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 26440-26449 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 20, // 26450-26459 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 26460-26469 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 26470-26479 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 26480-26489 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 26490-26499 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 26500-26509 + 3, 2, 1, 26, 25, 24, 23, 22, 21, 20, // 26510-26519 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 26520-26529 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 26530-26539 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 26540-26549 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 26550-26559 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 26560-26569 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 26570-26579 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 26580-26589 + 1, 6, 5, 4, 3, 2, 1, 30, 29, 28, // 26590-26599 + 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 26600-26609 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 26610-26619 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 26620-26629 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 26630-26639 + 1, 6, 5, 4, 3, 2, 1, 22, 21, 20, // 26640-26649 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 26650-26659 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 26660-26669 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 26670-26679 + 1, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 26680-26689 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 26690-26699 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 26700-26709 + 1, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 26710-26719 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 26720-26729 + 1, 6, 5, 4, 3, 2, 1, 22, 21, 20, // 26730-26739 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 26740-26749 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 26750-26759 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 26760-26769 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 26770-26779 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 26780-26789 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 26790-26799 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 26800-26809 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 26810-26819 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 26820-26829 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 10, // 26830-26839 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 26840-26849 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 26850-26859 + 1, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 26860-26869 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 26870-26879 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 26880-26889 + 1, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 26890-26899 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 26900-26909 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 26910-26919 + 1, 6, 5, 4, 3, 2, 1, 20, 19, 18, // 26920-26929 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 26930-26939 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 26940-26949 + 1, 2, 1, 6, 5, 4, 3, 2, 1, 22, // 26950-26959 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 26960-26969 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 26970-26979 + 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 26980-26989 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 26990-26999 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 27000-27009 + 1, 6, 5, 4, 3, 2, 1, 14, 13, 12, // 27010-27019 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 27020-27029 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 27030-27039 + 3, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 27040-27049 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 27050-27059 + 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 27060-27069 + 3, 2, 1, 4, 3, 2, 1, 14, 13, 12, // 27070-27079 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 27080-27089 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 27090-27099 + 3, 2, 1, 4, 3, 2, 1, 2, 1, 18, // 27100-27109 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 27110-27119 + 7, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 27120-27129 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 27130-27139 + 3, 2, 1, 36, 35, 34, 33, 32, 31, 30, // 27140-27149 + 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 27150-27159 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 27160-27169 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 27170-27179 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 27180-27189 + 1, 6, 5, 4, 3, 2, 1, 14, 13, 12, // 27190-27199 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 27200-27209 + 1, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 27210-27219 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 27220-27229 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 27230-27239 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 27240-27249 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 27250-27259 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 27260-27269 + 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 27270-27279 + 1, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 27280-27289 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 30, // 27290-27299 + 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 27300-27309 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 27310-27319 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 27320-27329 + 7, 6, 5, 4, 3, 2, 1, 24, 23, 22, // 27330-27339 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 27340-27349 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 27350-27359 + 1, 6, 5, 4, 3, 2, 1, 30, 29, 28, // 27360-27369 + 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 27370-27379 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 27380-27389 + 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 27390-27399 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 18, // 27400-27409 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 27410-27419 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 27420-27429 + 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 27430-27439 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 27440-27449 + 7, 6, 5, 4, 3, 2, 1, 22, 21, 20, // 27450-27459 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 27460-27469 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 27470-27479 + 1, 6, 5, 4, 3, 2, 1, 22, 21, 20, // 27480-27489 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 27490-27499 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 27500-27509 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 27510-27519 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 10, // 27520-27529 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 27530-27539 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 27540-27549 + 1, 30, 29, 28, 27, 26, 25, 24, 23, 22, // 27550-27559 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 27560-27569 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 27570-27579 + 1, 2, 1, 28, 27, 26, 25, 24, 23, 22, // 27580-27589 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 27590-27599 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 27600-27609 + 1, 6, 5, 4, 3, 2, 1, 14, 13, 12, // 27610-27619 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 27620-27629 + 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 27630-27639 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 27640-27649 + 3, 2, 1, 20, 19, 18, 17, 16, 15, 14, // 27650-27659 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 27660-27669 + 3, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 27670-27679 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 27680-27689 + 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 27690-27699 + 1, 32, 31, 30, 29, 28, 27, 26, 25, 24, // 27700-27709 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 27710-27719 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 27720-27729 + 3, 2, 1, 4, 3, 2, 1, 2, 1, 4, // 27730-27739 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 27740-27749 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 27750-27759 + 3, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 27760-27769 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 27770-27779 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 27780-27789 + 1, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 27790-27799 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 27800-27809 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 27810-27819 + 3, 2, 1, 4, 3, 2, 1, 20, 19, 18, // 27820-27829 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 27830-27839 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 27840-27849 + 1, 32, 31, 30, 29, 28, 27, 26, 25, 24, // 27850-27859 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 27860-27869 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 27870-27879 + 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 27880-27889 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 27890-27899 + 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 27900-27909 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 22, // 27910-27919 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 27920-27929 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 27930-27939 + 1, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 27940-27949 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 27950-27959 + 1, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 27960-27969 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 27970-27979 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 27980-27989 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 27990-27999 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 28000-28009 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 28010-28019 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 28020-28029 + 1, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 28030-28039 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 28040-28049 + 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 28050-28059 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 28060-28069 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 28070-28079 + 1, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 28080-28089 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 10, // 28090-28099 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 28100-28109 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 28110-28119 + 3, 2, 1, 28, 27, 26, 25, 24, 23, 22, // 28120-28129 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 28130-28139 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 28140-28149 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 28150-28159 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 28160-28169 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 28170-28179 + 1, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 28180-28189 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 28190-28199 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 28200-28209 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 28210-28219 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 48, // 28220-28229 + 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, // 28230-28239 + 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, // 28240-28249 + 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 28250-28259 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 28260-28269 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 4, // 28270-28279 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 28280-28289 + 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 28290-28299 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 10, // 28300-28309 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 30, // 28310-28319 + 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 28320-28329 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 28330-28339 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 28340-28349 + 1, 36, 35, 34, 33, 32, 31, 30, 29, 28, // 28350-28359 + 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 28360-28369 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 28370-28379 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 28380-28389 + 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 28390-28399 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 28400-28409 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 28410-28419 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 28420-28429 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 28430-28439 + 7, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 28440-28449 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 28450-28459 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 28460-28469 + 7, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 28470-28479 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 28480-28489 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 14, // 28490-28499 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 28500-28509 + 3, 2, 1, 4, 3, 2, 1, 20, 19, 18, // 28510-28519 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 28520-28529 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 28530-28539 + 1, 6, 5, 4, 3, 2, 1, 2, 1, 10, // 28540-28549 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 28550-28559 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 28560-28569 + 1, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 28570-28579 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 28580-28589 + 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 28590-28599 + 3, 2, 1, 4, 3, 2, 1, 12, 11, 10, // 28600-28609 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 28610-28619 + 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 28620-28629 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 28630-28639 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 28640-28649 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 28650-28659 + 1, 2, 1, 6, 5, 4, 3, 2, 1, 18, // 28660-28669 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 28670-28679 + 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 28680-28689 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 28690-28699 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 28700-28709 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 28710-28719 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 22, // 28720-28729 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 28730-28739 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 28740-28749 + 1, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 28750-28759 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 28760-28769 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 28770-28779 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 28780-28789 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 28790-28799 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 28800-28809 + 3, 2, 1, 4, 3, 2, 1, 20, 19, 18, // 28810-28819 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 28820-28829 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 28830-28839 + 3, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 28840-28849 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 28850-28859 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 28860-28869 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 22, // 28870-28879 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 28880-28889 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 28890-28899 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 28900-28909 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 28910-28919 + 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 28920-28929 + 3, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 28930-28939 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 28940-28949 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 28950-28959 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 28960-28969 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 30, // 28970-28979 + 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 28980-28989 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 28990-28999 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 29000-29009 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 29010-29019 + 1, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 29020-29029 + 3, 2, 1, 26, 25, 24, 23, 22, 21, 20, // 29030-29039 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 29040-29049 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 29050-29059 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 29060-29069 + 7, 6, 5, 4, 3, 2, 1, 24, 23, 22, // 29070-29079 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 29080-29089 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 29090-29099 + 1, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 29100-29109 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 29110-29119 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 29120-29129 + 1, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 29130-29139 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 29140-29149 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 29150-29159 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 29160-29169 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 29170-29179 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 29180-29189 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 29190-29199 + 1, 6, 5, 4, 3, 2, 1, 2, 1, 12, // 29200-29209 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 29210-29219 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 29220-29229 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 29230-29239 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 29240-29249 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 29250-29259 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 29260-29269 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 29270-29279 + 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 29280-29289 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 29290-29299 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 29300-29309 + 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 29310-29319 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 29320-29329 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 29330-29339 + 7, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 29340-29349 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 29350-29359 + 3, 2, 1, 20, 19, 18, 17, 16, 15, 14, // 29360-29369 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 29370-29379 + 3, 2, 1, 4, 3, 2, 1, 2, 1, 10, // 29380-29389 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 29390-29399 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 29400-29409 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 29410-29419 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 29420-29429 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 29430-29439 + 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 29440-29449 + 3, 2, 1, 20, 19, 18, 17, 16, 15, 14, // 29450-29459 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 29460-29469 + 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 29470-29479 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 29480-29489 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 29490-29499 + 1, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 29500-29509 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 29510-29519 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 29520-29529 + 1, 6, 5, 4, 3, 2, 1, 30, 29, 28, // 29530-29539 + 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 29540-29549 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 29550-29559 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 4, // 29560-29569 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 29570-29579 + 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 29580-29589 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 29590-29599 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 29600-29609 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 29610-29619 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 29620-29629 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 29630-29639 + 1, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 29640-29649 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 29650-29659 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 29660-29669 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 29670-29679 + 3, 2, 1, 34, 33, 32, 31, 30, 29, 28, // 29680-29689 + 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 29690-29699 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 29700-29709 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 29710-29719 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 29720-29729 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 29730-29739 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 29740-29749 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 29750-29759 + 1, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 29760-29769 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 29770-29779 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 29780-29789 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 29790-29799 + 3, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 29800-29809 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 29810-29819 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 29820-29829 + 3, 2, 1, 4, 3, 2, 1, 14, 13, 12, // 29830-29839 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 29840-29849 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 29850-29859 + 3, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 29860-29869 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 29870-29879 + 1, 36, 35, 34, 33, 32, 31, 30, 29, 28, // 29880-29889 + 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 29890-29899 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 29900-29909 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 29910-29919 + 1, 6, 5, 4, 3, 2, 1, 20, 19, 18, // 29920-29929 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 29930-29939 + 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 29940-29949 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 24, // 29950-29959 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 29960-29969 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 29970-29979 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 22, // 29980-29989 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 29990-29999 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 30000-30009 + 1, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 30010-30019 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 30020-30029 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 30030-30039 + 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 30040-30049 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 30050-30059 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 30060-30069 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 30070-30079 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 30080-30089 + 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 30090-30099 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 30100-30109 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 14, // 30110-30119 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 30120-30129 + 3, 2, 1, 4, 3, 2, 1, 2, 1, 22, // 30130-30139 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 30140-30149 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 30150-30159 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 30160-30169 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 30170-30179 + 1, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 30180-30189 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 30190-30199 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 30200-30209 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 30210-30219 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 30220-30229 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 30230-30239 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 30240-30249 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 10, // 30250-30259 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 30260-30269 + 1, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 30270-30279 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 30280-30289 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 30290-30299 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 30300-30309 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 30310-30319 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 30320-30329 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 30330-30339 + 1, 6, 5, 4, 3, 2, 1, 20, 19, 18, // 30340-30349 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 30350-30359 + 7, 6, 5, 4, 3, 2, 1, 22, 21, 20, // 30360-30369 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 30370-30379 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 30380-30389 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 30390-30399 + 3, 2, 1, 24, 23, 22, 21, 20, 19, 18, // 30400-30409 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 30410-30419 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 30420-30429 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 30430-30439 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 30440-30449 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 30450-30459 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 22, // 30460-30469 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 30470-30479 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 30480-30489 + 1, 2, 1, 4, 3, 2, 1, 12, 11, 10, // 30490-30499 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 30500-30509 + 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 30510-30519 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 30520-30529 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 30530-30539 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 30540-30549 + 3, 2, 1, 4, 3, 2, 1, 2, 1, 18, // 30550-30559 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 30560-30569 + 7, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 30570-30579 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 30580-30589 + 3, 2, 1, 38, 37, 36, 35, 34, 33, 32, // 30590-30599 + 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, // 30600-30609 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 30610-30619 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 30620-30629 + 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 30630-30639 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 30640-30649 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 30650-30659 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 30660-30669 + 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 30670-30679 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 30680-30689 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 30690-30699 + 3, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 30700-30709 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 30710-30719 + 7, 6, 5, 4, 3, 2, 1, 30, 29, 28, // 30720-30729 + 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 30730-30739 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 30740-30749 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 30750-30759 + 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 30760-30769 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 30770-30779 + 1, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 30780-30789 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 30790-30799 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 30800-30809 + 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 30810-30819 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 30820-30829 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 30830-30839 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 30840-30849 + 1, 2, 1, 6, 5, 4, 3, 2, 1, 10, // 30850-30859 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 30860-30869 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 30870-30879 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 30880-30889 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 30890-30899 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 30900-30909 + 1, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 30910-30919 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 30920-30929 + 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 30930-30939 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 22, // 30940-30949 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 30950-30959 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 30960-30969 + 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 30970-30979 + 3, 2, 1, 30, 29, 28, 27, 26, 25, 24, // 30980-30989 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 30990-30999 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 31000-31009 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 14, // 31010-31019 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 31020-31029 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 31030-31039 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 31040-31049 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 31050-31059 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 10, // 31060-31069 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 31070-31079 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 31080-31089 + 1, 30, 29, 28, 27, 26, 25, 24, 23, 22, // 31090-31099 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 31100-31109 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 31110-31119 + 1, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 31120-31129 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 31130-31139 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 31140-31149 + 1, 2, 1, 6, 5, 4, 3, 2, 1, 18, // 31150-31159 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 31160-31169 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 31170-31179 + 1, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 31180-31189 + 3, 2, 1, 26, 25, 24, 23, 22, 21, 20, // 31190-31199 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 31200-31209 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 31210-31219 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 31220-31229 + 1, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 31230-31239 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 4, // 31240-31249 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 31250-31259 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 31260-31269 + 1, 6, 5, 4, 3, 2, 1, 30, 29, 28, // 31270-31279 + 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 31280-31289 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 31290-31299 + 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 31300-31309 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 31310-31319 + 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 31320-31329 + 3, 2, 1, 4, 3, 2, 1, 20, 19, 18, // 31330-31339 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 31340-31349 + 7, 6, 5, 4, 3, 2, 1, 22, 21, 20, // 31350-31359 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 31360-31369 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 31370-31379 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 31380-31389 + 1, 2, 1, 4, 3, 2, 1, 72, 71, 70, // 31390-31399 + 69, 68, 67, 66, 65, 64, 63, 62, 61, 60, // 31400-31409 + 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, // 31410-31419 + 49, 48, 47, 46, 45, 44, 43, 42, 41, 40, // 31420-31429 + 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, // 31430-31439 + 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 31440-31449 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 31450-31459 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 31460-31469 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 31470-31479 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 22, // 31480-31489 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 31490-31499 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 31500-31509 + 1, 2, 1, 4, 3, 2, 1, 14, 13, 12, // 31510-31519 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 31520-31529 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 31530-31539 + 1, 2, 1, 4, 3, 2, 1, 20, 19, 18, // 31540-31549 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 31550-31559 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 31560-31569 + 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 31570-31579 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 31580-31589 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 31590-31599 + 1, 6, 5, 4, 3, 2, 1, 20, 19, 18, // 31600-31609 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 31610-31619 + 7, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 31620-31629 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 31630-31639 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 31640-31649 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 31650-31659 + 3, 2, 1, 4, 3, 2, 1, 20, 19, 18, // 31660-31669 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 31670-31679 + 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 31680-31689 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 22, // 31690-31699 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 31700-31709 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 31710-31719 + 1, 2, 1, 4, 3, 2, 1, 2, 1, 12, // 31720-31729 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 31730-31739 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 31740-31749 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 31750-31759 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 31760-31769 + 1, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 31770-31779 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 31780-31789 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 18, // 31790-31799 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 31800-31809 + 7, 6, 5, 4, 3, 2, 1, 30, 29, 28, // 31810-31819 + 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 31820-31829 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 31830-31839 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 10, // 31840-31849 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 31850-31859 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 31860-31869 + 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 31870-31879 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 31880-31889 + 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 31890-31899 + 7, 6, 5, 4, 3, 2, 1, 50, 49, 48, // 31900-31909 + 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, // 31910-31919 + 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, // 31920-31929 + 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 31930-31939 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 31940-31949 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 31950-31959 + 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 31960-31969 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 31970-31979 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 31980-31989 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 31990-31999 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 18, // 32000-32009 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 32010-32019 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 22, // 32020-32029 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 32030-32039 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 32040-32049 + 1, 6, 5, 4, 3, 2, 1, 2, 1, 4, // 32050-32059 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 32060-32069 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 32070-32079 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 10, // 32080-32089 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 32090-32099 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 32100-32109 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 22, // 32110-32119 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 32120-32129 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 32130-32139 + 1, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 32140-32149 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 32150-32159 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 32160-32169 + 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 32170-32179 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 32180-32189 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 32190-32199 + 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 32200-32209 + 3, 2, 1, 20, 19, 18, 17, 16, 15, 14, // 32210-32219 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 32220-32229 + 3, 2, 1, 4, 3, 2, 1, 14, 13, 12, // 32230-32239 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 32240-32249 + 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 32250-32259 + 1, 36, 35, 34, 33, 32, 31, 30, 29, 28, // 32260-32269 + 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 32270-32279 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 32280-32289 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 4, // 32290-32299 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 32300-32309 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 32310-32319 + 1, 2, 1, 4, 3, 2, 1, 14, 13, 12, // 32320-32329 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 32330-32339 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 32340-32349 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 32350-32359 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 32360-32369 + 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 32370-32379 + 1, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 32380-32389 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 32390-32399 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 32400-32409 + 1, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 32410-32419 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 32420-32429 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 32430-32439 + 1, 2, 1, 24, 23, 22, 21, 20, 19, 18, // 32440-32449 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 32450-32459 + 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 32460-32469 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 32470-32479 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 32480-32489 + 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 32490-32499 + 3, 2, 1, 4, 3, 2, 1, 24, 23, 22, // 32500-32509 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 32510-32519 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 32520-32529 + 1, 2, 1, 4, 3, 2, 1, 24, 23, 22, // 32530-32539 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 32540-32549 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 32550-32559 + 1, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 32560-32569 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 32570-32579 + 7, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 32580-32589 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 32590-32599 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 32600-32609 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 32610-32619 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 32620-32629 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 32630-32639 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 32640-32649 + 3, 2, 1, 34, 33, 32, 31, 30, 29, 28, // 32650-32659 + 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 32660-32669 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 32670-32679 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 32680-32689 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 32690-32699 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 32700-32709 + 3, 2, 1, 4, 3, 2, 1, 2, 1, 30, // 32710-32719 + 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 32720-32729 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 32730-32739 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 22, // 32740-32749 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 32750-32759 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 32760-32769 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 32770-32779 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 32780-32789 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 32790-32799 + 1, 2, 1, 28, 27, 26, 25, 24, 23, 22, // 32800-32809 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 32810-32819 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 32820-32829 + 1, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 32830-32839 + 3, 2, 1, 26, 25, 24, 23, 22, 21, 20, // 32840-32849 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 32850-32859 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 32860-32869 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 32870-32879 + 7, 6, 5, 4, 3, 2, 1, 22, 21, 20, // 32880-32889 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 32890-32899 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 32900-32909 + 1, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 32910-32919 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 32920-32929 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 32930-32939 + 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 32940-32949 + 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 32950-32959 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 32960-32969 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 32970-32979 + 3, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 32980-32989 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 14, // 32990-32999 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 33000-33009 + 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 33010-33019 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 33020-33029 + 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 33030-33039 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 33040-33049 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 33050-33059 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 33060-33069 + 1, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 33070-33079 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 33080-33089 + 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 33090-33099 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 33100-33109 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 30, // 33110-33119 + 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 33120-33129 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 33130-33139 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 33140-33149 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 33150-33159 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 33160-33169 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 33170-33179 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 33180-33189 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 33190-33199 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 33200-33209 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 33210-33219 + 3, 2, 1, 24, 23, 22, 21, 20, 19, 18, // 33220-33229 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 33230-33239 + 7, 6, 5, 4, 3, 2, 1, 40, 39, 38, // 33240-33249 + 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, // 33250-33259 + 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 33260-33269 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 33270-33279 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 12, // 33280-33289 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 33290-33299 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 33300-33309 + 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 33310-33319 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 33320-33329 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 33330-33339 + 3, 2, 1, 4, 3, 2, 1, 2, 1, 4, // 33340-33349 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 18, // 33350-33359 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 33360-33369 + 7, 6, 5, 4, 3, 2, 1, 14, 13, 12, // 33370-33379 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 33380-33389 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 33390-33399 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 33400-33409 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 33410-33419 + 7, 6, 5, 4, 3, 2, 1, 30, 29, 28, // 33420-33429 + 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 33430-33439 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 33440-33449 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 33450-33459 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 33460-33469 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 33470-33479 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 33480-33489 + 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 33490-33499 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 33500-33509 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 33510-33519 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 33520-33529 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 33530-33539 + 7, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 33540-33549 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 33550-33559 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 33560-33569 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 33570-33579 + 1, 6, 5, 4, 3, 2, 1, 2, 1, 10, // 33580-33589 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 33590-33599 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 33600-33609 + 3, 2, 1, 4, 3, 2, 1, 2, 1, 4, // 33610-33619 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 33620-33629 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 33630-33639 + 1, 6, 5, 4, 3, 2, 1, 32, 31, 30, // 33640-33649 + 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 33650-33659 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 33660-33669 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 24, // 33670-33679 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 33680-33689 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 33690-33699 + 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 33700-33709 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 33710-33719 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 33720-33729 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 33730-33739 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 33740-33749 + 1, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 33750-33759 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 4, // 33760-33769 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 33770-33779 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 33780-33789 + 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 33790-33799 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 33800-33809 + 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 33810-33819 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 22, // 33820-33829 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 33830-33839 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 33840-33849 + 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 33850-33859 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 33860-33869 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 33870-33879 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 33880-33889 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 33890-33899 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 33900-33909 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 33910-33919 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 33920-33929 + 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 33930-33939 + 1, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 33940-33949 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 33950-33959 + 1, 6, 5, 4, 3, 2, 1, 30, 29, 28, // 33960-33969 + 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 33970-33979 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 33980-33989 + 7, 6, 5, 4, 3, 2, 1, 22, 21, 20, // 33990-33999 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 34000-34009 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 34010-34019 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 34020-34029 + 1, 2, 1, 6, 5, 4, 3, 2, 1, 18, // 34030-34039 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 34040-34049 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 34050-34059 + 1, 62, 61, 60, 59, 58, 57, 56, 55, 54, // 34060-34069 + 53, 52, 51, 50, 49, 48, 47, 46, 45, 44, // 34070-34079 + 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, // 34080-34089 + 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, // 34090-34099 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 34100-34109 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 34110-34119 + 3, 2, 1, 4, 3, 2, 1, 2, 1, 12, // 34120-34129 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 34130-34139 + 1, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 34140-34149 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 12, // 34150-34159 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 34160-34169 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 34170-34179 + 3, 2, 1, 28, 27, 26, 25, 24, 23, 22, // 34180-34189 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 34190-34199 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 34200-34209 + 1, 2, 1, 4, 3, 2, 1, 14, 13, 12, // 34210-34219 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 34220-34229 + 1, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 34230-34239 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 34240-34249 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 34250-34259 + 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 34260-34269 + 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 34270-34279 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 34280-34289 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 34290-34299 + 1, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 34300-34309 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 34310-34319 + 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 34320-34329 + 7, 6, 5, 4, 3, 2, 1, 14, 13, 12, // 34330-34339 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 34340-34349 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 34350-34359 + 1, 6, 5, 4, 3, 2, 1, 2, 1, 12, // 34360-34369 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 34370-34379 + 1, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 34380-34389 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 34390-34399 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 34400-34409 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 34410-34419 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 34420-34429 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 34430-34439 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 34440-34449 + 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 34450-34459 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 34460-34469 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 34470-34479 + 3, 2, 1, 4, 3, 2, 1, 12, 11, 10, // 34480-34489 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 34490-34499 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 34500-34509 + 1, 2, 1, 6, 5, 4, 3, 2, 1, 18, // 34510-34519 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 34520-34529 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 34530-34539 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 34, // 34540-34549 + 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, // 34550-34559 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 34560-34569 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 34570-34579 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 34580-34589 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 34590-34599 + 3, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 34600-34609 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 34610-34619 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 34620-34629 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 34630-34639 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 34640-34649 + 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 34650-34659 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 34660-34669 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 34670-34679 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 34680-34689 + 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 34690-34699 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 34700-34709 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 34710-34719 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 34720-34729 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 34730-34739 + 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 34740-34749 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 4, // 34750-34759 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 34760-34769 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 34770-34779 + 1, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 34780-34789 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 34790-34799 + 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 34800-34809 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 22, // 34810-34819 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 34820-34829 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 34830-34839 + 1, 2, 1, 4, 3, 2, 1, 2, 1, 22, // 34840-34849 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 34850-34859 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 34860-34869 + 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 34870-34879 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 34880-34889 + 7, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 34890-34899 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 34900-34909 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 20, // 34910-34919 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 34920-34929 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 34930-34939 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 34940-34949 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 34950-34959 + 1, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 34960-34969 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 34970-34979 + 1, 42, 41, 40, 39, 38, 37, 36, 35, 34, // 34980-34989 + 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, // 34990-34999 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 35000-35009 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 35010-35019 + 3, 2, 1, 4, 3, 2, 1, 24, 23, 22, // 35020-35029 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 35030-35039 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 35040-35049 + 1, 2, 1, 6, 5, 4, 3, 2, 1, 10, // 35050-35059 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 35060-35069 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 35070-35079 + 1, 2, 1, 6, 5, 4, 3, 2, 1, 10, // 35080-35089 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 35090-35099 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 35100-35109 + 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 35110-35119 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 35120-35129 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 35130-35139 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 35140-35149 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 35150-35159 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 35160-35169 + 1, 30, 29, 28, 27, 26, 25, 24, 23, 22, // 35170-35179 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 35180-35189 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 35190-35199 + 1, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 35200-35209 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 35210-35219 + 1, 6, 5, 4, 3, 2, 1, 24, 23, 22, // 35220-35229 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 35230-35239 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 35240-35249 + 1, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 35250-35259 + 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 35260-35269 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 35270-35279 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 35280-35289 + 1, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 35290-35299 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 35300-35309 + 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 35310-35319 + 3, 2, 1, 4, 3, 2, 1, 12, 11, 10, // 35320-35329 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 35330-35339 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 35340-35349 + 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 35350-35359 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 35360-35369 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 35370-35379 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 35380-35389 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 35390-35399 + 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 35400-35409 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 35410-35419 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 35420-35429 + 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 35430-35439 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 12, // 35440-35449 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 35450-35459 + 1, 30, 29, 28, 27, 26, 25, 24, 23, 22, // 35460-35469 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 35470-35479 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 35480-35489 + 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 35490-35499 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 12, // 35500-35509 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 35510-35519 + 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 35520-35529 + 1, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 35530-35539 + 3, 2, 1, 26, 25, 24, 23, 22, 21, 20, // 35540-35549 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 35550-35559 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 35560-35569 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 35570-35579 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 35580-35589 + 1, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 35590-35599 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 35600-35609 + 7, 6, 5, 4, 3, 2, 1, 54, 53, 52, // 35610-35619 + 51, 50, 49, 48, 47, 46, 45, 44, 43, 42, // 35620-35629 + 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, // 35630-35639 + 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, // 35640-35649 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 35650-35659 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 35660-35669 + 1, 6, 5, 4, 3, 2, 1, 52, 51, 50, // 35670-35679 + 49, 48, 47, 46, 45, 44, 43, 42, 41, 40, // 35680-35689 + 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, // 35690-35699 + 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 35700-35709 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 35710-35719 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 35720-35729 + 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 35730-35739 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 35740-35749 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 35750-35759 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 35760-35769 + 1, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 35770-35779 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 35780-35789 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 35790-35799 + 1, 2, 1, 6, 5, 4, 3, 2, 1, 22, // 35800-35809 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 35810-35819 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 35820-35829 + 1, 6, 5, 4, 3, 2, 1, 2, 1, 12, // 35830-35839 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 35840-35849 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 35850-35859 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 10, // 35860-35869 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 35870-35879 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 35880-35889 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 12, // 35890-35899 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 35900-35909 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 35910-35919 + 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 35920-35929 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 35930-35939 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 35940-35949 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 35950-35959 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 35960-35969 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 35970-35979 + 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 35980-35989 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 35990-35999 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 36000-36009 + 1, 2, 1, 4, 3, 2, 1, 20, 19, 18, // 36010-36019 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 36020-36029 + 7, 6, 5, 4, 3, 2, 1, 24, 23, 22, // 36030-36039 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 36040-36049 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 36050-36059 + 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 36060-36069 + 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 36070-36079 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 36080-36089 + 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 36090-36099 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 22, // 36100-36109 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 36110-36119 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 36120-36129 + 1, 6, 5, 4, 3, 2, 1, 14, 13, 12, // 36130-36139 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 36140-36149 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 36150-36159 + 1, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 36160-36169 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 36170-36179 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 36180-36189 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 36190-36199 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 36200-36209 + 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 36210-36219 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 36220-36229 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 36230-36239 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 36240-36249 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 36250-36259 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 36260-36269 + 7, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 36270-36279 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 36280-36289 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 36290-36299 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 36300-36309 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 22, // 36310-36319 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 36320-36329 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 36330-36339 + 1, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 36340-36349 + 3, 2, 1, 20, 19, 18, 17, 16, 15, 14, // 36350-36359 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 36360-36369 + 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 36370-36379 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 44, // 36380-36389 + 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, // 36390-36399 + 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, // 36400-36409 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 36410-36419 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 36420-36429 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 36430-36439 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 36440-36449 + 1, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 36450-36459 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 4, // 36460-36469 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 14, // 36470-36479 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 36480-36489 + 3, 2, 1, 4, 3, 2, 1, 26, 25, 24, // 36490-36499 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 36500-36509 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 36510-36519 + 3, 2, 1, 4, 3, 2, 1, 2, 1, 12, // 36520-36529 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 36530-36539 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 36540-36549 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 36550-36559 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 36560-36569 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 36570-36579 + 3, 2, 1, 4, 3, 2, 1, 12, 11, 10, // 36580-36589 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 36590-36599 + 7, 6, 5, 4, 3, 2, 1, 22, 21, 20, // 36600-36609 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 36610-36619 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 36620-36629 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 36630-36639 + 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 36640-36649 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 36650-36659 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 36660-36669 + 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 36670-36679 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 36680-36689 + 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 36690-36699 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 36700-36709 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 36710-36719 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 36720-36729 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 36730-36739 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 36740-36749 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 36750-36759 + 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 36760-36769 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 36770-36779 + 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 36780-36789 + 1, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 36790-36799 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 36800-36809 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 36810-36819 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 36820-36829 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 36830-36839 + 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 36840-36849 + 7, 6, 5, 4, 3, 2, 1, 14, 13, 12, // 36850-36859 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 36860-36869 + 1, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 36870-36879 + 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 36880-36889 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 36890-36899 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 36900-36909 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 36910-36919 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 36920-36929 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 36930-36939 + 3, 2, 1, 4, 3, 2, 1, 26, 25, 24, // 36940-36949 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 36950-36959 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 36960-36969 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 18, // 36970-36979 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 36980-36989 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 36990-36999 + 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 37000-37009 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 37010-37019 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 37020-37029 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 37030-37039 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 37040-37049 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 37050-37059 + 1, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 37060-37069 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 37070-37079 + 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 37080-37089 + 7, 6, 5, 4, 3, 2, 1, 20, 19, 18, // 37090-37099 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 37100-37109 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 37110-37119 + 3, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 37120-37129 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 20, // 37130-37139 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 37140-37149 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 37150-37159 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 37160-37169 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 37170-37179 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 37180-37189 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 37190-37199 + 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 37200-37209 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 37210-37219 + 3, 2, 1, 20, 19, 18, 17, 16, 15, 14, // 37220-37229 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 37230-37239 + 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 37240-37249 + 3, 2, 1, 20, 19, 18, 17, 16, 15, 14, // 37250-37259 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 37260-37269 + 3, 2, 1, 4, 3, 2, 1, 30, 29, 28, // 37270-37279 + 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 37280-37289 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 37290-37299 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 4, // 37300-37309 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 37310-37319 + 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 37320-37329 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 18, // 37330-37339 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 37340-37349 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 37350-37359 + 1, 2, 1, 6, 5, 4, 3, 2, 1, 10, // 37360-37369 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 37370-37379 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 37380-37389 + 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 37390-37399 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 37400-37409 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 37410-37419 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 37420-37429 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 37430-37439 + 1, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 37440-37449 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 37450-37459 + 3, 2, 1, 20, 19, 18, 17, 16, 15, 14, // 37460-37469 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 37470-37479 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 37480-37489 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 37490-37499 + 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 37500-37509 + 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 37510-37519 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 37520-37529 + 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 37530-37539 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 12, // 37540-37549 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 37550-37559 + 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 37560-37569 + 1, 2, 1, 6, 5, 4, 3, 2, 1, 10, // 37570-37579 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 37580-37589 + 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 37590-37599 + 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 37600-37609 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 37610-37619 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 37620-37629 + 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 37630-37639 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 37640-37649 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 37650-37659 + 3, 2, 1, 28, 27, 26, 25, 24, 23, 22, // 37660-37669 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 37670-37679 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 37680-37689 + 1, 2, 1, 6, 5, 4, 3, 2, 1, 18, // 37690-37699 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 37700-37709 + 7, 6, 5, 4, 3, 2, 1, 30, 29, 28, // 37710-37719 + 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 37720-37729 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 37730-37739 + 7, 6, 5, 4, 3, 2, 1, 34, 33, 32, // 37740-37749 + 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, // 37750-37759 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 37760-37769 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 37770-37779 + 1, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 37780-37789 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 37790-37799 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 37800-37809 + 1, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 37810-37819 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 37820-37829 + 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 37830-37839 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 37840-37849 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 37850-37859 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 37860-37869 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 37870-37879 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 37880-37889 + 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 37890-37899 + 7, 6, 5, 4, 3, 2, 1, 44, 43, 42, // 37900-37909 + 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, // 37910-37919 + 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, // 37920-37929 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 37930-37939 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 37940-37949 + 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 37950-37959 + 3, 2, 1, 4, 3, 2, 1, 20, 19, 18, // 37960-37969 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 37970-37979 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 37980-37989 + 1, 2, 1, 4, 3, 2, 1, 14, 13, 12, // 37990-37999 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 38000-38009 + 1, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 38010-38019 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 38020-38029 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 38030-38039 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 38040-38049 + 3, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 38050-38059 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 38060-38069 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 38070-38079 + 3, 2, 1, 30, 29, 28, 27, 26, 25, 24, // 38080-38089 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 38090-38099 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 38100-38109 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 30, // 38110-38119 + 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 38120-38129 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 38130-38139 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 38140-38149 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 38150-38159 + 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 38160-38169 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 38170-38179 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 38180-38189 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 38190-38199 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 38200-38209 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 38210-38219 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 38220-38229 + 1, 6, 5, 4, 3, 2, 1, 2, 1, 22, // 38230-38239 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 38240-38249 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 38250-38259 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 38260-38269 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 38270-38279 + 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 38280-38289 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 38290-38299 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 38300-38309 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 38310-38319 + 1, 6, 5, 4, 3, 2, 1, 2, 1, 4, // 38320-38329 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 38330-38339 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 38340-38349 + 1, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 38350-38359 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 38360-38369 + 1, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 38370-38379 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 38380-38389 + 3, 2, 1, 38, 37, 36, 35, 34, 33, 32, // 38390-38399 + 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, // 38400-38409 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 38410-38419 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 38420-38429 + 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 38430-38439 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 4, // 38440-38449 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 38450-38459 + 1, 40, 39, 38, 37, 36, 35, 34, 33, 32, // 38460-38469 + 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, // 38470-38479 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 38480-38489 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 38490-38499 + 1, 42, 41, 40, 39, 38, 37, 36, 35, 34, // 38500-38509 + 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, // 38510-38519 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 38520-38529 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 38530-38539 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 38540-38549 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 38550-38559 + 1, 6, 5, 4, 3, 2, 1, 2, 1, 24, // 38560-38569 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 38570-38579 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 38580-38589 + 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 38590-38599 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 38600-38609 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 38610-38619 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 38620-38629 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 38630-38639 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 38640-38649 + 1, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 38650-38659 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 38660-38669 + 1, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 38670-38679 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 38680-38689 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 38690-38699 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 38700-38709 + 1, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 38710-38719 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 38720-38729 + 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 38730-38739 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 18, // 38740-38749 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 38750-38759 + 7, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 38760-38769 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 38770-38779 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 38780-38789 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 38790-38799 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 38800-38809 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 38810-38819 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 38820-38829 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 38830-38839 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 38840-38849 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 38850-38859 + 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 38860-38869 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 38870-38879 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 38880-38889 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 38890-38899 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 38900-38909 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 38910-38919 + 1, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 38920-38929 + 3, 2, 1, 20, 19, 18, 17, 16, 15, 14, // 38930-38939 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 38940-38949 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 38950-38959 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 38960-38969 + 1, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 38970-38979 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 38980-38989 + 3, 2, 1, 26, 25, 24, 23, 22, 21, 20, // 38990-38999 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 39000-39009 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 39010-39019 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 39020-39029 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 39030-39039 + 1, 2, 1, 4, 3, 2, 1, 32, 31, 30, // 39040-39049 + 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 39050-39059 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 39060-39069 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 39070-39079 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 39080-39089 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 39090-39099 + 3, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 39100-39109 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 14, // 39110-39119 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 39120-39129 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 18, // 39130-39139 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 39140-39149 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 39150-39159 + 1, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 39160-39169 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 39170-39179 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 39180-39189 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 39190-39199 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 39200-39209 + 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 39210-39219 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 4, // 39220-39229 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 39230-39239 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 39240-39249 + 1, 42, 41, 40, 39, 38, 37, 36, 35, 34, // 39250-39259 + 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, // 39260-39269 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 39270-39279 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 39280-39289 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 39290-39299 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 39300-39309 + 3, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 39310-39319 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 39320-39329 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 39330-39339 + 1, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 39340-39349 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 39350-39359 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 39360-39369 + 1, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 39370-39379 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 39380-39389 + 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 39390-39399 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 39400-39409 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 20, // 39410-39419 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 39420-39429 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 39430-39439 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 39440-39449 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 39450-39459 + 1, 38, 37, 36, 35, 34, 33, 32, 31, 30, // 39460-39469 + 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 39470-39479 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 39480-39489 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 39490-39499 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 39500-39509 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 39510-39519 + 1, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 39520-39529 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 39530-39539 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 39540-39549 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 39550-39559 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 39560-39569 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 39570-39579 + 1, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 39580-39589 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 39590-39599 + 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 39600-39609 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 39610-39619 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 39620-39629 + 1, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 39630-39639 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 39640-39649 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 39650-39659 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 39660-39669 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 24, // 39670-39679 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 39680-39689 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 39690-39699 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 10, // 39700-39709 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 39710-39719 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 39720-39729 + 3, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 39730-39739 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 39740-39749 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 39750-39759 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 39760-39769 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 39770-39779 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 39780-39789 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 22, // 39790-39799 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 39800-39809 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 39810-39819 + 1, 6, 5, 4, 3, 2, 1, 2, 1, 10, // 39820-39829 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 39830-39839 + 1, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 39840-39849 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 39850-39859 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 39860-39869 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 39870-39879 + 3, 2, 1, 4, 3, 2, 1, 14, 13, 12, // 39880-39889 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 39890-39899 + 1, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 39900-39909 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 39910-39919 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 39920-39929 + 7, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 39930-39939 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 39940-39949 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 39950-39959 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 39960-39969 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 39970-39979 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 20, // 39980-39989 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 39990-39999 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 40000-40009 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 40010-40019 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 40020-40029 + 1, 6, 5, 4, 3, 2, 1, 2, 1, 24, // 40030-40039 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 40040-40049 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 40050-40059 + 3, 2, 1, 24, 23, 22, 21, 20, 19, 18, // 40060-40069 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 40070-40079 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 40080-40089 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 40090-40099 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 40100-40109 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 40110-40119 + 3, 2, 1, 4, 3, 2, 1, 2, 1, 22, // 40120-40129 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 40130-40139 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 40140-40149 + 1, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 40150-40159 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 40160-40169 + 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 40170-40179 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 40180-40189 + 3, 2, 1, 20, 19, 18, 17, 16, 15, 14, // 40190-40199 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 40200-40209 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 40210-40219 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 40220-40229 + 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 40230-40239 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 40240-40249 + 3, 2, 1, 24, 23, 22, 21, 20, 19, 18, // 40250-40259 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 40260-40269 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 40270-40279 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 54, // 40280-40289 + 53, 52, 51, 50, 49, 48, 47, 46, 45, 44, // 40290-40299 + 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, // 40300-40309 + 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, // 40310-40319 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 40320-40329 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 40330-40339 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 40340-40349 + 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 40350-40359 + 1, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 40360-40369 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 40370-40379 + 7, 6, 5, 4, 3, 2, 1, 36, 35, 34, // 40380-40389 + 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, // 40390-40399 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 40400-40409 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 40410-40419 + 3, 2, 1, 4, 3, 2, 1, 2, 1, 4, // 40420-40429 + 3, 2, 1, 26, 25, 24, 23, 22, 21, 20, // 40430-40439 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 40440-40449 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 40450-40459 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 40460-40469 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 40470-40479 + 3, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 40480-40489 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 40490-40499 + 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 40500-40509 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 40510-40519 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 40520-40529 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 40530-40539 + 3, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 40540-40549 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 40550-40559 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 40560-40569 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 40570-40579 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 40580-40589 + 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 40590-40599 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 40600-40609 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 40610-40619 + 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 40620-40629 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 54, // 40630-40639 + 53, 52, 51, 50, 49, 48, 47, 46, 45, 44, // 40640-40649 + 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, // 40650-40659 + 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, // 40660-40669 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 40670-40679 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 40680-40689 + 3, 2, 1, 4, 3, 2, 1, 2, 1, 10, // 40690-40699 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 30, // 40700-40709 + 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 40710-40719 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 40720-40729 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 40730-40739 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 40740-40749 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 40750-40759 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 40760-40769 + 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 40770-40779 + 7, 6, 5, 4, 3, 2, 1, 14, 13, 12, // 40780-40789 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 40790-40799 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 40800-40809 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 40810-40819 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 40820-40829 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 40830-40839 + 1, 6, 5, 4, 3, 2, 1, 2, 1, 4, // 40840-40849 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 40850-40859 + 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 40860-40869 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 40870-40879 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 40880-40889 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 40890-40899 + 3, 2, 1, 24, 23, 22, 21, 20, 19, 18, // 40900-40909 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 40910-40919 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 40920-40929 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 10, // 40930-40939 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 40940-40949 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 40950-40959 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 40960-40969 + 3, 2, 1, 20, 19, 18, 17, 16, 15, 14, // 40970-40979 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 40980-40989 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 40990-40999 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 41000-41009 + 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 41010-41019 + 3, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 41020-41029 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 41030-41039 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 41040-41049 + 1, 6, 5, 4, 3, 2, 1, 20, 19, 18, // 41050-41059 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 41060-41069 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 41070-41079 + 1, 32, 31, 30, 29, 28, 27, 26, 25, 24, // 41080-41089 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 41090-41099 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 41100-41109 + 3, 2, 1, 4, 3, 2, 1, 14, 13, 12, // 41110-41119 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 41120-41129 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 41130-41139 + 1, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 41140-41149 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 41150-41159 + 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 41160-41169 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 4, // 41170-41179 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 41180-41189 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 41190-41199 + 1, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 41200-41209 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 41210-41219 + 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 41220-41229 + 1, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 41230-41239 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 41240-41249 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 41250-41259 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 41260-41269 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 41270-41279 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 41280-41289 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 34, // 41290-41299 + 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, // 41300-41309 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 41310-41319 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 41320-41329 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 41330-41339 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 41340-41349 + 1, 6, 5, 4, 3, 2, 1, 24, 23, 22, // 41350-41359 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 41360-41369 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 41370-41379 + 1, 6, 5, 4, 3, 2, 1, 2, 1, 10, // 41380-41389 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 41390-41399 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 41400-41409 + 1, 2, 1, 30, 29, 28, 27, 26, 25, 24, // 41410-41419 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 41420-41429 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 41430-41439 + 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 41440-41449 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 41450-41459 + 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 41460-41469 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 41470-41479 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 41480-41489 + 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 41490-41499 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 41500-41509 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 41510-41519 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 41520-41529 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 41530-41539 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 30, // 41540-41549 + 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 41550-41559 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 41560-41569 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 41570-41579 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 41580-41589 + 3, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 41590-41599 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 41600-41609 + 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 41610-41619 + 1, 6, 5, 4, 3, 2, 1, 14, 13, 12, // 41620-41629 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 41630-41639 + 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 41640-41649 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 41650-41659 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 41660-41669 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 41670-41679 + 1, 6, 5, 4, 3, 2, 1, 32, 31, 30, // 41680-41689 + 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 41690-41699 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 41700-41709 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 41710-41719 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 41720-41729 + 7, 6, 5, 4, 3, 2, 1, 22, 21, 20, // 41730-41739 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 41740-41749 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 41750-41759 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 41760-41769 + 1, 6, 5, 4, 3, 2, 1, 24, 23, 22, // 41770-41779 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 41780-41789 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 41790-41799 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 41800-41809 + 3, 2, 1, 30, 29, 28, 27, 26, 25, 24, // 41810-41819 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 41820-41829 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 41830-41839 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 41840-41849 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 41850-41859 + 3, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 41860-41869 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 41870-41879 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 41880-41889 + 3, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 41890-41899 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 41900-41909 + 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 41910-41919 + 7, 6, 5, 4, 3, 2, 1, 14, 13, 12, // 41920-41929 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 41930-41939 + 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 41940-41949 + 3, 2, 1, 4, 3, 2, 1, 2, 1, 10, // 41950-41959 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 41960-41969 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 41970-41979 + 1, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 41980-41989 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 41990-41999 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 42000-42009 + 3, 2, 1, 4, 3, 2, 1, 2, 1, 4, // 42010-42019 + 3, 2, 1, 20, 19, 18, 17, 16, 15, 14, // 42020-42029 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 42030-42039 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 42040-42049 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 42050-42059 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 42060-42069 + 1, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 42070-42079 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 42080-42089 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 42090-42099 + 1, 30, 29, 28, 27, 26, 25, 24, 23, 22, // 42100-42109 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 42110-42119 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 42120-42129 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 42130-42139 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 42140-42149 + 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 42150-42159 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 42160-42169 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 42170-42179 + 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 42180-42189 + 3, 2, 1, 4, 3, 2, 1, 12, 11, 10, // 42190-42199 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 42200-42209 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 42210-42219 + 1, 2, 1, 4, 3, 2, 1, 12, 11, 10, // 42220-42229 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 42230-42239 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 42240-42249 + 7, 6, 5, 4, 3, 2, 1, 24, 23, 22, // 42250-42259 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 42260-42269 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 42270-42279 + 1, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 42280-42289 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 42290-42299 + 7, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 42300-42309 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 42310-42319 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 42320-42329 + 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 42330-42339 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 42340-42349 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 42350-42359 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 42360-42369 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 42370-42379 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 42380-42389 + 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 42390-42399 + 3, 2, 1, 4, 3, 2, 1, 2, 1, 24, // 42400-42409 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 42410-42419 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 42420-42429 + 3, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 42430-42439 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 42440-42449 + 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 42450-42459 + 1, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 42460-42469 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 42470-42479 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 42480-42489 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 42490-42499 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 24, // 42500-42509 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 42510-42519 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 42520-42529 + 3, 2, 1, 24, 23, 22, 21, 20, 19, 18, // 42530-42539 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 42540-42549 + 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 42550-42559 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 42560-42569 + 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 42570-42579 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 22, // 42580-42589 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 42590-42599 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 42600-42609 + 1, 30, 29, 28, 27, 26, 25, 24, 23, 22, // 42610-42619 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 42620-42629 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 42630-42639 + 1, 2, 1, 6, 5, 4, 3, 2, 1, 18, // 42640-42649 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 42650-42659 + 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 42660-42669 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 42670-42679 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 42680-42689 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 42690-42699 + 1, 2, 1, 6, 5, 4, 3, 2, 1, 10, // 42700-42709 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 42710-42719 + 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 42720-42729 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 42730-42739 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 42740-42749 + 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 42750-42759 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 42760-42769 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 42770-42779 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 42780-42789 + 3, 2, 1, 4, 3, 2, 1, 24, 23, 22, // 42790-42799 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 42800-42809 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 42810-42819 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 42820-42829 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 42830-42839 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 42840-42849 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 42850-42859 + 3, 2, 1, 36, 35, 34, 33, 32, 31, 30, // 42860-42869 + 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 42870-42879 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 42880-42889 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 42890-42899 + 1, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 42900-42909 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 42910-42919 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 42920-42929 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 42930-42939 + 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 42940-42949 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 42950-42959 + 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 42960-42969 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 42970-42979 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 42980-42989 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 42990-42999 + 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 43000-43009 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 18, // 43010-43019 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 43020-43029 + 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 43030-43039 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 43040-43049 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 43050-43059 + 3, 2, 1, 4, 3, 2, 1, 26, 25, 24, // 43060-43069 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 43070-43079 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 43080-43089 + 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 43090-43099 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 43100-43109 + 7, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 43110-43119 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 43120-43129 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 43130-43139 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 43140-43149 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 43150-43159 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 43160-43169 + 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 43170-43179 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 43180-43189 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 43190-43199 + 1, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 43200-43209 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 43210-43219 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 43220-43229 + 7, 6, 5, 4, 3, 2, 1, 24, 23, 22, // 43230-43239 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 43240-43249 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 43250-43259 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 43260-43269 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 43270-43279 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 43280-43289 + 1, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 43290-43299 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 43300-43309 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 43310-43319 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 43320-43329 + 1, 60, 59, 58, 57, 56, 55, 54, 53, 52, // 43330-43339 + 51, 50, 49, 48, 47, 46, 45, 44, 43, 42, // 43340-43349 + 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, // 43350-43359 + 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, // 43360-43369 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 43370-43379 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 43380-43389 + 1, 6, 5, 4, 3, 2, 1, 2, 1, 4, // 43390-43399 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 43400-43409 + 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 43410-43419 + 7, 6, 5, 4, 3, 2, 1, 14, 13, 12, // 43420-43429 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 43430-43439 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 43440-43449 + 1, 6, 5, 4, 3, 2, 1, 24, 23, 22, // 43450-43459 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 43460-43469 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 43470-43479 + 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 43480-43489 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 43490-43499 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 43500-43509 + 7, 6, 5, 4, 3, 2, 1, 24, 23, 22, // 43510-43519 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 43520-43529 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 43530-43539 + 1, 2, 1, 30, 29, 28, 27, 26, 25, 24, // 43540-43549 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 43550-43559 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 43560-43569 + 3, 2, 1, 4, 3, 2, 1, 2, 1, 12, // 43570-43579 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 43580-43589 + 1, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 43590-43599 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 4, // 43600-43609 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 43610-43619 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 43620-43629 + 3, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 43630-43639 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 43640-43649 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 43650-43659 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 22, // 43660-43669 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 43670-43679 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 43680-43689 + 1, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 43690-43699 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 43700-43709 + 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 43710-43719 + 1, 32, 31, 30, 29, 28, 27, 26, 25, 24, // 43720-43729 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 43730-43739 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 43740-43749 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 18, // 43750-43759 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 43760-43769 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 43770-43779 + 1, 2, 1, 4, 3, 2, 1, 2, 1, 4, // 43780-43789 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 43790-43799 + 1, 52, 51, 50, 49, 48, 47, 46, 45, 44, // 43800-43809 + 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, // 43810-43819 + 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, // 43820-43829 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 43830-43839 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 43840-43849 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 43850-43859 + 7, 6, 5, 4, 3, 2, 1, 22, 21, 20, // 43860-43869 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 43870-43879 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 43880-43889 + 1, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 43890-43899 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 43900-43909 + 3, 2, 1, 20, 19, 18, 17, 16, 15, 14, // 43910-43919 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 43920-43929 + 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 43930-43939 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 43940-43949 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 43950-43959 + 1, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 43960-43969 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 43970-43979 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 43980-43989 + 1, 6, 5, 4, 3, 2, 1, 20, 19, 18, // 43990-43999 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 44000-44009 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 44010-44019 + 1, 6, 5, 4, 3, 2, 1, 2, 1, 12, // 44020-44029 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 44030-44039 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 44040-44049 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 44050-44059 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 44060-44069 + 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 44070-44079 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 12, // 44080-44089 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 44090-44099 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 44100-44109 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 44110-44119 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 44120-44129 + 1, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 44130-44139 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 44140-44149 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 44150-44159 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 44160-44169 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 44170-44179 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 44180-44189 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 44190-44199 + 1, 2, 1, 4, 3, 2, 1, 14, 13, 12, // 44200-44209 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 44210-44219 + 1, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 44220-44229 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 44230-44239 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 44240-44249 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 44250-44259 + 3, 2, 1, 4, 3, 2, 1, 2, 1, 4, // 44260-44269 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 44270-44279 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 44280-44289 + 3, 2, 1, 58, 57, 56, 55, 54, 53, 52, // 44290-44299 + 51, 50, 49, 48, 47, 46, 45, 44, 43, 42, // 44300-44309 + 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, // 44310-44319 + 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, // 44320-44329 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 44330-44339 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 44340-44349 + 1, 6, 5, 4, 3, 2, 1, 14, 13, 12, // 44350-44359 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 44360-44369 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 44370-44379 + 1, 2, 1, 6, 5, 4, 3, 2, 1, 28, // 44380-44389 + 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 44390-44399 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 44400-44409 + 7, 6, 5, 4, 3, 2, 1, 32, 31, 30, // 44410-44419 + 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 44420-44429 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 44430-44439 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 44440-44449 + 3, 2, 1, 30, 29, 28, 27, 26, 25, 24, // 44450-44459 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 44460-44469 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 44470-44479 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 44480-44489 + 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 44490-44499 + 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 44500-44509 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 44510-44519 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 44520-44529 + 1, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 44530-44539 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 14, // 44540-44549 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 44550-44559 + 3, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 44560-44569 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 44570-44579 + 7, 6, 5, 4, 3, 2, 1, 30, 29, 28, // 44580-44589 + 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 44590-44599 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 44600-44609 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 44610-44619 + 1, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 44620-44629 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 44630-44639 + 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 44640-44649 + 1, 6, 5, 4, 3, 2, 1, 26, 25, 24, // 44650-44659 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 44660-44669 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 44670-44679 + 3, 2, 1, 4, 3, 2, 1, 12, 11, 10, // 44680-44689 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 44690-44699 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 44700-44709 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 44710-44719 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 44720-44729 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 44730-44739 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 44740-44749 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 44750-44759 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 44760-44769 + 1, 2, 1, 4, 3, 2, 1, 12, 11, 10, // 44770-44779 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 44780-44789 + 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 44790-44799 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 44800-44809 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 20, // 44810-44819 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 44820-44829 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 44830-44839 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 44840-44849 + 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 44850-44859 + 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 44860-44869 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 44870-44879 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 44880-44889 + 3, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 44890-44899 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 44900-44909 + 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 44910-44919 + 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 44920-44929 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 44930-44939 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 44940-44949 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 44950-44959 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 44960-44969 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 44970-44979 + 3, 2, 1, 4, 3, 2, 1, 20, 19, 18, // 44980-44989 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 44990-44999 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 45000-45009 + 3, 2, 1, 40, 39, 38, 37, 36, 35, 34, // 45010-45019 + 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, // 45020-45029 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 45030-45039 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 45040-45049 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 45050-45059 + 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 45060-45069 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 45070-45079 + 3, 2, 1, 36, 35, 34, 33, 32, 31, 30, // 45080-45089 + 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 45090-45099 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 45100-45109 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 45110-45119 + 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 45120-45129 + 1, 6, 5, 4, 3, 2, 1, 2, 1, 22, // 45130-45139 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 45140-45149 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 45150-45159 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 45160-45169 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 45170-45179 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 45180-45189 + 1, 6, 5, 4, 3, 2, 1, 36, 35, 34, // 45190-45199 + 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, // 45200-45209 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 45210-45219 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 45220-45229 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 45230-45239 + 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 45240-45249 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 45250-45259 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 45260-45269 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 45270-45279 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 45280-45289 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 45290-45299 + 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 45300-45309 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 10, // 45310-45319 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 45320-45329 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 45330-45339 + 1, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 45340-45349 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 45350-45359 + 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 45360-45369 + 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 45370-45379 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 45380-45389 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 45390-45399 + 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 45400-45409 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 45410-45419 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 45420-45429 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 42, // 45430-45439 + 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, // 45440-45449 + 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, // 45450-45459 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 45460-45469 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 45470-45479 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 45480-45489 + 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 45490-45499 + 3, 2, 1, 20, 19, 18, 17, 16, 15, 14, // 45500-45509 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 45510-45519 + 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 45520-45529 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 45530-45539 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 45540-45549 + 3, 2, 1, 4, 3, 2, 1, 12, 11, 10, // 45550-45559 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 45560-45569 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 45570-45579 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 10, // 45580-45589 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 45590-45599 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 45600-45609 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 45610-45619 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 45620-45629 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 45630-45639 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 45640-45649 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 45650-45659 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 45660-45669 + 3, 2, 1, 4, 3, 2, 1, 14, 13, 12, // 45670-45679 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 45680-45689 + 1, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 45690-45699 + 7, 6, 5, 4, 3, 2, 1, 30, 29, 28, // 45700-45709 + 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 45710-45719 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 45720-45729 + 7, 6, 5, 4, 3, 2, 1, 14, 13, 12, // 45730-45739 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 45740-45749 + 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 45750-45759 + 3, 2, 1, 4, 3, 2, 1, 12, 11, 10, // 45760-45769 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 38, // 45770-45779 + 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, // 45780-45789 + 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 45790-45799 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 45800-45809 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 45810-45819 + 1, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 45820-45829 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 45830-45839 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 45840-45849 + 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 45850-45859 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 18, // 45860-45869 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 45870-45879 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 45880-45889 + 3, 2, 1, 50, 49, 48, 47, 46, 45, 44, // 45890-45899 + 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, // 45900-45909 + 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, // 45910-45919 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 45920-45929 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 45930-45939 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 45940-45949 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 45950-45959 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 45960-45969 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 45970-45979 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 32, // 45980-45989 + 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, // 45990-45999 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 46000-46009 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 46010-46019 + 1, 6, 5, 4, 3, 2, 1, 22, 21, 20, // 46020-46029 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 46030-46039 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 46040-46049 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 46050-46059 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 46060-46069 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 46070-46079 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 46080-46089 + 1, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 46090-46099 + 3, 2, 1, 30, 29, 28, 27, 26, 25, 24, // 46100-46109 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 46110-46119 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 46120-46129 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 46130-46139 + 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 46140-46149 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 46150-46159 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 46160-46169 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 46170-46179 + 1, 2, 1, 4, 3, 2, 1, 12, 11, 10, // 46180-46189 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 20, // 46190-46199 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 46200-46209 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 46210-46219 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 46220-46229 + 7, 6, 5, 4, 3, 2, 1, 24, 23, 22, // 46230-46239 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 46240-46249 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 46250-46259 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 46260-46269 + 1, 2, 1, 6, 5, 4, 3, 2, 1, 22, // 46270-46279 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 46280-46289 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 46290-46299 + 1, 6, 5, 4, 3, 2, 1, 2, 1, 18, // 46300-46309 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 46310-46319 + 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 46320-46329 + 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 46330-46339 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 46340-46349 + 1, 30, 29, 28, 27, 26, 25, 24, 23, 22, // 46350-46359 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 46360-46369 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 46370-46379 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 46380-46389 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 46390-46399 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 46400-46409 + 1, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 46410-46419 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 46420-46429 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 46430-46439 + 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 46440-46449 + 1, 6, 5, 4, 3, 2, 1, 14, 13, 12, // 46450-46459 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 46460-46469 + 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 46470-46479 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 46480-46489 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 46490-46499 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 46500-46509 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 46510-46519 + 3, 2, 1, 26, 25, 24, 23, 22, 21, 20, // 46520-46529 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 46530-46539 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 46540-46549 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 46550-46559 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 46560-46569 + 3, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 46570-46579 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 46580-46589 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 46590-46599 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 46600-46609 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 46610-46619 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 46620-46629 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 46630-46639 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 14, // 46640-46649 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 46650-46659 + 3, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 46660-46669 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 46670-46679 + 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 46680-46689 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 46690-46699 + 3, 2, 1, 20, 19, 18, 17, 16, 15, 14, // 46700-46709 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 46710-46719 + 3, 2, 1, 4, 3, 2, 1, 20, 19, 18, // 46720-46729 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 46730-46739 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 46740-46749 + 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 46750-46759 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 46760-46769 + 1, 36, 35, 34, 33, 32, 31, 30, 29, 28, // 46770-46779 + 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 46780-46789 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 46790-46799 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 46800-46809 + 1, 6, 5, 4, 3, 2, 1, 2, 1, 10, // 46810-46819 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 46820-46829 + 1, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 46830-46839 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 46840-46849 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 46850-46859 + 1, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 46860-46869 + 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 46870-46879 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 46880-46889 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 46890-46899 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 46900-46909 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 46910-46919 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 46920-46929 + 3, 2, 1, 24, 23, 22, 21, 20, 19, 18, // 46930-46939 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 46940-46949 + 7, 6, 5, 4, 3, 2, 1, 36, 35, 34, // 46950-46959 + 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, // 46960-46969 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 46970-46979 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 46980-46989 + 3, 2, 1, 4, 3, 2, 1, 20, 19, 18, // 46990-46999 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 47000-47009 + 7, 6, 5, 4, 3, 2, 1, 24, 23, 22, // 47010-47019 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 47020-47029 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 47030-47039 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 47040-47049 + 1, 6, 5, 4, 3, 2, 1, 2, 1, 28, // 47050-47059 + 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 47060-47069 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 47070-47079 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 47080-47089 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 47090-47099 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 47100-47109 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 47110-47119 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 47120-47129 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 47130-47139 + 3, 2, 1, 4, 3, 2, 1, 2, 1, 12, // 47140-47149 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 47150-47159 + 1, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 47160-47169 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 47170-47179 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 47180-47189 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 47190-47199 + 7, 6, 5, 4, 3, 2, 1, 14, 13, 12, // 47200-47209 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 47210-47219 + 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 47220-47229 + 7, 6, 5, 4, 3, 2, 1, 14, 13, 12, // 47230-47239 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 47240-47249 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 47250-47259 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 47260-47269 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 47270-47279 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 47280-47289 + 3, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 47290-47299 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 47300-47309 + 7, 6, 5, 4, 3, 2, 1, 22, 21, 20, // 47310-47319 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 47320-47329 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 47330-47339 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 47340-47349 + 1, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 47350-47359 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 47360-47369 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 47370-47379 + 1, 6, 5, 4, 3, 2, 1, 2, 1, 18, // 47380-47389 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 47390-47399 + 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 47400-47409 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 12, // 47410-47419 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 47420-47429 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 47430-47439 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 47440-47449 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 32, // 47450-47459 + 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, // 47460-47469 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 47470-47479 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 47480-47489 + 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 47490-47499 + 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 47500-47509 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 47510-47519 + 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 47520-47529 + 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 47530-47539 + 3, 2, 1, 20, 19, 18, 17, 16, 15, 14, // 47540-47549 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 47550-47559 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 47560-47569 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 47570-47579 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 47580-47589 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 47590-47599 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 47600-47609 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 47610-47619 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 10, // 47620-47629 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 47630-47639 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 47640-47649 + 3, 2, 1, 4, 3, 2, 1, 2, 1, 22, // 47650-47659 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 47660-47669 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 47670-47679 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 47680-47689 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 47690-47699 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 47700-47709 + 1, 2, 1, 4, 3, 2, 1, 20, 19, 18, // 47710-47719 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 47720-47729 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 47730-47739 + 1, 2, 1, 34, 33, 32, 31, 30, 29, 28, // 47740-47749 + 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 47750-47759 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 47760-47769 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 12, // 47770-47779 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 47780-47789 + 1, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 47790-47799 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 10, // 47800-47809 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 47810-47819 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 47820-47829 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 47830-47839 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 47840-47849 + 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 47850-47859 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 47860-47869 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 47870-47879 + 1, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 47880-47889 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 47890-47899 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 47900-47909 + 1, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 47910-47919 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 47920-47929 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 47930-47939 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 47940-47949 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 47950-47959 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 47960-47969 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 47970-47979 + 1, 36, 35, 34, 33, 32, 31, 30, 29, 28, // 47980-47989 + 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 47990-47999 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 48000-48009 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 48010-48019 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 20, // 48020-48029 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 48030-48039 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 24, // 48040-48049 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 48050-48059 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 48060-48069 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 48070-48079 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 48080-48089 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 48090-48099 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 48100-48109 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 48110-48119 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 48120-48129 + 1, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 48130-48139 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 48140-48149 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 48150-48159 + 3, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 48160-48169 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 48170-48179 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 48180-48189 + 3, 2, 1, 4, 3, 2, 1, 24, 23, 22, // 48190-48199 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 48200-48209 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 48210-48219 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 48220-48229 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 48230-48239 + 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 48240-48249 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 48250-48259 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 48260-48269 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 48270-48279 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 48280-48289 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 48290-48299 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 48300-48309 + 1, 2, 1, 24, 23, 22, 21, 20, 19, 18, // 48310-48319 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 48320-48329 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 48330-48339 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 48340-48349 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 48350-48359 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 48360-48369 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 48370-48379 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 48380-48389 + 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 48390-48399 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 4, // 48400-48409 + 3, 2, 1, 24, 23, 22, 21, 20, 19, 18, // 48410-48419 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 48420-48429 + 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 48430-48439 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 48440-48449 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 48450-48459 + 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 48460-48469 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 48470-48479 + 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 48480-48489 + 1, 6, 5, 4, 3, 2, 1, 26, 25, 24, // 48490-48499 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 48500-48509 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 48510-48519 + 3, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 48520-48529 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 48530-48539 + 1, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 48540-48549 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 48550-48559 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 48560-48569 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 48570-48579 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 48580-48589 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 48590-48599 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 48600-48609 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 48610-48619 + 3, 2, 1, 24, 23, 22, 21, 20, 19, 18, // 48620-48629 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 48630-48639 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 12, // 48640-48649 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 48650-48659 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 48660-48669 + 3, 2, 1, 4, 3, 2, 1, 2, 1, 52, // 48670-48679 + 51, 50, 49, 48, 47, 46, 45, 44, 43, 42, // 48680-48689 + 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, // 48690-48699 + 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, // 48700-48709 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 48710-48719 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 48720-48729 + 1, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 48730-48739 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 48740-48749 + 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 48750-48759 + 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 48760-48769 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 48770-48779 + 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 48780-48789 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 48790-48799 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 48800-48809 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 48810-48819 + 1, 2, 1, 24, 23, 22, 21, 20, 19, 18, // 48820-48829 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 48830-48839 + 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 48840-48849 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 10, // 48850-48859 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 48860-48869 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 48870-48879 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 18, // 48880-48889 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 48890-48899 + 7, 6, 5, 4, 3, 2, 1, 40, 39, 38, // 48900-48909 + 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, // 48910-48919 + 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 48920-48929 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 48930-48939 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 48940-48949 + 3, 2, 1, 20, 19, 18, 17, 16, 15, 14, // 48950-48959 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 48960-48969 + 3, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 48970-48979 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 48980-48989 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 48990-48999 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 10, // 49000-49009 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 49010-49019 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 49020-49029 + 1, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 49030-49039 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 49040-49049 + 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 49050-49059 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 49060-49069 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 49070-49079 + 1, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 49080-49089 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 49090-49099 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 49100-49109 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 49110-49119 + 1, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 49120-49129 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 49130-49139 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 49140-49149 + 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 49150-49159 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 49160-49169 + 1, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 49170-49179 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 49180-49189 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 49190-49199 + 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 49200-49209 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 49210-49219 + 3, 2, 1, 30, 29, 28, 27, 26, 25, 24, // 49220-49229 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 49230-49239 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 49240-49249 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 49250-49259 + 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 49260-49269 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 18, // 49270-49279 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 49280-49289 + 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 49290-49299 + 7, 6, 5, 4, 3, 2, 1, 24, 23, 22, // 49300-49309 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 49310-49319 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 49320-49329 + 1, 2, 1, 6, 5, 4, 3, 2, 1, 24, // 49330-49339 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 49340-49349 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 49350-49359 + 3, 2, 1, 4, 3, 2, 1, 2, 1, 22, // 49360-49369 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 49370-49379 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 49380-49389 + 1, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 49390-49399 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 49400-49409 + 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 49410-49419 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 49420-49429 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 49430-49439 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 49440-49449 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 49450-49459 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 49460-49469 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 49470-49479 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 49480-49489 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 24, // 49490-49499 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 49500-49509 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 49510-49519 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 49520-49529 + 1, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 49530-49539 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 10, // 49540-49549 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 38, // 49550-49559 + 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, // 49560-49569 + 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 49570-49579 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 49580-49589 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 49590-49599 + 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 49600-49609 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 49610-49619 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 49620-49629 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 24, // 49630-49639 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 49640-49649 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 49650-49659 + 3, 2, 1, 4, 3, 2, 1, 2, 1, 12, // 49660-49669 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 49670-49679 + 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 49680-49689 + 7, 6, 5, 4, 3, 2, 1, 14, 13, 12, // 49690-49699 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 49700-49709 + 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 49710-49719 + 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 49720-49729 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 49730-49739 + 1, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 49740-49749 + 7, 6, 5, 4, 3, 2, 1, 26, 25, 24, // 49750-49759 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 49760-49769 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 49770-49779 + 3, 2, 1, 4, 3, 2, 1, 2, 1, 12, // 49780-49789 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 49790-49799 + 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 49800-49809 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 49810-49819 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 49820-49829 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 49830-49839 + 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 49840-49849 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 49850-49859 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 49860-49869 + 1, 6, 5, 4, 3, 2, 1, 14, 13, 12, // 49870-49879 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 49880-49889 + 1, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 49890-49899 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 49900-49909 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 49910-49919 + 1, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 49920-49929 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 4, // 49930-49939 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 49940-49949 + 7, 6, 5, 4, 3, 2, 1, 34, 33, 32, // 49950-49959 + 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, // 49960-49969 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 49970-49979 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 49980-49989 + 1, 2, 1, 6, 5, 4, 3, 2, 1, 22, // 49990-49999 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 50000-50009 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 50010-50019 + 1, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 50020-50029 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 50030-50039 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 50040-50049 + 1, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 50050-50059 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 50060-50069 + 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 50070-50079 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 50080-50089 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 50090-50099 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 50100-50109 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 50110-50119 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 50120-50129 + 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 50130-50139 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 50140-50149 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 18, // 50150-50159 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 50160-50169 + 7, 6, 5, 4, 3, 2, 1, 30, 29, 28, // 50170-50179 + 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 50180-50189 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 50190-50199 + 7, 6, 5, 4, 3, 2, 1, 14, 13, 12, // 50200-50209 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 50210-50219 + 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 50220-50229 + 1, 30, 29, 28, 27, 26, 25, 24, 23, 22, // 50230-50239 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 50240-50249 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 50250-50259 + 1, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 50260-50269 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 50270-50279 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 50280-50289 + 1, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 50290-50299 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 50300-50309 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 50310-50319 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 50320-50329 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 50330-50339 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 50340-50349 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 50350-50359 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 50360-50369 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 50370-50379 + 3, 2, 1, 4, 3, 2, 1, 24, 23, 22, // 50380-50389 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 50390-50399 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 50400-50409 + 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 50410-50419 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 50420-50429 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 50430-50439 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 50440-50449 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 50450-50459 + 1, 36, 35, 34, 33, 32, 31, 30, 29, 28, // 50460-50469 + 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 50470-50479 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 50480-50489 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 50490-50499 + 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 50500-50509 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 50510-50519 + 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 50520-50529 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 50530-50539 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 50540-50549 + 1, 30, 29, 28, 27, 26, 25, 24, 23, 22, // 50550-50559 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 50560-50569 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 50570-50579 + 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 50580-50589 + 1, 2, 1, 6, 5, 4, 3, 2, 1, 28, // 50590-50599 + 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 50600-50609 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 50610-50619 + 7, 6, 5, 4, 3, 2, 1, 20, 19, 18, // 50620-50629 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 50630-50639 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 50640-50649 + 1, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 50650-50659 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 50660-50669 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 50670-50679 + 3, 2, 1, 24, 23, 22, 21, 20, 19, 18, // 50680-50689 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 50690-50699 + 7, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 50700-50709 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 50710-50719 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 50720-50729 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 50730-50739 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 50740-50749 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 50750-50759 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 50760-50769 + 3, 2, 1, 4, 3, 2, 1, 12, 11, 10, // 50770-50779 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 32, // 50780-50789 + 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, // 50790-50799 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 50800-50809 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 50810-50819 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 50820-50829 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 10, // 50830-50839 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 50840-50849 + 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 50850-50859 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 50860-50869 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 50870-50879 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 50880-50889 + 1, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 50890-50899 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 50900-50909 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 50910-50919 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 22, // 50920-50929 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 50930-50939 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 50940-50949 + 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 50950-50959 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 50960-50969 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 50970-50979 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 50980-50989 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 50990-50999 + 1, 30, 29, 28, 27, 26, 25, 24, 23, 22, // 51000-51009 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 51010-51019 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 51020-51029 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 51030-51039 + 3, 2, 1, 4, 3, 2, 1, 12, 11, 10, // 51040-51049 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 51050-51059 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 51060-51069 + 1, 38, 37, 36, 35, 34, 33, 32, 31, 30, // 51070-51079 + 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 51080-51089 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 51090-51099 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 22, // 51100-51109 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 51110-51119 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 51120-51129 + 1, 2, 1, 4, 3, 2, 1, 14, 13, 12, // 51130-51139 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 51140-51149 + 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 51150-51159 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 24, // 51160-51169 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 51170-51179 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 51180-51189 + 3, 2, 1, 4, 3, 2, 1, 2, 1, 4, // 51190-51199 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 51200-51209 + 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 51210-51219 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 51220-51229 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 51230-51239 + 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 51240-51249 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 51250-51259 + 3, 2, 1, 20, 19, 18, 17, 16, 15, 14, // 51260-51269 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 51270-51279 + 3, 2, 1, 4, 3, 2, 1, 20, 19, 18, // 51280-51289 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 51290-51299 + 7, 6, 5, 4, 3, 2, 1, 22, 21, 20, // 51300-51309 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 51310-51319 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 51320-51329 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 51330-51339 + 1, 2, 1, 4, 3, 2, 1, 2, 1, 12, // 51340-51349 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 51350-51359 + 1, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 51360-51369 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 51370-51379 + 3, 2, 1, 24, 23, 22, 21, 20, 19, 18, // 51380-51389 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 51390-51399 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 51400-51409 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 51410-51419 + 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 51420-51429 + 1, 6, 5, 4, 3, 2, 1, 2, 1, 10, // 51430-51439 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 51440-51449 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 51450-51459 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 51460-51469 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 51470-51479 + 1, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 51480-51489 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 51490-51499 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 51500-51509 + 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 51510-51519 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 51520-51529 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 51530-51539 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 51540-51549 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 51550-51559 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 51560-51569 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 51570-51579 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 51580-51589 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 51590-51599 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 51600-51609 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 51610-51619 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 51620-51629 + 1, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 51630-51639 + 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 51640-51649 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 51650-51659 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 51660-51669 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 51670-51679 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 51680-51689 + 1, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 51690-51699 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 51700-51709 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 51710-51719 + 1, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 51720-51729 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 51730-51739 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 51740-51749 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 51750-51759 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 18, // 51760-51769 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 51770-51779 + 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 51780-51789 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 51790-51799 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 51800-51809 + 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 51810-51819 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 10, // 51820-51829 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 51830-51839 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 51840-51849 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 10, // 51850-51859 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 51860-51869 + 1, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 51870-51879 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 51880-51889 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 51890-51899 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 51900-51909 + 3, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 51910-51919 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 51920-51929 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 51930-51939 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 22, // 51940-51949 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 51950-51959 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 51960-51969 + 1, 2, 1, 4, 3, 2, 1, 14, 13, 12, // 51970-51979 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 51980-51989 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 51990-51999 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 52000-52009 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 52010-52019 + 1, 6, 5, 4, 3, 2, 1, 24, 23, 22, // 52020-52029 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 52030-52039 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 52040-52049 + 1, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 52050-52059 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 12, // 52060-52069 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 52070-52079 + 1, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 52080-52089 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 52090-52099 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 52100-52109 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 52110-52119 + 1, 6, 5, 4, 3, 2, 1, 20, 19, 18, // 52120-52129 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 52130-52139 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 52140-52149 + 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 52150-52159 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 52160-52169 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 52170-52179 + 1, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 52180-52189 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 52190-52199 + 1, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 52200-52209 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 52210-52219 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 52220-52229 + 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 52230-52239 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 52240-52249 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 52250-52259 + 7, 6, 5, 4, 3, 2, 1, 22, 21, 20, // 52260-52269 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 52270-52279 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 52280-52289 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 52290-52299 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 52300-52309 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 52310-52319 + 1, 40, 39, 38, 37, 36, 35, 34, 33, 32, // 52320-52329 + 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, // 52330-52339 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 52340-52349 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 52350-52359 + 1, 2, 1, 6, 5, 4, 3, 2, 1, 10, // 52360-52369 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 52370-52379 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 52380-52389 + 1, 42, 41, 40, 39, 38, 37, 36, 35, 34, // 52390-52399 + 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, // 52400-52409 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 52410-52419 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 52420-52429 + 3, 2, 1, 20, 19, 18, 17, 16, 15, 14, // 52430-52439 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 52440-52449 + 3, 2, 1, 4, 3, 2, 1, 32, 31, 30, // 52450-52459 + 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 52460-52469 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 52470-52479 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 52480-52489 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 52490-52499 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 52500-52509 + 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 52510-52519 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 52520-52529 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 52530-52539 + 1, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 52540-52549 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 52550-52559 + 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 52560-52569 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 52570-52579 + 3, 2, 1, 26, 25, 24, 23, 22, 21, 20, // 52580-52589 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 52590-52599 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 52600-52609 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 52610-52619 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 52620-52629 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 28, // 52630-52639 + 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 52640-52649 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 52650-52659 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 52660-52669 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 52670-52679 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 52680-52689 + 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 52690-52699 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 52700-52709 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 52710-52719 + 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 52720-52729 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 52730-52739 + 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 52740-52749 + 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 52750-52759 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 52760-52769 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 52770-52779 + 3, 2, 1, 24, 23, 22, 21, 20, 19, 18, // 52780-52789 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 52790-52799 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 52800-52809 + 3, 2, 1, 4, 3, 2, 1, 20, 19, 18, // 52810-52819 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 52820-52829 + 7, 6, 5, 4, 3, 2, 1, 22, 21, 20, // 52830-52839 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 52840-52849 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 52850-52859 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 52860-52869 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 52870-52879 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 52880-52889 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 52890-52899 + 1, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 52900-52909 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 52910-52919 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 52920-52929 + 7, 6, 5, 4, 3, 2, 1, 14, 13, 12, // 52930-52939 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 52940-52949 + 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 52950-52959 + 3, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 52960-52969 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 52970-52979 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 52980-52989 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 52990-52999 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 53000-53009 + 7, 6, 5, 4, 3, 2, 1, 30, 29, 28, // 53010-53019 + 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 53020-53029 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 53030-53039 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 53040-53049 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 53050-53059 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 53060-53069 + 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 53070-53079 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 4, // 53080-53089 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 53090-53099 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 53100-53109 + 3, 2, 1, 4, 3, 2, 1, 12, 11, 10, // 53110-53119 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 53120-53129 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 53130-53139 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 12, // 53140-53149 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 53150-53159 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 53160-53169 + 1, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 53170-53179 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 53180-53189 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 53190-53199 + 1, 30, 29, 28, 27, 26, 25, 24, 23, 22, // 53200-53209 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 53210-53219 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 53220-53229 + 1, 2, 1, 6, 5, 4, 3, 2, 1, 28, // 53230-53239 + 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 53240-53249 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 53250-53259 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 10, // 53260-53269 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 53270-53279 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 53280-53289 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 53290-53299 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 53300-53309 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 53310-53319 + 3, 2, 1, 4, 3, 2, 1, 26, 25, 24, // 53320-53329 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 53330-53339 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 53340-53349 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 18, // 53350-53359 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 53360-53369 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 53370-53379 + 1, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 53380-53389 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 53390-53399 + 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 53400-53409 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 53410-53419 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 53420-53429 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 53430-53439 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 53440-53449 + 3, 2, 1, 26, 25, 24, 23, 22, 21, 20, // 53450-53459 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 53460-53469 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 24, // 53470-53479 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 53480-53489 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 53490-53499 + 3, 2, 1, 4, 3, 2, 1, 20, 19, 18, // 53500-53509 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 53510-53519 + 7, 6, 5, 4, 3, 2, 1, 22, 21, 20, // 53520-53529 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 53530-53539 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 53540-53549 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 53550-53559 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 22, // 53560-53569 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 53570-53579 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 53580-53589 + 1, 2, 1, 4, 3, 2, 1, 12, 11, 10, // 53590-53599 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 53600-53609 + 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 53610-53619 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 53620-53629 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 14, // 53630-53639 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 53640-53649 + 3, 2, 1, 4, 3, 2, 1, 24, 23, 22, // 53650-53659 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 53660-53669 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 53670-53679 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 53680-53689 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 18, // 53690-53699 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 53700-53709 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 12, // 53710-53719 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 53720-53729 + 1, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 53730-53739 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 53740-53749 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 53750-53759 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 53760-53769 + 3, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 53770-53779 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 53780-53789 + 1, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 53790-53799 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 53800-53809 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 53810-53819 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 53820-53829 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 53830-53839 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 53840-53849 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 53850-53859 + 1, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 53860-53869 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 53870-53879 + 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 53880-53889 + 1, 6, 5, 4, 3, 2, 1, 2, 1, 18, // 53890-53899 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 53900-53909 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 53910-53919 + 3, 2, 1, 4, 3, 2, 1, 12, 11, 10, // 53920-53929 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 53930-53939 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 53940-53949 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 28, // 53950-53959 + 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 53960-53969 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 53970-53979 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 53980-53989 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 53990-53999 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 54000-54009 + 1, 2, 1, 24, 23, 22, 21, 20, 19, 18, // 54010-54019 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 54020-54029 + 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 54030-54039 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 54040-54049 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 24, // 54050-54059 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 54060-54069 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 54070-54079 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 54080-54089 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 54090-54099 + 1, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 54100-54109 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 54110-54119 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 54120-54129 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 54130-54139 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 54140-54149 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 54150-54159 + 3, 2, 1, 4, 3, 2, 1, 14, 13, 12, // 54160-54169 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 54170-54179 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 54180-54189 + 3, 2, 1, 24, 23, 22, 21, 20, 19, 18, // 54190-54199 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 54200-54209 + 7, 6, 5, 4, 3, 2, 1, 34, 33, 32, // 54210-54219 + 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, // 54220-54229 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 54230-54239 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 54240-54249 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 54250-54259 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 54260-54269 + 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 54270-54279 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 54280-54289 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 54290-54299 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 54300-54309 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 54310-54319 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 54320-54329 + 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 54330-54339 + 7, 6, 5, 4, 3, 2, 1, 14, 13, 12, // 54340-54349 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 54350-54359 + 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 54360-54369 + 1, 6, 5, 4, 3, 2, 1, 24, 23, 22, // 54370-54379 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 54380-54389 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 54390-54399 + 1, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 54400-54409 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 54410-54419 + 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 54420-54429 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 54430-54439 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 20, // 54440-54449 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 54450-54459 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 24, // 54460-54469 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 54470-54479 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 54480-54489 + 3, 2, 1, 4, 3, 2, 1, 2, 1, 4, // 54490-54499 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 54500-54509 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 54510-54519 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 54520-54529 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 54530-54539 + 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 54540-54549 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 54550-54559 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 54560-54569 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 54570-54579 + 1, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 54580-54589 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 54590-54599 + 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 54600-54609 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 54610-54619 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 54620-54629 + 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 54630-54639 + 7, 6, 5, 4, 3, 2, 1, 20, 19, 18, // 54640-54649 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 54650-54659 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 54660-54669 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 30, // 54670-54679 + 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 54680-54689 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 54690-54699 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 54700-54709 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 54710-54719 + 1, 6, 5, 4, 3, 2, 1, 24, 23, 22, // 54720-54729 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 54730-54739 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 54740-54749 + 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 54750-54759 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 54760-54769 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 54770-54779 + 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 54780-54789 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 30, // 54790-54799 + 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 54800-54809 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 54810-54819 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 54820-54829 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 54830-54839 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 54840-54849 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 54850-54859 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 54860-54869 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 54870-54879 + 1, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 54880-54889 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 54890-54899 + 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 54900-54909 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 22, // 54910-54919 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 54920-54929 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 54930-54939 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 54940-54949 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 54950-54959 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 54960-54969 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 54970-54979 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 54980-54989 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 54990-54999 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 55000-55009 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 55010-55019 + 1, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 55020-55029 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 55030-55039 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 55040-55049 + 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 55050-55059 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 55060-55069 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 24, // 55070-55079 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 55080-55089 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 55090-55099 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 55100-55109 + 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 55110-55119 + 7, 6, 5, 4, 3, 2, 1, 20, 19, 18, // 55120-55129 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 55130-55139 + 7, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 55140-55149 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 55150-55159 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 55160-55169 + 1, 30, 29, 28, 27, 26, 25, 24, 23, 22, // 55170-55179 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 55180-55189 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 55190-55199 + 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 55200-55209 + 3, 2, 1, 4, 3, 2, 1, 2, 1, 10, // 55210-55219 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 55220-55229 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 55230-55239 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 10, // 55240-55249 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 32, // 55250-55259 + 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, // 55260-55269 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 55270-55279 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 55280-55289 + 1, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 55290-55299 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 55300-55309 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 55310-55319 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 55320-55329 + 1, 2, 1, 4, 3, 2, 1, 2, 1, 4, // 55330-55339 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 55340-55349 + 1, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 55350-55359 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 55360-55369 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 55370-55379 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 55380-55389 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 55390-55399 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 55400-55409 + 1, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 55410-55419 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 55420-55429 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 55430-55439 + 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 55440-55449 + 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 55450-55459 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 55460-55469 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 55470-55479 + 7, 6, 5, 4, 3, 2, 1, 14, 13, 12, // 55480-55489 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 55490-55499 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 55500-55509 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 55510-55519 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 55520-55529 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 55530-55539 + 1, 6, 5, 4, 3, 2, 1, 32, 31, 30, // 55540-55549 + 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 55550-55559 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 55560-55569 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 55570-55579 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 55580-55589 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 55590-55599 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 10, // 55600-55609 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 55610-55619 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 55620-55629 + 1, 2, 1, 6, 5, 4, 3, 2, 1, 22, // 55630-55639 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 55640-55649 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 55650-55659 + 1, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 55660-55669 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 55670-55679 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 55680-55689 + 1, 6, 5, 4, 3, 2, 1, 14, 13, 12, // 55690-55699 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 55700-55709 + 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 55710-55719 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 55720-55729 + 3, 2, 1, 30, 29, 28, 27, 26, 25, 24, // 55730-55739 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 55740-55749 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 55750-55759 + 3, 2, 1, 24, 23, 22, 21, 20, 19, 18, // 55760-55769 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 55770-55779 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 55780-55789 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 55790-55799 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 55800-55809 + 3, 2, 1, 4, 3, 2, 1, 2, 1, 4, // 55810-55819 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 55820-55829 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 55830-55839 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 22, // 55840-55849 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 55850-55859 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 55860-55869 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 55870-55879 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 55880-55889 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 55890-55899 + 1, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 55900-55909 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 55910-55919 + 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 55920-55929 + 1, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 55930-55939 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 55940-55949 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 55950-55959 + 7, 6, 5, 4, 3, 2, 1, 20, 19, 18, // 55960-55969 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 55970-55979 + 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 55980-55989 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 55990-55999 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 30, // 56000-56009 + 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 56010-56019 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 56020-56029 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 56030-56039 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 56040-56049 + 3, 2, 1, 28, 27, 26, 25, 24, 23, 22, // 56050-56059 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 56060-56069 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 56070-56079 + 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 56080-56089 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 56090-56099 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 56100-56109 + 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 56110-56119 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 56120-56129 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 56130-56139 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 56140-56149 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 56150-56159 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 56160-56169 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 56170-56179 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 56180-56189 + 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 56190-56199 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 28, // 56200-56209 + 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 56210-56219 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 56220-56229 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 10, // 56230-56239 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 56240-56249 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 56250-56259 + 3, 2, 1, 4, 3, 2, 1, 2, 1, 30, // 56260-56269 + 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 56270-56279 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 56280-56289 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 56290-56299 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 56300-56309 + 1, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 56310-56319 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 56320-56329 + 3, 2, 1, 26, 25, 24, 23, 22, 21, 20, // 56330-56339 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 56340-56349 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 56350-56359 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 56360-56369 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 56370-56379 + 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 56380-56389 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 56390-56399 + 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 56400-56409 + 7, 6, 5, 4, 3, 2, 1, 14, 13, 12, // 56410-56419 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 56420-56429 + 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 56430-56439 + 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 56440-56449 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 56450-56459 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 56460-56469 + 3, 2, 1, 4, 3, 2, 1, 2, 1, 10, // 56470-56479 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 56480-56489 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 56490-56499 + 1, 2, 1, 6, 5, 4, 3, 2, 1, 10, // 56500-56509 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 56510-56519 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 56520-56529 + 1, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 56530-56539 + 3, 2, 1, 26, 25, 24, 23, 22, 21, 20, // 56540-56549 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 56550-56559 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 22, // 56560-56569 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 56570-56579 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 56580-56589 + 1, 6, 5, 4, 3, 2, 1, 2, 1, 12, // 56590-56599 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 56600-56609 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 56610-56619 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 56620-56629 + 3, 2, 1, 26, 25, 24, 23, 22, 21, 20, // 56630-56639 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 56640-56649 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 56650-56659 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 56660-56669 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 56670-56679 + 1, 6, 5, 4, 3, 2, 1, 14, 13, 12, // 56680-56689 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 56690-56699 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 56700-56709 + 1, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 56710-56719 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 56720-56729 + 1, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 56730-56739 + 7, 6, 5, 4, 3, 2, 1, 20, 19, 18, // 56740-56749 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 56750-56759 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 56760-56769 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 56770-56779 + 3, 2, 1, 24, 23, 22, 21, 20, 19, 18, // 56780-56789 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 56790-56799 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 4, // 56800-56809 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 56810-56819 + 1, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 56820-56829 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 56830-56839 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 56840-56849 + 7, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 56850-56859 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 56860-56869 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 56870-56879 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 56880-56889 + 1, 2, 1, 4, 3, 2, 1, 12, 11, 10, // 56890-56899 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 56900-56909 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 56910-56919 + 1, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 56920-56929 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 56930-56939 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 56940-56949 + 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 56950-56959 + 3, 2, 1, 20, 19, 18, 17, 16, 15, 14, // 56960-56969 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 56970-56979 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 56980-56989 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 38, // 56990-56999 + 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, // 57000-57009 + 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 57010-57019 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 57020-57029 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 57030-57039 + 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 57040-57049 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 57050-57059 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 57060-57069 + 3, 2, 1, 4, 3, 2, 1, 12, 11, 10, // 57070-57079 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 57080-57089 + 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 57090-57099 + 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 57100-57109 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 57110-57119 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 57120-57129 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 57130-57139 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 14, // 57140-57149 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 57150-57159 + 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 57160-57169 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 57170-57179 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 57180-57189 + 1, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 57190-57199 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 57200-57209 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 57210-57219 + 1, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 57220-57229 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 57230-57239 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 57240-57249 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 57250-57259 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 57260-57269 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 57270-57279 + 3, 2, 1, 4, 3, 2, 1, 14, 13, 12, // 57280-57289 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 57290-57299 + 1, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 57300-57309 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 57310-57319 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 57320-57329 + 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 57330-57339 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 18, // 57340-57349 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 57350-57359 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 57360-57369 + 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 57370-57379 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 57380-57389 + 7, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 57390-57399 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 57400-57409 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 57410-57419 + 7, 6, 5, 4, 3, 2, 1, 30, 29, 28, // 57420-57429 + 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 57430-57439 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 57440-57449 + 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 57450-57459 + 7, 6, 5, 4, 3, 2, 1, 20, 19, 18, // 57460-57469 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 57470-57479 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 57480-57489 + 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 57490-57499 + 3, 2, 1, 24, 23, 22, 21, 20, 19, 18, // 57500-57509 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 57510-57519 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 28, // 57520-57529 + 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 57530-57539 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 57540-57549 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 12, // 57550-57559 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 57560-57569 + 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 57570-57579 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 57580-57589 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 57590-57599 + 1, 36, 35, 34, 33, 32, 31, 30, 29, 28, // 57600-57609 + 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 57610-57619 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 57620-57629 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 57630-57639 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 57640-57649 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 57650-57659 + 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 57660-57669 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 57670-57679 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 57680-57689 + 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 57690-57699 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 57700-57709 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 57710-57719 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 57720-57729 + 1, 6, 5, 4, 3, 2, 1, 14, 13, 12, // 57730-57739 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 57740-57749 + 1, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 57750-57759 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 57760-57769 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 57770-57779 + 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 57780-57789 + 1, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 57790-57799 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 20, // 57800-57809 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 57810-57819 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 57820-57829 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 57830-57839 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 57840-57849 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 22, // 57850-57859 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 57860-57869 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 57870-57879 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 57880-57889 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 57890-57899 + 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 57900-57909 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 57910-57919 + 3, 2, 1, 20, 19, 18, 17, 16, 15, 14, // 57920-57929 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 57930-57939 + 3, 2, 1, 4, 3, 2, 1, 26, 25, 24, // 57940-57949 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 57950-57959 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 57960-57969 + 3, 2, 1, 4, 3, 2, 1, 14, 13, 12, // 57970-57979 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 57980-57989 + 1, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 57990-57999 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 58000-58009 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 58010-58019 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 58020-58029 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 58030-58039 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 58040-58049 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 58050-58059 + 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 58060-58069 + 3, 2, 1, 26, 25, 24, 23, 22, 21, 20, // 58070-58079 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 58080-58089 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 58090-58099 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 58100-58109 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 58110-58119 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 58120-58129 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 58130-58139 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 58140-58149 + 1, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 58150-58159 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 58160-58169 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 58170-58179 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 58180-58189 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 58190-58199 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 58200-58209 + 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 58210-58219 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 58220-58229 + 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 58230-58239 + 3, 2, 1, 28, 27, 26, 25, 24, 23, 22, // 58240-58249 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 58250-58259 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 58260-58269 + 1, 38, 37, 36, 35, 34, 33, 32, 31, 30, // 58270-58279 + 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 58280-58289 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 58290-58299 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 58300-58309 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 58310-58319 + 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 58320-58329 + 7, 6, 5, 4, 3, 2, 1, 26, 25, 24, // 58330-58339 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 58340-58349 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 58350-58359 + 3, 2, 1, 4, 3, 2, 1, 2, 1, 10, // 58360-58369 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 58370-58379 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 58380-58389 + 1, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 58390-58399 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 58400-58409 + 1, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 58410-58419 + 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 58420-58429 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 58430-58439 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 58440-58449 + 1, 2, 1, 24, 23, 22, 21, 20, 19, 18, // 58450-58459 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 58460-58469 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 58470-58479 + 1, 30, 29, 28, 27, 26, 25, 24, 23, 22, // 58480-58489 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 58490-58499 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 58500-58509 + 1, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 58510-58519 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 58520-58529 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 58530-58539 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 18, // 58540-58549 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 58550-58559 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 58560-58569 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 22, // 58570-58579 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 58580-58589 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 58590-58599 + 1, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 58600-58609 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 58610-58619 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 58620-58629 + 1, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 58630-58639 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 58640-58649 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 58650-58659 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 58660-58669 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 58670-58679 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 58680-58689 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 58690-58699 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 58700-58709 + 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 58710-58719 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 58720-58729 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 58730-58739 + 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 58740-58749 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 58750-58759 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 58760-58769 + 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 58770-58779 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 42, // 58780-58789 + 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, // 58790-58799 + 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, // 58800-58809 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 58810-58819 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 58820-58829 + 1, 58, 57, 56, 55, 54, 53, 52, 51, 50, // 58830-58839 + 49, 48, 47, 46, 45, 44, 43, 42, 41, 40, // 58840-58849 + 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, // 58850-58859 + 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 58860-58869 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 58870-58879 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 58880-58889 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 58890-58899 + 1, 6, 5, 4, 3, 2, 1, 2, 1, 4, // 58900-58909 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 58910-58919 + 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 58920-58929 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 58930-58939 + 3, 2, 1, 20, 19, 18, 17, 16, 15, 14, // 58940-58949 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 58950-58959 + 3, 2, 1, 4, 3, 2, 1, 12, 11, 10, // 58960-58969 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 58970-58979 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 58980-58989 + 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 58990-58999 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 59000-59009 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 59010-59019 + 1, 2, 1, 6, 5, 4, 3, 2, 1, 22, // 59020-59029 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 59030-59039 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 59040-59049 + 1, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 59050-59059 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 59060-59069 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 59070-59079 + 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 59080-59089 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 59090-59099 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 59100-59109 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 59110-59119 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 59120-59129 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 59130-59139 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 59140-59149 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 59150-59159 + 7, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 59160-59169 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 59170-59179 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 59180-59189 + 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 59190-59199 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 10, // 59200-59209 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 59210-59219 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 59220-59229 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 59230-59239 + 3, 2, 1, 20, 19, 18, 17, 16, 15, 14, // 59240-59249 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 59250-59259 + 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 59260-59269 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 59270-59279 + 1, 52, 51, 50, 49, 48, 47, 46, 45, 44, // 59280-59289 + 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, // 59290-59299 + 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, // 59300-59309 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 59310-59319 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 59320-59329 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 59330-59339 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 59340-59349 + 1, 6, 5, 4, 3, 2, 1, 2, 1, 10, // 59350-59359 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 59360-59369 + 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 59370-59379 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 59380-59389 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 59390-59399 + 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 59400-59409 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 22, // 59410-59419 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 59420-59429 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 59430-59439 + 1, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 59440-59449 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 59450-59459 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 59460-59469 + 1, 2, 1, 24, 23, 22, 21, 20, 19, 18, // 59470-59479 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 59480-59489 + 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 59490-59499 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 59500-59509 + 3, 2, 1, 26, 25, 24, 23, 22, 21, 20, // 59510-59519 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 59520-59529 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 59530-59539 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 59540-59549 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 59550-59559 + 1, 6, 5, 4, 3, 2, 1, 14, 13, 12, // 59560-59569 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 59570-59579 + 1, 30, 29, 28, 27, 26, 25, 24, 23, 22, // 59580-59589 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 59590-59599 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 59600-59609 + 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 59610-59619 + 1, 6, 5, 4, 3, 2, 1, 2, 1, 22, // 59620-59629 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 59630-59639 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 59640-59649 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 59650-59659 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 59660-59669 + 1, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 59670-59679 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 59680-59689 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 59690-59699 + 7, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 59700-59709 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 59710-59719 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 14, // 59720-59729 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 59730-59739 + 3, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 59740-59749 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 59750-59759 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 59760-59769 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 59770-59779 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 59780-59789 + 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 59790-59799 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 24, // 59800-59809 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 59810-59819 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 59820-59829 + 3, 2, 1, 30, 29, 28, 27, 26, 25, 24, // 59830-59839 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 59840-59849 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 59850-59859 + 3, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 59860-59869 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 59870-59879 + 7, 6, 5, 4, 3, 2, 1, 34, 33, 32, // 59880-59889 + 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, // 59890-59899 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 59900-59909 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 59910-59919 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 22, // 59920-59929 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 59930-59939 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 59940-59949 + 1, 6, 5, 4, 3, 2, 1, 14, 13, 12, // 59950-59959 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 59960-59969 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 59970-59979 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 59980-59989 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 59990-59999 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 60000-60009 + 3, 2, 1, 4, 3, 2, 1, 12, 11, 10, // 60010-60019 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 60020-60029 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 60030-60039 + 1, 36, 35, 34, 33, 32, 31, 30, 29, 28, // 60040-60049 + 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 60050-60059 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 60060-60069 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 60070-60079 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 60080-60089 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 60090-60099 + 1, 2, 1, 4, 3, 2, 1, 20, 19, 18, // 60100-60109 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 60110-60119 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 60120-60129 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 10, // 60130-60139 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 60140-60149 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 60150-60159 + 1, 6, 5, 4, 3, 2, 1, 2, 1, 40, // 60160-60169 + 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, // 60170-60179 + 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 60180-60189 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 60190-60199 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 60200-60209 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 60210-60219 + 3, 2, 1, 28, 27, 26, 25, 24, 23, 22, // 60220-60229 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 60230-60239 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 60240-60249 + 1, 6, 5, 4, 3, 2, 1, 2, 1, 12, // 60250-60259 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 60260-60269 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 60270-60279 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 60280-60289 + 3, 2, 1, 24, 23, 22, 21, 20, 19, 18, // 60290-60299 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 60300-60309 + 7, 6, 5, 4, 3, 2, 1, 14, 13, 12, // 60310-60319 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 60320-60329 + 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 60330-60339 + 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 60340-60349 + 3, 2, 1, 20, 19, 18, 17, 16, 15, 14, // 60350-60359 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 60360-60369 + 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 60370-60379 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 60380-60389 + 7, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 60390-60399 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 60400-60409 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 60410-60419 + 7, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 60420-60429 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 60430-60439 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 60440-60449 + 7, 6, 5, 4, 3, 2, 1, 36, 35, 34, // 60450-60459 + 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, // 60460-60469 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 60470-60479 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 60480-60489 + 3, 2, 1, 4, 3, 2, 1, 12, 11, 10, // 60490-60499 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 60500-60509 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 60510-60519 + 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 60520-60529 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 50, // 60530-60539 + 49, 48, 47, 46, 45, 44, 43, 42, 41, 40, // 60540-60549 + 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, // 60550-60559 + 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 60560-60569 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 60570-60579 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 60580-60589 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 60590-60599 + 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 60600-60609 + 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 60610-60619 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 60620-60629 + 1, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 60630-60639 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 10, // 60640-60649 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 60650-60659 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 60660-60669 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 60670-60679 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 60680-60689 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 60690-60699 + 3, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 60700-60709 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 60710-60719 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 60720-60729 + 3, 2, 1, 4, 3, 2, 1, 20, 19, 18, // 60730-60739 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 60740-60749 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 60750-60759 + 1, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 60760-60769 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 14, // 60770-60779 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 60780-60789 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 60790-60799 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 60800-60809 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 60810-60819 + 1, 38, 37, 36, 35, 34, 33, 32, 31, 30, // 60820-60829 + 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 60830-60839 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 60840-60849 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 60850-60859 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 60860-60869 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 60870-60879 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 10, // 60880-60889 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 60890-60899 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 60900-60909 + 3, 2, 1, 4, 3, 2, 1, 2, 1, 4, // 60910-60919 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 60920-60929 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 60930-60939 + 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 60940-60949 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 60950-60959 + 1, 40, 39, 38, 37, 36, 35, 34, 33, 32, // 60960-60969 + 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, // 60970-60979 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 60980-60989 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 60990-60999 + 1, 6, 5, 4, 3, 2, 1, 20, 19, 18, // 61000-61009 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 61010-61019 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 61020-61029 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 61030-61039 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 61040-61049 + 1, 6, 5, 4, 3, 2, 1, 34, 33, 32, // 61050-61059 + 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, // 61060-61069 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 61070-61079 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 61080-61089 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 22, // 61090-61099 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 61100-61109 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 61110-61119 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 61120-61129 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 61130-61139 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 61140-61149 + 1, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 61150-61159 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 42, // 61160-61169 + 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, // 61170-61179 + 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, // 61180-61189 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 61190-61199 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 61200-61209 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 61210-61219 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 61220-61229 + 1, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 61230-61239 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 61240-61249 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 61250-61259 + 1, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 61260-61269 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 61270-61279 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 61280-61289 + 1, 6, 5, 4, 3, 2, 1, 34, 33, 32, // 61290-61299 + 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, // 61300-61309 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 61310-61319 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 61320-61329 + 1, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 61330-61339 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 61340-61349 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 61350-61359 + 3, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 61360-61369 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 61370-61379 + 1, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 61380-61389 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 61390-61399 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 8, // 61400-61409 + 7, 6, 5, 4, 3, 2, 1, 24, 23, 22, // 61410-61419 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 61420-61429 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 61430-61439 + 1, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 61440-61449 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 61450-61459 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 61460-61469 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 61470-61479 + 3, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 61480-61489 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 61490-61499 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 61500-61509 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 24, // 61510-61519 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 61520-61529 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 61530-61539 + 3, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 61540-61549 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 2, // 61550-61559 + 1, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 61560-61569 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 61570-61579 + 3, 2, 1, 20, 19, 18, 17, 16, 15, 14, // 61580-61589 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 61590-61599 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 61600-61609 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 61610-61619 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 61620-61629 + 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 61630-61639 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 61640-61649 + 1, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 61650-61659 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 61660-61669 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 61670-61679 + 1, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 61680-61689 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 61690-61699 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 61700-61709 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 61710-61719 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 22, // 61720-61729 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 61730-61739 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 61740-61749 + 1, 6, 5, 4, 3, 2, 1, 24, 23, 22, // 61750-61759 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 61760-61769 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 61770-61779 + 1, 32, 31, 30, 29, 28, 27, 26, 25, 24, // 61780-61789 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 61790-61799 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 61800-61809 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 18, // 61810-61819 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 61820-61829 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 61830-61839 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 61840-61849 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 61850-61859 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 61860-61869 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 30, // 61870-61879 + 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 61880-61889 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 61890-61899 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 61900-61909 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 61910-61919 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 61920-61929 + 3, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 61930-61939 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 61940-61949 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 61950-61959 + 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 61960-61969 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 61970-61979 + 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 61980-61989 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 61990-61999 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 62000-62009 + 1, 6, 5, 4, 3, 2, 1, 22, 21, 20, // 62010-62019 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 62020-62029 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 62030-62039 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 62040-62049 + 3, 2, 1, 4, 3, 2, 1, 14, 13, 12, // 62050-62059 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 62060-62069 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 62070-62079 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 62080-62089 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 20, // 62090-62099 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 62100-62109 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 62110-62119 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 62120-62129 + 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 62130-62139 + 1, 2, 1, 28, 27, 26, 25, 24, 23, 22, // 62140-62149 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 62150-62159 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 62160-62169 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 62170-62179 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 62180-62189 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 62190-62199 + 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 62200-62209 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 14, // 62210-62219 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 62220-62229 + 3, 2, 1, 40, 39, 38, 37, 36, 35, 34, // 62230-62239 + 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, // 62240-62249 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 62250-62259 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 62260-62269 + 3, 2, 1, 24, 23, 22, 21, 20, 19, 18, // 62270-62279 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 62280-62289 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 4, // 62290-62299 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 62300-62309 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 62310-62319 + 3, 2, 1, 4, 3, 2, 1, 20, 19, 18, // 62320-62329 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 62330-62339 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 62340-62349 + 1, 32, 31, 30, 29, 28, 27, 26, 25, 24, // 62350-62359 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 62360-62369 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 62370-62379 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 62380-62389 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 62390-62399 + 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 62400-62409 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 62410-62419 + 3, 2, 1, 36, 35, 34, 33, 32, 31, 30, // 62420-62429 + 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 62430-62439 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 62440-62449 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 62450-62459 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 62460-62469 + 3, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 62470-62479 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 62480-62489 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 62490-62499 + 1, 6, 5, 4, 3, 2, 1, 26, 25, 24, // 62500-62509 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 62510-62519 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 62520-62529 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 10, // 62530-62539 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 62540-62549 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 62550-62559 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 62560-62569 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 62570-62579 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 62580-62589 + 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 62590-62599 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 62600-62609 + 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 62610-62619 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 62620-62629 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 14, // 62630-62639 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 62640-62649 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 24, // 62650-62659 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 62660-62669 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 62670-62679 + 3, 2, 1, 4, 3, 2, 1, 14, 13, 12, // 62680-62689 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 62690-62699 + 1, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 62700-62709 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 62710-62719 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 62720-62729 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 62730-62739 + 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 62740-62749 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 62750-62759 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 62760-62769 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 62770-62779 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 62780-62789 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 62790-62799 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 62800-62809 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 62810-62819 + 7, 6, 5, 4, 3, 2, 1, 24, 23, 22, // 62820-62829 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 62830-62839 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 62840-62849 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 62850-62859 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 62860-62869 + 3, 2, 1, 24, 23, 22, 21, 20, 19, 18, // 62870-62879 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 62880-62889 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 62890-62899 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 62900-62909 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 62910-62919 + 1, 6, 5, 4, 3, 2, 1, 2, 1, 10, // 62920-62929 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 30, // 62930-62939 + 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 62940-62949 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 62950-62959 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 62960-62969 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 62970-62979 + 1, 2, 1, 4, 3, 2, 1, 2, 1, 40, // 62980-62989 + 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, // 62990-62999 + 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 63000-63009 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 63010-63019 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 63020-63029 + 1, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 63030-63039 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 63040-63049 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 63050-63059 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 63060-63069 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 18, // 63070-63079 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 63080-63089 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 63090-63099 + 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 63100-63109 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 63110-63119 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 63120-63129 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 63130-63139 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 30, // 63140-63149 + 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 63150-63159 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 63160-63169 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 63170-63179 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 63180-63189 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 12, // 63190-63199 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 63200-63209 + 1, 30, 29, 28, 27, 26, 25, 24, 23, 22, // 63210-63219 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 63220-63229 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 63230-63239 + 1, 6, 5, 4, 3, 2, 1, 30, 29, 28, // 63240-63249 + 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 63250-63259 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 63260-63269 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 63270-63279 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 63280-63289 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 12, // 63290-63299 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 63300-63309 + 1, 2, 1, 4, 3, 2, 1, 14, 13, 12, // 63310-63319 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 63320-63329 + 1, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 63330-63339 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 63340-63349 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 63350-63359 + 1, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 63360-63369 + 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 63370-63379 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 63380-63389 + 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 63390-63399 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 63400-63409 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 63410-63419 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 63420-63429 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 63430-63439 + 3, 2, 1, 20, 19, 18, 17, 16, 15, 14, // 63440-63449 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 63450-63459 + 3, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 63460-63469 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 63470-63479 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 63480-63489 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 22, // 63490-63499 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 63500-63509 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 63510-63519 + 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 63520-63529 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 63530-63539 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 63540-63549 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 63550-63559 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 63560-63569 + 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 63570-63579 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 10, // 63580-63589 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 63590-63599 + 1, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 63600-63609 + 1, 6, 5, 4, 3, 2, 1, 12, 11, 10, // 63610-63619 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 63620-63629 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 63630-63639 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 10, // 63640-63649 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 63650-63659 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 63660-63669 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 63670-63679 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 63680-63689 + 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 63690-63699 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 10, // 63700-63709 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 63710-63719 + 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 63720-63729 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 63730-63739 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 63740-63749 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 63750-63759 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 63760-63769 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 63770-63779 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 63780-63789 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 63790-63799 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 14, // 63800-63809 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 63810-63819 + 3, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 63820-63829 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 63830-63839 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 63840-63849 + 3, 2, 1, 4, 3, 2, 1, 6, 5, 4, // 63850-63859 + 3, 2, 1, 38, 37, 36, 35, 34, 33, 32, // 63860-63869 + 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, // 63870-63879 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 63880-63889 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 63890-63899 + 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 63900-63909 + 3, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 63910-63919 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 20, // 63920-63929 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 63930-63939 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 28, // 63940-63949 + 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 63950-63959 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 63960-63969 + 7, 6, 5, 4, 3, 2, 1, 20, 19, 18, // 63970-63979 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 63980-63989 + 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 63990-63999 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 64000-64009 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 14, // 64010-64019 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 64020-64029 + 3, 2, 1, 4, 3, 2, 1, 26, 25, 24, // 64030-64039 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 64040-64049 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 64050-64059 + 3, 2, 1, 4, 3, 2, 1, 14, 13, 12, // 64060-64069 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 64070-64079 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 64080-64089 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 64090-64099 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 64100-64109 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 64110-64119 + 3, 2, 1, 28, 27, 26, 25, 24, 23, 22, // 64120-64129 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 64130-64139 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 64140-64149 + 1, 2, 1, 4, 3, 2, 1, 14, 13, 12, // 64150-64159 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 64160-64169 + 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 64170-64179 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 28, // 64180-64189 + 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 64190-64199 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 64200-64209 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 64210-64219 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 64220-64229 + 1, 6, 5, 4, 3, 2, 1, 34, 33, 32, // 64230-64239 + 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, // 64240-64249 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 64250-64259 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 64260-64269 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 64270-64279 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 64280-64289 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 64290-64299 + 1, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 64300-64309 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 64310-64319 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 64320-64329 + 3, 2, 1, 40, 39, 38, 37, 36, 35, 34, // 64330-64339 + 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, // 64340-64349 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 64350-64359 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 64360-64369 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 64370-64379 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 64380-64389 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 64390-64399 + 3, 2, 1, 30, 29, 28, 27, 26, 25, 24, // 64400-64409 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 64410-64419 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 64420-64429 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 64430-64439 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 64440-64449 + 1, 2, 1, 30, 29, 28, 27, 26, 25, 24, // 64450-64459 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 64460-64469 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 64470-64479 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 10, // 64480-64489 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 64490-64499 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 64500-64509 + 3, 2, 1, 40, 39, 38, 37, 36, 35, 34, // 64510-64519 + 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, // 64520-64529 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 64530-64539 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 64540-64549 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 64550-64559 + 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 64560-64569 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 12, // 64570-64579 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 64580-64589 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 64590-64599 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 64600-64609 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 64610-64619 + 1, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 64620-64629 + 3, 2, 1, 28, 27, 26, 25, 24, 23, 22, // 64630-64639 + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, // 64640-64649 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 64650-64659 + 1, 2, 1, 4, 3, 2, 1, 12, 11, 10, // 64660-64669 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 64670-64679 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 64680-64689 + 3, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 64690-64699 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, // 64700-64709 + 7, 6, 5, 4, 3, 2, 1, 30, 29, 28, // 64710-64719 + 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 64720-64729 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 64730-64739 + 7, 6, 5, 4, 3, 2, 1, 16, 15, 14, // 64740-64749 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 64750-64759 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 64760-64769 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 64770-64779 + 1, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 64780-64789 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 64790-64799 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 64800-64809 + 1, 6, 5, 4, 3, 2, 1, 32, 31, 30, // 64810-64819 + 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 64820-64829 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 64830-64839 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 64840-64849 + 3, 2, 1, 18, 17, 16, 15, 14, 13, 12, // 64850-64859 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 64860-64869 + 1, 6, 5, 4, 3, 2, 1, 2, 1, 12, // 64870-64879 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 64880-64889 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 64890-64899 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 64900-64909 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 64910-64919 + 1, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 64920-64929 + 7, 6, 5, 4, 3, 2, 1, 14, 13, 12, // 64930-64939 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 64940-64949 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 64950-64959 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 28, // 64960-64969 + 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, // 64970-64979 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 64980-64989 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 64990-64999 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 65000-65009 + 1, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 65010-65019 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 4, // 65020-65029 + 3, 2, 1, 20, 19, 18, 17, 16, 15, 14, // 65030-65039 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 65040-65049 + 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 65050-65059 + 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, // 65060-65069 + 1, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 65070-65079 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, // 65080-65089 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 65090-65099 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 65100-65109 + 1, 8, 7, 6, 5, 4, 3, 2, 1, 4, // 65110-65119 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 12, // 65120-65129 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 65130-65139 + 1, 6, 5, 4, 3, 2, 1, 20, 19, 18, // 65140-65149 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 65150-65159 + 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, // 65160-65169 + 1, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 65170-65179 + 3, 2, 1, 20, 19, 18, 17, 16, 15, 14, // 65180-65189 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 65190-65199 + 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, // 65200-65209 + 3, 2, 1, 26, 25, 24, 23, 22, 21, 20, // 65210-65219 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 65220-65229 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 65230-65239 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 65240-65249 + 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 65250-65259 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 18, // 65260-65269 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 65270-65279 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 65280-65289 + 3, 2, 1, 16, 15, 14, 13, 12, 11, 10, // 65290-65299 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 14, // 65300-65309 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 65310-65319 + 3, 2, 1, 4, 3, 2, 1, 26, 25, 24, // 65320-65329 + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, // 65330-65339 + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 65340-65349 + 3, 2, 1, 4, 3, 2, 1, 14, 13, 12, // 65350-65359 + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 65360-65369 + 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, // 65370-65379 + 1, 12, 11, 10, 9, 8, 7, 6, 5, 4, // 65380-65389 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 65390-65399 + 7, 6, 5, 4, 3, 2, 1, 6, 5, 4, // 65400-65409 + 3, 2, 1, 6, 5, 4, 3, 2, 1, 4, // 65410-65419 + 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, // 65420-65429 + 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, // 65430-65439 + 7, 6, 5, 4, 3, 2, 1, 2, 1, 30, // 65440-65449 + 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, // 65450-65459 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 65460-65469 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 18, // 65470-65479 + 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, // 65480-65489 + 7, 6, 5, 4, 3, 2, 1, 22, 21, 20, // 65490-65499 + 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, // 65500-65509 + 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, // 65510-65519 + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 65520-65529 + 0, 0, 0, 0, 0, 0, + } + + lohi [256]struct{ lo, hi int } +) + +func init() { + for i, v := range liars { + blk := v >> 24 + x := &lohi[blk] + if x.lo == 0 || i < x.lo { + x.lo = i + } + if i > x.hi { + x.hi = i + } + } +} diff --git a/vendor/github.com/cznic/mathutil/test_deps.go b/vendor/github.com/cznic/mathutil/test_deps.go new file mode 100644 index 0000000..40054dc --- /dev/null +++ b/vendor/github.com/cznic/mathutil/test_deps.go @@ -0,0 +1,11 @@ +// Copyright (c) 2014 The mathutil Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package mathutil + +// Pull test dependencies too. +// Enables easy 'go test X' after 'go get X' +import ( +// nothing yet +) diff --git a/vendor/github.com/go-ole/go-ole/ChangeLog.md b/vendor/github.com/go-ole/go-ole/ChangeLog.md new file mode 100644 index 0000000..4ba6a8c --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/ChangeLog.md @@ -0,0 +1,49 @@ +# Version 1.x.x + +* **Add more test cases and reference new test COM server project.** (Placeholder for future additions) + +# Version 1.2.0-alphaX + +**Minimum supported version is now Go 1.4. Go 1.1 support is deprecated, but should still build.** + + * Added CI configuration for Travis-CI and AppVeyor. + * Added test InterfaceID and ClassID for the COM Test Server project. + * Added more inline documentation (#83). + * Added IEnumVARIANT implementation (#88). + * Added IEnumVARIANT test cases (#99, #100, #101). + * Added support for retrieving `time.Time` from VARIANT (#92). + * Added test case for IUnknown (#64). + * Added test case for IDispatch (#64). + * Added test cases for scalar variants (#64, #76). + +# Version 1.1.1 + + * Fixes for Linux build. + * Fixes for Windows build. + +# Version 1.1.0 + +The change to provide building on all platforms is a new feature. The increase in minor version reflects that and allows those who wish to stay on 1.0.x to continue to do so. Support for 1.0.x will be limited to bug fixes. + + * Move GUID out of variables.go into its own file to make new documentation available. + * Move OleError out of ole.go into its own file to make new documentation available. + * Add documentation to utility functions. + * Add documentation to variant receiver functions. + * Add documentation to ole structures. + * Make variant available to other systems outside of Windows. + * Make OLE structures available to other systems outside of Windows. + +## New Features + + * Library should now be built on all platforms supported by Go. Library will NOOP on any platform that is not Windows. + * More functions are now documented and available on godoc.org. + +# Version 1.0.1 + + 1. Fix package references from repository location change. + +# Version 1.0.0 + +This version is stable enough for use. The COM API is still incomplete, but provides enough functionality for accessing COM servers using IDispatch interface. + +There is no changelog for this version. Check commits for history. diff --git a/vendor/github.com/go-ole/go-ole/LICENSE b/vendor/github.com/go-ole/go-ole/LICENSE new file mode 100644 index 0000000..623ec06 --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright © 2013-2017 Yasuhiro Matsumoto, + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the “Software”), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/vendor/github.com/go-ole/go-ole/README.md b/vendor/github.com/go-ole/go-ole/README.md new file mode 100644 index 0000000..7b57755 --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/README.md @@ -0,0 +1,46 @@ +# Go OLE + +[![Build status](https://ci.appveyor.com/api/projects/status/qr0u2sf7q43us9fj?svg=true)](https://ci.appveyor.com/project/jacobsantos/go-ole-jgs28) +[![Build Status](https://travis-ci.org/go-ole/go-ole.svg?branch=master)](https://travis-ci.org/go-ole/go-ole) +[![GoDoc](https://godoc.org/github.com/go-ole/go-ole?status.svg)](https://godoc.org/github.com/go-ole/go-ole) + +Go bindings for Windows COM using shared libraries instead of cgo. + +By Yasuhiro Matsumoto. + +## Install + +To experiment with go-ole, you can just compile and run the example program: + +``` +go get github.com/go-ole/go-ole +cd /path/to/go-ole/ +go test + +cd /path/to/go-ole/example/excel +go run excel.go +``` + +## Continuous Integration + +Continuous integration configuration has been added for both Travis-CI and AppVeyor. You will have to add these to your own account for your fork in order for it to run. + +**Travis-CI** + +Travis-CI was added to check builds on Linux to ensure that `go get` works when cross building. Currently, Travis-CI is not used to test cross-building, but this may be changed in the future. It is also not currently possible to test the library on Linux, since COM API is specific to Windows and it is not currently possible to run a COM server on Linux or even connect to a remote COM server. + +**AppVeyor** + +AppVeyor is used to build on Windows using the (in-development) test COM server. It is currently only used to test the build and ensure that the code works on Windows. It will be used to register a COM server and then run the test cases based on the test COM server. + +The tests currently do run and do pass and this should be maintained with commits. + +## Versioning + +Go OLE uses [semantic versioning](http://semver.org) for version numbers, which is similar to the version contract of the Go language. Which means that the major version will always maintain backwards compatibility with minor versions. Minor versions will only add new additions and changes. Fixes will always be in patch. + +This contract should allow you to upgrade to new minor and patch versions without breakage or modifications to your existing code. Leave a ticket, if there is breakage, so that it could be fixed. + +## LICENSE + +Under the MIT License: http://mattn.mit-license.org/2013 diff --git a/vendor/github.com/go-ole/go-ole/appveyor.yml b/vendor/github.com/go-ole/go-ole/appveyor.yml new file mode 100644 index 0000000..0d557ac --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/appveyor.yml @@ -0,0 +1,54 @@ +# Notes: +# - Minimal appveyor.yml file is an empty file. All sections are optional. +# - Indent each level of configuration with 2 spaces. Do not use tabs! +# - All section names are case-sensitive. +# - Section names should be unique on each level. + +version: "1.3.0.{build}-alpha-{branch}" + +os: Windows Server 2012 R2 + +branches: + only: + - master + - v1.2 + - v1.1 + - v1.0 + +skip_tags: true + +clone_folder: c:\gopath\src\github.com\go-ole\go-ole + +environment: + GOPATH: c:\gopath + matrix: + - GOARCH: amd64 + GOVERSION: 1.5 + GOROOT: c:\go + DOWNLOADPLATFORM: "x64" + +install: + - choco install mingw + - SET PATH=c:\tools\mingw64\bin;%PATH% + # - Download COM Server + - ps: Start-FileDownload "https://github.com/go-ole/test-com-server/releases/download/v1.0.2/test-com-server-${env:DOWNLOADPLATFORM}.zip" + - 7z e test-com-server-%DOWNLOADPLATFORM%.zip -oc:\gopath\src\github.com\go-ole\go-ole > NUL + - c:\gopath\src\github.com\go-ole\go-ole\build\register-assembly.bat + # - set + - go version + - go env + - go get -u golang.org/x/tools/cmd/cover + - go get -u golang.org/x/tools/cmd/godoc + - go get -u golang.org/x/tools/cmd/stringer + +build_script: + - cd c:\gopath\src\github.com\go-ole\go-ole + - go get -v -t ./... + - go build + - go test -v -cover ./... + +# disable automatic tests +test: off + +# disable deployment +deploy: off diff --git a/vendor/github.com/go-ole/go-ole/com.go b/vendor/github.com/go-ole/go-ole/com.go new file mode 100644 index 0000000..6f986b1 --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/com.go @@ -0,0 +1,344 @@ +// +build windows + +package ole + +import ( + "syscall" + "unicode/utf16" + "unsafe" +) + +var ( + procCoInitialize, _ = modole32.FindProc("CoInitialize") + procCoInitializeEx, _ = modole32.FindProc("CoInitializeEx") + procCoUninitialize, _ = modole32.FindProc("CoUninitialize") + procCoCreateInstance, _ = modole32.FindProc("CoCreateInstance") + procCoTaskMemFree, _ = modole32.FindProc("CoTaskMemFree") + procCLSIDFromProgID, _ = modole32.FindProc("CLSIDFromProgID") + procCLSIDFromString, _ = modole32.FindProc("CLSIDFromString") + procStringFromCLSID, _ = modole32.FindProc("StringFromCLSID") + procStringFromIID, _ = modole32.FindProc("StringFromIID") + procIIDFromString, _ = modole32.FindProc("IIDFromString") + procCoGetObject, _ = modole32.FindProc("CoGetObject") + procGetUserDefaultLCID, _ = modkernel32.FindProc("GetUserDefaultLCID") + procCopyMemory, _ = modkernel32.FindProc("RtlMoveMemory") + procVariantInit, _ = modoleaut32.FindProc("VariantInit") + procVariantClear, _ = modoleaut32.FindProc("VariantClear") + procVariantTimeToSystemTime, _ = modoleaut32.FindProc("VariantTimeToSystemTime") + procSysAllocString, _ = modoleaut32.FindProc("SysAllocString") + procSysAllocStringLen, _ = modoleaut32.FindProc("SysAllocStringLen") + procSysFreeString, _ = modoleaut32.FindProc("SysFreeString") + procSysStringLen, _ = modoleaut32.FindProc("SysStringLen") + procCreateDispTypeInfo, _ = modoleaut32.FindProc("CreateDispTypeInfo") + procCreateStdDispatch, _ = modoleaut32.FindProc("CreateStdDispatch") + procGetActiveObject, _ = modoleaut32.FindProc("GetActiveObject") + + procGetMessageW, _ = moduser32.FindProc("GetMessageW") + procDispatchMessageW, _ = moduser32.FindProc("DispatchMessageW") +) + +// coInitialize initializes COM library on current thread. +// +// MSDN documentation suggests that this function should not be called. Call +// CoInitializeEx() instead. The reason has to do with threading and this +// function is only for single-threaded apartments. +// +// That said, most users of the library have gotten away with just this +// function. If you are experiencing threading issues, then use +// CoInitializeEx(). +func coInitialize() (err error) { + // http://msdn.microsoft.com/en-us/library/windows/desktop/ms678543(v=vs.85).aspx + // Suggests that no value should be passed to CoInitialized. + // Could just be Call() since the parameter is optional. <-- Needs testing to be sure. + hr, _, _ := procCoInitialize.Call(uintptr(0)) + if hr != 0 { + err = NewError(hr) + } + return +} + +// coInitializeEx initializes COM library with concurrency model. +func coInitializeEx(coinit uint32) (err error) { + // http://msdn.microsoft.com/en-us/library/windows/desktop/ms695279(v=vs.85).aspx + // Suggests that the first parameter is not only optional but should always be NULL. + hr, _, _ := procCoInitializeEx.Call(uintptr(0), uintptr(coinit)) + if hr != 0 { + err = NewError(hr) + } + return +} + +// CoInitialize initializes COM library on current thread. +// +// MSDN documentation suggests that this function should not be called. Call +// CoInitializeEx() instead. The reason has to do with threading and this +// function is only for single-threaded apartments. +// +// That said, most users of the library have gotten away with just this +// function. If you are experiencing threading issues, then use +// CoInitializeEx(). +func CoInitialize(p uintptr) (err error) { + // p is ignored and won't be used. + // Avoid any variable not used errors. + p = uintptr(0) + return coInitialize() +} + +// CoInitializeEx initializes COM library with concurrency model. +func CoInitializeEx(p uintptr, coinit uint32) (err error) { + // Avoid any variable not used errors. + p = uintptr(0) + return coInitializeEx(coinit) +} + +// CoUninitialize uninitializes COM Library. +func CoUninitialize() { + procCoUninitialize.Call() +} + +// CoTaskMemFree frees memory pointer. +func CoTaskMemFree(memptr uintptr) { + procCoTaskMemFree.Call(memptr) +} + +// CLSIDFromProgID retrieves Class Identifier with the given Program Identifier. +// +// The Programmatic Identifier must be registered, because it will be looked up +// in the Windows Registry. The registry entry has the following keys: CLSID, +// Insertable, Protocol and Shell +// (https://msdn.microsoft.com/en-us/library/dd542719(v=vs.85).aspx). +// +// programID identifies the class id with less precision and is not guaranteed +// to be unique. These are usually found in the registry under +// HKEY_LOCAL_MACHINE\SOFTWARE\Classes, usually with the format of +// "Program.Component.Version" with version being optional. +// +// CLSIDFromProgID in Windows API. +func CLSIDFromProgID(progId string) (clsid *GUID, err error) { + var guid GUID + lpszProgID := uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(progId))) + hr, _, _ := procCLSIDFromProgID.Call(lpszProgID, uintptr(unsafe.Pointer(&guid))) + if hr != 0 { + err = NewError(hr) + } + clsid = &guid + return +} + +// CLSIDFromString retrieves Class ID from string representation. +// +// This is technically the string version of the GUID and will convert the +// string to object. +// +// CLSIDFromString in Windows API. +func CLSIDFromString(str string) (clsid *GUID, err error) { + var guid GUID + lpsz := uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(str))) + hr, _, _ := procCLSIDFromString.Call(lpsz, uintptr(unsafe.Pointer(&guid))) + if hr != 0 { + err = NewError(hr) + } + clsid = &guid + return +} + +// StringFromCLSID returns GUID formated string from GUID object. +func StringFromCLSID(clsid *GUID) (str string, err error) { + var p *uint16 + hr, _, _ := procStringFromCLSID.Call(uintptr(unsafe.Pointer(clsid)), uintptr(unsafe.Pointer(&p))) + if hr != 0 { + err = NewError(hr) + } + str = LpOleStrToString(p) + return +} + +// IIDFromString returns GUID from program ID. +func IIDFromString(progId string) (clsid *GUID, err error) { + var guid GUID + lpsz := uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(progId))) + hr, _, _ := procIIDFromString.Call(lpsz, uintptr(unsafe.Pointer(&guid))) + if hr != 0 { + err = NewError(hr) + } + clsid = &guid + return +} + +// StringFromIID returns GUID formatted string from GUID object. +func StringFromIID(iid *GUID) (str string, err error) { + var p *uint16 + hr, _, _ := procStringFromIID.Call(uintptr(unsafe.Pointer(iid)), uintptr(unsafe.Pointer(&p))) + if hr != 0 { + err = NewError(hr) + } + str = LpOleStrToString(p) + return +} + +// CreateInstance of single uninitialized object with GUID. +func CreateInstance(clsid *GUID, iid *GUID) (unk *IUnknown, err error) { + if iid == nil { + iid = IID_IUnknown + } + hr, _, _ := procCoCreateInstance.Call( + uintptr(unsafe.Pointer(clsid)), + 0, + CLSCTX_SERVER, + uintptr(unsafe.Pointer(iid)), + uintptr(unsafe.Pointer(&unk))) + if hr != 0 { + err = NewError(hr) + } + return +} + +// GetActiveObject retrieves pointer to active object. +func GetActiveObject(clsid *GUID, iid *GUID) (unk *IUnknown, err error) { + if iid == nil { + iid = IID_IUnknown + } + hr, _, _ := procGetActiveObject.Call( + uintptr(unsafe.Pointer(clsid)), + uintptr(unsafe.Pointer(iid)), + uintptr(unsafe.Pointer(&unk))) + if hr != 0 { + err = NewError(hr) + } + return +} + +type BindOpts struct { + CbStruct uint32 + GrfFlags uint32 + GrfMode uint32 + TickCountDeadline uint32 +} + +// GetObject retrieves pointer to active object. +func GetObject(programID string, bindOpts *BindOpts, iid *GUID) (unk *IUnknown, err error) { + if bindOpts != nil { + bindOpts.CbStruct = uint32(unsafe.Sizeof(BindOpts{})) + } + if iid == nil { + iid = IID_IUnknown + } + hr, _, _ := procCoGetObject.Call( + uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(programID))), + uintptr(unsafe.Pointer(bindOpts)), + uintptr(unsafe.Pointer(iid)), + uintptr(unsafe.Pointer(&unk))) + if hr != 0 { + err = NewError(hr) + } + return +} + +// VariantInit initializes variant. +func VariantInit(v *VARIANT) (err error) { + hr, _, _ := procVariantInit.Call(uintptr(unsafe.Pointer(v))) + if hr != 0 { + err = NewError(hr) + } + return +} + +// VariantClear clears value in Variant settings to VT_EMPTY. +func VariantClear(v *VARIANT) (err error) { + hr, _, _ := procVariantClear.Call(uintptr(unsafe.Pointer(v))) + if hr != 0 { + err = NewError(hr) + } + return +} + +// SysAllocString allocates memory for string and copies string into memory. +func SysAllocString(v string) (ss *int16) { + pss, _, _ := procSysAllocString.Call(uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(v)))) + ss = (*int16)(unsafe.Pointer(pss)) + return +} + +// SysAllocStringLen copies up to length of given string returning pointer. +func SysAllocStringLen(v string) (ss *int16) { + utf16 := utf16.Encode([]rune(v + "\x00")) + ptr := &utf16[0] + + pss, _, _ := procSysAllocStringLen.Call(uintptr(unsafe.Pointer(ptr)), uintptr(len(utf16)-1)) + ss = (*int16)(unsafe.Pointer(pss)) + return +} + +// SysFreeString frees string system memory. This must be called with SysAllocString. +func SysFreeString(v *int16) (err error) { + hr, _, _ := procSysFreeString.Call(uintptr(unsafe.Pointer(v))) + if hr != 0 { + err = NewError(hr) + } + return +} + +// SysStringLen is the length of the system allocated string. +func SysStringLen(v *int16) uint32 { + l, _, _ := procSysStringLen.Call(uintptr(unsafe.Pointer(v))) + return uint32(l) +} + +// CreateStdDispatch provides default IDispatch implementation for IUnknown. +// +// This handles default IDispatch implementation for objects. It haves a few +// limitations with only supporting one language. It will also only return +// default exception codes. +func CreateStdDispatch(unk *IUnknown, v uintptr, ptinfo *IUnknown) (disp *IDispatch, err error) { + hr, _, _ := procCreateStdDispatch.Call( + uintptr(unsafe.Pointer(unk)), + v, + uintptr(unsafe.Pointer(ptinfo)), + uintptr(unsafe.Pointer(&disp))) + if hr != 0 { + err = NewError(hr) + } + return +} + +// CreateDispTypeInfo provides default ITypeInfo implementation for IDispatch. +// +// This will not handle the full implementation of the interface. +func CreateDispTypeInfo(idata *INTERFACEDATA) (pptinfo *IUnknown, err error) { + hr, _, _ := procCreateDispTypeInfo.Call( + uintptr(unsafe.Pointer(idata)), + uintptr(GetUserDefaultLCID()), + uintptr(unsafe.Pointer(&pptinfo))) + if hr != 0 { + err = NewError(hr) + } + return +} + +// copyMemory moves location of a block of memory. +func copyMemory(dest unsafe.Pointer, src unsafe.Pointer, length uint32) { + procCopyMemory.Call(uintptr(dest), uintptr(src), uintptr(length)) +} + +// GetUserDefaultLCID retrieves current user default locale. +func GetUserDefaultLCID() (lcid uint32) { + ret, _, _ := procGetUserDefaultLCID.Call() + lcid = uint32(ret) + return +} + +// GetMessage in message queue from runtime. +// +// This function appears to block. PeekMessage does not block. +func GetMessage(msg *Msg, hwnd uint32, MsgFilterMin uint32, MsgFilterMax uint32) (ret int32, err error) { + r0, _, err := procGetMessageW.Call(uintptr(unsafe.Pointer(msg)), uintptr(hwnd), uintptr(MsgFilterMin), uintptr(MsgFilterMax)) + ret = int32(r0) + return +} + +// DispatchMessage to window procedure. +func DispatchMessage(msg *Msg) (ret int32) { + r0, _, _ := procDispatchMessageW.Call(uintptr(unsafe.Pointer(msg))) + ret = int32(r0) + return +} diff --git a/vendor/github.com/go-ole/go-ole/com_func.go b/vendor/github.com/go-ole/go-ole/com_func.go new file mode 100644 index 0000000..cef539d --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/com_func.go @@ -0,0 +1,174 @@ +// +build !windows + +package ole + +import ( + "time" + "unsafe" +) + +// coInitialize initializes COM library on current thread. +// +// MSDN documentation suggests that this function should not be called. Call +// CoInitializeEx() instead. The reason has to do with threading and this +// function is only for single-threaded apartments. +// +// That said, most users of the library have gotten away with just this +// function. If you are experiencing threading issues, then use +// CoInitializeEx(). +func coInitialize() error { + return NewError(E_NOTIMPL) +} + +// coInitializeEx initializes COM library with concurrency model. +func coInitializeEx(coinit uint32) error { + return NewError(E_NOTIMPL) +} + +// CoInitialize initializes COM library on current thread. +// +// MSDN documentation suggests that this function should not be called. Call +// CoInitializeEx() instead. The reason has to do with threading and this +// function is only for single-threaded apartments. +// +// That said, most users of the library have gotten away with just this +// function. If you are experiencing threading issues, then use +// CoInitializeEx(). +func CoInitialize(p uintptr) error { + return NewError(E_NOTIMPL) +} + +// CoInitializeEx initializes COM library with concurrency model. +func CoInitializeEx(p uintptr, coinit uint32) error { + return NewError(E_NOTIMPL) +} + +// CoUninitialize uninitializes COM Library. +func CoUninitialize() {} + +// CoTaskMemFree frees memory pointer. +func CoTaskMemFree(memptr uintptr) {} + +// CLSIDFromProgID retrieves Class Identifier with the given Program Identifier. +// +// The Programmatic Identifier must be registered, because it will be looked up +// in the Windows Registry. The registry entry has the following keys: CLSID, +// Insertable, Protocol and Shell +// (https://msdn.microsoft.com/en-us/library/dd542719(v=vs.85).aspx). +// +// programID identifies the class id with less precision and is not guaranteed +// to be unique. These are usually found in the registry under +// HKEY_LOCAL_MACHINE\SOFTWARE\Classes, usually with the format of +// "Program.Component.Version" with version being optional. +// +// CLSIDFromProgID in Windows API. +func CLSIDFromProgID(progId string) (*GUID, error) { + return nil, NewError(E_NOTIMPL) +} + +// CLSIDFromString retrieves Class ID from string representation. +// +// This is technically the string version of the GUID and will convert the +// string to object. +// +// CLSIDFromString in Windows API. +func CLSIDFromString(str string) (*GUID, error) { + return nil, NewError(E_NOTIMPL) +} + +// StringFromCLSID returns GUID formated string from GUID object. +func StringFromCLSID(clsid *GUID) (string, error) { + return "", NewError(E_NOTIMPL) +} + +// IIDFromString returns GUID from program ID. +func IIDFromString(progId string) (*GUID, error) { + return nil, NewError(E_NOTIMPL) +} + +// StringFromIID returns GUID formatted string from GUID object. +func StringFromIID(iid *GUID) (string, error) { + return "", NewError(E_NOTIMPL) +} + +// CreateInstance of single uninitialized object with GUID. +func CreateInstance(clsid *GUID, iid *GUID) (*IUnknown, error) { + return nil, NewError(E_NOTIMPL) +} + +// GetActiveObject retrieves pointer to active object. +func GetActiveObject(clsid *GUID, iid *GUID) (*IUnknown, error) { + return nil, NewError(E_NOTIMPL) +} + +// VariantInit initializes variant. +func VariantInit(v *VARIANT) error { + return NewError(E_NOTIMPL) +} + +// VariantClear clears value in Variant settings to VT_EMPTY. +func VariantClear(v *VARIANT) error { + return NewError(E_NOTIMPL) +} + +// SysAllocString allocates memory for string and copies string into memory. +func SysAllocString(v string) *int16 { + u := int16(0) + return &u +} + +// SysAllocStringLen copies up to length of given string returning pointer. +func SysAllocStringLen(v string) *int16 { + u := int16(0) + return &u +} + +// SysFreeString frees string system memory. This must be called with SysAllocString. +func SysFreeString(v *int16) error { + return NewError(E_NOTIMPL) +} + +// SysStringLen is the length of the system allocated string. +func SysStringLen(v *int16) uint32 { + return uint32(0) +} + +// CreateStdDispatch provides default IDispatch implementation for IUnknown. +// +// This handles default IDispatch implementation for objects. It haves a few +// limitations with only supporting one language. It will also only return +// default exception codes. +func CreateStdDispatch(unk *IUnknown, v uintptr, ptinfo *IUnknown) (*IDispatch, error) { + return nil, NewError(E_NOTIMPL) +} + +// CreateDispTypeInfo provides default ITypeInfo implementation for IDispatch. +// +// This will not handle the full implementation of the interface. +func CreateDispTypeInfo(idata *INTERFACEDATA) (*IUnknown, error) { + return nil, NewError(E_NOTIMPL) +} + +// copyMemory moves location of a block of memory. +func copyMemory(dest unsafe.Pointer, src unsafe.Pointer, length uint32) {} + +// GetUserDefaultLCID retrieves current user default locale. +func GetUserDefaultLCID() uint32 { + return uint32(0) +} + +// GetMessage in message queue from runtime. +// +// This function appears to block. PeekMessage does not block. +func GetMessage(msg *Msg, hwnd uint32, MsgFilterMin uint32, MsgFilterMax uint32) (int32, error) { + return int32(0), NewError(E_NOTIMPL) +} + +// DispatchMessage to window procedure. +func DispatchMessage(msg *Msg) int32 { + return int32(0) +} + +func GetVariantDate(value uint64) (time.Time, error) { + return time.Now(), NewError(E_NOTIMPL) +} diff --git a/vendor/github.com/go-ole/go-ole/connect.go b/vendor/github.com/go-ole/go-ole/connect.go new file mode 100644 index 0000000..b2ac2ec --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/connect.go @@ -0,0 +1,192 @@ +package ole + +// Connection contains IUnknown for fluent interface interaction. +// +// Deprecated. Use oleutil package instead. +type Connection struct { + Object *IUnknown // Access COM +} + +// Initialize COM. +func (*Connection) Initialize() (err error) { + return coInitialize() +} + +// Uninitialize COM. +func (*Connection) Uninitialize() { + CoUninitialize() +} + +// Create IUnknown object based first on ProgId and then from String. +func (c *Connection) Create(progId string) (err error) { + var clsid *GUID + clsid, err = CLSIDFromProgID(progId) + if err != nil { + clsid, err = CLSIDFromString(progId) + if err != nil { + return + } + } + + unknown, err := CreateInstance(clsid, IID_IUnknown) + if err != nil { + return + } + c.Object = unknown + + return +} + +// Release IUnknown object. +func (c *Connection) Release() { + c.Object.Release() +} + +// Load COM object from list of programIDs or strings. +func (c *Connection) Load(names ...string) (errors []error) { + var tempErrors []error = make([]error, len(names)) + var numErrors int = 0 + for _, name := range names { + err := c.Create(name) + if err != nil { + tempErrors = append(tempErrors, err) + numErrors += 1 + continue + } + break + } + + copy(errors, tempErrors[0:numErrors]) + return +} + +// Dispatch returns Dispatch object. +func (c *Connection) Dispatch() (object *Dispatch, err error) { + dispatch, err := c.Object.QueryInterface(IID_IDispatch) + if err != nil { + return + } + object = &Dispatch{dispatch} + return +} + +// Dispatch stores IDispatch object. +type Dispatch struct { + Object *IDispatch // Dispatch object. +} + +// Call method on IDispatch with parameters. +func (d *Dispatch) Call(method string, params ...interface{}) (result *VARIANT, err error) { + id, err := d.GetId(method) + if err != nil { + return + } + + result, err = d.Invoke(id, DISPATCH_METHOD, params) + return +} + +// MustCall method on IDispatch with parameters. +func (d *Dispatch) MustCall(method string, params ...interface{}) (result *VARIANT) { + id, err := d.GetId(method) + if err != nil { + panic(err) + } + + result, err = d.Invoke(id, DISPATCH_METHOD, params) + if err != nil { + panic(err) + } + + return +} + +// Get property on IDispatch with parameters. +func (d *Dispatch) Get(name string, params ...interface{}) (result *VARIANT, err error) { + id, err := d.GetId(name) + if err != nil { + return + } + result, err = d.Invoke(id, DISPATCH_PROPERTYGET, params) + return +} + +// MustGet property on IDispatch with parameters. +func (d *Dispatch) MustGet(name string, params ...interface{}) (result *VARIANT) { + id, err := d.GetId(name) + if err != nil { + panic(err) + } + + result, err = d.Invoke(id, DISPATCH_PROPERTYGET, params) + if err != nil { + panic(err) + } + return +} + +// Set property on IDispatch with parameters. +func (d *Dispatch) Set(name string, params ...interface{}) (result *VARIANT, err error) { + id, err := d.GetId(name) + if err != nil { + return + } + result, err = d.Invoke(id, DISPATCH_PROPERTYPUT, params) + return +} + +// MustSet property on IDispatch with parameters. +func (d *Dispatch) MustSet(name string, params ...interface{}) (result *VARIANT) { + id, err := d.GetId(name) + if err != nil { + panic(err) + } + + result, err = d.Invoke(id, DISPATCH_PROPERTYPUT, params) + if err != nil { + panic(err) + } + return +} + +// GetId retrieves ID of name on IDispatch. +func (d *Dispatch) GetId(name string) (id int32, err error) { + var dispid []int32 + dispid, err = d.Object.GetIDsOfName([]string{name}) + if err != nil { + return + } + id = dispid[0] + return +} + +// GetIds retrieves all IDs of names on IDispatch. +func (d *Dispatch) GetIds(names ...string) (dispid []int32, err error) { + dispid, err = d.Object.GetIDsOfName(names) + return +} + +// Invoke IDispatch on DisplayID of dispatch type with parameters. +// +// There have been problems where if send cascading params..., it would error +// out because the parameters would be empty. +func (d *Dispatch) Invoke(id int32, dispatch int16, params []interface{}) (result *VARIANT, err error) { + if len(params) < 1 { + result, err = d.Object.Invoke(id, dispatch) + } else { + result, err = d.Object.Invoke(id, dispatch, params...) + } + return +} + +// Release IDispatch object. +func (d *Dispatch) Release() { + d.Object.Release() +} + +// Connect initializes COM and attempts to load IUnknown based on given names. +func Connect(names ...string) (connection *Connection) { + connection.Initialize() + connection.Load(names...) + return +} diff --git a/vendor/github.com/go-ole/go-ole/constants.go b/vendor/github.com/go-ole/go-ole/constants.go new file mode 100644 index 0000000..fd0c6d7 --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/constants.go @@ -0,0 +1,153 @@ +package ole + +const ( + CLSCTX_INPROC_SERVER = 1 + CLSCTX_INPROC_HANDLER = 2 + CLSCTX_LOCAL_SERVER = 4 + CLSCTX_INPROC_SERVER16 = 8 + CLSCTX_REMOTE_SERVER = 16 + CLSCTX_ALL = CLSCTX_INPROC_SERVER | CLSCTX_INPROC_HANDLER | CLSCTX_LOCAL_SERVER + CLSCTX_INPROC = CLSCTX_INPROC_SERVER | CLSCTX_INPROC_HANDLER + CLSCTX_SERVER = CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER | CLSCTX_REMOTE_SERVER +) + +const ( + COINIT_APARTMENTTHREADED = 0x2 + COINIT_MULTITHREADED = 0x0 + COINIT_DISABLE_OLE1DDE = 0x4 + COINIT_SPEED_OVER_MEMORY = 0x8 +) + +const ( + DISPATCH_METHOD = 1 + DISPATCH_PROPERTYGET = 2 + DISPATCH_PROPERTYPUT = 4 + DISPATCH_PROPERTYPUTREF = 8 +) + +const ( + S_OK = 0x00000000 + E_UNEXPECTED = 0x8000FFFF + E_NOTIMPL = 0x80004001 + E_OUTOFMEMORY = 0x8007000E + E_INVALIDARG = 0x80070057 + E_NOINTERFACE = 0x80004002 + E_POINTER = 0x80004003 + E_HANDLE = 0x80070006 + E_ABORT = 0x80004004 + E_FAIL = 0x80004005 + E_ACCESSDENIED = 0x80070005 + E_PENDING = 0x8000000A + + CO_E_CLASSSTRING = 0x800401F3 +) + +const ( + CC_FASTCALL = iota + CC_CDECL + CC_MSCPASCAL + CC_PASCAL = CC_MSCPASCAL + CC_MACPASCAL + CC_STDCALL + CC_FPFASTCALL + CC_SYSCALL + CC_MPWCDECL + CC_MPWPASCAL + CC_MAX = CC_MPWPASCAL +) + +type VT uint16 + +const ( + VT_EMPTY VT = 0x0 + VT_NULL VT = 0x1 + VT_I2 VT = 0x2 + VT_I4 VT = 0x3 + VT_R4 VT = 0x4 + VT_R8 VT = 0x5 + VT_CY VT = 0x6 + VT_DATE VT = 0x7 + VT_BSTR VT = 0x8 + VT_DISPATCH VT = 0x9 + VT_ERROR VT = 0xa + VT_BOOL VT = 0xb + VT_VARIANT VT = 0xc + VT_UNKNOWN VT = 0xd + VT_DECIMAL VT = 0xe + VT_I1 VT = 0x10 + VT_UI1 VT = 0x11 + VT_UI2 VT = 0x12 + VT_UI4 VT = 0x13 + VT_I8 VT = 0x14 + VT_UI8 VT = 0x15 + VT_INT VT = 0x16 + VT_UINT VT = 0x17 + VT_VOID VT = 0x18 + VT_HRESULT VT = 0x19 + VT_PTR VT = 0x1a + VT_SAFEARRAY VT = 0x1b + VT_CARRAY VT = 0x1c + VT_USERDEFINED VT = 0x1d + VT_LPSTR VT = 0x1e + VT_LPWSTR VT = 0x1f + VT_RECORD VT = 0x24 + VT_INT_PTR VT = 0x25 + VT_UINT_PTR VT = 0x26 + VT_FILETIME VT = 0x40 + VT_BLOB VT = 0x41 + VT_STREAM VT = 0x42 + VT_STORAGE VT = 0x43 + VT_STREAMED_OBJECT VT = 0x44 + VT_STORED_OBJECT VT = 0x45 + VT_BLOB_OBJECT VT = 0x46 + VT_CF VT = 0x47 + VT_CLSID VT = 0x48 + VT_BSTR_BLOB VT = 0xfff + VT_VECTOR VT = 0x1000 + VT_ARRAY VT = 0x2000 + VT_BYREF VT = 0x4000 + VT_RESERVED VT = 0x8000 + VT_ILLEGAL VT = 0xffff + VT_ILLEGALMASKED VT = 0xfff + VT_TYPEMASK VT = 0xfff +) + +const ( + DISPID_UNKNOWN = -1 + DISPID_VALUE = 0 + DISPID_PROPERTYPUT = -3 + DISPID_NEWENUM = -4 + DISPID_EVALUATE = -5 + DISPID_CONSTRUCTOR = -6 + DISPID_DESTRUCTOR = -7 + DISPID_COLLECT = -8 +) + +const ( + TKIND_ENUM = 1 + TKIND_RECORD = 2 + TKIND_MODULE = 3 + TKIND_INTERFACE = 4 + TKIND_DISPATCH = 5 + TKIND_COCLASS = 6 + TKIND_ALIAS = 7 + TKIND_UNION = 8 + TKIND_MAX = 9 +) + +// Safe Array Feature Flags + +const ( + FADF_AUTO = 0x0001 + FADF_STATIC = 0x0002 + FADF_EMBEDDED = 0x0004 + FADF_FIXEDSIZE = 0x0010 + FADF_RECORD = 0x0020 + FADF_HAVEIID = 0x0040 + FADF_HAVEVARTYPE = 0x0080 + FADF_BSTR = 0x0100 + FADF_UNKNOWN = 0x0200 + FADF_DISPATCH = 0x0400 + FADF_VARIANT = 0x0800 + FADF_RESERVED = 0xF008 +) diff --git a/vendor/github.com/go-ole/go-ole/error.go b/vendor/github.com/go-ole/go-ole/error.go new file mode 100644 index 0000000..096b456 --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/error.go @@ -0,0 +1,51 @@ +package ole + +// OleError stores COM errors. +type OleError struct { + hr uintptr + description string + subError error +} + +// NewError creates new error with HResult. +func NewError(hr uintptr) *OleError { + return &OleError{hr: hr} +} + +// NewErrorWithDescription creates new COM error with HResult and description. +func NewErrorWithDescription(hr uintptr, description string) *OleError { + return &OleError{hr: hr, description: description} +} + +// NewErrorWithSubError creates new COM error with parent error. +func NewErrorWithSubError(hr uintptr, description string, err error) *OleError { + return &OleError{hr: hr, description: description, subError: err} +} + +// Code is the HResult. +func (v *OleError) Code() uintptr { + return uintptr(v.hr) +} + +// String description, either manually set or format message with error code. +func (v *OleError) String() string { + if v.description != "" { + return errstr(int(v.hr)) + " (" + v.description + ")" + } + return errstr(int(v.hr)) +} + +// Error implements error interface. +func (v *OleError) Error() string { + return v.String() +} + +// Description retrieves error summary, if there is one. +func (v *OleError) Description() string { + return v.description +} + +// SubError returns parent error, if there is one. +func (v *OleError) SubError() error { + return v.subError +} diff --git a/vendor/github.com/go-ole/go-ole/error_func.go b/vendor/github.com/go-ole/go-ole/error_func.go new file mode 100644 index 0000000..8a2ffaa --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/error_func.go @@ -0,0 +1,8 @@ +// +build !windows + +package ole + +// errstr converts error code to string. +func errstr(errno int) string { + return "" +} diff --git a/vendor/github.com/go-ole/go-ole/error_windows.go b/vendor/github.com/go-ole/go-ole/error_windows.go new file mode 100644 index 0000000..d0e8e68 --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/error_windows.go @@ -0,0 +1,24 @@ +// +build windows + +package ole + +import ( + "fmt" + "syscall" + "unicode/utf16" +) + +// errstr converts error code to string. +func errstr(errno int) string { + // ask windows for the remaining errors + var flags uint32 = syscall.FORMAT_MESSAGE_FROM_SYSTEM | syscall.FORMAT_MESSAGE_ARGUMENT_ARRAY | syscall.FORMAT_MESSAGE_IGNORE_INSERTS + b := make([]uint16, 300) + n, err := syscall.FormatMessage(flags, 0, uint32(errno), 0, b, nil) + if err != nil { + return fmt.Sprintf("error %d (FormatMessage failed with: %v)", errno, err) + } + // trim terminating \r and \n + for ; n > 0 && (b[n-1] == '\n' || b[n-1] == '\r'); n-- { + } + return string(utf16.Decode(b[:n])) +} diff --git a/vendor/github.com/go-ole/go-ole/go.mod b/vendor/github.com/go-ole/go-ole/go.mod new file mode 100644 index 0000000..df98533 --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/go.mod @@ -0,0 +1,3 @@ +module github.com/go-ole/go-ole + +go 1.12 diff --git a/vendor/github.com/go-ole/go-ole/guid.go b/vendor/github.com/go-ole/go-ole/guid.go new file mode 100644 index 0000000..8d20f68 --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/guid.go @@ -0,0 +1,284 @@ +package ole + +var ( + // IID_NULL is null Interface ID, used when no other Interface ID is known. + IID_NULL = NewGUID("{00000000-0000-0000-0000-000000000000}") + + // IID_IUnknown is for IUnknown interfaces. + IID_IUnknown = NewGUID("{00000000-0000-0000-C000-000000000046}") + + // IID_IDispatch is for IDispatch interfaces. + IID_IDispatch = NewGUID("{00020400-0000-0000-C000-000000000046}") + + // IID_IEnumVariant is for IEnumVariant interfaces + IID_IEnumVariant = NewGUID("{00020404-0000-0000-C000-000000000046}") + + // IID_IConnectionPointContainer is for IConnectionPointContainer interfaces. + IID_IConnectionPointContainer = NewGUID("{B196B284-BAB4-101A-B69C-00AA00341D07}") + + // IID_IConnectionPoint is for IConnectionPoint interfaces. + IID_IConnectionPoint = NewGUID("{B196B286-BAB4-101A-B69C-00AA00341D07}") + + // IID_IInspectable is for IInspectable interfaces. + IID_IInspectable = NewGUID("{AF86E2E0-B12D-4C6A-9C5A-D7AA65101E90}") + + // IID_IProvideClassInfo is for IProvideClassInfo interfaces. + IID_IProvideClassInfo = NewGUID("{B196B283-BAB4-101A-B69C-00AA00341D07}") +) + +// These are for testing and not part of any library. +var ( + // IID_ICOMTestString is for ICOMTestString interfaces. + // + // {E0133EB4-C36F-469A-9D3D-C66B84BE19ED} + IID_ICOMTestString = NewGUID("{E0133EB4-C36F-469A-9D3D-C66B84BE19ED}") + + // IID_ICOMTestInt8 is for ICOMTestInt8 interfaces. + // + // {BEB06610-EB84-4155-AF58-E2BFF53680B4} + IID_ICOMTestInt8 = NewGUID("{BEB06610-EB84-4155-AF58-E2BFF53680B4}") + + // IID_ICOMTestInt16 is for ICOMTestInt16 interfaces. + // + // {DAA3F9FA-761E-4976-A860-8364CE55F6FC} + IID_ICOMTestInt16 = NewGUID("{DAA3F9FA-761E-4976-A860-8364CE55F6FC}") + + // IID_ICOMTestInt32 is for ICOMTestInt32 interfaces. + // + // {E3DEDEE7-38A2-4540-91D1-2EEF1D8891B0} + IID_ICOMTestInt32 = NewGUID("{E3DEDEE7-38A2-4540-91D1-2EEF1D8891B0}") + + // IID_ICOMTestInt64 is for ICOMTestInt64 interfaces. + // + // {8D437CBC-B3ED-485C-BC32-C336432A1623} + IID_ICOMTestInt64 = NewGUID("{8D437CBC-B3ED-485C-BC32-C336432A1623}") + + // IID_ICOMTestFloat is for ICOMTestFloat interfaces. + // + // {BF1ED004-EA02-456A-AA55-2AC8AC6B054C} + IID_ICOMTestFloat = NewGUID("{BF1ED004-EA02-456A-AA55-2AC8AC6B054C}") + + // IID_ICOMTestDouble is for ICOMTestDouble interfaces. + // + // {BF908A81-8687-4E93-999F-D86FAB284BA0} + IID_ICOMTestDouble = NewGUID("{BF908A81-8687-4E93-999F-D86FAB284BA0}") + + // IID_ICOMTestBoolean is for ICOMTestBoolean interfaces. + // + // {D530E7A6-4EE8-40D1-8931-3D63B8605010} + IID_ICOMTestBoolean = NewGUID("{D530E7A6-4EE8-40D1-8931-3D63B8605010}") + + // IID_ICOMEchoTestObject is for ICOMEchoTestObject interfaces. + // + // {6485B1EF-D780-4834-A4FE-1EBB51746CA3} + IID_ICOMEchoTestObject = NewGUID("{6485B1EF-D780-4834-A4FE-1EBB51746CA3}") + + // IID_ICOMTestTypes is for ICOMTestTypes interfaces. + // + // {CCA8D7AE-91C0-4277-A8B3-FF4EDF28D3C0} + IID_ICOMTestTypes = NewGUID("{CCA8D7AE-91C0-4277-A8B3-FF4EDF28D3C0}") + + // CLSID_COMEchoTestObject is for COMEchoTestObject class. + // + // {3C24506A-AE9E-4D50-9157-EF317281F1B0} + CLSID_COMEchoTestObject = NewGUID("{3C24506A-AE9E-4D50-9157-EF317281F1B0}") + + // CLSID_COMTestScalarClass is for COMTestScalarClass class. + // + // {865B85C5-0334-4AC6-9EF6-AACEC8FC5E86} + CLSID_COMTestScalarClass = NewGUID("{865B85C5-0334-4AC6-9EF6-AACEC8FC5E86}") +) + +const hextable = "0123456789ABCDEF" +const emptyGUID = "{00000000-0000-0000-0000-000000000000}" + +// GUID is Windows API specific GUID type. +// +// This exists to match Windows GUID type for direct passing for COM. +// Format is in xxxxxxxx-xxxx-xxxx-xxxxxxxxxxxxxxxx. +type GUID struct { + Data1 uint32 + Data2 uint16 + Data3 uint16 + Data4 [8]byte +} + +// NewGUID converts the given string into a globally unique identifier that is +// compliant with the Windows API. +// +// The supplied string may be in any of these formats: +// +// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +// XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX +// {XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} +// +// The conversion of the supplied string is not case-sensitive. +func NewGUID(guid string) *GUID { + d := []byte(guid) + var d1, d2, d3, d4a, d4b []byte + + switch len(d) { + case 38: + if d[0] != '{' || d[37] != '}' { + return nil + } + d = d[1:37] + fallthrough + case 36: + if d[8] != '-' || d[13] != '-' || d[18] != '-' || d[23] != '-' { + return nil + } + d1 = d[0:8] + d2 = d[9:13] + d3 = d[14:18] + d4a = d[19:23] + d4b = d[24:36] + case 32: + d1 = d[0:8] + d2 = d[8:12] + d3 = d[12:16] + d4a = d[16:20] + d4b = d[20:32] + default: + return nil + } + + var g GUID + var ok1, ok2, ok3, ok4 bool + g.Data1, ok1 = decodeHexUint32(d1) + g.Data2, ok2 = decodeHexUint16(d2) + g.Data3, ok3 = decodeHexUint16(d3) + g.Data4, ok4 = decodeHexByte64(d4a, d4b) + if ok1 && ok2 && ok3 && ok4 { + return &g + } + return nil +} + +func decodeHexUint32(src []byte) (value uint32, ok bool) { + var b1, b2, b3, b4 byte + var ok1, ok2, ok3, ok4 bool + b1, ok1 = decodeHexByte(src[0], src[1]) + b2, ok2 = decodeHexByte(src[2], src[3]) + b3, ok3 = decodeHexByte(src[4], src[5]) + b4, ok4 = decodeHexByte(src[6], src[7]) + value = (uint32(b1) << 24) | (uint32(b2) << 16) | (uint32(b3) << 8) | uint32(b4) + ok = ok1 && ok2 && ok3 && ok4 + return +} + +func decodeHexUint16(src []byte) (value uint16, ok bool) { + var b1, b2 byte + var ok1, ok2 bool + b1, ok1 = decodeHexByte(src[0], src[1]) + b2, ok2 = decodeHexByte(src[2], src[3]) + value = (uint16(b1) << 8) | uint16(b2) + ok = ok1 && ok2 + return +} + +func decodeHexByte64(s1 []byte, s2 []byte) (value [8]byte, ok bool) { + var ok1, ok2, ok3, ok4, ok5, ok6, ok7, ok8 bool + value[0], ok1 = decodeHexByte(s1[0], s1[1]) + value[1], ok2 = decodeHexByte(s1[2], s1[3]) + value[2], ok3 = decodeHexByte(s2[0], s2[1]) + value[3], ok4 = decodeHexByte(s2[2], s2[3]) + value[4], ok5 = decodeHexByte(s2[4], s2[5]) + value[5], ok6 = decodeHexByte(s2[6], s2[7]) + value[6], ok7 = decodeHexByte(s2[8], s2[9]) + value[7], ok8 = decodeHexByte(s2[10], s2[11]) + ok = ok1 && ok2 && ok3 && ok4 && ok5 && ok6 && ok7 && ok8 + return +} + +func decodeHexByte(c1, c2 byte) (value byte, ok bool) { + var n1, n2 byte + var ok1, ok2 bool + n1, ok1 = decodeHexChar(c1) + n2, ok2 = decodeHexChar(c2) + value = (n1 << 4) | n2 + ok = ok1 && ok2 + return +} + +func decodeHexChar(c byte) (byte, bool) { + switch { + case '0' <= c && c <= '9': + return c - '0', true + case 'a' <= c && c <= 'f': + return c - 'a' + 10, true + case 'A' <= c && c <= 'F': + return c - 'A' + 10, true + } + + return 0, false +} + +// String converts the GUID to string form. It will adhere to this pattern: +// +// {XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} +// +// If the GUID is nil, the string representation of an empty GUID is returned: +// +// {00000000-0000-0000-0000-000000000000} +func (guid *GUID) String() string { + if guid == nil { + return emptyGUID + } + + var c [38]byte + c[0] = '{' + putUint32Hex(c[1:9], guid.Data1) + c[9] = '-' + putUint16Hex(c[10:14], guid.Data2) + c[14] = '-' + putUint16Hex(c[15:19], guid.Data3) + c[19] = '-' + putByteHex(c[20:24], guid.Data4[0:2]) + c[24] = '-' + putByteHex(c[25:37], guid.Data4[2:8]) + c[37] = '}' + return string(c[:]) +} + +func putUint32Hex(b []byte, v uint32) { + b[0] = hextable[byte(v>>24)>>4] + b[1] = hextable[byte(v>>24)&0x0f] + b[2] = hextable[byte(v>>16)>>4] + b[3] = hextable[byte(v>>16)&0x0f] + b[4] = hextable[byte(v>>8)>>4] + b[5] = hextable[byte(v>>8)&0x0f] + b[6] = hextable[byte(v)>>4] + b[7] = hextable[byte(v)&0x0f] +} + +func putUint16Hex(b []byte, v uint16) { + b[0] = hextable[byte(v>>8)>>4] + b[1] = hextable[byte(v>>8)&0x0f] + b[2] = hextable[byte(v)>>4] + b[3] = hextable[byte(v)&0x0f] +} + +func putByteHex(dst, src []byte) { + for i := 0; i < len(src); i++ { + dst[i*2] = hextable[src[i]>>4] + dst[i*2+1] = hextable[src[i]&0x0f] + } +} + +// IsEqualGUID compares two GUID. +// +// Not constant time comparison. +func IsEqualGUID(guid1 *GUID, guid2 *GUID) bool { + return guid1.Data1 == guid2.Data1 && + guid1.Data2 == guid2.Data2 && + guid1.Data3 == guid2.Data3 && + guid1.Data4[0] == guid2.Data4[0] && + guid1.Data4[1] == guid2.Data4[1] && + guid1.Data4[2] == guid2.Data4[2] && + guid1.Data4[3] == guid2.Data4[3] && + guid1.Data4[4] == guid2.Data4[4] && + guid1.Data4[5] == guid2.Data4[5] && + guid1.Data4[6] == guid2.Data4[6] && + guid1.Data4[7] == guid2.Data4[7] +} diff --git a/vendor/github.com/go-ole/go-ole/iconnectionpoint.go b/vendor/github.com/go-ole/go-ole/iconnectionpoint.go new file mode 100644 index 0000000..9e6c49f --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/iconnectionpoint.go @@ -0,0 +1,20 @@ +package ole + +import "unsafe" + +type IConnectionPoint struct { + IUnknown +} + +type IConnectionPointVtbl struct { + IUnknownVtbl + GetConnectionInterface uintptr + GetConnectionPointContainer uintptr + Advise uintptr + Unadvise uintptr + EnumConnections uintptr +} + +func (v *IConnectionPoint) VTable() *IConnectionPointVtbl { + return (*IConnectionPointVtbl)(unsafe.Pointer(v.RawVTable)) +} diff --git a/vendor/github.com/go-ole/go-ole/iconnectionpoint_func.go b/vendor/github.com/go-ole/go-ole/iconnectionpoint_func.go new file mode 100644 index 0000000..5414dc3 --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/iconnectionpoint_func.go @@ -0,0 +1,21 @@ +// +build !windows + +package ole + +import "unsafe" + +func (v *IConnectionPoint) GetConnectionInterface(piid **GUID) int32 { + return int32(0) +} + +func (v *IConnectionPoint) Advise(unknown *IUnknown) (uint32, error) { + return uint32(0), NewError(E_NOTIMPL) +} + +func (v *IConnectionPoint) Unadvise(cookie uint32) error { + return NewError(E_NOTIMPL) +} + +func (v *IConnectionPoint) EnumConnections(p *unsafe.Pointer) (err error) { + return NewError(E_NOTIMPL) +} diff --git a/vendor/github.com/go-ole/go-ole/iconnectionpoint_windows.go b/vendor/github.com/go-ole/go-ole/iconnectionpoint_windows.go new file mode 100644 index 0000000..32bc183 --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/iconnectionpoint_windows.go @@ -0,0 +1,43 @@ +// +build windows + +package ole + +import ( + "syscall" + "unsafe" +) + +func (v *IConnectionPoint) GetConnectionInterface(piid **GUID) int32 { + // XXX: This doesn't look like it does what it's supposed to + return release((*IUnknown)(unsafe.Pointer(v))) +} + +func (v *IConnectionPoint) Advise(unknown *IUnknown) (cookie uint32, err error) { + hr, _, _ := syscall.Syscall( + v.VTable().Advise, + 3, + uintptr(unsafe.Pointer(v)), + uintptr(unsafe.Pointer(unknown)), + uintptr(unsafe.Pointer(&cookie))) + if hr != 0 { + err = NewError(hr) + } + return +} + +func (v *IConnectionPoint) Unadvise(cookie uint32) (err error) { + hr, _, _ := syscall.Syscall( + v.VTable().Unadvise, + 2, + uintptr(unsafe.Pointer(v)), + uintptr(cookie), + 0) + if hr != 0 { + err = NewError(hr) + } + return +} + +func (v *IConnectionPoint) EnumConnections(p *unsafe.Pointer) error { + return NewError(E_NOTIMPL) +} diff --git a/vendor/github.com/go-ole/go-ole/iconnectionpointcontainer.go b/vendor/github.com/go-ole/go-ole/iconnectionpointcontainer.go new file mode 100644 index 0000000..165860d --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/iconnectionpointcontainer.go @@ -0,0 +1,17 @@ +package ole + +import "unsafe" + +type IConnectionPointContainer struct { + IUnknown +} + +type IConnectionPointContainerVtbl struct { + IUnknownVtbl + EnumConnectionPoints uintptr + FindConnectionPoint uintptr +} + +func (v *IConnectionPointContainer) VTable() *IConnectionPointContainerVtbl { + return (*IConnectionPointContainerVtbl)(unsafe.Pointer(v.RawVTable)) +} diff --git a/vendor/github.com/go-ole/go-ole/iconnectionpointcontainer_func.go b/vendor/github.com/go-ole/go-ole/iconnectionpointcontainer_func.go new file mode 100644 index 0000000..5dfa42a --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/iconnectionpointcontainer_func.go @@ -0,0 +1,11 @@ +// +build !windows + +package ole + +func (v *IConnectionPointContainer) EnumConnectionPoints(points interface{}) error { + return NewError(E_NOTIMPL) +} + +func (v *IConnectionPointContainer) FindConnectionPoint(iid *GUID, point **IConnectionPoint) error { + return NewError(E_NOTIMPL) +} diff --git a/vendor/github.com/go-ole/go-ole/iconnectionpointcontainer_windows.go b/vendor/github.com/go-ole/go-ole/iconnectionpointcontainer_windows.go new file mode 100644 index 0000000..ad30d79 --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/iconnectionpointcontainer_windows.go @@ -0,0 +1,25 @@ +// +build windows + +package ole + +import ( + "syscall" + "unsafe" +) + +func (v *IConnectionPointContainer) EnumConnectionPoints(points interface{}) error { + return NewError(E_NOTIMPL) +} + +func (v *IConnectionPointContainer) FindConnectionPoint(iid *GUID, point **IConnectionPoint) (err error) { + hr, _, _ := syscall.Syscall( + v.VTable().FindConnectionPoint, + 3, + uintptr(unsafe.Pointer(v)), + uintptr(unsafe.Pointer(iid)), + uintptr(unsafe.Pointer(point))) + if hr != 0 { + err = NewError(hr) + } + return +} diff --git a/vendor/github.com/go-ole/go-ole/idispatch.go b/vendor/github.com/go-ole/go-ole/idispatch.go new file mode 100644 index 0000000..d4af124 --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/idispatch.go @@ -0,0 +1,94 @@ +package ole + +import "unsafe" + +type IDispatch struct { + IUnknown +} + +type IDispatchVtbl struct { + IUnknownVtbl + GetTypeInfoCount uintptr + GetTypeInfo uintptr + GetIDsOfNames uintptr + Invoke uintptr +} + +func (v *IDispatch) VTable() *IDispatchVtbl { + return (*IDispatchVtbl)(unsafe.Pointer(v.RawVTable)) +} + +func (v *IDispatch) GetIDsOfName(names []string) (dispid []int32, err error) { + dispid, err = getIDsOfName(v, names) + return +} + +func (v *IDispatch) Invoke(dispid int32, dispatch int16, params ...interface{}) (result *VARIANT, err error) { + result, err = invoke(v, dispid, dispatch, params...) + return +} + +func (v *IDispatch) GetTypeInfoCount() (c uint32, err error) { + c, err = getTypeInfoCount(v) + return +} + +func (v *IDispatch) GetTypeInfo() (tinfo *ITypeInfo, err error) { + tinfo, err = getTypeInfo(v) + return +} + +// GetSingleIDOfName is a helper that returns single display ID for IDispatch name. +// +// This replaces the common pattern of attempting to get a single name from the list of available +// IDs. It gives the first ID, if it is available. +func (v *IDispatch) GetSingleIDOfName(name string) (displayID int32, err error) { + var displayIDs []int32 + displayIDs, err = v.GetIDsOfName([]string{name}) + if err != nil { + return + } + displayID = displayIDs[0] + return +} + +// InvokeWithOptionalArgs accepts arguments as an array, works like Invoke. +// +// Accepts name and will attempt to retrieve Display ID to pass to Invoke. +// +// Passing params as an array is a workaround that could be fixed in later versions of Go that +// prevent passing empty params. During testing it was discovered that this is an acceptable way of +// getting around not being able to pass params normally. +func (v *IDispatch) InvokeWithOptionalArgs(name string, dispatch int16, params []interface{}) (result *VARIANT, err error) { + displayID, err := v.GetSingleIDOfName(name) + if err != nil { + return + } + + if len(params) < 1 { + result, err = v.Invoke(displayID, dispatch) + } else { + result, err = v.Invoke(displayID, dispatch, params...) + } + + return +} + +// CallMethod invokes named function with arguments on object. +func (v *IDispatch) CallMethod(name string, params ...interface{}) (*VARIANT, error) { + return v.InvokeWithOptionalArgs(name, DISPATCH_METHOD, params) +} + +// GetProperty retrieves the property with the name with the ability to pass arguments. +// +// Most of the time you will not need to pass arguments as most objects do not allow for this +// feature. Or at least, should not allow for this feature. Some servers don't follow best practices +// and this is provided for those edge cases. +func (v *IDispatch) GetProperty(name string, params ...interface{}) (*VARIANT, error) { + return v.InvokeWithOptionalArgs(name, DISPATCH_PROPERTYGET, params) +} + +// PutProperty attempts to mutate a property in the object. +func (v *IDispatch) PutProperty(name string, params ...interface{}) (*VARIANT, error) { + return v.InvokeWithOptionalArgs(name, DISPATCH_PROPERTYPUT, params) +} diff --git a/vendor/github.com/go-ole/go-ole/idispatch_func.go b/vendor/github.com/go-ole/go-ole/idispatch_func.go new file mode 100644 index 0000000..b8fbbe3 --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/idispatch_func.go @@ -0,0 +1,19 @@ +// +build !windows + +package ole + +func getIDsOfName(disp *IDispatch, names []string) ([]int32, error) { + return []int32{}, NewError(E_NOTIMPL) +} + +func getTypeInfoCount(disp *IDispatch) (uint32, error) { + return uint32(0), NewError(E_NOTIMPL) +} + +func getTypeInfo(disp *IDispatch) (*ITypeInfo, error) { + return nil, NewError(E_NOTIMPL) +} + +func invoke(disp *IDispatch, dispid int32, dispatch int16, params ...interface{}) (*VARIANT, error) { + return nil, NewError(E_NOTIMPL) +} diff --git a/vendor/github.com/go-ole/go-ole/idispatch_windows.go b/vendor/github.com/go-ole/go-ole/idispatch_windows.go new file mode 100644 index 0000000..6ec180b --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/idispatch_windows.go @@ -0,0 +1,200 @@ +// +build windows + +package ole + +import ( + "math/big" + "syscall" + "time" + "unsafe" +) + +func getIDsOfName(disp *IDispatch, names []string) (dispid []int32, err error) { + wnames := make([]*uint16, len(names)) + for i := 0; i < len(names); i++ { + wnames[i] = syscall.StringToUTF16Ptr(names[i]) + } + dispid = make([]int32, len(names)) + namelen := uint32(len(names)) + hr, _, _ := syscall.Syscall6( + disp.VTable().GetIDsOfNames, + 6, + uintptr(unsafe.Pointer(disp)), + uintptr(unsafe.Pointer(IID_NULL)), + uintptr(unsafe.Pointer(&wnames[0])), + uintptr(namelen), + uintptr(GetUserDefaultLCID()), + uintptr(unsafe.Pointer(&dispid[0]))) + if hr != 0 { + err = NewError(hr) + } + return +} + +func getTypeInfoCount(disp *IDispatch) (c uint32, err error) { + hr, _, _ := syscall.Syscall( + disp.VTable().GetTypeInfoCount, + 2, + uintptr(unsafe.Pointer(disp)), + uintptr(unsafe.Pointer(&c)), + 0) + if hr != 0 { + err = NewError(hr) + } + return +} + +func getTypeInfo(disp *IDispatch) (tinfo *ITypeInfo, err error) { + hr, _, _ := syscall.Syscall( + disp.VTable().GetTypeInfo, + 3, + uintptr(unsafe.Pointer(disp)), + uintptr(GetUserDefaultLCID()), + uintptr(unsafe.Pointer(&tinfo))) + if hr != 0 { + err = NewError(hr) + } + return +} + +func invoke(disp *IDispatch, dispid int32, dispatch int16, params ...interface{}) (result *VARIANT, err error) { + var dispparams DISPPARAMS + + if dispatch&DISPATCH_PROPERTYPUT != 0 { + dispnames := [1]int32{DISPID_PROPERTYPUT} + dispparams.rgdispidNamedArgs = uintptr(unsafe.Pointer(&dispnames[0])) + dispparams.cNamedArgs = 1 + } else if dispatch&DISPATCH_PROPERTYPUTREF != 0 { + dispnames := [1]int32{DISPID_PROPERTYPUT} + dispparams.rgdispidNamedArgs = uintptr(unsafe.Pointer(&dispnames[0])) + dispparams.cNamedArgs = 1 + } + var vargs []VARIANT + if len(params) > 0 { + vargs = make([]VARIANT, len(params)) + for i, v := range params { + //n := len(params)-i-1 + n := len(params) - i - 1 + VariantInit(&vargs[n]) + switch vv := v.(type) { + case bool: + if vv { + vargs[n] = NewVariant(VT_BOOL, 0xffff) + } else { + vargs[n] = NewVariant(VT_BOOL, 0) + } + case *bool: + vargs[n] = NewVariant(VT_BOOL|VT_BYREF, int64(uintptr(unsafe.Pointer(v.(*bool))))) + case uint8: + vargs[n] = NewVariant(VT_I1, int64(v.(uint8))) + case *uint8: + vargs[n] = NewVariant(VT_I1|VT_BYREF, int64(uintptr(unsafe.Pointer(v.(*uint8))))) + case int8: + vargs[n] = NewVariant(VT_I1, int64(v.(int8))) + case *int8: + vargs[n] = NewVariant(VT_I1|VT_BYREF, int64(uintptr(unsafe.Pointer(v.(*uint8))))) + case int16: + vargs[n] = NewVariant(VT_I2, int64(v.(int16))) + case *int16: + vargs[n] = NewVariant(VT_I2|VT_BYREF, int64(uintptr(unsafe.Pointer(v.(*int16))))) + case uint16: + vargs[n] = NewVariant(VT_UI2, int64(v.(uint16))) + case *uint16: + vargs[n] = NewVariant(VT_UI2|VT_BYREF, int64(uintptr(unsafe.Pointer(v.(*uint16))))) + case int32: + vargs[n] = NewVariant(VT_I4, int64(v.(int32))) + case *int32: + vargs[n] = NewVariant(VT_I4|VT_BYREF, int64(uintptr(unsafe.Pointer(v.(*int32))))) + case uint32: + vargs[n] = NewVariant(VT_UI4, int64(v.(uint32))) + case *uint32: + vargs[n] = NewVariant(VT_UI4|VT_BYREF, int64(uintptr(unsafe.Pointer(v.(*uint32))))) + case int64: + vargs[n] = NewVariant(VT_I8, int64(v.(int64))) + case *int64: + vargs[n] = NewVariant(VT_I8|VT_BYREF, int64(uintptr(unsafe.Pointer(v.(*int64))))) + case uint64: + vargs[n] = NewVariant(VT_UI8, int64(uintptr(v.(uint64)))) + case *uint64: + vargs[n] = NewVariant(VT_UI8|VT_BYREF, int64(uintptr(unsafe.Pointer(v.(*uint64))))) + case int: + vargs[n] = NewVariant(VT_I4, int64(v.(int))) + case *int: + vargs[n] = NewVariant(VT_I4|VT_BYREF, int64(uintptr(unsafe.Pointer(v.(*int))))) + case uint: + vargs[n] = NewVariant(VT_UI4, int64(v.(uint))) + case *uint: + vargs[n] = NewVariant(VT_UI4|VT_BYREF, int64(uintptr(unsafe.Pointer(v.(*uint))))) + case float32: + vargs[n] = NewVariant(VT_R4, *(*int64)(unsafe.Pointer(&vv))) + case *float32: + vargs[n] = NewVariant(VT_R4|VT_BYREF, int64(uintptr(unsafe.Pointer(v.(*float32))))) + case float64: + vargs[n] = NewVariant(VT_R8, *(*int64)(unsafe.Pointer(&vv))) + case *float64: + vargs[n] = NewVariant(VT_R8|VT_BYREF, int64(uintptr(unsafe.Pointer(v.(*float64))))) + case *big.Int: + vargs[n] = NewVariant(VT_DECIMAL, v.(*big.Int).Int64()) + case string: + vargs[n] = NewVariant(VT_BSTR, int64(uintptr(unsafe.Pointer(SysAllocStringLen(v.(string)))))) + case *string: + vargs[n] = NewVariant(VT_BSTR|VT_BYREF, int64(uintptr(unsafe.Pointer(v.(*string))))) + case time.Time: + s := vv.Format("2006-01-02 15:04:05") + vargs[n] = NewVariant(VT_BSTR, int64(uintptr(unsafe.Pointer(SysAllocStringLen(s))))) + case *time.Time: + s := vv.Format("2006-01-02 15:04:05") + vargs[n] = NewVariant(VT_BSTR|VT_BYREF, int64(uintptr(unsafe.Pointer(&s)))) + case *IDispatch: + vargs[n] = NewVariant(VT_DISPATCH, int64(uintptr(unsafe.Pointer(v.(*IDispatch))))) + case **IDispatch: + vargs[n] = NewVariant(VT_DISPATCH|VT_BYREF, int64(uintptr(unsafe.Pointer(v.(**IDispatch))))) + case nil: + vargs[n] = NewVariant(VT_NULL, 0) + case *VARIANT: + vargs[n] = NewVariant(VT_VARIANT|VT_BYREF, int64(uintptr(unsafe.Pointer(v.(*VARIANT))))) + case []byte: + safeByteArray := safeArrayFromByteSlice(v.([]byte)) + vargs[n] = NewVariant(VT_ARRAY|VT_UI1, int64(uintptr(unsafe.Pointer(safeByteArray)))) + defer VariantClear(&vargs[n]) + case []string: + safeByteArray := safeArrayFromStringSlice(v.([]string)) + vargs[n] = NewVariant(VT_ARRAY|VT_BSTR, int64(uintptr(unsafe.Pointer(safeByteArray)))) + defer VariantClear(&vargs[n]) + default: + panic("unknown type") + } + } + dispparams.rgvarg = uintptr(unsafe.Pointer(&vargs[0])) + dispparams.cArgs = uint32(len(params)) + } + + result = new(VARIANT) + var excepInfo EXCEPINFO + VariantInit(result) + hr, _, _ := syscall.Syscall9( + disp.VTable().Invoke, + 9, + uintptr(unsafe.Pointer(disp)), + uintptr(dispid), + uintptr(unsafe.Pointer(IID_NULL)), + uintptr(GetUserDefaultLCID()), + uintptr(dispatch), + uintptr(unsafe.Pointer(&dispparams)), + uintptr(unsafe.Pointer(result)), + uintptr(unsafe.Pointer(&excepInfo)), + 0) + if hr != 0 { + err = NewErrorWithSubError(hr, BstrToString(excepInfo.bstrDescription), excepInfo) + } + for i, varg := range vargs { + n := len(params) - i - 1 + if varg.VT == VT_BSTR && varg.Val != 0 { + SysFreeString(((*int16)(unsafe.Pointer(uintptr(varg.Val))))) + } + if varg.VT == (VT_BSTR|VT_BYREF) && varg.Val != 0 { + *(params[n].(*string)) = LpOleStrToString(*(**uint16)(unsafe.Pointer(uintptr(varg.Val)))) + } + } + return +} diff --git a/vendor/github.com/go-ole/go-ole/ienumvariant.go b/vendor/github.com/go-ole/go-ole/ienumvariant.go new file mode 100644 index 0000000..2433897 --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/ienumvariant.go @@ -0,0 +1,19 @@ +package ole + +import "unsafe" + +type IEnumVARIANT struct { + IUnknown +} + +type IEnumVARIANTVtbl struct { + IUnknownVtbl + Next uintptr + Skip uintptr + Reset uintptr + Clone uintptr +} + +func (v *IEnumVARIANT) VTable() *IEnumVARIANTVtbl { + return (*IEnumVARIANTVtbl)(unsafe.Pointer(v.RawVTable)) +} diff --git a/vendor/github.com/go-ole/go-ole/ienumvariant_func.go b/vendor/github.com/go-ole/go-ole/ienumvariant_func.go new file mode 100644 index 0000000..c148481 --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/ienumvariant_func.go @@ -0,0 +1,19 @@ +// +build !windows + +package ole + +func (enum *IEnumVARIANT) Clone() (*IEnumVARIANT, error) { + return nil, NewError(E_NOTIMPL) +} + +func (enum *IEnumVARIANT) Reset() error { + return NewError(E_NOTIMPL) +} + +func (enum *IEnumVARIANT) Skip(celt uint) error { + return NewError(E_NOTIMPL) +} + +func (enum *IEnumVARIANT) Next(celt uint) (VARIANT, uint, error) { + return NewVariant(VT_NULL, int64(0)), 0, NewError(E_NOTIMPL) +} diff --git a/vendor/github.com/go-ole/go-ole/ienumvariant_windows.go b/vendor/github.com/go-ole/go-ole/ienumvariant_windows.go new file mode 100644 index 0000000..4781f3b --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/ienumvariant_windows.go @@ -0,0 +1,63 @@ +// +build windows + +package ole + +import ( + "syscall" + "unsafe" +) + +func (enum *IEnumVARIANT) Clone() (cloned *IEnumVARIANT, err error) { + hr, _, _ := syscall.Syscall( + enum.VTable().Clone, + 2, + uintptr(unsafe.Pointer(enum)), + uintptr(unsafe.Pointer(&cloned)), + 0) + if hr != 0 { + err = NewError(hr) + } + return +} + +func (enum *IEnumVARIANT) Reset() (err error) { + hr, _, _ := syscall.Syscall( + enum.VTable().Reset, + 1, + uintptr(unsafe.Pointer(enum)), + 0, + 0) + if hr != 0 { + err = NewError(hr) + } + return +} + +func (enum *IEnumVARIANT) Skip(celt uint) (err error) { + hr, _, _ := syscall.Syscall( + enum.VTable().Skip, + 2, + uintptr(unsafe.Pointer(enum)), + uintptr(celt), + 0) + if hr != 0 { + err = NewError(hr) + } + return +} + +func (enum *IEnumVARIANT) Next(celt uint) (array VARIANT, length uint, err error) { + hr, _, _ := syscall.Syscall6( + enum.VTable().Next, + 4, + uintptr(unsafe.Pointer(enum)), + uintptr(celt), + uintptr(unsafe.Pointer(&array)), + uintptr(unsafe.Pointer(&length)), + 0, + 0) + if hr != 0 { + err = NewError(hr) + } + return +} diff --git a/vendor/github.com/go-ole/go-ole/iinspectable.go b/vendor/github.com/go-ole/go-ole/iinspectable.go new file mode 100644 index 0000000..f4a19e2 --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/iinspectable.go @@ -0,0 +1,18 @@ +package ole + +import "unsafe" + +type IInspectable struct { + IUnknown +} + +type IInspectableVtbl struct { + IUnknownVtbl + GetIIds uintptr + GetRuntimeClassName uintptr + GetTrustLevel uintptr +} + +func (v *IInspectable) VTable() *IInspectableVtbl { + return (*IInspectableVtbl)(unsafe.Pointer(v.RawVTable)) +} diff --git a/vendor/github.com/go-ole/go-ole/iinspectable_func.go b/vendor/github.com/go-ole/go-ole/iinspectable_func.go new file mode 100644 index 0000000..348829b --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/iinspectable_func.go @@ -0,0 +1,15 @@ +// +build !windows + +package ole + +func (v *IInspectable) GetIids() ([]*GUID, error) { + return []*GUID{}, NewError(E_NOTIMPL) +} + +func (v *IInspectable) GetRuntimeClassName() (string, error) { + return "", NewError(E_NOTIMPL) +} + +func (v *IInspectable) GetTrustLevel() (uint32, error) { + return uint32(0), NewError(E_NOTIMPL) +} diff --git a/vendor/github.com/go-ole/go-ole/iinspectable_windows.go b/vendor/github.com/go-ole/go-ole/iinspectable_windows.go new file mode 100644 index 0000000..4519a4a --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/iinspectable_windows.go @@ -0,0 +1,72 @@ +// +build windows + +package ole + +import ( + "bytes" + "encoding/binary" + "reflect" + "syscall" + "unsafe" +) + +func (v *IInspectable) GetIids() (iids []*GUID, err error) { + var count uint32 + var array uintptr + hr, _, _ := syscall.Syscall( + v.VTable().GetIIds, + 3, + uintptr(unsafe.Pointer(v)), + uintptr(unsafe.Pointer(&count)), + uintptr(unsafe.Pointer(&array))) + if hr != 0 { + err = NewError(hr) + return + } + defer CoTaskMemFree(array) + + iids = make([]*GUID, count) + byteCount := count * uint32(unsafe.Sizeof(GUID{})) + slicehdr := reflect.SliceHeader{Data: array, Len: int(byteCount), Cap: int(byteCount)} + byteSlice := *(*[]byte)(unsafe.Pointer(&slicehdr)) + reader := bytes.NewReader(byteSlice) + for i := range iids { + guid := GUID{} + err = binary.Read(reader, binary.LittleEndian, &guid) + if err != nil { + return + } + iids[i] = &guid + } + return +} + +func (v *IInspectable) GetRuntimeClassName() (s string, err error) { + var hstring HString + hr, _, _ := syscall.Syscall( + v.VTable().GetRuntimeClassName, + 2, + uintptr(unsafe.Pointer(v)), + uintptr(unsafe.Pointer(&hstring)), + 0) + if hr != 0 { + err = NewError(hr) + return + } + s = hstring.String() + DeleteHString(hstring) + return +} + +func (v *IInspectable) GetTrustLevel() (level uint32, err error) { + hr, _, _ := syscall.Syscall( + v.VTable().GetTrustLevel, + 2, + uintptr(unsafe.Pointer(v)), + uintptr(unsafe.Pointer(&level)), + 0) + if hr != 0 { + err = NewError(hr) + } + return +} diff --git a/vendor/github.com/go-ole/go-ole/iprovideclassinfo.go b/vendor/github.com/go-ole/go-ole/iprovideclassinfo.go new file mode 100644 index 0000000..25f3a6f --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/iprovideclassinfo.go @@ -0,0 +1,21 @@ +package ole + +import "unsafe" + +type IProvideClassInfo struct { + IUnknown +} + +type IProvideClassInfoVtbl struct { + IUnknownVtbl + GetClassInfo uintptr +} + +func (v *IProvideClassInfo) VTable() *IProvideClassInfoVtbl { + return (*IProvideClassInfoVtbl)(unsafe.Pointer(v.RawVTable)) +} + +func (v *IProvideClassInfo) GetClassInfo() (cinfo *ITypeInfo, err error) { + cinfo, err = getClassInfo(v) + return +} diff --git a/vendor/github.com/go-ole/go-ole/iprovideclassinfo_func.go b/vendor/github.com/go-ole/go-ole/iprovideclassinfo_func.go new file mode 100644 index 0000000..7e3cb63 --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/iprovideclassinfo_func.go @@ -0,0 +1,7 @@ +// +build !windows + +package ole + +func getClassInfo(disp *IProvideClassInfo) (tinfo *ITypeInfo, err error) { + return nil, NewError(E_NOTIMPL) +} diff --git a/vendor/github.com/go-ole/go-ole/iprovideclassinfo_windows.go b/vendor/github.com/go-ole/go-ole/iprovideclassinfo_windows.go new file mode 100644 index 0000000..2ad0163 --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/iprovideclassinfo_windows.go @@ -0,0 +1,21 @@ +// +build windows + +package ole + +import ( + "syscall" + "unsafe" +) + +func getClassInfo(disp *IProvideClassInfo) (tinfo *ITypeInfo, err error) { + hr, _, _ := syscall.Syscall( + disp.VTable().GetClassInfo, + 2, + uintptr(unsafe.Pointer(disp)), + uintptr(unsafe.Pointer(&tinfo)), + 0) + if hr != 0 { + err = NewError(hr) + } + return +} diff --git a/vendor/github.com/go-ole/go-ole/itypeinfo.go b/vendor/github.com/go-ole/go-ole/itypeinfo.go new file mode 100644 index 0000000..dd3c5e2 --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/itypeinfo.go @@ -0,0 +1,34 @@ +package ole + +import "unsafe" + +type ITypeInfo struct { + IUnknown +} + +type ITypeInfoVtbl struct { + IUnknownVtbl + GetTypeAttr uintptr + GetTypeComp uintptr + GetFuncDesc uintptr + GetVarDesc uintptr + GetNames uintptr + GetRefTypeOfImplType uintptr + GetImplTypeFlags uintptr + GetIDsOfNames uintptr + Invoke uintptr + GetDocumentation uintptr + GetDllEntry uintptr + GetRefTypeInfo uintptr + AddressOfMember uintptr + CreateInstance uintptr + GetMops uintptr + GetContainingTypeLib uintptr + ReleaseTypeAttr uintptr + ReleaseFuncDesc uintptr + ReleaseVarDesc uintptr +} + +func (v *ITypeInfo) VTable() *ITypeInfoVtbl { + return (*ITypeInfoVtbl)(unsafe.Pointer(v.RawVTable)) +} diff --git a/vendor/github.com/go-ole/go-ole/itypeinfo_func.go b/vendor/github.com/go-ole/go-ole/itypeinfo_func.go new file mode 100644 index 0000000..8364a65 --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/itypeinfo_func.go @@ -0,0 +1,7 @@ +// +build !windows + +package ole + +func (v *ITypeInfo) GetTypeAttr() (*TYPEATTR, error) { + return nil, NewError(E_NOTIMPL) +} diff --git a/vendor/github.com/go-ole/go-ole/itypeinfo_windows.go b/vendor/github.com/go-ole/go-ole/itypeinfo_windows.go new file mode 100644 index 0000000..54782b3 --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/itypeinfo_windows.go @@ -0,0 +1,21 @@ +// +build windows + +package ole + +import ( + "syscall" + "unsafe" +) + +func (v *ITypeInfo) GetTypeAttr() (tattr *TYPEATTR, err error) { + hr, _, _ := syscall.Syscall( + uintptr(v.VTable().GetTypeAttr), + 2, + uintptr(unsafe.Pointer(v)), + uintptr(unsafe.Pointer(&tattr)), + 0) + if hr != 0 { + err = NewError(hr) + } + return +} diff --git a/vendor/github.com/go-ole/go-ole/iunknown.go b/vendor/github.com/go-ole/go-ole/iunknown.go new file mode 100644 index 0000000..108f28e --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/iunknown.go @@ -0,0 +1,57 @@ +package ole + +import "unsafe" + +type IUnknown struct { + RawVTable *interface{} +} + +type IUnknownVtbl struct { + QueryInterface uintptr + AddRef uintptr + Release uintptr +} + +type UnknownLike interface { + QueryInterface(iid *GUID) (disp *IDispatch, err error) + AddRef() int32 + Release() int32 +} + +func (v *IUnknown) VTable() *IUnknownVtbl { + return (*IUnknownVtbl)(unsafe.Pointer(v.RawVTable)) +} + +func (v *IUnknown) PutQueryInterface(interfaceID *GUID, obj interface{}) error { + return reflectQueryInterface(v, v.VTable().QueryInterface, interfaceID, obj) +} + +func (v *IUnknown) IDispatch(interfaceID *GUID) (dispatch *IDispatch, err error) { + err = v.PutQueryInterface(interfaceID, &dispatch) + return +} + +func (v *IUnknown) IEnumVARIANT(interfaceID *GUID) (enum *IEnumVARIANT, err error) { + err = v.PutQueryInterface(interfaceID, &enum) + return +} + +func (v *IUnknown) QueryInterface(iid *GUID) (*IDispatch, error) { + return queryInterface(v, iid) +} + +func (v *IUnknown) MustQueryInterface(iid *GUID) (disp *IDispatch) { + unk, err := queryInterface(v, iid) + if err != nil { + panic(err) + } + return unk +} + +func (v *IUnknown) AddRef() int32 { + return addRef(v) +} + +func (v *IUnknown) Release() int32 { + return release(v) +} diff --git a/vendor/github.com/go-ole/go-ole/iunknown_func.go b/vendor/github.com/go-ole/go-ole/iunknown_func.go new file mode 100644 index 0000000..d0a62cf --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/iunknown_func.go @@ -0,0 +1,19 @@ +// +build !windows + +package ole + +func reflectQueryInterface(self interface{}, method uintptr, interfaceID *GUID, obj interface{}) (err error) { + return NewError(E_NOTIMPL) +} + +func queryInterface(unk *IUnknown, iid *GUID) (disp *IDispatch, err error) { + return nil, NewError(E_NOTIMPL) +} + +func addRef(unk *IUnknown) int32 { + return 0 +} + +func release(unk *IUnknown) int32 { + return 0 +} diff --git a/vendor/github.com/go-ole/go-ole/iunknown_windows.go b/vendor/github.com/go-ole/go-ole/iunknown_windows.go new file mode 100644 index 0000000..ede5bb8 --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/iunknown_windows.go @@ -0,0 +1,58 @@ +// +build windows + +package ole + +import ( + "reflect" + "syscall" + "unsafe" +) + +func reflectQueryInterface(self interface{}, method uintptr, interfaceID *GUID, obj interface{}) (err error) { + selfValue := reflect.ValueOf(self).Elem() + objValue := reflect.ValueOf(obj).Elem() + + hr, _, _ := syscall.Syscall( + method, + 3, + selfValue.UnsafeAddr(), + uintptr(unsafe.Pointer(interfaceID)), + objValue.Addr().Pointer()) + if hr != 0 { + err = NewError(hr) + } + return +} + +func queryInterface(unk *IUnknown, iid *GUID) (disp *IDispatch, err error) { + hr, _, _ := syscall.Syscall( + unk.VTable().QueryInterface, + 3, + uintptr(unsafe.Pointer(unk)), + uintptr(unsafe.Pointer(iid)), + uintptr(unsafe.Pointer(&disp))) + if hr != 0 { + err = NewError(hr) + } + return +} + +func addRef(unk *IUnknown) int32 { + ret, _, _ := syscall.Syscall( + unk.VTable().AddRef, + 1, + uintptr(unsafe.Pointer(unk)), + 0, + 0) + return int32(ret) +} + +func release(unk *IUnknown) int32 { + ret, _, _ := syscall.Syscall( + unk.VTable().Release, + 1, + uintptr(unsafe.Pointer(unk)), + 0, + 0) + return int32(ret) +} diff --git a/vendor/github.com/go-ole/go-ole/ole.go b/vendor/github.com/go-ole/go-ole/ole.go new file mode 100644 index 0000000..e2ae4f4 --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/ole.go @@ -0,0 +1,157 @@ +package ole + +import ( + "fmt" + "strings" +) + +// DISPPARAMS are the arguments that passed to methods or property. +type DISPPARAMS struct { + rgvarg uintptr + rgdispidNamedArgs uintptr + cArgs uint32 + cNamedArgs uint32 +} + +// EXCEPINFO defines exception info. +type EXCEPINFO struct { + wCode uint16 + wReserved uint16 + bstrSource *uint16 + bstrDescription *uint16 + bstrHelpFile *uint16 + dwHelpContext uint32 + pvReserved uintptr + pfnDeferredFillIn uintptr + scode uint32 +} + +// WCode return wCode in EXCEPINFO. +func (e EXCEPINFO) WCode() uint16 { + return e.wCode +} + +// SCODE return scode in EXCEPINFO. +func (e EXCEPINFO) SCODE() uint32 { + return e.scode +} + +// String convert EXCEPINFO to string. +func (e EXCEPINFO) String() string { + var src, desc, hlp string + if e.bstrSource == nil { + src = "" + } else { + src = BstrToString(e.bstrSource) + } + + if e.bstrDescription == nil { + desc = "" + } else { + desc = BstrToString(e.bstrDescription) + } + + if e.bstrHelpFile == nil { + hlp = "" + } else { + hlp = BstrToString(e.bstrHelpFile) + } + + return fmt.Sprintf( + "wCode: %#x, bstrSource: %v, bstrDescription: %v, bstrHelpFile: %v, dwHelpContext: %#x, scode: %#x", + e.wCode, src, desc, hlp, e.dwHelpContext, e.scode, + ) +} + +// Error implements error interface and returns error string. +func (e EXCEPINFO) Error() string { + if e.bstrDescription != nil { + return strings.TrimSpace(BstrToString(e.bstrDescription)) + } + + src := "Unknown" + if e.bstrSource != nil { + src = BstrToString(e.bstrSource) + } + + code := e.scode + if e.wCode != 0 { + code = uint32(e.wCode) + } + + return fmt.Sprintf("%v: %#x", src, code) +} + +// PARAMDATA defines parameter data type. +type PARAMDATA struct { + Name *int16 + Vt uint16 +} + +// METHODDATA defines method info. +type METHODDATA struct { + Name *uint16 + Data *PARAMDATA + Dispid int32 + Meth uint32 + CC int32 + CArgs uint32 + Flags uint16 + VtReturn uint32 +} + +// INTERFACEDATA defines interface info. +type INTERFACEDATA struct { + MethodData *METHODDATA + CMembers uint32 +} + +// Point is 2D vector type. +type Point struct { + X int32 + Y int32 +} + +// Msg is message between processes. +type Msg struct { + Hwnd uint32 + Message uint32 + Wparam int32 + Lparam int32 + Time uint32 + Pt Point +} + +// TYPEDESC defines data type. +type TYPEDESC struct { + Hreftype uint32 + VT uint16 +} + +// IDLDESC defines IDL info. +type IDLDESC struct { + DwReserved uint32 + WIDLFlags uint16 +} + +// TYPEATTR defines type info. +type TYPEATTR struct { + Guid GUID + Lcid uint32 + dwReserved uint32 + MemidConstructor int32 + MemidDestructor int32 + LpstrSchema *uint16 + CbSizeInstance uint32 + Typekind int32 + CFuncs uint16 + CVars uint16 + CImplTypes uint16 + CbSizeVft uint16 + CbAlignment uint16 + WTypeFlags uint16 + WMajorVerNum uint16 + WMinorVerNum uint16 + TdescAlias TYPEDESC + IdldescType IDLDESC +} diff --git a/vendor/github.com/go-ole/go-ole/oleutil/connection.go b/vendor/github.com/go-ole/go-ole/oleutil/connection.go new file mode 100644 index 0000000..60df73c --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/oleutil/connection.go @@ -0,0 +1,100 @@ +// +build windows + +package oleutil + +import ( + "reflect" + "unsafe" + + ole "github.com/go-ole/go-ole" +) + +type stdDispatch struct { + lpVtbl *stdDispatchVtbl + ref int32 + iid *ole.GUID + iface interface{} + funcMap map[string]int32 +} + +type stdDispatchVtbl struct { + pQueryInterface uintptr + pAddRef uintptr + pRelease uintptr + pGetTypeInfoCount uintptr + pGetTypeInfo uintptr + pGetIDsOfNames uintptr + pInvoke uintptr +} + +func dispQueryInterface(this *ole.IUnknown, iid *ole.GUID, punk **ole.IUnknown) uint32 { + pthis := (*stdDispatch)(unsafe.Pointer(this)) + *punk = nil + if ole.IsEqualGUID(iid, ole.IID_IUnknown) || + ole.IsEqualGUID(iid, ole.IID_IDispatch) { + dispAddRef(this) + *punk = this + return ole.S_OK + } + if ole.IsEqualGUID(iid, pthis.iid) { + dispAddRef(this) + *punk = this + return ole.S_OK + } + return ole.E_NOINTERFACE +} + +func dispAddRef(this *ole.IUnknown) int32 { + pthis := (*stdDispatch)(unsafe.Pointer(this)) + pthis.ref++ + return pthis.ref +} + +func dispRelease(this *ole.IUnknown) int32 { + pthis := (*stdDispatch)(unsafe.Pointer(this)) + pthis.ref-- + return pthis.ref +} + +func dispGetIDsOfNames(this *ole.IUnknown, iid *ole.GUID, wnames []*uint16, namelen int, lcid int, pdisp []int32) uintptr { + pthis := (*stdDispatch)(unsafe.Pointer(this)) + names := make([]string, len(wnames)) + for i := 0; i < len(names); i++ { + names[i] = ole.LpOleStrToString(wnames[i]) + } + for n := 0; n < namelen; n++ { + if id, ok := pthis.funcMap[names[n]]; ok { + pdisp[n] = id + } + } + return ole.S_OK +} + +func dispGetTypeInfoCount(pcount *int) uintptr { + if pcount != nil { + *pcount = 0 + } + return ole.S_OK +} + +func dispGetTypeInfo(ptypeif *uintptr) uintptr { + return ole.E_NOTIMPL +} + +func dispInvoke(this *ole.IDispatch, dispid int32, riid *ole.GUID, lcid int, flags int16, dispparams *ole.DISPPARAMS, result *ole.VARIANT, pexcepinfo *ole.EXCEPINFO, nerr *uint) uintptr { + pthis := (*stdDispatch)(unsafe.Pointer(this)) + found := "" + for name, id := range pthis.funcMap { + if id == dispid { + found = name + } + } + if found != "" { + rv := reflect.ValueOf(pthis.iface).Elem() + rm := rv.MethodByName(found) + rr := rm.Call([]reflect.Value{}) + println(len(rr)) + return ole.S_OK + } + return ole.E_NOTIMPL +} diff --git a/vendor/github.com/go-ole/go-ole/oleutil/connection_func.go b/vendor/github.com/go-ole/go-ole/oleutil/connection_func.go new file mode 100644 index 0000000..8818fb8 --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/oleutil/connection_func.go @@ -0,0 +1,10 @@ +// +build !windows + +package oleutil + +import ole "github.com/go-ole/go-ole" + +// ConnectObject creates a connection point between two services for communication. +func ConnectObject(disp *ole.IDispatch, iid *ole.GUID, idisp interface{}) (uint32, error) { + return 0, ole.NewError(ole.E_NOTIMPL) +} diff --git a/vendor/github.com/go-ole/go-ole/oleutil/connection_windows.go b/vendor/github.com/go-ole/go-ole/oleutil/connection_windows.go new file mode 100644 index 0000000..ab9c0d8 --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/oleutil/connection_windows.go @@ -0,0 +1,58 @@ +// +build windows + +package oleutil + +import ( + "reflect" + "syscall" + "unsafe" + + ole "github.com/go-ole/go-ole" +) + +// ConnectObject creates a connection point between two services for communication. +func ConnectObject(disp *ole.IDispatch, iid *ole.GUID, idisp interface{}) (cookie uint32, err error) { + unknown, err := disp.QueryInterface(ole.IID_IConnectionPointContainer) + if err != nil { + return + } + + container := (*ole.IConnectionPointContainer)(unsafe.Pointer(unknown)) + var point *ole.IConnectionPoint + err = container.FindConnectionPoint(iid, &point) + if err != nil { + return + } + if edisp, ok := idisp.(*ole.IUnknown); ok { + cookie, err = point.Advise(edisp) + container.Release() + if err != nil { + return + } + } + rv := reflect.ValueOf(disp).Elem() + if rv.Type().Kind() == reflect.Struct { + dest := &stdDispatch{} + dest.lpVtbl = &stdDispatchVtbl{} + dest.lpVtbl.pQueryInterface = syscall.NewCallback(dispQueryInterface) + dest.lpVtbl.pAddRef = syscall.NewCallback(dispAddRef) + dest.lpVtbl.pRelease = syscall.NewCallback(dispRelease) + dest.lpVtbl.pGetTypeInfoCount = syscall.NewCallback(dispGetTypeInfoCount) + dest.lpVtbl.pGetTypeInfo = syscall.NewCallback(dispGetTypeInfo) + dest.lpVtbl.pGetIDsOfNames = syscall.NewCallback(dispGetIDsOfNames) + dest.lpVtbl.pInvoke = syscall.NewCallback(dispInvoke) + dest.iface = disp + dest.iid = iid + cookie, err = point.Advise((*ole.IUnknown)(unsafe.Pointer(dest))) + container.Release() + if err != nil { + point.Release() + return + } + return + } + + container.Release() + + return 0, ole.NewError(ole.E_INVALIDARG) +} diff --git a/vendor/github.com/go-ole/go-ole/oleutil/go-get.go b/vendor/github.com/go-ole/go-ole/oleutil/go-get.go new file mode 100644 index 0000000..5834762 --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/oleutil/go-get.go @@ -0,0 +1,6 @@ +// This file is here so go get succeeds as without it errors with: +// no buildable Go source files in ... +// +// +build !windows + +package oleutil diff --git a/vendor/github.com/go-ole/go-ole/oleutil/oleutil.go b/vendor/github.com/go-ole/go-ole/oleutil/oleutil.go new file mode 100644 index 0000000..f7803c1 --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/oleutil/oleutil.go @@ -0,0 +1,127 @@ +package oleutil + +import ole "github.com/go-ole/go-ole" + +// ClassIDFrom retrieves class ID whether given is program ID or application string. +func ClassIDFrom(programID string) (classID *ole.GUID, err error) { + return ole.ClassIDFrom(programID) +} + +// CreateObject creates object from programID based on interface type. +// +// Only supports IUnknown. +// +// Program ID can be either program ID or application string. +func CreateObject(programID string) (unknown *ole.IUnknown, err error) { + classID, err := ole.ClassIDFrom(programID) + if err != nil { + return + } + + unknown, err = ole.CreateInstance(classID, ole.IID_IUnknown) + if err != nil { + return + } + + return +} + +// GetActiveObject retrieves active object for program ID and interface ID based +// on interface type. +// +// Only supports IUnknown. +// +// Program ID can be either program ID or application string. +func GetActiveObject(programID string) (unknown *ole.IUnknown, err error) { + classID, err := ole.ClassIDFrom(programID) + if err != nil { + return + } + + unknown, err = ole.GetActiveObject(classID, ole.IID_IUnknown) + if err != nil { + return + } + + return +} + +// CallMethod calls method on IDispatch with parameters. +func CallMethod(disp *ole.IDispatch, name string, params ...interface{}) (result *ole.VARIANT, err error) { + return disp.InvokeWithOptionalArgs(name, ole.DISPATCH_METHOD, params) +} + +// MustCallMethod calls method on IDispatch with parameters or panics. +func MustCallMethod(disp *ole.IDispatch, name string, params ...interface{}) (result *ole.VARIANT) { + r, err := CallMethod(disp, name, params...) + if err != nil { + panic(err.Error()) + } + return r +} + +// GetProperty retrieves property from IDispatch. +func GetProperty(disp *ole.IDispatch, name string, params ...interface{}) (result *ole.VARIANT, err error) { + return disp.InvokeWithOptionalArgs(name, ole.DISPATCH_PROPERTYGET, params) +} + +// MustGetProperty retrieves property from IDispatch or panics. +func MustGetProperty(disp *ole.IDispatch, name string, params ...interface{}) (result *ole.VARIANT) { + r, err := GetProperty(disp, name, params...) + if err != nil { + panic(err.Error()) + } + return r +} + +// PutProperty mutates property. +func PutProperty(disp *ole.IDispatch, name string, params ...interface{}) (result *ole.VARIANT, err error) { + return disp.InvokeWithOptionalArgs(name, ole.DISPATCH_PROPERTYPUT, params) +} + +// MustPutProperty mutates property or panics. +func MustPutProperty(disp *ole.IDispatch, name string, params ...interface{}) (result *ole.VARIANT) { + r, err := PutProperty(disp, name, params...) + if err != nil { + panic(err.Error()) + } + return r +} + +// PutPropertyRef mutates property reference. +func PutPropertyRef(disp *ole.IDispatch, name string, params ...interface{}) (result *ole.VARIANT, err error) { + return disp.InvokeWithOptionalArgs(name, ole.DISPATCH_PROPERTYPUTREF, params) +} + +// MustPutPropertyRef mutates property reference or panics. +func MustPutPropertyRef(disp *ole.IDispatch, name string, params ...interface{}) (result *ole.VARIANT) { + r, err := PutPropertyRef(disp, name, params...) + if err != nil { + panic(err.Error()) + } + return r +} + +func ForEach(disp *ole.IDispatch, f func(v *ole.VARIANT) error) error { + newEnum, err := disp.GetProperty("_NewEnum") + if err != nil { + return err + } + defer newEnum.Clear() + + enum, err := newEnum.ToIUnknown().IEnumVARIANT(ole.IID_IEnumVariant) + if err != nil { + return err + } + defer enum.Release() + + for item, length, err := enum.Next(1); length > 0; item, length, err = enum.Next(1) { + if err != nil { + return err + } + if ferr := f(&item); ferr != nil { + return ferr + } + } + return nil +} diff --git a/vendor/github.com/go-ole/go-ole/safearray.go b/vendor/github.com/go-ole/go-ole/safearray.go new file mode 100644 index 0000000..a5201b5 --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/safearray.go @@ -0,0 +1,27 @@ +// Package is meant to retrieve and process safe array data returned from COM. + +package ole + +// SafeArrayBound defines the SafeArray boundaries. +type SafeArrayBound struct { + Elements uint32 + LowerBound int32 +} + +// SafeArray is how COM handles arrays. +type SafeArray struct { + Dimensions uint16 + FeaturesFlag uint16 + ElementsSize uint32 + LocksAmount uint32 + Data uint32 + Bounds [16]byte +} + +// SAFEARRAY is obsolete, exists for backwards compatibility. +// Use SafeArray +type SAFEARRAY SafeArray + +// SAFEARRAYBOUND is obsolete, exists for backwards compatibility. +// Use SafeArrayBound +type SAFEARRAYBOUND SafeArrayBound diff --git a/vendor/github.com/go-ole/go-ole/safearray_func.go b/vendor/github.com/go-ole/go-ole/safearray_func.go new file mode 100644 index 0000000..0dee670 --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/safearray_func.go @@ -0,0 +1,211 @@ +// +build !windows + +package ole + +import ( + "unsafe" +) + +// safeArrayAccessData returns raw array pointer. +// +// AKA: SafeArrayAccessData in Windows API. +func safeArrayAccessData(safearray *SafeArray) (uintptr, error) { + return uintptr(0), NewError(E_NOTIMPL) +} + +// safeArrayUnaccessData releases raw array. +// +// AKA: SafeArrayUnaccessData in Windows API. +func safeArrayUnaccessData(safearray *SafeArray) error { + return NewError(E_NOTIMPL) +} + +// safeArrayAllocData allocates SafeArray. +// +// AKA: SafeArrayAllocData in Windows API. +func safeArrayAllocData(safearray *SafeArray) error { + return NewError(E_NOTIMPL) +} + +// safeArrayAllocDescriptor allocates SafeArray. +// +// AKA: SafeArrayAllocDescriptor in Windows API. +func safeArrayAllocDescriptor(dimensions uint32) (*SafeArray, error) { + return nil, NewError(E_NOTIMPL) +} + +// safeArrayAllocDescriptorEx allocates SafeArray. +// +// AKA: SafeArrayAllocDescriptorEx in Windows API. +func safeArrayAllocDescriptorEx(variantType VT, dimensions uint32) (*SafeArray, error) { + return nil, NewError(E_NOTIMPL) +} + +// safeArrayCopy returns copy of SafeArray. +// +// AKA: SafeArrayCopy in Windows API. +func safeArrayCopy(original *SafeArray) (*SafeArray, error) { + return nil, NewError(E_NOTIMPL) +} + +// safeArrayCopyData duplicates SafeArray into another SafeArray object. +// +// AKA: SafeArrayCopyData in Windows API. +func safeArrayCopyData(original *SafeArray, duplicate *SafeArray) error { + return NewError(E_NOTIMPL) +} + +// safeArrayCreate creates SafeArray. +// +// AKA: SafeArrayCreate in Windows API. +func safeArrayCreate(variantType VT, dimensions uint32, bounds *SafeArrayBound) (*SafeArray, error) { + return nil, NewError(E_NOTIMPL) +} + +// safeArrayCreateEx creates SafeArray. +// +// AKA: SafeArrayCreateEx in Windows API. +func safeArrayCreateEx(variantType VT, dimensions uint32, bounds *SafeArrayBound, extra uintptr) (*SafeArray, error) { + return nil, NewError(E_NOTIMPL) +} + +// safeArrayCreateVector creates SafeArray. +// +// AKA: SafeArrayCreateVector in Windows API. +func safeArrayCreateVector(variantType VT, lowerBound int32, length uint32) (*SafeArray, error) { + return nil, NewError(E_NOTIMPL) +} + +// safeArrayCreateVectorEx creates SafeArray. +// +// AKA: SafeArrayCreateVectorEx in Windows API. +func safeArrayCreateVectorEx(variantType VT, lowerBound int32, length uint32, extra uintptr) (*SafeArray, error) { + return nil, NewError(E_NOTIMPL) +} + +// safeArrayDestroy destroys SafeArray object. +// +// AKA: SafeArrayDestroy in Windows API. +func safeArrayDestroy(safearray *SafeArray) error { + return NewError(E_NOTIMPL) +} + +// safeArrayDestroyData destroys SafeArray object. +// +// AKA: SafeArrayDestroyData in Windows API. +func safeArrayDestroyData(safearray *SafeArray) error { + return NewError(E_NOTIMPL) +} + +// safeArrayDestroyDescriptor destroys SafeArray object. +// +// AKA: SafeArrayDestroyDescriptor in Windows API. +func safeArrayDestroyDescriptor(safearray *SafeArray) error { + return NewError(E_NOTIMPL) +} + +// safeArrayGetDim is the amount of dimensions in the SafeArray. +// +// SafeArrays may have multiple dimensions. Meaning, it could be +// multidimensional array. +// +// AKA: SafeArrayGetDim in Windows API. +func safeArrayGetDim(safearray *SafeArray) (*uint32, error) { + u := uint32(0) + return &u, NewError(E_NOTIMPL) +} + +// safeArrayGetElementSize is the element size in bytes. +// +// AKA: SafeArrayGetElemsize in Windows API. +func safeArrayGetElementSize(safearray *SafeArray) (*uint32, error) { + u := uint32(0) + return &u, NewError(E_NOTIMPL) +} + +// safeArrayGetElement retrieves element at given index. +func safeArrayGetElement(safearray *SafeArray, index int32, pv unsafe.Pointer) error { + return NewError(E_NOTIMPL) +} + +// safeArrayGetElement retrieves element at given index and converts to string. +func safeArrayGetElementString(safearray *SafeArray, index int32) (string, error) { + return "", NewError(E_NOTIMPL) +} + +// safeArrayGetIID is the InterfaceID of the elements in the SafeArray. +// +// AKA: SafeArrayGetIID in Windows API. +func safeArrayGetIID(safearray *SafeArray) (*GUID, error) { + return nil, NewError(E_NOTIMPL) +} + +// safeArrayGetLBound returns lower bounds of SafeArray. +// +// SafeArrays may have multiple dimensions. Meaning, it could be +// multidimensional array. +// +// AKA: SafeArrayGetLBound in Windows API. +func safeArrayGetLBound(safearray *SafeArray, dimension uint32) (int32, error) { + return int32(0), NewError(E_NOTIMPL) +} + +// safeArrayGetUBound returns upper bounds of SafeArray. +// +// SafeArrays may have multiple dimensions. Meaning, it could be +// multidimensional array. +// +// AKA: SafeArrayGetUBound in Windows API. +func safeArrayGetUBound(safearray *SafeArray, dimension uint32) (int32, error) { + return int32(0), NewError(E_NOTIMPL) +} + +// safeArrayGetVartype returns data type of SafeArray. +// +// AKA: SafeArrayGetVartype in Windows API. +func safeArrayGetVartype(safearray *SafeArray) (uint16, error) { + return uint16(0), NewError(E_NOTIMPL) +} + +// safeArrayLock locks SafeArray for reading to modify SafeArray. +// +// This must be called during some calls to ensure that another process does not +// read or write to the SafeArray during editing. +// +// AKA: SafeArrayLock in Windows API. +func safeArrayLock(safearray *SafeArray) error { + return NewError(E_NOTIMPL) +} + +// safeArrayUnlock unlocks SafeArray for reading. +// +// AKA: SafeArrayUnlock in Windows API. +func safeArrayUnlock(safearray *SafeArray) error { + return NewError(E_NOTIMPL) +} + +// safeArrayPutElement stores the data element at the specified location in the +// array. +// +// AKA: SafeArrayPutElement in Windows API. +func safeArrayPutElement(safearray *SafeArray, index int64, element uintptr) error { + return NewError(E_NOTIMPL) +} + +// safeArrayGetRecordInfo accesses IRecordInfo info for custom types. +// +// AKA: SafeArrayGetRecordInfo in Windows API. +// +// XXX: Must implement IRecordInfo interface for this to return. +func safeArrayGetRecordInfo(safearray *SafeArray) (interface{}, error) { + return nil, NewError(E_NOTIMPL) +} + +// safeArraySetRecordInfo mutates IRecordInfo info for custom types. +// +// AKA: SafeArraySetRecordInfo in Windows API. +// +// XXX: Must implement IRecordInfo interface for this to return. +func safeArraySetRecordInfo(safearray *SafeArray, recordInfo interface{}) error { + return NewError(E_NOTIMPL) +} diff --git a/vendor/github.com/go-ole/go-ole/safearray_windows.go b/vendor/github.com/go-ole/go-ole/safearray_windows.go new file mode 100644 index 0000000..b48a239 --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/safearray_windows.go @@ -0,0 +1,337 @@ +// +build windows + +package ole + +import ( + "unsafe" +) + +var ( + procSafeArrayAccessData, _ = modoleaut32.FindProc("SafeArrayAccessData") + procSafeArrayAllocData, _ = modoleaut32.FindProc("SafeArrayAllocData") + procSafeArrayAllocDescriptor, _ = modoleaut32.FindProc("SafeArrayAllocDescriptor") + procSafeArrayAllocDescriptorEx, _ = modoleaut32.FindProc("SafeArrayAllocDescriptorEx") + procSafeArrayCopy, _ = modoleaut32.FindProc("SafeArrayCopy") + procSafeArrayCopyData, _ = modoleaut32.FindProc("SafeArrayCopyData") + procSafeArrayCreate, _ = modoleaut32.FindProc("SafeArrayCreate") + procSafeArrayCreateEx, _ = modoleaut32.FindProc("SafeArrayCreateEx") + procSafeArrayCreateVector, _ = modoleaut32.FindProc("SafeArrayCreateVector") + procSafeArrayCreateVectorEx, _ = modoleaut32.FindProc("SafeArrayCreateVectorEx") + procSafeArrayDestroy, _ = modoleaut32.FindProc("SafeArrayDestroy") + procSafeArrayDestroyData, _ = modoleaut32.FindProc("SafeArrayDestroyData") + procSafeArrayDestroyDescriptor, _ = modoleaut32.FindProc("SafeArrayDestroyDescriptor") + procSafeArrayGetDim, _ = modoleaut32.FindProc("SafeArrayGetDim") + procSafeArrayGetElement, _ = modoleaut32.FindProc("SafeArrayGetElement") + procSafeArrayGetElemsize, _ = modoleaut32.FindProc("SafeArrayGetElemsize") + procSafeArrayGetIID, _ = modoleaut32.FindProc("SafeArrayGetIID") + procSafeArrayGetLBound, _ = modoleaut32.FindProc("SafeArrayGetLBound") + procSafeArrayGetUBound, _ = modoleaut32.FindProc("SafeArrayGetUBound") + procSafeArrayGetVartype, _ = modoleaut32.FindProc("SafeArrayGetVartype") + procSafeArrayLock, _ = modoleaut32.FindProc("SafeArrayLock") + procSafeArrayPtrOfIndex, _ = modoleaut32.FindProc("SafeArrayPtrOfIndex") + procSafeArrayUnaccessData, _ = modoleaut32.FindProc("SafeArrayUnaccessData") + procSafeArrayUnlock, _ = modoleaut32.FindProc("SafeArrayUnlock") + procSafeArrayPutElement, _ = modoleaut32.FindProc("SafeArrayPutElement") + //procSafeArrayRedim, _ = modoleaut32.FindProc("SafeArrayRedim") // TODO + //procSafeArraySetIID, _ = modoleaut32.FindProc("SafeArraySetIID") // TODO + procSafeArrayGetRecordInfo, _ = modoleaut32.FindProc("SafeArrayGetRecordInfo") + procSafeArraySetRecordInfo, _ = modoleaut32.FindProc("SafeArraySetRecordInfo") +) + +// safeArrayAccessData returns raw array pointer. +// +// AKA: SafeArrayAccessData in Windows API. +// Todo: Test +func safeArrayAccessData(safearray *SafeArray) (element uintptr, err error) { + err = convertHresultToError( + procSafeArrayAccessData.Call( + uintptr(unsafe.Pointer(safearray)), + uintptr(unsafe.Pointer(&element)))) + return +} + +// safeArrayUnaccessData releases raw array. +// +// AKA: SafeArrayUnaccessData in Windows API. +func safeArrayUnaccessData(safearray *SafeArray) (err error) { + err = convertHresultToError(procSafeArrayUnaccessData.Call(uintptr(unsafe.Pointer(safearray)))) + return +} + +// safeArrayAllocData allocates SafeArray. +// +// AKA: SafeArrayAllocData in Windows API. +func safeArrayAllocData(safearray *SafeArray) (err error) { + err = convertHresultToError(procSafeArrayAllocData.Call(uintptr(unsafe.Pointer(safearray)))) + return +} + +// safeArrayAllocDescriptor allocates SafeArray. +// +// AKA: SafeArrayAllocDescriptor in Windows API. +func safeArrayAllocDescriptor(dimensions uint32) (safearray *SafeArray, err error) { + err = convertHresultToError( + procSafeArrayAllocDescriptor.Call(uintptr(dimensions), uintptr(unsafe.Pointer(&safearray)))) + return +} + +// safeArrayAllocDescriptorEx allocates SafeArray. +// +// AKA: SafeArrayAllocDescriptorEx in Windows API. +func safeArrayAllocDescriptorEx(variantType VT, dimensions uint32) (safearray *SafeArray, err error) { + err = convertHresultToError( + procSafeArrayAllocDescriptorEx.Call( + uintptr(variantType), + uintptr(dimensions), + uintptr(unsafe.Pointer(&safearray)))) + return +} + +// safeArrayCopy returns copy of SafeArray. +// +// AKA: SafeArrayCopy in Windows API. +func safeArrayCopy(original *SafeArray) (safearray *SafeArray, err error) { + err = convertHresultToError( + procSafeArrayCopy.Call( + uintptr(unsafe.Pointer(original)), + uintptr(unsafe.Pointer(&safearray)))) + return +} + +// safeArrayCopyData duplicates SafeArray into another SafeArray object. +// +// AKA: SafeArrayCopyData in Windows API. +func safeArrayCopyData(original *SafeArray, duplicate *SafeArray) (err error) { + err = convertHresultToError( + procSafeArrayCopyData.Call( + uintptr(unsafe.Pointer(original)), + uintptr(unsafe.Pointer(duplicate)))) + return +} + +// safeArrayCreate creates SafeArray. +// +// AKA: SafeArrayCreate in Windows API. +func safeArrayCreate(variantType VT, dimensions uint32, bounds *SafeArrayBound) (safearray *SafeArray, err error) { + sa, _, err := procSafeArrayCreate.Call( + uintptr(variantType), + uintptr(dimensions), + uintptr(unsafe.Pointer(bounds))) + safearray = (*SafeArray)(unsafe.Pointer(&sa)) + return +} + +// safeArrayCreateEx creates SafeArray. +// +// AKA: SafeArrayCreateEx in Windows API. +func safeArrayCreateEx(variantType VT, dimensions uint32, bounds *SafeArrayBound, extra uintptr) (safearray *SafeArray, err error) { + sa, _, err := procSafeArrayCreateEx.Call( + uintptr(variantType), + uintptr(dimensions), + uintptr(unsafe.Pointer(bounds)), + extra) + safearray = (*SafeArray)(unsafe.Pointer(sa)) + return +} + +// safeArrayCreateVector creates SafeArray. +// +// AKA: SafeArrayCreateVector in Windows API. +func safeArrayCreateVector(variantType VT, lowerBound int32, length uint32) (safearray *SafeArray, err error) { + sa, _, err := procSafeArrayCreateVector.Call( + uintptr(variantType), + uintptr(lowerBound), + uintptr(length)) + safearray = (*SafeArray)(unsafe.Pointer(sa)) + return +} + +// safeArrayCreateVectorEx creates SafeArray. +// +// AKA: SafeArrayCreateVectorEx in Windows API. +func safeArrayCreateVectorEx(variantType VT, lowerBound int32, length uint32, extra uintptr) (safearray *SafeArray, err error) { + sa, _, err := procSafeArrayCreateVectorEx.Call( + uintptr(variantType), + uintptr(lowerBound), + uintptr(length), + extra) + safearray = (*SafeArray)(unsafe.Pointer(sa)) + return +} + +// safeArrayDestroy destroys SafeArray object. +// +// AKA: SafeArrayDestroy in Windows API. +func safeArrayDestroy(safearray *SafeArray) (err error) { + err = convertHresultToError(procSafeArrayDestroy.Call(uintptr(unsafe.Pointer(safearray)))) + return +} + +// safeArrayDestroyData destroys SafeArray object. +// +// AKA: SafeArrayDestroyData in Windows API. +func safeArrayDestroyData(safearray *SafeArray) (err error) { + err = convertHresultToError(procSafeArrayDestroyData.Call(uintptr(unsafe.Pointer(safearray)))) + return +} + +// safeArrayDestroyDescriptor destroys SafeArray object. +// +// AKA: SafeArrayDestroyDescriptor in Windows API. +func safeArrayDestroyDescriptor(safearray *SafeArray) (err error) { + err = convertHresultToError(procSafeArrayDestroyDescriptor.Call(uintptr(unsafe.Pointer(safearray)))) + return +} + +// safeArrayGetDim is the amount of dimensions in the SafeArray. +// +// SafeArrays may have multiple dimensions. Meaning, it could be +// multidimensional array. +// +// AKA: SafeArrayGetDim in Windows API. +func safeArrayGetDim(safearray *SafeArray) (dimensions *uint32, err error) { + l, _, err := procSafeArrayGetDim.Call(uintptr(unsafe.Pointer(safearray))) + dimensions = (*uint32)(unsafe.Pointer(l)) + return +} + +// safeArrayGetElementSize is the element size in bytes. +// +// AKA: SafeArrayGetElemsize in Windows API. +func safeArrayGetElementSize(safearray *SafeArray) (length *uint32, err error) { + l, _, err := procSafeArrayGetElemsize.Call(uintptr(unsafe.Pointer(safearray))) + length = (*uint32)(unsafe.Pointer(l)) + return +} + +// safeArrayGetElement retrieves element at given index. +func safeArrayGetElement(safearray *SafeArray, index int32, pv unsafe.Pointer) error { + return convertHresultToError( + procSafeArrayGetElement.Call( + uintptr(unsafe.Pointer(safearray)), + uintptr(unsafe.Pointer(&index)), + uintptr(pv))) +} + +// safeArrayGetElementString retrieves element at given index and converts to string. +func safeArrayGetElementString(safearray *SafeArray, index int32) (str string, err error) { + var element *int16 + err = convertHresultToError( + procSafeArrayGetElement.Call( + uintptr(unsafe.Pointer(safearray)), + uintptr(unsafe.Pointer(&index)), + uintptr(unsafe.Pointer(&element)))) + str = BstrToString(*(**uint16)(unsafe.Pointer(&element))) + SysFreeString(element) + return +} + +// safeArrayGetIID is the InterfaceID of the elements in the SafeArray. +// +// AKA: SafeArrayGetIID in Windows API. +func safeArrayGetIID(safearray *SafeArray) (guid *GUID, err error) { + err = convertHresultToError( + procSafeArrayGetIID.Call( + uintptr(unsafe.Pointer(safearray)), + uintptr(unsafe.Pointer(&guid)))) + return +} + +// safeArrayGetLBound returns lower bounds of SafeArray. +// +// SafeArrays may have multiple dimensions. Meaning, it could be +// multidimensional array. +// +// AKA: SafeArrayGetLBound in Windows API. +func safeArrayGetLBound(safearray *SafeArray, dimension uint32) (lowerBound int32, err error) { + err = convertHresultToError( + procSafeArrayGetLBound.Call( + uintptr(unsafe.Pointer(safearray)), + uintptr(dimension), + uintptr(unsafe.Pointer(&lowerBound)))) + return +} + +// safeArrayGetUBound returns upper bounds of SafeArray. +// +// SafeArrays may have multiple dimensions. Meaning, it could be +// multidimensional array. +// +// AKA: SafeArrayGetUBound in Windows API. +func safeArrayGetUBound(safearray *SafeArray, dimension uint32) (upperBound int32, err error) { + err = convertHresultToError( + procSafeArrayGetUBound.Call( + uintptr(unsafe.Pointer(safearray)), + uintptr(dimension), + uintptr(unsafe.Pointer(&upperBound)))) + return +} + +// safeArrayGetVartype returns data type of SafeArray. +// +// AKA: SafeArrayGetVartype in Windows API. +func safeArrayGetVartype(safearray *SafeArray) (varType uint16, err error) { + err = convertHresultToError( + procSafeArrayGetVartype.Call( + uintptr(unsafe.Pointer(safearray)), + uintptr(unsafe.Pointer(&varType)))) + return +} + +// safeArrayLock locks SafeArray for reading to modify SafeArray. +// +// This must be called during some calls to ensure that another process does not +// read or write to the SafeArray during editing. +// +// AKA: SafeArrayLock in Windows API. +func safeArrayLock(safearray *SafeArray) (err error) { + err = convertHresultToError(procSafeArrayLock.Call(uintptr(unsafe.Pointer(safearray)))) + return +} + +// safeArrayUnlock unlocks SafeArray for reading. +// +// AKA: SafeArrayUnlock in Windows API. +func safeArrayUnlock(safearray *SafeArray) (err error) { + err = convertHresultToError(procSafeArrayUnlock.Call(uintptr(unsafe.Pointer(safearray)))) + return +} + +// safeArrayPutElement stores the data element at the specified location in the +// array. +// +// AKA: SafeArrayPutElement in Windows API. +func safeArrayPutElement(safearray *SafeArray, index int64, element uintptr) (err error) { + err = convertHresultToError( + procSafeArrayPutElement.Call( + uintptr(unsafe.Pointer(safearray)), + uintptr(unsafe.Pointer(&index)), + uintptr(unsafe.Pointer(element)))) + return +} + +// safeArrayGetRecordInfo accesses IRecordInfo info for custom types. +// +// AKA: SafeArrayGetRecordInfo in Windows API. +// +// XXX: Must implement IRecordInfo interface for this to return. +func safeArrayGetRecordInfo(safearray *SafeArray) (recordInfo interface{}, err error) { + err = convertHresultToError( + procSafeArrayGetRecordInfo.Call( + uintptr(unsafe.Pointer(safearray)), + uintptr(unsafe.Pointer(&recordInfo)))) + return +} + +// safeArraySetRecordInfo mutates IRecordInfo info for custom types. +// +// AKA: SafeArraySetRecordInfo in Windows API. +// +// XXX: Must implement IRecordInfo interface for this to return. +func safeArraySetRecordInfo(safearray *SafeArray, recordInfo interface{}) (err error) { + err = convertHresultToError( + procSafeArraySetRecordInfo.Call( + uintptr(unsafe.Pointer(safearray)), + uintptr(unsafe.Pointer(&recordInfo)))) + return +} diff --git a/vendor/github.com/go-ole/go-ole/safearrayconversion.go b/vendor/github.com/go-ole/go-ole/safearrayconversion.go new file mode 100644 index 0000000..259f488 --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/safearrayconversion.go @@ -0,0 +1,140 @@ +// Helper for converting SafeArray to array of objects. + +package ole + +import ( + "unsafe" +) + +type SafeArrayConversion struct { + Array *SafeArray +} + +func (sac *SafeArrayConversion) ToStringArray() (strings []string) { + totalElements, _ := sac.TotalElements(0) + strings = make([]string, totalElements) + + for i := int32(0); i < totalElements; i++ { + strings[int32(i)], _ = safeArrayGetElementString(sac.Array, i) + } + + return +} + +func (sac *SafeArrayConversion) ToByteArray() (bytes []byte) { + totalElements, _ := sac.TotalElements(0) + bytes = make([]byte, totalElements) + + for i := int32(0); i < totalElements; i++ { + safeArrayGetElement(sac.Array, i, unsafe.Pointer(&bytes[int32(i)])) + } + + return +} + +func (sac *SafeArrayConversion) ToValueArray() (values []interface{}) { + totalElements, _ := sac.TotalElements(0) + values = make([]interface{}, totalElements) + vt, _ := safeArrayGetVartype(sac.Array) + + for i := int32(0); i < totalElements; i++ { + switch VT(vt) { + case VT_BOOL: + var v bool + safeArrayGetElement(sac.Array, i, unsafe.Pointer(&v)) + values[i] = v + case VT_I1: + var v int8 + safeArrayGetElement(sac.Array, i, unsafe.Pointer(&v)) + values[i] = v + case VT_I2: + var v int16 + safeArrayGetElement(sac.Array, i, unsafe.Pointer(&v)) + values[i] = v + case VT_I4: + var v int32 + safeArrayGetElement(sac.Array, i, unsafe.Pointer(&v)) + values[i] = v + case VT_I8: + var v int64 + safeArrayGetElement(sac.Array, i, unsafe.Pointer(&v)) + values[i] = v + case VT_UI1: + var v uint8 + safeArrayGetElement(sac.Array, i, unsafe.Pointer(&v)) + values[i] = v + case VT_UI2: + var v uint16 + safeArrayGetElement(sac.Array, i, unsafe.Pointer(&v)) + values[i] = v + case VT_UI4: + var v uint32 + safeArrayGetElement(sac.Array, i, unsafe.Pointer(&v)) + values[i] = v + case VT_UI8: + var v uint64 + safeArrayGetElement(sac.Array, i, unsafe.Pointer(&v)) + values[i] = v + case VT_R4: + var v float32 + safeArrayGetElement(sac.Array, i, unsafe.Pointer(&v)) + values[i] = v + case VT_R8: + var v float64 + safeArrayGetElement(sac.Array, i, unsafe.Pointer(&v)) + values[i] = v + case VT_BSTR: + var v string + safeArrayGetElement(sac.Array, i, unsafe.Pointer(&v)) + values[i] = v + case VT_VARIANT: + var v VARIANT + safeArrayGetElement(sac.Array, i, unsafe.Pointer(&v)) + values[i] = v.Value() + default: + // TODO + } + } + + return +} + +func (sac *SafeArrayConversion) GetType() (varType uint16, err error) { + return safeArrayGetVartype(sac.Array) +} + +func (sac *SafeArrayConversion) GetDimensions() (dimensions *uint32, err error) { + return safeArrayGetDim(sac.Array) +} + +func (sac *SafeArrayConversion) GetSize() (length *uint32, err error) { + return safeArrayGetElementSize(sac.Array) +} + +func (sac *SafeArrayConversion) TotalElements(index uint32) (totalElements int32, err error) { + if index < 1 { + index = 1 + } + + // Get array bounds + var LowerBounds int32 + var UpperBounds int32 + + LowerBounds, err = safeArrayGetLBound(sac.Array, index) + if err != nil { + return + } + + UpperBounds, err = safeArrayGetUBound(sac.Array, index) + if err != nil { + return + } + + totalElements = UpperBounds - LowerBounds + 1 + return +} + +// Release Safe Array memory +func (sac *SafeArrayConversion) Release() { + safeArrayDestroy(sac.Array) +} diff --git a/vendor/github.com/go-ole/go-ole/safearrayslices.go b/vendor/github.com/go-ole/go-ole/safearrayslices.go new file mode 100644 index 0000000..a9fa885 --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/safearrayslices.go @@ -0,0 +1,33 @@ +// +build windows + +package ole + +import ( + "unsafe" +) + +func safeArrayFromByteSlice(slice []byte) *SafeArray { + array, _ := safeArrayCreateVector(VT_UI1, 0, uint32(len(slice))) + + if array == nil { + panic("Could not convert []byte to SAFEARRAY") + } + + for i, v := range slice { + safeArrayPutElement(array, int64(i), uintptr(unsafe.Pointer(&v))) + } + return array +} + +func safeArrayFromStringSlice(slice []string) *SafeArray { + array, _ := safeArrayCreateVector(VT_BSTR, 0, uint32(len(slice))) + + if array == nil { + panic("Could not convert []string to SAFEARRAY") + } + // SysAllocStringLen(s) + for i, v := range slice { + safeArrayPutElement(array, int64(i), uintptr(unsafe.Pointer(SysAllocStringLen(v)))) + } + return array +} diff --git a/vendor/github.com/go-ole/go-ole/utility.go b/vendor/github.com/go-ole/go-ole/utility.go new file mode 100644 index 0000000..99ee82d --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/utility.go @@ -0,0 +1,101 @@ +package ole + +import ( + "unicode/utf16" + "unsafe" +) + +// ClassIDFrom retrieves class ID whether given is program ID or application string. +// +// Helper that provides check against both Class ID from Program ID and Class ID from string. It is +// faster, if you know which you are using, to use the individual functions, but this will check +// against available functions for you. +func ClassIDFrom(programID string) (classID *GUID, err error) { + classID, err = CLSIDFromProgID(programID) + if err != nil { + classID, err = CLSIDFromString(programID) + if err != nil { + return + } + } + return +} + +// BytePtrToString converts byte pointer to a Go string. +func BytePtrToString(p *byte) string { + a := (*[10000]uint8)(unsafe.Pointer(p)) + i := 0 + for a[i] != 0 { + i++ + } + return string(a[:i]) +} + +// UTF16PtrToString is alias for LpOleStrToString. +// +// Kept for compatibility reasons. +func UTF16PtrToString(p *uint16) string { + return LpOleStrToString(p) +} + +// LpOleStrToString converts COM Unicode to Go string. +func LpOleStrToString(p *uint16) string { + if p == nil { + return "" + } + + length := lpOleStrLen(p) + a := make([]uint16, length) + + ptr := unsafe.Pointer(p) + + for i := 0; i < int(length); i++ { + a[i] = *(*uint16)(ptr) + ptr = unsafe.Pointer(uintptr(ptr) + 2) + } + + return string(utf16.Decode(a)) +} + +// BstrToString converts COM binary string to Go string. +func BstrToString(p *uint16) string { + if p == nil { + return "" + } + length := SysStringLen((*int16)(unsafe.Pointer(p))) + a := make([]uint16, length) + + ptr := unsafe.Pointer(p) + + for i := 0; i < int(length); i++ { + a[i] = *(*uint16)(ptr) + ptr = unsafe.Pointer(uintptr(ptr) + 2) + } + return string(utf16.Decode(a)) +} + +// lpOleStrLen returns the length of Unicode string. +func lpOleStrLen(p *uint16) (length int64) { + if p == nil { + return 0 + } + + ptr := unsafe.Pointer(p) + + for i := 0; ; i++ { + if 0 == *(*uint16)(ptr) { + length = int64(i) + break + } + ptr = unsafe.Pointer(uintptr(ptr) + 2) + } + return +} + +// convertHresultToError converts syscall to error, if call is unsuccessful. +func convertHresultToError(hr uintptr, r2 uintptr, ignore error) (err error) { + if hr != 0 { + err = NewError(hr) + } + return +} diff --git a/vendor/github.com/go-ole/go-ole/variables.go b/vendor/github.com/go-ole/go-ole/variables.go new file mode 100644 index 0000000..ebe00f1 --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/variables.go @@ -0,0 +1,16 @@ +// +build windows + +package ole + +import ( + "syscall" +) + +var ( + modcombase = syscall.NewLazyDLL("combase.dll") + modkernel32, _ = syscall.LoadDLL("kernel32.dll") + modole32, _ = syscall.LoadDLL("ole32.dll") + modoleaut32, _ = syscall.LoadDLL("oleaut32.dll") + modmsvcrt, _ = syscall.LoadDLL("msvcrt.dll") + moduser32, _ = syscall.LoadDLL("user32.dll") +) diff --git a/vendor/github.com/go-ole/go-ole/variant.go b/vendor/github.com/go-ole/go-ole/variant.go new file mode 100644 index 0000000..967a23f --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/variant.go @@ -0,0 +1,105 @@ +package ole + +import "unsafe" + +// NewVariant returns new variant based on type and value. +func NewVariant(vt VT, val int64) VARIANT { + return VARIANT{VT: vt, Val: val} +} + +// ToIUnknown converts Variant to Unknown object. +func (v *VARIANT) ToIUnknown() *IUnknown { + if v.VT != VT_UNKNOWN { + return nil + } + return (*IUnknown)(unsafe.Pointer(uintptr(v.Val))) +} + +// ToIDispatch converts variant to dispatch object. +func (v *VARIANT) ToIDispatch() *IDispatch { + if v.VT != VT_DISPATCH { + return nil + } + return (*IDispatch)(unsafe.Pointer(uintptr(v.Val))) +} + +// ToArray converts variant to SafeArray helper. +func (v *VARIANT) ToArray() *SafeArrayConversion { + if v.VT != VT_SAFEARRAY { + if v.VT&VT_ARRAY == 0 { + return nil + } + } + var safeArray *SafeArray = (*SafeArray)(unsafe.Pointer(uintptr(v.Val))) + return &SafeArrayConversion{safeArray} +} + +// ToString converts variant to Go string. +func (v *VARIANT) ToString() string { + if v.VT != VT_BSTR { + return "" + } + return BstrToString(*(**uint16)(unsafe.Pointer(&v.Val))) +} + +// Clear the memory of variant object. +func (v *VARIANT) Clear() error { + return VariantClear(v) +} + +// Value returns variant value based on its type. +// +// Currently supported types: 2- and 4-byte integers, strings, bools. +// Note that 64-bit integers, datetimes, and other types are stored as strings +// and will be returned as strings. +// +// Needs to be further converted, because this returns an interface{}. +func (v *VARIANT) Value() interface{} { + switch v.VT { + case VT_I1: + return int8(v.Val) + case VT_UI1: + return uint8(v.Val) + case VT_I2: + return int16(v.Val) + case VT_UI2: + return uint16(v.Val) + case VT_I4: + return int32(v.Val) + case VT_UI4: + return uint32(v.Val) + case VT_I8: + return int64(v.Val) + case VT_UI8: + return uint64(v.Val) + case VT_INT: + return int(v.Val) + case VT_UINT: + return uint(v.Val) + case VT_INT_PTR: + return uintptr(v.Val) // TODO + case VT_UINT_PTR: + return uintptr(v.Val) + case VT_R4: + return *(*float32)(unsafe.Pointer(&v.Val)) + case VT_R8: + return *(*float64)(unsafe.Pointer(&v.Val)) + case VT_BSTR: + return v.ToString() + case VT_DATE: + // VT_DATE type will either return float64 or time.Time. + d := uint64(v.Val) + date, err := GetVariantDate(d) + if err != nil { + return float64(v.Val) + } + return date + case VT_UNKNOWN: + return v.ToIUnknown() + case VT_DISPATCH: + return v.ToIDispatch() + case VT_BOOL: + return v.Val != 0 + } + return nil +} diff --git a/vendor/github.com/go-ole/go-ole/variant_386.go b/vendor/github.com/go-ole/go-ole/variant_386.go new file mode 100644 index 0000000..e73736b --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/variant_386.go @@ -0,0 +1,11 @@ +// +build 386 + +package ole + +type VARIANT struct { + VT VT // 2 + wReserved1 uint16 // 4 + wReserved2 uint16 // 6 + wReserved3 uint16 // 8 + Val int64 // 16 +} diff --git a/vendor/github.com/go-ole/go-ole/variant_amd64.go b/vendor/github.com/go-ole/go-ole/variant_amd64.go new file mode 100644 index 0000000..dccdde1 --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/variant_amd64.go @@ -0,0 +1,12 @@ +// +build amd64 + +package ole + +type VARIANT struct { + VT VT // 2 + wReserved1 uint16 // 4 + wReserved2 uint16 // 6 + wReserved3 uint16 // 8 + Val int64 // 16 + _ [8]byte // 24 +} diff --git a/vendor/github.com/go-ole/go-ole/variant_date_386.go b/vendor/github.com/go-ole/go-ole/variant_date_386.go new file mode 100644 index 0000000..1b970f6 --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/variant_date_386.go @@ -0,0 +1,22 @@ +// +build windows,386 + +package ole + +import ( + "errors" + "syscall" + "time" + "unsafe" +) + +// GetVariantDate converts COM Variant Time value to Go time.Time. +func GetVariantDate(value uint64) (time.Time, error) { + var st syscall.Systemtime + v1 := uint32(value) + v2 := uint32(value >> 32) + r, _, _ := procVariantTimeToSystemTime.Call(uintptr(v1), uintptr(v2), uintptr(unsafe.Pointer(&st))) + if r != 0 { + return time.Date(int(st.Year), time.Month(st.Month), int(st.Day), int(st.Hour), int(st.Minute), int(st.Second), int(st.Milliseconds/1000), time.UTC), nil + } + return time.Now(), errors.New("Could not convert to time, passing current time.") +} diff --git a/vendor/github.com/go-ole/go-ole/variant_date_amd64.go b/vendor/github.com/go-ole/go-ole/variant_date_amd64.go new file mode 100644 index 0000000..6952f1f --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/variant_date_amd64.go @@ -0,0 +1,20 @@ +// +build windows,amd64 + +package ole + +import ( + "errors" + "syscall" + "time" + "unsafe" +) + +// GetVariantDate converts COM Variant Time value to Go time.Time. +func GetVariantDate(value uint64) (time.Time, error) { + var st syscall.Systemtime + r, _, _ := procVariantTimeToSystemTime.Call(uintptr(value), uintptr(unsafe.Pointer(&st))) + if r != 0 { + return time.Date(int(st.Year), time.Month(st.Month), int(st.Day), int(st.Hour), int(st.Minute), int(st.Second), int(st.Milliseconds/1000), time.UTC), nil + } + return time.Now(), errors.New("Could not convert to time, passing current time.") +} diff --git a/vendor/github.com/go-ole/go-ole/variant_ppc64le.go b/vendor/github.com/go-ole/go-ole/variant_ppc64le.go new file mode 100644 index 0000000..326427a --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/variant_ppc64le.go @@ -0,0 +1,12 @@ +// +build ppc64le + +package ole + +type VARIANT struct { + VT VT // 2 + wReserved1 uint16 // 4 + wReserved2 uint16 // 6 + wReserved3 uint16 // 8 + Val int64 // 16 + _ [8]byte // 24 +} diff --git a/vendor/github.com/go-ole/go-ole/variant_s390x.go b/vendor/github.com/go-ole/go-ole/variant_s390x.go new file mode 100644 index 0000000..9874ca6 --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/variant_s390x.go @@ -0,0 +1,12 @@ +// +build s390x + +package ole + +type VARIANT struct { + VT VT // 2 + wReserved1 uint16 // 4 + wReserved2 uint16 // 6 + wReserved3 uint16 // 8 + Val int64 // 16 + _ [8]byte // 24 +} diff --git a/vendor/github.com/go-ole/go-ole/vt_string.go b/vendor/github.com/go-ole/go-ole/vt_string.go new file mode 100644 index 0000000..729b4a0 --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/vt_string.go @@ -0,0 +1,58 @@ +// generated by stringer -output vt_string.go -type VT; DO NOT EDIT + +package ole + +import "fmt" + +const ( + _VT_name_0 = "VT_EMPTYVT_NULLVT_I2VT_I4VT_R4VT_R8VT_CYVT_DATEVT_BSTRVT_DISPATCHVT_ERRORVT_BOOLVT_VARIANTVT_UNKNOWNVT_DECIMAL" + _VT_name_1 = "VT_I1VT_UI1VT_UI2VT_UI4VT_I8VT_UI8VT_INTVT_UINTVT_VOIDVT_HRESULTVT_PTRVT_SAFEARRAYVT_CARRAYVT_USERDEFINEDVT_LPSTRVT_LPWSTR" + _VT_name_2 = "VT_RECORDVT_INT_PTRVT_UINT_PTR" + _VT_name_3 = "VT_FILETIMEVT_BLOBVT_STREAMVT_STORAGEVT_STREAMED_OBJECTVT_STORED_OBJECTVT_BLOB_OBJECTVT_CFVT_CLSID" + _VT_name_4 = "VT_BSTR_BLOBVT_VECTOR" + _VT_name_5 = "VT_ARRAY" + _VT_name_6 = "VT_BYREF" + _VT_name_7 = "VT_RESERVED" + _VT_name_8 = "VT_ILLEGAL" +) + +var ( + _VT_index_0 = [...]uint8{0, 8, 15, 20, 25, 30, 35, 40, 47, 54, 65, 73, 80, 90, 100, 110} + _VT_index_1 = [...]uint8{0, 5, 11, 17, 23, 28, 34, 40, 47, 54, 64, 70, 82, 91, 105, 113, 122} + _VT_index_2 = [...]uint8{0, 9, 19, 30} + _VT_index_3 = [...]uint8{0, 11, 18, 27, 37, 55, 71, 85, 90, 98} + _VT_index_4 = [...]uint8{0, 12, 21} + _VT_index_5 = [...]uint8{0, 8} + _VT_index_6 = [...]uint8{0, 8} + _VT_index_7 = [...]uint8{0, 11} + _VT_index_8 = [...]uint8{0, 10} +) + +func (i VT) String() string { + switch { + case 0 <= i && i <= 14: + return _VT_name_0[_VT_index_0[i]:_VT_index_0[i+1]] + case 16 <= i && i <= 31: + i -= 16 + return _VT_name_1[_VT_index_1[i]:_VT_index_1[i+1]] + case 36 <= i && i <= 38: + i -= 36 + return _VT_name_2[_VT_index_2[i]:_VT_index_2[i+1]] + case 64 <= i && i <= 72: + i -= 64 + return _VT_name_3[_VT_index_3[i]:_VT_index_3[i+1]] + case 4095 <= i && i <= 4096: + i -= 4095 + return _VT_name_4[_VT_index_4[i]:_VT_index_4[i+1]] + case i == 8192: + return _VT_name_5 + case i == 16384: + return _VT_name_6 + case i == 32768: + return _VT_name_7 + case i == 65535: + return _VT_name_8 + default: + return fmt.Sprintf("VT(%d)", i) + } +} diff --git a/vendor/github.com/go-ole/go-ole/winrt.go b/vendor/github.com/go-ole/go-ole/winrt.go new file mode 100644 index 0000000..4e9eca7 --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/winrt.go @@ -0,0 +1,99 @@ +// +build windows + +package ole + +import ( + "reflect" + "syscall" + "unicode/utf8" + "unsafe" +) + +var ( + procRoInitialize = modcombase.NewProc("RoInitialize") + procRoActivateInstance = modcombase.NewProc("RoActivateInstance") + procRoGetActivationFactory = modcombase.NewProc("RoGetActivationFactory") + procWindowsCreateString = modcombase.NewProc("WindowsCreateString") + procWindowsDeleteString = modcombase.NewProc("WindowsDeleteString") + procWindowsGetStringRawBuffer = modcombase.NewProc("WindowsGetStringRawBuffer") +) + +func RoInitialize(thread_type uint32) (err error) { + hr, _, _ := procRoInitialize.Call(uintptr(thread_type)) + if hr != 0 { + err = NewError(hr) + } + return +} + +func RoActivateInstance(clsid string) (ins *IInspectable, err error) { + hClsid, err := NewHString(clsid) + if err != nil { + return nil, err + } + defer DeleteHString(hClsid) + + hr, _, _ := procRoActivateInstance.Call( + uintptr(unsafe.Pointer(hClsid)), + uintptr(unsafe.Pointer(&ins))) + if hr != 0 { + err = NewError(hr) + } + return +} + +func RoGetActivationFactory(clsid string, iid *GUID) (ins *IInspectable, err error) { + hClsid, err := NewHString(clsid) + if err != nil { + return nil, err + } + defer DeleteHString(hClsid) + + hr, _, _ := procRoGetActivationFactory.Call( + uintptr(unsafe.Pointer(hClsid)), + uintptr(unsafe.Pointer(iid)), + uintptr(unsafe.Pointer(&ins))) + if hr != 0 { + err = NewError(hr) + } + return +} + +// HString is handle string for pointers. +type HString uintptr + +// NewHString returns a new HString for Go string. +func NewHString(s string) (hstring HString, err error) { + u16 := syscall.StringToUTF16Ptr(s) + len := uint32(utf8.RuneCountInString(s)) + hr, _, _ := procWindowsCreateString.Call( + uintptr(unsafe.Pointer(u16)), + uintptr(len), + uintptr(unsafe.Pointer(&hstring))) + if hr != 0 { + err = NewError(hr) + } + return +} + +// DeleteHString deletes HString. +func DeleteHString(hstring HString) (err error) { + hr, _, _ := procWindowsDeleteString.Call(uintptr(hstring)) + if hr != 0 { + err = NewError(hr) + } + return +} + +// String returns Go string value of HString. +func (h HString) String() string { + var u16buf uintptr + var u16len uint32 + u16buf, _, _ = procWindowsGetStringRawBuffer.Call( + uintptr(h), + uintptr(unsafe.Pointer(&u16len))) + + u16hdr := reflect.SliceHeader{Data: u16buf, Len: int(u16len), Cap: int(u16len)} + u16 := *(*[]uint16)(unsafe.Pointer(&u16hdr)) + return syscall.UTF16ToString(u16) +} diff --git a/vendor/github.com/go-ole/go-ole/winrt_doc.go b/vendor/github.com/go-ole/go-ole/winrt_doc.go new file mode 100644 index 0000000..52e6d74 --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/winrt_doc.go @@ -0,0 +1,36 @@ +// +build !windows + +package ole + +// RoInitialize +func RoInitialize(thread_type uint32) (err error) { + return NewError(E_NOTIMPL) +} + +// RoActivateInstance +func RoActivateInstance(clsid string) (ins *IInspectable, err error) { + return nil, NewError(E_NOTIMPL) +} + +// RoGetActivationFactory +func RoGetActivationFactory(clsid string, iid *GUID) (ins *IInspectable, err error) { + return nil, NewError(E_NOTIMPL) +} + +// HString is handle string for pointers. +type HString uintptr + +// NewHString returns a new HString for Go string. +func NewHString(s string) (hstring HString, err error) { + return HString(uintptr(0)), NewError(E_NOTIMPL) +} + +// DeleteHString deletes HString. +func DeleteHString(hstring HString) (err error) { + return NewError(E_NOTIMPL) +} + +// String returns Go string value of HString. +func (h HString) String() string { + return "" +} diff --git a/vendor/github.com/go-sql-driver/mysql/AUTHORS b/vendor/github.com/go-sql-driver/mysql/AUTHORS new file mode 100644 index 0000000..146cdff --- /dev/null +++ b/vendor/github.com/go-sql-driver/mysql/AUTHORS @@ -0,0 +1,97 @@ +# This is the official list of Go-MySQL-Driver authors for copyright purposes. + +# If you are submitting a patch, please add your name or the name of the +# organization which holds the copyright to this list in alphabetical order. + +# Names should be added to this file as +# Name +# The email address is not required for organizations. +# Please keep the list sorted. + + +# Individual Persons + +Aaron Hopkins +Achille Roussel +Alexey Palazhchenko +Andrew Reid +Arne Hormann +Asta Xie +Bulat Gaifullin +Carlos Nieto +Chris Moos +Craig Wilson +Daniel Montoya +Daniel Nichter +Daniël van Eeden +Dave Protasowski +DisposaBoy +Egor Smolyakov +Evan Shaw +Frederick Mayle +Gustavo Kristic +Hajime Nakagami +Hanno Braun +Henri Yandell +Hirotaka Yamamoto +ICHINOSE Shogo +Ilia Cimpoes +INADA Naoki +Jacek Szwec +James Harr +Jeff Hodges +Jeffrey Charles +Jerome Meyer +Jian Zhen +Joshua Prunier +Julien Lefevre +Julien Schmidt +Justin Li +Justin Nuß +Kamil Dziedzic +Kevin Malachowski +Kieron Woodhouse +Lennart Rudolph +Leonardo YongUk Kim +Linh Tran Tuan +Lion Yang +Luca Looz +Lucas Liu +Luke Scott +Maciej Zimnoch +Michael Woolnough +Nicola Peduzzi +Olivier Mengué +oscarzhao +Paul Bonser +Peter Schultz +Rebecca Chin +Reed Allman +Richard Wilkes +Robert Russell +Runrioter Wung +Shuode Li +Simon J Mudd +Soroush Pour +Stan Putrya +Stanley Gunawan +Steven Hartland +Thomas Wodarek +Tim Ruffles +Tom Jenkinson +Xiangyu Hu +Xiaobing Jiang +Xiuming Chen +Zhenye Xie + +# Organizations + +Barracuda Networks, Inc. +Counting Ltd. +Google Inc. +InfoSum Ltd. +Keybase Inc. +Percona LLC +Pivotal Inc. +Stripe Inc. +Multiplay Ltd. diff --git a/vendor/github.com/go-sql-driver/mysql/CHANGELOG.md b/vendor/github.com/go-sql-driver/mysql/CHANGELOG.md new file mode 100644 index 0000000..2d87d74 --- /dev/null +++ b/vendor/github.com/go-sql-driver/mysql/CHANGELOG.md @@ -0,0 +1,167 @@ +## Version 1.4 (2018-06-03) + +Changes: + + - Documentation fixes (#530, #535, #567) + - Refactoring (#575, #579, #580, #581, #603, #615, #704) + - Cache column names (#444) + - Sort the DSN parameters in DSNs generated from a config (#637) + - Allow native password authentication by default (#644) + - Use the default port if it is missing in the DSN (#668) + - Removed the `strict` mode (#676) + - Do not query `max_allowed_packet` by default (#680) + - Dropped support Go 1.6 and lower (#696) + - Updated `ConvertValue()` to match the database/sql/driver implementation (#760) + - Document the usage of `0000-00-00T00:00:00` as the time.Time zero value (#783) + - Improved the compatibility of the authentication system (#807) + +New Features: + + - Multi-Results support (#537) + - `rejectReadOnly` DSN option (#604) + - `context.Context` support (#608, #612, #627, #761) + - Transaction isolation level support (#619, #744) + - Read-Only transactions support (#618, #634) + - `NewConfig` function which initializes a config with default values (#679) + - Implemented the `ColumnType` interfaces (#667, #724) + - Support for custom string types in `ConvertValue` (#623) + - Implemented `NamedValueChecker`, improving support for uint64 with high bit set (#690, #709, #710) + - `caching_sha2_password` authentication plugin support (#794, #800, #801, #802) + - Implemented `driver.SessionResetter` (#779) + - `sha256_password` authentication plugin support (#808) + +Bugfixes: + + - Use the DSN hostname as TLS default ServerName if `tls=true` (#564, #718) + - Fixed LOAD LOCAL DATA INFILE for empty files (#590) + - Removed columns definition cache since it sometimes cached invalid data (#592) + - Don't mutate registered TLS configs (#600) + - Make RegisterTLSConfig concurrency-safe (#613) + - Handle missing auth data in the handshake packet correctly (#646) + - Do not retry queries when data was written to avoid data corruption (#302, #736) + - Cache the connection pointer for error handling before invalidating it (#678) + - Fixed imports for appengine/cloudsql (#700) + - Fix sending STMT_LONG_DATA for 0 byte data (#734) + - Set correct capacity for []bytes read from length-encoded strings (#766) + - Make RegisterDial concurrency-safe (#773) + + +## Version 1.3 (2016-12-01) + +Changes: + + - Go 1.1 is no longer supported + - Use decimals fields in MySQL to format time types (#249) + - Buffer optimizations (#269) + - TLS ServerName defaults to the host (#283) + - Refactoring (#400, #410, #437) + - Adjusted documentation for second generation CloudSQL (#485) + - Documented DSN system var quoting rules (#502) + - Made statement.Close() calls idempotent to avoid errors in Go 1.6+ (#512) + +New Features: + + - Enable microsecond resolution on TIME, DATETIME and TIMESTAMP (#249) + - Support for returning table alias on Columns() (#289, #359, #382) + - Placeholder interpolation, can be actived with the DSN parameter `interpolateParams=true` (#309, #318, #490) + - Support for uint64 parameters with high bit set (#332, #345) + - Cleartext authentication plugin support (#327) + - Exported ParseDSN function and the Config struct (#403, #419, #429) + - Read / Write timeouts (#401) + - Support for JSON field type (#414) + - Support for multi-statements and multi-results (#411, #431) + - DSN parameter to set the driver-side max_allowed_packet value manually (#489) + - Native password authentication plugin support (#494, #524) + +Bugfixes: + + - Fixed handling of queries without columns and rows (#255) + - Fixed a panic when SetKeepAlive() failed (#298) + - Handle ERR packets while reading rows (#321) + - Fixed reading NULL length-encoded integers in MySQL 5.6+ (#349) + - Fixed absolute paths support in LOAD LOCAL DATA INFILE (#356) + - Actually zero out bytes in handshake response (#378) + - Fixed race condition in registering LOAD DATA INFILE handler (#383) + - Fixed tests with MySQL 5.7.9+ (#380) + - QueryUnescape TLS config names (#397) + - Fixed "broken pipe" error by writing to closed socket (#390) + - Fixed LOAD LOCAL DATA INFILE buffering (#424) + - Fixed parsing of floats into float64 when placeholders are used (#434) + - Fixed DSN tests with Go 1.7+ (#459) + - Handle ERR packets while waiting for EOF (#473) + - Invalidate connection on error while discarding additional results (#513) + - Allow terminating packets of length 0 (#516) + + +## Version 1.2 (2014-06-03) + +Changes: + + - We switched back to a "rolling release". `go get` installs the current master branch again + - Version v1 of the driver will not be maintained anymore. Go 1.0 is no longer supported by this driver + - Exported errors to allow easy checking from application code + - Enabled TCP Keepalives on TCP connections + - Optimized INFILE handling (better buffer size calculation, lazy init, ...) + - The DSN parser also checks for a missing separating slash + - Faster binary date / datetime to string formatting + - Also exported the MySQLWarning type + - mysqlConn.Close returns the first error encountered instead of ignoring all errors + - writePacket() automatically writes the packet size to the header + - readPacket() uses an iterative approach instead of the recursive approach to merge splitted packets + +New Features: + + - `RegisterDial` allows the usage of a custom dial function to establish the network connection + - Setting the connection collation is possible with the `collation` DSN parameter. This parameter should be preferred over the `charset` parameter + - Logging of critical errors is configurable with `SetLogger` + - Google CloudSQL support + +Bugfixes: + + - Allow more than 32 parameters in prepared statements + - Various old_password fixes + - Fixed TestConcurrent test to pass Go's race detection + - Fixed appendLengthEncodedInteger for large numbers + - Renamed readLengthEnodedString to readLengthEncodedString and skipLengthEnodedString to skipLengthEncodedString (fixed typo) + + +## Version 1.1 (2013-11-02) + +Changes: + + - Go-MySQL-Driver now requires Go 1.1 + - Connections now use the collation `utf8_general_ci` by default. Adding `&charset=UTF8` to the DSN should not be necessary anymore + - Made closing rows and connections error tolerant. This allows for example deferring rows.Close() without checking for errors + - `[]byte(nil)` is now treated as a NULL value. Before, it was treated like an empty string / `[]byte("")` + - DSN parameter values must now be url.QueryEscape'ed. This allows text values to contain special characters, such as '&'. + - Use the IO buffer also for writing. This results in zero allocations (by the driver) for most queries + - Optimized the buffer for reading + - stmt.Query now caches column metadata + - New Logo + - Changed the copyright header to include all contributors + - Improved the LOAD INFILE documentation + - The driver struct is now exported to make the driver directly accessible + - Refactored the driver tests + - Added more benchmarks and moved all to a separate file + - Other small refactoring + +New Features: + + - Added *old_passwords* support: Required in some cases, but must be enabled by adding `allowOldPasswords=true` to the DSN since it is insecure + - Added a `clientFoundRows` parameter: Return the number of matching rows instead of the number of rows changed on UPDATEs + - Added TLS/SSL support: Use a TLS/SSL encrypted connection to the server. Custom TLS configs can be registered and used + +Bugfixes: + + - Fixed MySQL 4.1 support: MySQL 4.1 sends packets with lengths which differ from the specification + - Convert to DB timezone when inserting `time.Time` + - Splitted packets (more than 16MB) are now merged correctly + - Fixed false positive `io.EOF` errors when the data was fully read + - Avoid panics on reuse of closed connections + - Fixed empty string producing false nil values + - Fixed sign byte for positive TIME fields + + +## Version 1.0 (2013-05-14) + +Initial Release diff --git a/vendor/github.com/go-sql-driver/mysql/CONTRIBUTING.md b/vendor/github.com/go-sql-driver/mysql/CONTRIBUTING.md new file mode 100644 index 0000000..8fe16bc --- /dev/null +++ b/vendor/github.com/go-sql-driver/mysql/CONTRIBUTING.md @@ -0,0 +1,23 @@ +# Contributing Guidelines + +## Reporting Issues + +Before creating a new Issue, please check first if a similar Issue [already exists](https://github.com/go-sql-driver/mysql/issues?state=open) or was [recently closed](https://github.com/go-sql-driver/mysql/issues?direction=desc&page=1&sort=updated&state=closed). + +## Contributing Code + +By contributing to this project, you share your code under the Mozilla Public License 2, as specified in the LICENSE file. +Don't forget to add yourself to the AUTHORS file. + +### Code Review + +Everyone is invited to review and comment on pull requests. +If it looks fine to you, comment with "LGTM" (Looks good to me). + +If changes are required, notice the reviewers with "PTAL" (Please take another look) after committing the fixes. + +Before merging the Pull Request, at least one [team member](https://github.com/go-sql-driver?tab=members) must have commented with "LGTM". + +## Development Ideas + +If you are looking for ideas for code contributions, please check our [Development Ideas](https://github.com/go-sql-driver/mysql/wiki/Development-Ideas) Wiki page. diff --git a/vendor/github.com/go-sql-driver/mysql/LICENSE b/vendor/github.com/go-sql-driver/mysql/LICENSE new file mode 100644 index 0000000..14e2f77 --- /dev/null +++ b/vendor/github.com/go-sql-driver/mysql/LICENSE @@ -0,0 +1,373 @@ +Mozilla Public License Version 2.0 +================================== + +1. Definitions +-------------- + +1.1. "Contributor" + means each individual or legal entity that creates, contributes to + the creation of, or owns Covered Software. + +1.2. "Contributor Version" + means the combination of the Contributions of others (if any) used + by a Contributor and that particular Contributor's Contribution. + +1.3. "Contribution" + means Covered Software of a particular Contributor. + +1.4. "Covered Software" + means Source Code Form to which the initial Contributor has attached + the notice in Exhibit A, the Executable Form of such Source Code + Form, and Modifications of such Source Code Form, in each case + including portions thereof. + +1.5. "Incompatible With Secondary Licenses" + means + + (a) that the initial Contributor has attached the notice described + in Exhibit B to the Covered Software; or + + (b) that the Covered Software was made available under the terms of + version 1.1 or earlier of the License, but not also under the + terms of a Secondary License. + +1.6. "Executable Form" + means any form of the work other than Source Code Form. + +1.7. "Larger Work" + means a work that combines Covered Software with other material, in + a separate file or files, that is not Covered Software. + +1.8. "License" + means this document. + +1.9. "Licensable" + means having the right to grant, to the maximum extent possible, + whether at the time of the initial grant or subsequently, any and + all of the rights conveyed by this License. + +1.10. "Modifications" + means any of the following: + + (a) any file in Source Code Form that results from an addition to, + deletion from, or modification of the contents of Covered + Software; or + + (b) any new file in Source Code Form that contains any Covered + Software. + +1.11. "Patent Claims" of a Contributor + means any patent claim(s), including without limitation, method, + process, and apparatus claims, in any patent Licensable by such + Contributor that would be infringed, but for the grant of the + License, by the making, using, selling, offering for sale, having + made, import, or transfer of either its Contributions or its + Contributor Version. + +1.12. "Secondary License" + means either the GNU General Public License, Version 2.0, the GNU + Lesser General Public License, Version 2.1, the GNU Affero General + Public License, Version 3.0, or any later versions of those + licenses. + +1.13. "Source Code Form" + means the form of the work preferred for making modifications. + +1.14. "You" (or "Your") + means an individual or a legal entity exercising rights under this + License. For legal entities, "You" includes any entity that + controls, is controlled by, or is under common control with You. For + purposes of this definition, "control" means (a) the power, direct + or indirect, to cause the direction or management of such entity, + whether by contract or otherwise, or (b) ownership of more than + fifty percent (50%) of the outstanding shares or beneficial + ownership of such entity. + +2. License Grants and Conditions +-------------------------------- + +2.1. Grants + +Each Contributor hereby grants You a world-wide, royalty-free, +non-exclusive license: + +(a) under intellectual property rights (other than patent or trademark) + Licensable by such Contributor to use, reproduce, make available, + modify, display, perform, distribute, and otherwise exploit its + Contributions, either on an unmodified basis, with Modifications, or + as part of a Larger Work; and + +(b) under Patent Claims of such Contributor to make, use, sell, offer + for sale, have made, import, and otherwise transfer either its + Contributions or its Contributor Version. + +2.2. Effective Date + +The licenses granted in Section 2.1 with respect to any Contribution +become effective for each Contribution on the date the Contributor first +distributes such Contribution. + +2.3. Limitations on Grant Scope + +The licenses granted in this Section 2 are the only rights granted under +this License. No additional rights or licenses will be implied from the +distribution or licensing of Covered Software under this License. +Notwithstanding Section 2.1(b) above, no patent license is granted by a +Contributor: + +(a) for any code that a Contributor has removed from Covered Software; + or + +(b) for infringements caused by: (i) Your and any other third party's + modifications of Covered Software, or (ii) the combination of its + Contributions with other software (except as part of its Contributor + Version); or + +(c) under Patent Claims infringed by Covered Software in the absence of + its Contributions. + +This License does not grant any rights in the trademarks, service marks, +or logos of any Contributor (except as may be necessary to comply with +the notice requirements in Section 3.4). + +2.4. Subsequent Licenses + +No Contributor makes additional grants as a result of Your choice to +distribute the Covered Software under a subsequent version of this +License (see Section 10.2) or under the terms of a Secondary License (if +permitted under the terms of Section 3.3). + +2.5. Representation + +Each Contributor represents that the Contributor believes its +Contributions are its original creation(s) or it has sufficient rights +to grant the rights to its Contributions conveyed by this License. + +2.6. Fair Use + +This License is not intended to limit any rights You have under +applicable copyright doctrines of fair use, fair dealing, or other +equivalents. + +2.7. Conditions + +Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted +in Section 2.1. + +3. Responsibilities +------------------- + +3.1. Distribution of Source Form + +All distribution of Covered Software in Source Code Form, including any +Modifications that You create or to which You contribute, must be under +the terms of this License. You must inform recipients that the Source +Code Form of the Covered Software is governed by the terms of this +License, and how they can obtain a copy of this License. You may not +attempt to alter or restrict the recipients' rights in the Source Code +Form. + +3.2. Distribution of Executable Form + +If You distribute Covered Software in Executable Form then: + +(a) such Covered Software must also be made available in Source Code + Form, as described in Section 3.1, and You must inform recipients of + the Executable Form how they can obtain a copy of such Source Code + Form by reasonable means in a timely manner, at a charge no more + than the cost of distribution to the recipient; and + +(b) You may distribute such Executable Form under the terms of this + License, or sublicense it under different terms, provided that the + license for the Executable Form does not attempt to limit or alter + the recipients' rights in the Source Code Form under this License. + +3.3. Distribution of a Larger Work + +You may create and distribute a Larger Work under terms of Your choice, +provided that You also comply with the requirements of this License for +the Covered Software. If the Larger Work is a combination of Covered +Software with a work governed by one or more Secondary Licenses, and the +Covered Software is not Incompatible With Secondary Licenses, this +License permits You to additionally distribute such Covered Software +under the terms of such Secondary License(s), so that the recipient of +the Larger Work may, at their option, further distribute the Covered +Software under the terms of either this License or such Secondary +License(s). + +3.4. Notices + +You may not remove or alter the substance of any license notices +(including copyright notices, patent notices, disclaimers of warranty, +or limitations of liability) contained within the Source Code Form of +the Covered Software, except that You may alter any license notices to +the extent required to remedy known factual inaccuracies. + +3.5. Application of Additional Terms + +You may choose to offer, and to charge a fee for, warranty, support, +indemnity or liability obligations to one or more recipients of Covered +Software. However, You may do so only on Your own behalf, and not on +behalf of any Contributor. You must make it absolutely clear that any +such warranty, support, indemnity, or liability obligation is offered by +You alone, and You hereby agree to indemnify every Contributor for any +liability incurred by such Contributor as a result of warranty, support, +indemnity or liability terms You offer. You may include additional +disclaimers of warranty and limitations of liability specific to any +jurisdiction. + +4. Inability to Comply Due to Statute or Regulation +--------------------------------------------------- + +If it is impossible for You to comply with any of the terms of this +License with respect to some or all of the Covered Software due to +statute, judicial order, or regulation then You must: (a) comply with +the terms of this License to the maximum extent possible; and (b) +describe the limitations and the code they affect. Such description must +be placed in a text file included with all distributions of the Covered +Software under this License. Except to the extent prohibited by statute +or regulation, such description must be sufficiently detailed for a +recipient of ordinary skill to be able to understand it. + +5. Termination +-------------- + +5.1. The rights granted under this License will terminate automatically +if You fail to comply with any of its terms. However, if You become +compliant, then the rights granted under this License from a particular +Contributor are reinstated (a) provisionally, unless and until such +Contributor explicitly and finally terminates Your grants, and (b) on an +ongoing basis, if such Contributor fails to notify You of the +non-compliance by some reasonable means prior to 60 days after You have +come back into compliance. Moreover, Your grants from a particular +Contributor are reinstated on an ongoing basis if such Contributor +notifies You of the non-compliance by some reasonable means, this is the +first time You have received notice of non-compliance with this License +from such Contributor, and You become compliant prior to 30 days after +Your receipt of the notice. + +5.2. If You initiate litigation against any entity by asserting a patent +infringement claim (excluding declaratory judgment actions, +counter-claims, and cross-claims) alleging that a Contributor Version +directly or indirectly infringes any patent, then the rights granted to +You by any and all Contributors for the Covered Software under Section +2.1 of this License shall terminate. + +5.3. In the event of termination under Sections 5.1 or 5.2 above, all +end user license agreements (excluding distributors and resellers) which +have been validly granted by You or Your distributors under this License +prior to termination shall survive termination. + +************************************************************************ +* * +* 6. Disclaimer of Warranty * +* ------------------------- * +* * +* Covered Software is provided under this License on an "as is" * +* basis, without warranty of any kind, either expressed, implied, or * +* statutory, including, without limitation, warranties that the * +* Covered Software is free of defects, merchantable, fit for a * +* particular purpose or non-infringing. The entire risk as to the * +* quality and performance of the Covered Software is with You. * +* Should any Covered Software prove defective in any respect, You * +* (not any Contributor) assume the cost of any necessary servicing, * +* repair, or correction. This disclaimer of warranty constitutes an * +* essential part of this License. No use of any Covered Software is * +* authorized under this License except under this disclaimer. * +* * +************************************************************************ + +************************************************************************ +* * +* 7. Limitation of Liability * +* -------------------------- * +* * +* Under no circumstances and under no legal theory, whether tort * +* (including negligence), contract, or otherwise, shall any * +* Contributor, or anyone who distributes Covered Software as * +* permitted above, be liable to You for any direct, indirect, * +* special, incidental, or consequential damages of any character * +* including, without limitation, damages for lost profits, loss of * +* goodwill, work stoppage, computer failure or malfunction, or any * +* and all other commercial damages or losses, even if such party * +* shall have been informed of the possibility of such damages. This * +* limitation of liability shall not apply to liability for death or * +* personal injury resulting from such party's negligence to the * +* extent applicable law prohibits such limitation. Some * +* jurisdictions do not allow the exclusion or limitation of * +* incidental or consequential damages, so this exclusion and * +* limitation may not apply to You. * +* * +************************************************************************ + +8. Litigation +------------- + +Any litigation relating to this License may be brought only in the +courts of a jurisdiction where the defendant maintains its principal +place of business and such litigation shall be governed by laws of that +jurisdiction, without reference to its conflict-of-law provisions. +Nothing in this Section shall prevent a party's ability to bring +cross-claims or counter-claims. + +9. Miscellaneous +---------------- + +This License represents the complete agreement concerning the subject +matter hereof. If any provision of this License is held to be +unenforceable, such provision shall be reformed only to the extent +necessary to make it enforceable. Any law or regulation which provides +that the language of a contract shall be construed against the drafter +shall not be used to construe this License against a Contributor. + +10. Versions of the License +--------------------------- + +10.1. New Versions + +Mozilla Foundation is the license steward. Except as provided in Section +10.3, no one other than the license steward has the right to modify or +publish new versions of this License. Each version will be given a +distinguishing version number. + +10.2. Effect of New Versions + +You may distribute the Covered Software under the terms of the version +of the License under which You originally received the Covered Software, +or under the terms of any subsequent version published by the license +steward. + +10.3. Modified Versions + +If you create software not governed by this License, and you want to +create a new license for such software, you may create and use a +modified version of this License if you rename the license and remove +any references to the name of the license steward (except to note that +such modified license differs from this License). + +10.4. Distributing Source Code Form that is Incompatible With Secondary +Licenses + +If You choose to distribute Source Code Form that is Incompatible With +Secondary Licenses under the terms of this version of the License, the +notice described in Exhibit B of this License must be attached. + +Exhibit A - Source Code Form License Notice +------------------------------------------- + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. + +If it is not possible or desirable to put the notice in a particular +file, then You may include the notice in a location (such as a LICENSE +file in a relevant directory) where a recipient would be likely to look +for such a notice. + +You may add additional accurate notices of copyright ownership. + +Exhibit B - "Incompatible With Secondary Licenses" Notice +--------------------------------------------------------- + + This Source Code Form is "Incompatible With Secondary Licenses", as + defined by the Mozilla Public License, v. 2.0. diff --git a/vendor/github.com/go-sql-driver/mysql/README.md b/vendor/github.com/go-sql-driver/mysql/README.md new file mode 100644 index 0000000..7b435be --- /dev/null +++ b/vendor/github.com/go-sql-driver/mysql/README.md @@ -0,0 +1,490 @@ +# Go-MySQL-Driver + +A MySQL-Driver for Go's [database/sql](https://golang.org/pkg/database/sql/) package + +![Go-MySQL-Driver logo](https://raw.github.com/wiki/go-sql-driver/mysql/gomysql_m.png "Golang Gopher holding the MySQL Dolphin") + +--------------------------------------- + * [Features](#features) + * [Requirements](#requirements) + * [Installation](#installation) + * [Usage](#usage) + * [DSN (Data Source Name)](#dsn-data-source-name) + * [Password](#password) + * [Protocol](#protocol) + * [Address](#address) + * [Parameters](#parameters) + * [Examples](#examples) + * [Connection pool and timeouts](#connection-pool-and-timeouts) + * [context.Context Support](#contextcontext-support) + * [ColumnType Support](#columntype-support) + * [LOAD DATA LOCAL INFILE support](#load-data-local-infile-support) + * [time.Time support](#timetime-support) + * [Unicode support](#unicode-support) + * [Testing / Development](#testing--development) + * [License](#license) + +--------------------------------------- + +## Features + * Lightweight and [fast](https://github.com/go-sql-driver/sql-benchmark "golang MySQL-Driver performance") + * Native Go implementation. No C-bindings, just pure Go + * Connections over TCP/IPv4, TCP/IPv6, Unix domain sockets or [custom protocols](https://godoc.org/github.com/go-sql-driver/mysql#DialFunc) + * Automatic handling of broken connections + * Automatic Connection Pooling *(by database/sql package)* + * Supports queries larger than 16MB + * Full [`sql.RawBytes`](https://golang.org/pkg/database/sql/#RawBytes) support. + * Intelligent `LONG DATA` handling in prepared statements + * Secure `LOAD DATA LOCAL INFILE` support with file Whitelisting and `io.Reader` support + * Optional `time.Time` parsing + * Optional placeholder interpolation + +## Requirements + * Go 1.9 or higher. We aim to support the 3 latest versions of Go. + * MySQL (4.1+), MariaDB, Percona Server, Google CloudSQL or Sphinx (2.2.3+) + +--------------------------------------- + +## Installation +Simple install the package to your [$GOPATH](https://github.com/golang/go/wiki/GOPATH "GOPATH") with the [go tool](https://golang.org/cmd/go/ "go command") from shell: +```bash +$ go get -u github.com/go-sql-driver/mysql +``` +Make sure [Git is installed](https://git-scm.com/downloads) on your machine and in your system's `PATH`. + +## Usage +_Go MySQL Driver_ is an implementation of Go's `database/sql/driver` interface. You only need to import the driver and can use the full [`database/sql`](https://golang.org/pkg/database/sql/) API then. + +Use `mysql` as `driverName` and a valid [DSN](#dsn-data-source-name) as `dataSourceName`: +```go +import "database/sql" +import _ "github.com/go-sql-driver/mysql" + +db, err := sql.Open("mysql", "user:password@/dbname") +``` + +[Examples are available in our Wiki](https://github.com/go-sql-driver/mysql/wiki/Examples "Go-MySQL-Driver Examples"). + + +### DSN (Data Source Name) + +The Data Source Name has a common format, like e.g. [PEAR DB](http://pear.php.net/manual/en/package.database.db.intro-dsn.php) uses it, but without type-prefix (optional parts marked by squared brackets): +``` +[username[:password]@][protocol[(address)]]/dbname[?param1=value1&...¶mN=valueN] +``` + +A DSN in its fullest form: +``` +username:password@protocol(address)/dbname?param=value +``` + +Except for the databasename, all values are optional. So the minimal DSN is: +``` +/dbname +``` + +If you do not want to preselect a database, leave `dbname` empty: +``` +/ +``` +This has the same effect as an empty DSN string: +``` + +``` + +Alternatively, [Config.FormatDSN](https://godoc.org/github.com/go-sql-driver/mysql#Config.FormatDSN) can be used to create a DSN string by filling a struct. + +#### Password +Passwords can consist of any character. Escaping is **not** necessary. + +#### Protocol +See [net.Dial](https://golang.org/pkg/net/#Dial) for more information which networks are available. +In general you should use an Unix domain socket if available and TCP otherwise for best performance. + +#### Address +For TCP and UDP networks, addresses have the form `host[:port]`. +If `port` is omitted, the default port will be used. +If `host` is a literal IPv6 address, it must be enclosed in square brackets. +The functions [net.JoinHostPort](https://golang.org/pkg/net/#JoinHostPort) and [net.SplitHostPort](https://golang.org/pkg/net/#SplitHostPort) manipulate addresses in this form. + +For Unix domain sockets the address is the absolute path to the MySQL-Server-socket, e.g. `/var/run/mysqld/mysqld.sock` or `/tmp/mysql.sock`. + +#### Parameters +*Parameters are case-sensitive!* + +Notice that any of `true`, `TRUE`, `True` or `1` is accepted to stand for a true boolean value. Not surprisingly, false can be specified as any of: `false`, `FALSE`, `False` or `0`. + +##### `allowAllFiles` + +``` +Type: bool +Valid Values: true, false +Default: false +``` + +`allowAllFiles=true` disables the file Whitelist for `LOAD DATA LOCAL INFILE` and allows *all* files. +[*Might be insecure!*](http://dev.mysql.com/doc/refman/5.7/en/load-data-local.html) + +##### `allowCleartextPasswords` + +``` +Type: bool +Valid Values: true, false +Default: false +``` + +`allowCleartextPasswords=true` allows using the [cleartext client side plugin](http://dev.mysql.com/doc/en/cleartext-authentication-plugin.html) if required by an account, such as one defined with the [PAM authentication plugin](http://dev.mysql.com/doc/en/pam-authentication-plugin.html). Sending passwords in clear text may be a security problem in some configurations. To avoid problems if there is any possibility that the password would be intercepted, clients should connect to MySQL Server using a method that protects the password. Possibilities include [TLS / SSL](#tls), IPsec, or a private network. + +##### `allowNativePasswords` + +``` +Type: bool +Valid Values: true, false +Default: true +``` +`allowNativePasswords=false` disallows the usage of MySQL native password method. + +##### `allowOldPasswords` + +``` +Type: bool +Valid Values: true, false +Default: false +``` +`allowOldPasswords=true` allows the usage of the insecure old password method. This should be avoided, but is necessary in some cases. See also [the old_passwords wiki page](https://github.com/go-sql-driver/mysql/wiki/old_passwords). + +##### `charset` + +``` +Type: string +Valid Values: +Default: none +``` + +Sets the charset used for client-server interaction (`"SET NAMES "`). If multiple charsets are set (separated by a comma), the following charset is used if setting the charset failes. This enables for example support for `utf8mb4` ([introduced in MySQL 5.5.3](http://dev.mysql.com/doc/refman/5.5/en/charset-unicode-utf8mb4.html)) with fallback to `utf8` for older servers (`charset=utf8mb4,utf8`). + +Usage of the `charset` parameter is discouraged because it issues additional queries to the server. +Unless you need the fallback behavior, please use `collation` instead. + +##### `collation` + +``` +Type: string +Valid Values: +Default: utf8_general_ci +``` + +Sets the collation used for client-server interaction on connection. In contrast to `charset`, `collation` does not issue additional queries. If the specified collation is unavailable on the target server, the connection will fail. + +A list of valid charsets for a server is retrievable with `SHOW COLLATION`. + +##### `clientFoundRows` + +``` +Type: bool +Valid Values: true, false +Default: false +``` + +`clientFoundRows=true` causes an UPDATE to return the number of matching rows instead of the number of rows changed. + +##### `columnsWithAlias` + +``` +Type: bool +Valid Values: true, false +Default: false +``` + +When `columnsWithAlias` is true, calls to `sql.Rows.Columns()` will return the table alias and the column name separated by a dot. For example: + +``` +SELECT u.id FROM users as u +``` + +will return `u.id` instead of just `id` if `columnsWithAlias=true`. + +##### `interpolateParams` + +``` +Type: bool +Valid Values: true, false +Default: false +``` + +If `interpolateParams` is true, placeholders (`?`) in calls to `db.Query()` and `db.Exec()` are interpolated into a single query string with given parameters. This reduces the number of roundtrips, since the driver has to prepare a statement, execute it with given parameters and close the statement again with `interpolateParams=false`. + +*This can not be used together with the multibyte encodings BIG5, CP932, GB2312, GBK or SJIS. These are blacklisted as they may [introduce a SQL injection vulnerability](http://stackoverflow.com/a/12118602/3430118)!* + +##### `loc` + +``` +Type: string +Valid Values: +Default: UTC +``` + +Sets the location for time.Time values (when using `parseTime=true`). *"Local"* sets the system's location. See [time.LoadLocation](https://golang.org/pkg/time/#LoadLocation) for details. + +Note that this sets the location for time.Time values but does not change MySQL's [time_zone setting](https://dev.mysql.com/doc/refman/5.5/en/time-zone-support.html). For that see the [time_zone system variable](#system-variables), which can also be set as a DSN parameter. + +Please keep in mind, that param values must be [url.QueryEscape](https://golang.org/pkg/net/url/#QueryEscape)'ed. Alternatively you can manually replace the `/` with `%2F`. For example `US/Pacific` would be `loc=US%2FPacific`. + +##### `maxAllowedPacket` +``` +Type: decimal number +Default: 4194304 +``` + +Max packet size allowed in bytes. The default value is 4 MiB and should be adjusted to match the server settings. `maxAllowedPacket=0` can be used to automatically fetch the `max_allowed_packet` variable from server *on every connection*. + +##### `multiStatements` + +``` +Type: bool +Valid Values: true, false +Default: false +``` + +Allow multiple statements in one query. While this allows batch queries, it also greatly increases the risk of SQL injections. Only the result of the first query is returned, all other results are silently discarded. + +When `multiStatements` is used, `?` parameters must only be used in the first statement. + +##### `parseTime` + +``` +Type: bool +Valid Values: true, false +Default: false +``` + +`parseTime=true` changes the output type of `DATE` and `DATETIME` values to `time.Time` instead of `[]byte` / `string` +The date or datetime like `0000-00-00 00:00:00` is converted into zero value of `time.Time`. + + +##### `readTimeout` + +``` +Type: duration +Default: 0 +``` + +I/O read timeout. The value must be a decimal number with a unit suffix (*"ms"*, *"s"*, *"m"*, *"h"*), such as *"30s"*, *"0.5m"* or *"1m30s"*. + +##### `rejectReadOnly` + +``` +Type: bool +Valid Values: true, false +Default: false +``` + + +`rejectReadOnly=true` causes the driver to reject read-only connections. This +is for a possible race condition during an automatic failover, where the mysql +client gets connected to a read-only replica after the failover. + +Note that this should be a fairly rare case, as an automatic failover normally +happens when the primary is down, and the race condition shouldn't happen +unless it comes back up online as soon as the failover is kicked off. On the +other hand, when this happens, a MySQL application can get stuck on a +read-only connection until restarted. It is however fairly easy to reproduce, +for example, using a manual failover on AWS Aurora's MySQL-compatible cluster. + +If you are not relying on read-only transactions to reject writes that aren't +supposed to happen, setting this on some MySQL providers (such as AWS Aurora) +is safer for failovers. + +Note that ERROR 1290 can be returned for a `read-only` server and this option will +cause a retry for that error. However the same error number is used for some +other cases. You should ensure your application will never cause an ERROR 1290 +except for `read-only` mode when enabling this option. + + +##### `serverPubKey` + +``` +Type: string +Valid Values: +Default: none +``` + +Server public keys can be registered with [`mysql.RegisterServerPubKey`](https://godoc.org/github.com/go-sql-driver/mysql#RegisterServerPubKey), which can then be used by the assigned name in the DSN. +Public keys are used to transmit encrypted data, e.g. for authentication. +If the server's public key is known, it should be set manually to avoid expensive and potentially insecure transmissions of the public key from the server to the client each time it is required. + + +##### `timeout` + +``` +Type: duration +Default: OS default +``` + +Timeout for establishing connections, aka dial timeout. The value must be a decimal number with a unit suffix (*"ms"*, *"s"*, *"m"*, *"h"*), such as *"30s"*, *"0.5m"* or *"1m30s"*. + + +##### `tls` + +``` +Type: bool / string +Valid Values: true, false, skip-verify, preferred, +Default: false +``` + +`tls=true` enables TLS / SSL encrypted connection to the server. Use `skip-verify` if you want to use a self-signed or invalid certificate (server side) or use `preferred` to use TLS only when advertised by the server. This is similar to `skip-verify`, but additionally allows a fallback to a connection which is not encrypted. Neither `skip-verify` nor `preferred` add any reliable security. You can use a custom TLS config after registering it with [`mysql.RegisterTLSConfig`](https://godoc.org/github.com/go-sql-driver/mysql#RegisterTLSConfig). + + +##### `writeTimeout` + +``` +Type: duration +Default: 0 +``` + +I/O write timeout. The value must be a decimal number with a unit suffix (*"ms"*, *"s"*, *"m"*, *"h"*), such as *"30s"*, *"0.5m"* or *"1m30s"*. + + +##### System Variables + +Any other parameters are interpreted as system variables: + * `=`: `SET =` + * `=`: `SET =` + * `=%27%27`: `SET =''` + +Rules: +* The values for string variables must be quoted with `'`. +* The values must also be [url.QueryEscape](http://golang.org/pkg/net/url/#QueryEscape)'ed! + (which implies values of string variables must be wrapped with `%27`). + +Examples: + * `autocommit=1`: `SET autocommit=1` + * [`time_zone=%27Europe%2FParis%27`](https://dev.mysql.com/doc/refman/5.5/en/time-zone-support.html): `SET time_zone='Europe/Paris'` + * [`tx_isolation=%27REPEATABLE-READ%27`](https://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html#sysvar_tx_isolation): `SET tx_isolation='REPEATABLE-READ'` + + +#### Examples +``` +user@unix(/path/to/socket)/dbname +``` + +``` +root:pw@unix(/tmp/mysql.sock)/myDatabase?loc=Local +``` + +``` +user:password@tcp(localhost:5555)/dbname?tls=skip-verify&autocommit=true +``` + +Treat warnings as errors by setting the system variable [`sql_mode`](https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html): +``` +user:password@/dbname?sql_mode=TRADITIONAL +``` + +TCP via IPv6: +``` +user:password@tcp([de:ad:be:ef::ca:fe]:80)/dbname?timeout=90s&collation=utf8mb4_unicode_ci +``` + +TCP on a remote host, e.g. Amazon RDS: +``` +id:password@tcp(your-amazonaws-uri.com:3306)/dbname +``` + +Google Cloud SQL on App Engine (First Generation MySQL Server): +``` +user@cloudsql(project-id:instance-name)/dbname +``` + +Google Cloud SQL on App Engine (Second Generation MySQL Server): +``` +user@cloudsql(project-id:regionname:instance-name)/dbname +``` + +TCP using default port (3306) on localhost: +``` +user:password@tcp/dbname?charset=utf8mb4,utf8&sys_var=esc%40ped +``` + +Use the default protocol (tcp) and host (localhost:3306): +``` +user:password@/dbname +``` + +No Database preselected: +``` +user:password@/ +``` + + +### Connection pool and timeouts +The connection pool is managed by Go's database/sql package. For details on how to configure the size of the pool and how long connections stay in the pool see `*DB.SetMaxOpenConns`, `*DB.SetMaxIdleConns`, and `*DB.SetConnMaxLifetime` in the [database/sql documentation](https://golang.org/pkg/database/sql/). The read, write, and dial timeouts for each individual connection are configured with the DSN parameters [`readTimeout`](#readtimeout), [`writeTimeout`](#writetimeout), and [`timeout`](#timeout), respectively. + +## `ColumnType` Support +This driver supports the [`ColumnType` interface](https://golang.org/pkg/database/sql/#ColumnType) introduced in Go 1.8, with the exception of [`ColumnType.Length()`](https://golang.org/pkg/database/sql/#ColumnType.Length), which is currently not supported. + +## `context.Context` Support +Go 1.8 added `database/sql` support for `context.Context`. This driver supports query timeouts and cancellation via contexts. +See [context support in the database/sql package](https://golang.org/doc/go1.8#database_sql) for more details. + + +### `LOAD DATA LOCAL INFILE` support +For this feature you need direct access to the package. Therefore you must change the import path (no `_`): +```go +import "github.com/go-sql-driver/mysql" +``` + +Files must be whitelisted by registering them with `mysql.RegisterLocalFile(filepath)` (recommended) or the Whitelist check must be deactivated by using the DSN parameter `allowAllFiles=true` ([*Might be insecure!*](http://dev.mysql.com/doc/refman/5.7/en/load-data-local.html)). + +To use a `io.Reader` a handler function must be registered with `mysql.RegisterReaderHandler(name, handler)` which returns a `io.Reader` or `io.ReadCloser`. The Reader is available with the filepath `Reader::` then. Choose different names for different handlers and `DeregisterReaderHandler` when you don't need it anymore. + +See the [godoc of Go-MySQL-Driver](https://godoc.org/github.com/go-sql-driver/mysql "golang mysql driver documentation") for details. + + +### `time.Time` support +The default internal output type of MySQL `DATE` and `DATETIME` values is `[]byte` which allows you to scan the value into a `[]byte`, `string` or `sql.RawBytes` variable in your program. + +However, many want to scan MySQL `DATE` and `DATETIME` values into `time.Time` variables, which is the logical equivalent in Go to `DATE` and `DATETIME` in MySQL. You can do that by changing the internal output type from `[]byte` to `time.Time` with the DSN parameter `parseTime=true`. You can set the default [`time.Time` location](https://golang.org/pkg/time/#Location) with the `loc` DSN parameter. + +**Caution:** As of Go 1.1, this makes `time.Time` the only variable type you can scan `DATE` and `DATETIME` values into. This breaks for example [`sql.RawBytes` support](https://github.com/go-sql-driver/mysql/wiki/Examples#rawbytes). + +Alternatively you can use the [`NullTime`](https://godoc.org/github.com/go-sql-driver/mysql#NullTime) type as the scan destination, which works with both `time.Time` and `string` / `[]byte`. + + +### Unicode support +Since version 1.1 Go-MySQL-Driver automatically uses the collation `utf8_general_ci` by default. + +Other collations / charsets can be set using the [`collation`](#collation) DSN parameter. + +Version 1.0 of the driver recommended adding `&charset=utf8` (alias for `SET NAMES utf8`) to the DSN to enable proper UTF-8 support. This is not necessary anymore. The [`collation`](#collation) parameter should be preferred to set another collation / charset than the default. + +See http://dev.mysql.com/doc/refman/5.7/en/charset-unicode.html for more details on MySQL's Unicode support. + +## Testing / Development +To run the driver tests you may need to adjust the configuration. See the [Testing Wiki-Page](https://github.com/go-sql-driver/mysql/wiki/Testing "Testing") for details. + +Go-MySQL-Driver is not feature-complete yet. Your help is very appreciated. +If you want to contribute, you can work on an [open issue](https://github.com/go-sql-driver/mysql/issues?state=open) or review a [pull request](https://github.com/go-sql-driver/mysql/pulls). + +See the [Contribution Guidelines](https://github.com/go-sql-driver/mysql/blob/master/CONTRIBUTING.md) for details. + +--------------------------------------- + +## License +Go-MySQL-Driver is licensed under the [Mozilla Public License Version 2.0](https://raw.github.com/go-sql-driver/mysql/master/LICENSE) + +Mozilla summarizes the license scope as follows: +> MPL: The copyleft applies to any files containing MPLed code. + + +That means: + * You can **use** the **unchanged** source code both in private and commercially. + * When distributing, you **must publish** the source code of any **changed files** licensed under the MPL 2.0 under a) the MPL 2.0 itself or b) a compatible license (e.g. GPL 3.0 or Apache License 2.0). + * You **needn't publish** the source code of your library as long as the files licensed under the MPL 2.0 are **unchanged**. + +Please read the [MPL 2.0 FAQ](https://www.mozilla.org/en-US/MPL/2.0/FAQ/) if you have further questions regarding the license. + +You can read the full terms here: [LICENSE](https://raw.github.com/go-sql-driver/mysql/master/LICENSE). + +![Go Gopher and MySQL Dolphin](https://raw.github.com/wiki/go-sql-driver/mysql/go-mysql-driver_m.jpg "Golang Gopher transporting the MySQL Dolphin in a wheelbarrow") + diff --git a/vendor/github.com/go-sql-driver/mysql/appengine.go b/vendor/github.com/go-sql-driver/mysql/appengine.go new file mode 100644 index 0000000..be41f2e --- /dev/null +++ b/vendor/github.com/go-sql-driver/mysql/appengine.go @@ -0,0 +1,19 @@ +// Go MySQL Driver - A MySQL-Driver for Go's database/sql package +// +// Copyright 2013 The Go-MySQL-Driver Authors. All rights reserved. +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this file, +// You can obtain one at http://mozilla.org/MPL/2.0/. + +// +build appengine + +package mysql + +import ( + "google.golang.org/appengine/cloudsql" +) + +func init() { + RegisterDial("cloudsql", cloudsql.Dial) +} diff --git a/vendor/github.com/go-sql-driver/mysql/auth.go b/vendor/github.com/go-sql-driver/mysql/auth.go new file mode 100644 index 0000000..fec7040 --- /dev/null +++ b/vendor/github.com/go-sql-driver/mysql/auth.go @@ -0,0 +1,422 @@ +// Go MySQL Driver - A MySQL-Driver for Go's database/sql package +// +// Copyright 2018 The Go-MySQL-Driver Authors. All rights reserved. +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this file, +// You can obtain one at http://mozilla.org/MPL/2.0/. + +package mysql + +import ( + "crypto/rand" + "crypto/rsa" + "crypto/sha1" + "crypto/sha256" + "crypto/x509" + "encoding/pem" + "sync" +) + +// server pub keys registry +var ( + serverPubKeyLock sync.RWMutex + serverPubKeyRegistry map[string]*rsa.PublicKey +) + +// RegisterServerPubKey registers a server RSA public key which can be used to +// send data in a secure manner to the server without receiving the public key +// in a potentially insecure way from the server first. +// Registered keys can afterwards be used adding serverPubKey= to the DSN. +// +// Note: The provided rsa.PublicKey instance is exclusively owned by the driver +// after registering it and may not be modified. +// +// data, err := ioutil.ReadFile("mykey.pem") +// if err != nil { +// log.Fatal(err) +// } +// +// block, _ := pem.Decode(data) +// if block == nil || block.Type != "PUBLIC KEY" { +// log.Fatal("failed to decode PEM block containing public key") +// } +// +// pub, err := x509.ParsePKIXPublicKey(block.Bytes) +// if err != nil { +// log.Fatal(err) +// } +// +// if rsaPubKey, ok := pub.(*rsa.PublicKey); ok { +// mysql.RegisterServerPubKey("mykey", rsaPubKey) +// } else { +// log.Fatal("not a RSA public key") +// } +// +func RegisterServerPubKey(name string, pubKey *rsa.PublicKey) { + serverPubKeyLock.Lock() + if serverPubKeyRegistry == nil { + serverPubKeyRegistry = make(map[string]*rsa.PublicKey) + } + + serverPubKeyRegistry[name] = pubKey + serverPubKeyLock.Unlock() +} + +// DeregisterServerPubKey removes the public key registered with the given name. +func DeregisterServerPubKey(name string) { + serverPubKeyLock.Lock() + if serverPubKeyRegistry != nil { + delete(serverPubKeyRegistry, name) + } + serverPubKeyLock.Unlock() +} + +func getServerPubKey(name string) (pubKey *rsa.PublicKey) { + serverPubKeyLock.RLock() + if v, ok := serverPubKeyRegistry[name]; ok { + pubKey = v + } + serverPubKeyLock.RUnlock() + return +} + +// Hash password using pre 4.1 (old password) method +// https://github.com/atcurtis/mariadb/blob/master/mysys/my_rnd.c +type myRnd struct { + seed1, seed2 uint32 +} + +const myRndMaxVal = 0x3FFFFFFF + +// Pseudo random number generator +func newMyRnd(seed1, seed2 uint32) *myRnd { + return &myRnd{ + seed1: seed1 % myRndMaxVal, + seed2: seed2 % myRndMaxVal, + } +} + +// Tested to be equivalent to MariaDB's floating point variant +// http://play.golang.org/p/QHvhd4qved +// http://play.golang.org/p/RG0q4ElWDx +func (r *myRnd) NextByte() byte { + r.seed1 = (r.seed1*3 + r.seed2) % myRndMaxVal + r.seed2 = (r.seed1 + r.seed2 + 33) % myRndMaxVal + + return byte(uint64(r.seed1) * 31 / myRndMaxVal) +} + +// Generate binary hash from byte string using insecure pre 4.1 method +func pwHash(password []byte) (result [2]uint32) { + var add uint32 = 7 + var tmp uint32 + + result[0] = 1345345333 + result[1] = 0x12345671 + + for _, c := range password { + // skip spaces and tabs in password + if c == ' ' || c == '\t' { + continue + } + + tmp = uint32(c) + result[0] ^= (((result[0] & 63) + add) * tmp) + (result[0] << 8) + result[1] += (result[1] << 8) ^ result[0] + add += tmp + } + + // Remove sign bit (1<<31)-1) + result[0] &= 0x7FFFFFFF + result[1] &= 0x7FFFFFFF + + return +} + +// Hash password using insecure pre 4.1 method +func scrambleOldPassword(scramble []byte, password string) []byte { + if len(password) == 0 { + return nil + } + + scramble = scramble[:8] + + hashPw := pwHash([]byte(password)) + hashSc := pwHash(scramble) + + r := newMyRnd(hashPw[0]^hashSc[0], hashPw[1]^hashSc[1]) + + var out [8]byte + for i := range out { + out[i] = r.NextByte() + 64 + } + + mask := r.NextByte() + for i := range out { + out[i] ^= mask + } + + return out[:] +} + +// Hash password using 4.1+ method (SHA1) +func scramblePassword(scramble []byte, password string) []byte { + if len(password) == 0 { + return nil + } + + // stage1Hash = SHA1(password) + crypt := sha1.New() + crypt.Write([]byte(password)) + stage1 := crypt.Sum(nil) + + // scrambleHash = SHA1(scramble + SHA1(stage1Hash)) + // inner Hash + crypt.Reset() + crypt.Write(stage1) + hash := crypt.Sum(nil) + + // outer Hash + crypt.Reset() + crypt.Write(scramble) + crypt.Write(hash) + scramble = crypt.Sum(nil) + + // token = scrambleHash XOR stage1Hash + for i := range scramble { + scramble[i] ^= stage1[i] + } + return scramble +} + +// Hash password using MySQL 8+ method (SHA256) +func scrambleSHA256Password(scramble []byte, password string) []byte { + if len(password) == 0 { + return nil + } + + // XOR(SHA256(password), SHA256(SHA256(SHA256(password)), scramble)) + + crypt := sha256.New() + crypt.Write([]byte(password)) + message1 := crypt.Sum(nil) + + crypt.Reset() + crypt.Write(message1) + message1Hash := crypt.Sum(nil) + + crypt.Reset() + crypt.Write(message1Hash) + crypt.Write(scramble) + message2 := crypt.Sum(nil) + + for i := range message1 { + message1[i] ^= message2[i] + } + + return message1 +} + +func encryptPassword(password string, seed []byte, pub *rsa.PublicKey) ([]byte, error) { + plain := make([]byte, len(password)+1) + copy(plain, password) + for i := range plain { + j := i % len(seed) + plain[i] ^= seed[j] + } + sha1 := sha1.New() + return rsa.EncryptOAEP(sha1, rand.Reader, pub, plain, nil) +} + +func (mc *mysqlConn) sendEncryptedPassword(seed []byte, pub *rsa.PublicKey) error { + enc, err := encryptPassword(mc.cfg.Passwd, seed, pub) + if err != nil { + return err + } + return mc.writeAuthSwitchPacket(enc) +} + +func (mc *mysqlConn) auth(authData []byte, plugin string) ([]byte, error) { + switch plugin { + case "caching_sha2_password": + authResp := scrambleSHA256Password(authData, mc.cfg.Passwd) + return authResp, nil + + case "mysql_old_password": + if !mc.cfg.AllowOldPasswords { + return nil, ErrOldPassword + } + // Note: there are edge cases where this should work but doesn't; + // this is currently "wontfix": + // https://github.com/go-sql-driver/mysql/issues/184 + authResp := append(scrambleOldPassword(authData[:8], mc.cfg.Passwd), 0) + return authResp, nil + + case "mysql_clear_password": + if !mc.cfg.AllowCleartextPasswords { + return nil, ErrCleartextPassword + } + // http://dev.mysql.com/doc/refman/5.7/en/cleartext-authentication-plugin.html + // http://dev.mysql.com/doc/refman/5.7/en/pam-authentication-plugin.html + return append([]byte(mc.cfg.Passwd), 0), nil + + case "mysql_native_password": + if !mc.cfg.AllowNativePasswords { + return nil, ErrNativePassword + } + // https://dev.mysql.com/doc/internals/en/secure-password-authentication.html + // Native password authentication only need and will need 20-byte challenge. + authResp := scramblePassword(authData[:20], mc.cfg.Passwd) + return authResp, nil + + case "sha256_password": + if len(mc.cfg.Passwd) == 0 { + return []byte{0}, nil + } + if mc.cfg.tls != nil || mc.cfg.Net == "unix" { + // write cleartext auth packet + return append([]byte(mc.cfg.Passwd), 0), nil + } + + pubKey := mc.cfg.pubKey + if pubKey == nil { + // request public key from server + return []byte{1}, nil + } + + // encrypted password + enc, err := encryptPassword(mc.cfg.Passwd, authData, pubKey) + return enc, err + + default: + errLog.Print("unknown auth plugin:", plugin) + return nil, ErrUnknownPlugin + } +} + +func (mc *mysqlConn) handleAuthResult(oldAuthData []byte, plugin string) error { + // Read Result Packet + authData, newPlugin, err := mc.readAuthResult() + if err != nil { + return err + } + + // handle auth plugin switch, if requested + if newPlugin != "" { + // If CLIENT_PLUGIN_AUTH capability is not supported, no new cipher is + // sent and we have to keep using the cipher sent in the init packet. + if authData == nil { + authData = oldAuthData + } else { + // copy data from read buffer to owned slice + copy(oldAuthData, authData) + } + + plugin = newPlugin + + authResp, err := mc.auth(authData, plugin) + if err != nil { + return err + } + if err = mc.writeAuthSwitchPacket(authResp); err != nil { + return err + } + + // Read Result Packet + authData, newPlugin, err = mc.readAuthResult() + if err != nil { + return err + } + + // Do not allow to change the auth plugin more than once + if newPlugin != "" { + return ErrMalformPkt + } + } + + switch plugin { + + // https://insidemysql.com/preparing-your-community-connector-for-mysql-8-part-2-sha256/ + case "caching_sha2_password": + switch len(authData) { + case 0: + return nil // auth successful + case 1: + switch authData[0] { + case cachingSha2PasswordFastAuthSuccess: + if err = mc.readResultOK(); err == nil { + return nil // auth successful + } + + case cachingSha2PasswordPerformFullAuthentication: + if mc.cfg.tls != nil || mc.cfg.Net == "unix" { + // write cleartext auth packet + err = mc.writeAuthSwitchPacket(append([]byte(mc.cfg.Passwd), 0)) + if err != nil { + return err + } + } else { + pubKey := mc.cfg.pubKey + if pubKey == nil { + // request public key from server + data, err := mc.buf.takeSmallBuffer(4 + 1) + if err != nil { + return err + } + data[4] = cachingSha2PasswordRequestPublicKey + mc.writePacket(data) + + // parse public key + if data, err = mc.readPacket(); err != nil { + return err + } + + block, _ := pem.Decode(data[1:]) + pkix, err := x509.ParsePKIXPublicKey(block.Bytes) + if err != nil { + return err + } + pubKey = pkix.(*rsa.PublicKey) + } + + // send encrypted password + err = mc.sendEncryptedPassword(oldAuthData, pubKey) + if err != nil { + return err + } + } + return mc.readResultOK() + + default: + return ErrMalformPkt + } + default: + return ErrMalformPkt + } + + case "sha256_password": + switch len(authData) { + case 0: + return nil // auth successful + default: + block, _ := pem.Decode(authData) + pub, err := x509.ParsePKIXPublicKey(block.Bytes) + if err != nil { + return err + } + + // send encrypted password + err = mc.sendEncryptedPassword(oldAuthData, pub.(*rsa.PublicKey)) + if err != nil { + return err + } + return mc.readResultOK() + } + + default: + return nil // auth successful + } + + return err +} diff --git a/vendor/github.com/go-sql-driver/mysql/buffer.go b/vendor/github.com/go-sql-driver/mysql/buffer.go new file mode 100644 index 0000000..19486bd --- /dev/null +++ b/vendor/github.com/go-sql-driver/mysql/buffer.go @@ -0,0 +1,160 @@ +// Go MySQL Driver - A MySQL-Driver for Go's database/sql package +// +// Copyright 2013 The Go-MySQL-Driver Authors. All rights reserved. +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this file, +// You can obtain one at http://mozilla.org/MPL/2.0/. + +package mysql + +import ( + "io" + "net" + "time" +) + +const defaultBufSize = 4096 + +// A buffer which is used for both reading and writing. +// This is possible since communication on each connection is synchronous. +// In other words, we can't write and read simultaneously on the same connection. +// The buffer is similar to bufio.Reader / Writer but zero-copy-ish +// Also highly optimized for this particular use case. +type buffer struct { + buf []byte // buf is a byte buffer who's length and capacity are equal. + nc net.Conn + idx int + length int + timeout time.Duration +} + +// newBuffer allocates and returns a new buffer. +func newBuffer(nc net.Conn) buffer { + return buffer{ + buf: make([]byte, defaultBufSize), + nc: nc, + } +} + +// fill reads into the buffer until at least _need_ bytes are in it +func (b *buffer) fill(need int) error { + n := b.length + + // move existing data to the beginning + if n > 0 && b.idx > 0 { + copy(b.buf[0:n], b.buf[b.idx:]) + } + + // grow buffer if necessary + // TODO: let the buffer shrink again at some point + // Maybe keep the org buf slice and swap back? + if need > len(b.buf) { + // Round up to the next multiple of the default size + newBuf := make([]byte, ((need/defaultBufSize)+1)*defaultBufSize) + copy(newBuf, b.buf) + b.buf = newBuf + } + + b.idx = 0 + + for { + if b.timeout > 0 { + if err := b.nc.SetReadDeadline(time.Now().Add(b.timeout)); err != nil { + return err + } + } + + nn, err := b.nc.Read(b.buf[n:]) + n += nn + + switch err { + case nil: + if n < need { + continue + } + b.length = n + return nil + + case io.EOF: + if n >= need { + b.length = n + return nil + } + return io.ErrUnexpectedEOF + + default: + return err + } + } +} + +// returns next N bytes from buffer. +// The returned slice is only guaranteed to be valid until the next read +func (b *buffer) readNext(need int) ([]byte, error) { + if b.length < need { + // refill + if err := b.fill(need); err != nil { + return nil, err + } + } + + offset := b.idx + b.idx += need + b.length -= need + return b.buf[offset:b.idx], nil +} + +// takeBuffer returns a buffer with the requested size. +// If possible, a slice from the existing buffer is returned. +// Otherwise a bigger buffer is made. +// Only one buffer (total) can be used at a time. +func (b *buffer) takeBuffer(length int) ([]byte, error) { + if b.length > 0 { + return nil, ErrBusyBuffer + } + + // test (cheap) general case first + if length <= cap(b.buf) { + return b.buf[:length], nil + } + + if length < maxPacketSize { + b.buf = make([]byte, length) + return b.buf, nil + } + + // buffer is larger than we want to store. + return make([]byte, length), nil +} + +// takeSmallBuffer is shortcut which can be used if length is +// known to be smaller than defaultBufSize. +// Only one buffer (total) can be used at a time. +func (b *buffer) takeSmallBuffer(length int) ([]byte, error) { + if b.length > 0 { + return nil, ErrBusyBuffer + } + return b.buf[:length], nil +} + +// takeCompleteBuffer returns the complete existing buffer. +// This can be used if the necessary buffer size is unknown. +// cap and len of the returned buffer will be equal. +// Only one buffer (total) can be used at a time. +func (b *buffer) takeCompleteBuffer() ([]byte, error) { + if b.length > 0 { + return nil, ErrBusyBuffer + } + return b.buf, nil +} + +// store stores buf, an updated buffer, if its suitable to do so. +func (b *buffer) store(buf []byte) error { + if b.length > 0 { + return ErrBusyBuffer + } else if cap(buf) <= maxPacketSize && cap(buf) > cap(b.buf) { + b.buf = buf[:cap(buf)] + } + return nil +} diff --git a/vendor/github.com/go-sql-driver/mysql/collations.go b/vendor/github.com/go-sql-driver/mysql/collations.go new file mode 100644 index 0000000..136c9e4 --- /dev/null +++ b/vendor/github.com/go-sql-driver/mysql/collations.go @@ -0,0 +1,251 @@ +// Go MySQL Driver - A MySQL-Driver for Go's database/sql package +// +// Copyright 2014 The Go-MySQL-Driver Authors. All rights reserved. +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this file, +// You can obtain one at http://mozilla.org/MPL/2.0/. + +package mysql + +const defaultCollation = "utf8_general_ci" +const binaryCollation = "binary" + +// A list of available collations mapped to the internal ID. +// To update this map use the following MySQL query: +// SELECT COLLATION_NAME, ID FROM information_schema.COLLATIONS +var collations = map[string]byte{ + "big5_chinese_ci": 1, + "latin2_czech_cs": 2, + "dec8_swedish_ci": 3, + "cp850_general_ci": 4, + "latin1_german1_ci": 5, + "hp8_english_ci": 6, + "koi8r_general_ci": 7, + "latin1_swedish_ci": 8, + "latin2_general_ci": 9, + "swe7_swedish_ci": 10, + "ascii_general_ci": 11, + "ujis_japanese_ci": 12, + "sjis_japanese_ci": 13, + "cp1251_bulgarian_ci": 14, + "latin1_danish_ci": 15, + "hebrew_general_ci": 16, + "tis620_thai_ci": 18, + "euckr_korean_ci": 19, + "latin7_estonian_cs": 20, + "latin2_hungarian_ci": 21, + "koi8u_general_ci": 22, + "cp1251_ukrainian_ci": 23, + "gb2312_chinese_ci": 24, + "greek_general_ci": 25, + "cp1250_general_ci": 26, + "latin2_croatian_ci": 27, + "gbk_chinese_ci": 28, + "cp1257_lithuanian_ci": 29, + "latin5_turkish_ci": 30, + "latin1_german2_ci": 31, + "armscii8_general_ci": 32, + "utf8_general_ci": 33, + "cp1250_czech_cs": 34, + "ucs2_general_ci": 35, + "cp866_general_ci": 36, + "keybcs2_general_ci": 37, + "macce_general_ci": 38, + "macroman_general_ci": 39, + "cp852_general_ci": 40, + "latin7_general_ci": 41, + "latin7_general_cs": 42, + "macce_bin": 43, + "cp1250_croatian_ci": 44, + "utf8mb4_general_ci": 45, + "utf8mb4_bin": 46, + "latin1_bin": 47, + "latin1_general_ci": 48, + "latin1_general_cs": 49, + "cp1251_bin": 50, + "cp1251_general_ci": 51, + "cp1251_general_cs": 52, + "macroman_bin": 53, + "utf16_general_ci": 54, + "utf16_bin": 55, + "utf16le_general_ci": 56, + "cp1256_general_ci": 57, + "cp1257_bin": 58, + "cp1257_general_ci": 59, + "utf32_general_ci": 60, + "utf32_bin": 61, + "utf16le_bin": 62, + "binary": 63, + "armscii8_bin": 64, + "ascii_bin": 65, + "cp1250_bin": 66, + "cp1256_bin": 67, + "cp866_bin": 68, + "dec8_bin": 69, + "greek_bin": 70, + "hebrew_bin": 71, + "hp8_bin": 72, + "keybcs2_bin": 73, + "koi8r_bin": 74, + "koi8u_bin": 75, + "latin2_bin": 77, + "latin5_bin": 78, + "latin7_bin": 79, + "cp850_bin": 80, + "cp852_bin": 81, + "swe7_bin": 82, + "utf8_bin": 83, + "big5_bin": 84, + "euckr_bin": 85, + "gb2312_bin": 86, + "gbk_bin": 87, + "sjis_bin": 88, + "tis620_bin": 89, + "ucs2_bin": 90, + "ujis_bin": 91, + "geostd8_general_ci": 92, + "geostd8_bin": 93, + "latin1_spanish_ci": 94, + "cp932_japanese_ci": 95, + "cp932_bin": 96, + "eucjpms_japanese_ci": 97, + "eucjpms_bin": 98, + "cp1250_polish_ci": 99, + "utf16_unicode_ci": 101, + "utf16_icelandic_ci": 102, + "utf16_latvian_ci": 103, + "utf16_romanian_ci": 104, + "utf16_slovenian_ci": 105, + "utf16_polish_ci": 106, + "utf16_estonian_ci": 107, + "utf16_spanish_ci": 108, + "utf16_swedish_ci": 109, + "utf16_turkish_ci": 110, + "utf16_czech_ci": 111, + "utf16_danish_ci": 112, + "utf16_lithuanian_ci": 113, + "utf16_slovak_ci": 114, + "utf16_spanish2_ci": 115, + "utf16_roman_ci": 116, + "utf16_persian_ci": 117, + "utf16_esperanto_ci": 118, + "utf16_hungarian_ci": 119, + "utf16_sinhala_ci": 120, + "utf16_german2_ci": 121, + "utf16_croatian_ci": 122, + "utf16_unicode_520_ci": 123, + "utf16_vietnamese_ci": 124, + "ucs2_unicode_ci": 128, + "ucs2_icelandic_ci": 129, + "ucs2_latvian_ci": 130, + "ucs2_romanian_ci": 131, + "ucs2_slovenian_ci": 132, + "ucs2_polish_ci": 133, + "ucs2_estonian_ci": 134, + "ucs2_spanish_ci": 135, + "ucs2_swedish_ci": 136, + "ucs2_turkish_ci": 137, + "ucs2_czech_ci": 138, + "ucs2_danish_ci": 139, + "ucs2_lithuanian_ci": 140, + "ucs2_slovak_ci": 141, + "ucs2_spanish2_ci": 142, + "ucs2_roman_ci": 143, + "ucs2_persian_ci": 144, + "ucs2_esperanto_ci": 145, + "ucs2_hungarian_ci": 146, + "ucs2_sinhala_ci": 147, + "ucs2_german2_ci": 148, + "ucs2_croatian_ci": 149, + "ucs2_unicode_520_ci": 150, + "ucs2_vietnamese_ci": 151, + "ucs2_general_mysql500_ci": 159, + "utf32_unicode_ci": 160, + "utf32_icelandic_ci": 161, + "utf32_latvian_ci": 162, + "utf32_romanian_ci": 163, + "utf32_slovenian_ci": 164, + "utf32_polish_ci": 165, + "utf32_estonian_ci": 166, + "utf32_spanish_ci": 167, + "utf32_swedish_ci": 168, + "utf32_turkish_ci": 169, + "utf32_czech_ci": 170, + "utf32_danish_ci": 171, + "utf32_lithuanian_ci": 172, + "utf32_slovak_ci": 173, + "utf32_spanish2_ci": 174, + "utf32_roman_ci": 175, + "utf32_persian_ci": 176, + "utf32_esperanto_ci": 177, + "utf32_hungarian_ci": 178, + "utf32_sinhala_ci": 179, + "utf32_german2_ci": 180, + "utf32_croatian_ci": 181, + "utf32_unicode_520_ci": 182, + "utf32_vietnamese_ci": 183, + "utf8_unicode_ci": 192, + "utf8_icelandic_ci": 193, + "utf8_latvian_ci": 194, + "utf8_romanian_ci": 195, + "utf8_slovenian_ci": 196, + "utf8_polish_ci": 197, + "utf8_estonian_ci": 198, + "utf8_spanish_ci": 199, + "utf8_swedish_ci": 200, + "utf8_turkish_ci": 201, + "utf8_czech_ci": 202, + "utf8_danish_ci": 203, + "utf8_lithuanian_ci": 204, + "utf8_slovak_ci": 205, + "utf8_spanish2_ci": 206, + "utf8_roman_ci": 207, + "utf8_persian_ci": 208, + "utf8_esperanto_ci": 209, + "utf8_hungarian_ci": 210, + "utf8_sinhala_ci": 211, + "utf8_german2_ci": 212, + "utf8_croatian_ci": 213, + "utf8_unicode_520_ci": 214, + "utf8_vietnamese_ci": 215, + "utf8_general_mysql500_ci": 223, + "utf8mb4_unicode_ci": 224, + "utf8mb4_icelandic_ci": 225, + "utf8mb4_latvian_ci": 226, + "utf8mb4_romanian_ci": 227, + "utf8mb4_slovenian_ci": 228, + "utf8mb4_polish_ci": 229, + "utf8mb4_estonian_ci": 230, + "utf8mb4_spanish_ci": 231, + "utf8mb4_swedish_ci": 232, + "utf8mb4_turkish_ci": 233, + "utf8mb4_czech_ci": 234, + "utf8mb4_danish_ci": 235, + "utf8mb4_lithuanian_ci": 236, + "utf8mb4_slovak_ci": 237, + "utf8mb4_spanish2_ci": 238, + "utf8mb4_roman_ci": 239, + "utf8mb4_persian_ci": 240, + "utf8mb4_esperanto_ci": 241, + "utf8mb4_hungarian_ci": 242, + "utf8mb4_sinhala_ci": 243, + "utf8mb4_german2_ci": 244, + "utf8mb4_croatian_ci": 245, + "utf8mb4_unicode_520_ci": 246, + "utf8mb4_vietnamese_ci": 247, +} + +// A blacklist of collations which is unsafe to interpolate parameters. +// These multibyte encodings may contains 0x5c (`\`) in their trailing bytes. +var unsafeCollations = map[string]bool{ + "big5_chinese_ci": true, + "sjis_japanese_ci": true, + "gbk_chinese_ci": true, + "big5_bin": true, + "gb2312_bin": true, + "gbk_bin": true, + "sjis_bin": true, + "cp932_japanese_ci": true, + "cp932_bin": true, +} diff --git a/vendor/github.com/go-sql-driver/mysql/connection.go b/vendor/github.com/go-sql-driver/mysql/connection.go new file mode 100644 index 0000000..fc4ec75 --- /dev/null +++ b/vendor/github.com/go-sql-driver/mysql/connection.go @@ -0,0 +1,643 @@ +// Go MySQL Driver - A MySQL-Driver for Go's database/sql package +// +// Copyright 2012 The Go-MySQL-Driver Authors. All rights reserved. +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this file, +// You can obtain one at http://mozilla.org/MPL/2.0/. + +package mysql + +import ( + "context" + "database/sql" + "database/sql/driver" + "io" + "net" + "strconv" + "strings" + "time" +) + +type mysqlConn struct { + buf buffer + netConn net.Conn + affectedRows uint64 + insertId uint64 + cfg *Config + maxAllowedPacket int + maxWriteSize int + writeTimeout time.Duration + flags clientFlag + status statusFlag + sequence uint8 + parseTime bool + + // for context support (Go 1.8+) + watching bool + watcher chan<- context.Context + closech chan struct{} + finished chan<- struct{} + canceled atomicError // set non-nil if conn is canceled + closed atomicBool // set when conn is closed, before closech is closed +} + +// Handles parameters set in DSN after the connection is established +func (mc *mysqlConn) handleParams() (err error) { + for param, val := range mc.cfg.Params { + switch param { + // Charset + case "charset": + charsets := strings.Split(val, ",") + for i := range charsets { + // ignore errors here - a charset may not exist + err = mc.exec("SET NAMES " + charsets[i]) + if err == nil { + break + } + } + if err != nil { + return + } + + // System Vars + default: + err = mc.exec("SET " + param + "=" + val + "") + if err != nil { + return + } + } + } + + return +} + +func (mc *mysqlConn) markBadConn(err error) error { + if mc == nil { + return err + } + if err != errBadConnNoWrite { + return err + } + return driver.ErrBadConn +} + +func (mc *mysqlConn) Begin() (driver.Tx, error) { + return mc.begin(false) +} + +func (mc *mysqlConn) begin(readOnly bool) (driver.Tx, error) { + if mc.closed.IsSet() { + errLog.Print(ErrInvalidConn) + return nil, driver.ErrBadConn + } + var q string + if readOnly { + q = "START TRANSACTION READ ONLY" + } else { + q = "START TRANSACTION" + } + err := mc.exec(q) + if err == nil { + return &mysqlTx{mc}, err + } + return nil, mc.markBadConn(err) +} + +func (mc *mysqlConn) Close() (err error) { + // Makes Close idempotent + if !mc.closed.IsSet() { + err = mc.writeCommandPacket(comQuit) + } + + mc.cleanup() + + return +} + +// Closes the network connection and unsets internal variables. Do not call this +// function after successfully authentication, call Close instead. This function +// is called before auth or on auth failure because MySQL will have already +// closed the network connection. +func (mc *mysqlConn) cleanup() { + if !mc.closed.TrySet(true) { + return + } + + // Makes cleanup idempotent + close(mc.closech) + if mc.netConn == nil { + return + } + if err := mc.netConn.Close(); err != nil { + errLog.Print(err) + } +} + +func (mc *mysqlConn) error() error { + if mc.closed.IsSet() { + if err := mc.canceled.Value(); err != nil { + return err + } + return ErrInvalidConn + } + return nil +} + +func (mc *mysqlConn) Prepare(query string) (driver.Stmt, error) { + if mc.closed.IsSet() { + errLog.Print(ErrInvalidConn) + return nil, driver.ErrBadConn + } + // Send command + err := mc.writeCommandPacketStr(comStmtPrepare, query) + if err != nil { + return nil, mc.markBadConn(err) + } + + stmt := &mysqlStmt{ + mc: mc, + } + + // Read Result + columnCount, err := stmt.readPrepareResultPacket() + if err == nil { + if stmt.paramCount > 0 { + if err = mc.readUntilEOF(); err != nil { + return nil, err + } + } + + if columnCount > 0 { + err = mc.readUntilEOF() + } + } + + return stmt, err +} + +func (mc *mysqlConn) interpolateParams(query string, args []driver.Value) (string, error) { + // Number of ? should be same to len(args) + if strings.Count(query, "?") != len(args) { + return "", driver.ErrSkip + } + + buf, err := mc.buf.takeCompleteBuffer() + if err != nil { + // can not take the buffer. Something must be wrong with the connection + errLog.Print(err) + return "", ErrInvalidConn + } + buf = buf[:0] + argPos := 0 + + for i := 0; i < len(query); i++ { + q := strings.IndexByte(query[i:], '?') + if q == -1 { + buf = append(buf, query[i:]...) + break + } + buf = append(buf, query[i:i+q]...) + i += q + + arg := args[argPos] + argPos++ + + if arg == nil { + buf = append(buf, "NULL"...) + continue + } + + switch v := arg.(type) { + case int64: + buf = strconv.AppendInt(buf, v, 10) + case float64: + buf = strconv.AppendFloat(buf, v, 'g', -1, 64) + case bool: + if v { + buf = append(buf, '1') + } else { + buf = append(buf, '0') + } + case time.Time: + if v.IsZero() { + buf = append(buf, "'0000-00-00'"...) + } else { + v := v.In(mc.cfg.Loc) + v = v.Add(time.Nanosecond * 500) // To round under microsecond + year := v.Year() + year100 := year / 100 + year1 := year % 100 + month := v.Month() + day := v.Day() + hour := v.Hour() + minute := v.Minute() + second := v.Second() + micro := v.Nanosecond() / 1000 + + buf = append(buf, []byte{ + '\'', + digits10[year100], digits01[year100], + digits10[year1], digits01[year1], + '-', + digits10[month], digits01[month], + '-', + digits10[day], digits01[day], + ' ', + digits10[hour], digits01[hour], + ':', + digits10[minute], digits01[minute], + ':', + digits10[second], digits01[second], + }...) + + if micro != 0 { + micro10000 := micro / 10000 + micro100 := micro / 100 % 100 + micro1 := micro % 100 + buf = append(buf, []byte{ + '.', + digits10[micro10000], digits01[micro10000], + digits10[micro100], digits01[micro100], + digits10[micro1], digits01[micro1], + }...) + } + buf = append(buf, '\'') + } + case []byte: + if v == nil { + buf = append(buf, "NULL"...) + } else { + buf = append(buf, "_binary'"...) + if mc.status&statusNoBackslashEscapes == 0 { + buf = escapeBytesBackslash(buf, v) + } else { + buf = escapeBytesQuotes(buf, v) + } + buf = append(buf, '\'') + } + case string: + buf = append(buf, '\'') + if mc.status&statusNoBackslashEscapes == 0 { + buf = escapeStringBackslash(buf, v) + } else { + buf = escapeStringQuotes(buf, v) + } + buf = append(buf, '\'') + default: + return "", driver.ErrSkip + } + + if len(buf)+4 > mc.maxAllowedPacket { + return "", driver.ErrSkip + } + } + if argPos != len(args) { + return "", driver.ErrSkip + } + return string(buf), nil +} + +func (mc *mysqlConn) Exec(query string, args []driver.Value) (driver.Result, error) { + if mc.closed.IsSet() { + errLog.Print(ErrInvalidConn) + return nil, driver.ErrBadConn + } + if len(args) != 0 { + if !mc.cfg.InterpolateParams { + return nil, driver.ErrSkip + } + // try to interpolate the parameters to save extra roundtrips for preparing and closing a statement + prepared, err := mc.interpolateParams(query, args) + if err != nil { + return nil, err + } + query = prepared + } + mc.affectedRows = 0 + mc.insertId = 0 + + err := mc.exec(query) + if err == nil { + return &mysqlResult{ + affectedRows: int64(mc.affectedRows), + insertId: int64(mc.insertId), + }, err + } + return nil, mc.markBadConn(err) +} + +// Internal function to execute commands +func (mc *mysqlConn) exec(query string) error { + // Send command + if err := mc.writeCommandPacketStr(comQuery, query); err != nil { + return mc.markBadConn(err) + } + + // Read Result + resLen, err := mc.readResultSetHeaderPacket() + if err != nil { + return err + } + + if resLen > 0 { + // columns + if err := mc.readUntilEOF(); err != nil { + return err + } + + // rows + if err := mc.readUntilEOF(); err != nil { + return err + } + } + + return mc.discardResults() +} + +func (mc *mysqlConn) Query(query string, args []driver.Value) (driver.Rows, error) { + return mc.query(query, args) +} + +func (mc *mysqlConn) query(query string, args []driver.Value) (*textRows, error) { + if mc.closed.IsSet() { + errLog.Print(ErrInvalidConn) + return nil, driver.ErrBadConn + } + if len(args) != 0 { + if !mc.cfg.InterpolateParams { + return nil, driver.ErrSkip + } + // try client-side prepare to reduce roundtrip + prepared, err := mc.interpolateParams(query, args) + if err != nil { + return nil, err + } + query = prepared + } + // Send command + err := mc.writeCommandPacketStr(comQuery, query) + if err == nil { + // Read Result + var resLen int + resLen, err = mc.readResultSetHeaderPacket() + if err == nil { + rows := new(textRows) + rows.mc = mc + + if resLen == 0 { + rows.rs.done = true + + switch err := rows.NextResultSet(); err { + case nil, io.EOF: + return rows, nil + default: + return nil, err + } + } + + // Columns + rows.rs.columns, err = mc.readColumns(resLen) + return rows, err + } + } + return nil, mc.markBadConn(err) +} + +// Gets the value of the given MySQL System Variable +// The returned byte slice is only valid until the next read +func (mc *mysqlConn) getSystemVar(name string) ([]byte, error) { + // Send command + if err := mc.writeCommandPacketStr(comQuery, "SELECT @@"+name); err != nil { + return nil, err + } + + // Read Result + resLen, err := mc.readResultSetHeaderPacket() + if err == nil { + rows := new(textRows) + rows.mc = mc + rows.rs.columns = []mysqlField{{fieldType: fieldTypeVarChar}} + + if resLen > 0 { + // Columns + if err := mc.readUntilEOF(); err != nil { + return nil, err + } + } + + dest := make([]driver.Value, resLen) + if err = rows.readRow(dest); err == nil { + return dest[0].([]byte), mc.readUntilEOF() + } + } + return nil, err +} + +// finish is called when the query has canceled. +func (mc *mysqlConn) cancel(err error) { + mc.canceled.Set(err) + mc.cleanup() +} + +// finish is called when the query has succeeded. +func (mc *mysqlConn) finish() { + if !mc.watching || mc.finished == nil { + return + } + select { + case mc.finished <- struct{}{}: + mc.watching = false + case <-mc.closech: + } +} + +// Ping implements driver.Pinger interface +func (mc *mysqlConn) Ping(ctx context.Context) (err error) { + if mc.closed.IsSet() { + errLog.Print(ErrInvalidConn) + return driver.ErrBadConn + } + + if err = mc.watchCancel(ctx); err != nil { + return + } + defer mc.finish() + + if err = mc.writeCommandPacket(comPing); err != nil { + return mc.markBadConn(err) + } + + return mc.readResultOK() +} + +// BeginTx implements driver.ConnBeginTx interface +func (mc *mysqlConn) BeginTx(ctx context.Context, opts driver.TxOptions) (driver.Tx, error) { + if err := mc.watchCancel(ctx); err != nil { + return nil, err + } + defer mc.finish() + + if sql.IsolationLevel(opts.Isolation) != sql.LevelDefault { + level, err := mapIsolationLevel(opts.Isolation) + if err != nil { + return nil, err + } + err = mc.exec("SET TRANSACTION ISOLATION LEVEL " + level) + if err != nil { + return nil, err + } + } + + return mc.begin(opts.ReadOnly) +} + +func (mc *mysqlConn) QueryContext(ctx context.Context, query string, args []driver.NamedValue) (driver.Rows, error) { + dargs, err := namedValueToValue(args) + if err != nil { + return nil, err + } + + if err := mc.watchCancel(ctx); err != nil { + return nil, err + } + + rows, err := mc.query(query, dargs) + if err != nil { + mc.finish() + return nil, err + } + rows.finish = mc.finish + return rows, err +} + +func (mc *mysqlConn) ExecContext(ctx context.Context, query string, args []driver.NamedValue) (driver.Result, error) { + dargs, err := namedValueToValue(args) + if err != nil { + return nil, err + } + + if err := mc.watchCancel(ctx); err != nil { + return nil, err + } + defer mc.finish() + + return mc.Exec(query, dargs) +} + +func (mc *mysqlConn) PrepareContext(ctx context.Context, query string) (driver.Stmt, error) { + if err := mc.watchCancel(ctx); err != nil { + return nil, err + } + + stmt, err := mc.Prepare(query) + mc.finish() + if err != nil { + return nil, err + } + + select { + default: + case <-ctx.Done(): + stmt.Close() + return nil, ctx.Err() + } + return stmt, nil +} + +func (stmt *mysqlStmt) QueryContext(ctx context.Context, args []driver.NamedValue) (driver.Rows, error) { + dargs, err := namedValueToValue(args) + if err != nil { + return nil, err + } + + if err := stmt.mc.watchCancel(ctx); err != nil { + return nil, err + } + + rows, err := stmt.query(dargs) + if err != nil { + stmt.mc.finish() + return nil, err + } + rows.finish = stmt.mc.finish + return rows, err +} + +func (stmt *mysqlStmt) ExecContext(ctx context.Context, args []driver.NamedValue) (driver.Result, error) { + dargs, err := namedValueToValue(args) + if err != nil { + return nil, err + } + + if err := stmt.mc.watchCancel(ctx); err != nil { + return nil, err + } + defer stmt.mc.finish() + + return stmt.Exec(dargs) +} + +func (mc *mysqlConn) watchCancel(ctx context.Context) error { + if mc.watching { + // Reach here if canceled, + // so the connection is already invalid + mc.cleanup() + return nil + } + // When ctx is already cancelled, don't watch it. + if err := ctx.Err(); err != nil { + return err + } + // When ctx is not cancellable, don't watch it. + if ctx.Done() == nil { + return nil + } + // When watcher is not alive, can't watch it. + if mc.watcher == nil { + return nil + } + + mc.watching = true + mc.watcher <- ctx + return nil +} + +func (mc *mysqlConn) startWatcher() { + watcher := make(chan context.Context, 1) + mc.watcher = watcher + finished := make(chan struct{}) + mc.finished = finished + go func() { + for { + var ctx context.Context + select { + case ctx = <-watcher: + case <-mc.closech: + return + } + + select { + case <-ctx.Done(): + mc.cancel(ctx.Err()) + case <-finished: + case <-mc.closech: + return + } + } + }() +} + +func (mc *mysqlConn) CheckNamedValue(nv *driver.NamedValue) (err error) { + nv.Value, err = converter{}.ConvertValue(nv.Value) + return +} + +// ResetSession implements driver.SessionResetter. +// (From Go 1.10) +func (mc *mysqlConn) ResetSession(ctx context.Context) error { + if mc.closed.IsSet() { + return driver.ErrBadConn + } + return nil +} diff --git a/vendor/github.com/go-sql-driver/mysql/const.go b/vendor/github.com/go-sql-driver/mysql/const.go new file mode 100644 index 0000000..b1e6b85 --- /dev/null +++ b/vendor/github.com/go-sql-driver/mysql/const.go @@ -0,0 +1,174 @@ +// Go MySQL Driver - A MySQL-Driver for Go's database/sql package +// +// Copyright 2012 The Go-MySQL-Driver Authors. All rights reserved. +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this file, +// You can obtain one at http://mozilla.org/MPL/2.0/. + +package mysql + +const ( + defaultAuthPlugin = "mysql_native_password" + defaultMaxAllowedPacket = 4 << 20 // 4 MiB + minProtocolVersion = 10 + maxPacketSize = 1<<24 - 1 + timeFormat = "2006-01-02 15:04:05.999999" +) + +// MySQL constants documentation: +// http://dev.mysql.com/doc/internals/en/client-server-protocol.html + +const ( + iOK byte = 0x00 + iAuthMoreData byte = 0x01 + iLocalInFile byte = 0xfb + iEOF byte = 0xfe + iERR byte = 0xff +) + +// https://dev.mysql.com/doc/internals/en/capability-flags.html#packet-Protocol::CapabilityFlags +type clientFlag uint32 + +const ( + clientLongPassword clientFlag = 1 << iota + clientFoundRows + clientLongFlag + clientConnectWithDB + clientNoSchema + clientCompress + clientODBC + clientLocalFiles + clientIgnoreSpace + clientProtocol41 + clientInteractive + clientSSL + clientIgnoreSIGPIPE + clientTransactions + clientReserved + clientSecureConn + clientMultiStatements + clientMultiResults + clientPSMultiResults + clientPluginAuth + clientConnectAttrs + clientPluginAuthLenEncClientData + clientCanHandleExpiredPasswords + clientSessionTrack + clientDeprecateEOF +) + +const ( + comQuit byte = iota + 1 + comInitDB + comQuery + comFieldList + comCreateDB + comDropDB + comRefresh + comShutdown + comStatistics + comProcessInfo + comConnect + comProcessKill + comDebug + comPing + comTime + comDelayedInsert + comChangeUser + comBinlogDump + comTableDump + comConnectOut + comRegisterSlave + comStmtPrepare + comStmtExecute + comStmtSendLongData + comStmtClose + comStmtReset + comSetOption + comStmtFetch +) + +// https://dev.mysql.com/doc/internals/en/com-query-response.html#packet-Protocol::ColumnType +type fieldType byte + +const ( + fieldTypeDecimal fieldType = iota + fieldTypeTiny + fieldTypeShort + fieldTypeLong + fieldTypeFloat + fieldTypeDouble + fieldTypeNULL + fieldTypeTimestamp + fieldTypeLongLong + fieldTypeInt24 + fieldTypeDate + fieldTypeTime + fieldTypeDateTime + fieldTypeYear + fieldTypeNewDate + fieldTypeVarChar + fieldTypeBit +) +const ( + fieldTypeJSON fieldType = iota + 0xf5 + fieldTypeNewDecimal + fieldTypeEnum + fieldTypeSet + fieldTypeTinyBLOB + fieldTypeMediumBLOB + fieldTypeLongBLOB + fieldTypeBLOB + fieldTypeVarString + fieldTypeString + fieldTypeGeometry +) + +type fieldFlag uint16 + +const ( + flagNotNULL fieldFlag = 1 << iota + flagPriKey + flagUniqueKey + flagMultipleKey + flagBLOB + flagUnsigned + flagZeroFill + flagBinary + flagEnum + flagAutoIncrement + flagTimestamp + flagSet + flagUnknown1 + flagUnknown2 + flagUnknown3 + flagUnknown4 +) + +// http://dev.mysql.com/doc/internals/en/status-flags.html +type statusFlag uint16 + +const ( + statusInTrans statusFlag = 1 << iota + statusInAutocommit + statusReserved // Not in documentation + statusMoreResultsExists + statusNoGoodIndexUsed + statusNoIndexUsed + statusCursorExists + statusLastRowSent + statusDbDropped + statusNoBackslashEscapes + statusMetadataChanged + statusQueryWasSlow + statusPsOutParams + statusInTransReadonly + statusSessionStateChanged +) + +const ( + cachingSha2PasswordRequestPublicKey = 2 + cachingSha2PasswordFastAuthSuccess = 3 + cachingSha2PasswordPerformFullAuthentication = 4 +) diff --git a/vendor/github.com/go-sql-driver/mysql/driver.go b/vendor/github.com/go-sql-driver/mysql/driver.go new file mode 100644 index 0000000..9f49670 --- /dev/null +++ b/vendor/github.com/go-sql-driver/mysql/driver.go @@ -0,0 +1,169 @@ +// Copyright 2012 The Go-MySQL-Driver Authors. All rights reserved. +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this file, +// You can obtain one at http://mozilla.org/MPL/2.0/. + +// Package mysql provides a MySQL driver for Go's database/sql package. +// +// The driver should be used via the database/sql package: +// +// import "database/sql" +// import _ "github.com/go-sql-driver/mysql" +// +// db, err := sql.Open("mysql", "user:password@/dbname") +// +// See https://github.com/go-sql-driver/mysql#usage for details +package mysql + +import ( + "database/sql" + "database/sql/driver" + "net" + "sync" +) + +// MySQLDriver is exported to make the driver directly accessible. +// In general the driver is used via the database/sql package. +type MySQLDriver struct{} + +// DialFunc is a function which can be used to establish the network connection. +// Custom dial functions must be registered with RegisterDial +type DialFunc func(addr string) (net.Conn, error) + +var ( + dialsLock sync.RWMutex + dials map[string]DialFunc +) + +// RegisterDial registers a custom dial function. It can then be used by the +// network address mynet(addr), where mynet is the registered new network. +// addr is passed as a parameter to the dial function. +func RegisterDial(net string, dial DialFunc) { + dialsLock.Lock() + defer dialsLock.Unlock() + if dials == nil { + dials = make(map[string]DialFunc) + } + dials[net] = dial +} + +// Open new Connection. +// See https://github.com/go-sql-driver/mysql#dsn-data-source-name for how +// the DSN string is formatted +func (d MySQLDriver) Open(dsn string) (driver.Conn, error) { + var err error + + // New mysqlConn + mc := &mysqlConn{ + maxAllowedPacket: maxPacketSize, + maxWriteSize: maxPacketSize - 1, + closech: make(chan struct{}), + } + mc.cfg, err = ParseDSN(dsn) + if err != nil { + return nil, err + } + mc.parseTime = mc.cfg.ParseTime + + // Connect to Server + dialsLock.RLock() + dial, ok := dials[mc.cfg.Net] + dialsLock.RUnlock() + if ok { + mc.netConn, err = dial(mc.cfg.Addr) + } else { + nd := net.Dialer{Timeout: mc.cfg.Timeout} + mc.netConn, err = nd.Dial(mc.cfg.Net, mc.cfg.Addr) + } + if err != nil { + if nerr, ok := err.(net.Error); ok && nerr.Temporary() { + errLog.Print("net.Error from Dial()': ", nerr.Error()) + return nil, driver.ErrBadConn + } + return nil, err + } + + // Enable TCP Keepalives on TCP connections + if tc, ok := mc.netConn.(*net.TCPConn); ok { + if err := tc.SetKeepAlive(true); err != nil { + // Don't send COM_QUIT before handshake. + mc.netConn.Close() + mc.netConn = nil + return nil, err + } + } + + // Call startWatcher for context support (From Go 1.8) + mc.startWatcher() + + mc.buf = newBuffer(mc.netConn) + + // Set I/O timeouts + mc.buf.timeout = mc.cfg.ReadTimeout + mc.writeTimeout = mc.cfg.WriteTimeout + + // Reading Handshake Initialization Packet + authData, plugin, err := mc.readHandshakePacket() + if err != nil { + mc.cleanup() + return nil, err + } + if plugin == "" { + plugin = defaultAuthPlugin + } + + // Send Client Authentication Packet + authResp, err := mc.auth(authData, plugin) + if err != nil { + // try the default auth plugin, if using the requested plugin failed + errLog.Print("could not use requested auth plugin '"+plugin+"': ", err.Error()) + plugin = defaultAuthPlugin + authResp, err = mc.auth(authData, plugin) + if err != nil { + mc.cleanup() + return nil, err + } + } + if err = mc.writeHandshakeResponsePacket(authResp, plugin); err != nil { + mc.cleanup() + return nil, err + } + + // Handle response to auth packet, switch methods if possible + if err = mc.handleAuthResult(authData, plugin); err != nil { + // Authentication failed and MySQL has already closed the connection + // (https://dev.mysql.com/doc/internals/en/authentication-fails.html). + // Do not send COM_QUIT, just cleanup and return the error. + mc.cleanup() + return nil, err + } + + if mc.cfg.MaxAllowedPacket > 0 { + mc.maxAllowedPacket = mc.cfg.MaxAllowedPacket + } else { + // Get max allowed packet size + maxap, err := mc.getSystemVar("max_allowed_packet") + if err != nil { + mc.Close() + return nil, err + } + mc.maxAllowedPacket = stringToInt(maxap) - 1 + } + if mc.maxAllowedPacket < maxPacketSize { + mc.maxWriteSize = mc.maxAllowedPacket + } + + // Handle DSN Params + err = mc.handleParams() + if err != nil { + mc.Close() + return nil, err + } + + return mc, nil +} + +func init() { + sql.Register("mysql", &MySQLDriver{}) +} diff --git a/vendor/github.com/go-sql-driver/mysql/dsn.go b/vendor/github.com/go-sql-driver/mysql/dsn.go new file mode 100644 index 0000000..b913472 --- /dev/null +++ b/vendor/github.com/go-sql-driver/mysql/dsn.go @@ -0,0 +1,611 @@ +// Go MySQL Driver - A MySQL-Driver for Go's database/sql package +// +// Copyright 2016 The Go-MySQL-Driver Authors. All rights reserved. +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this file, +// You can obtain one at http://mozilla.org/MPL/2.0/. + +package mysql + +import ( + "bytes" + "crypto/rsa" + "crypto/tls" + "errors" + "fmt" + "net" + "net/url" + "sort" + "strconv" + "strings" + "time" +) + +var ( + errInvalidDSNUnescaped = errors.New("invalid DSN: did you forget to escape a param value?") + errInvalidDSNAddr = errors.New("invalid DSN: network address not terminated (missing closing brace)") + errInvalidDSNNoSlash = errors.New("invalid DSN: missing the slash separating the database name") + errInvalidDSNUnsafeCollation = errors.New("invalid DSN: interpolateParams can not be used with unsafe collations") +) + +// Config is a configuration parsed from a DSN string. +// If a new Config is created instead of being parsed from a DSN string, +// the NewConfig function should be used, which sets default values. +type Config struct { + User string // Username + Passwd string // Password (requires User) + Net string // Network type + Addr string // Network address (requires Net) + DBName string // Database name + Params map[string]string // Connection parameters + Collation string // Connection collation + Loc *time.Location // Location for time.Time values + MaxAllowedPacket int // Max packet size allowed + ServerPubKey string // Server public key name + pubKey *rsa.PublicKey // Server public key + TLSConfig string // TLS configuration name + tls *tls.Config // TLS configuration + Timeout time.Duration // Dial timeout + ReadTimeout time.Duration // I/O read timeout + WriteTimeout time.Duration // I/O write timeout + + AllowAllFiles bool // Allow all files to be used with LOAD DATA LOCAL INFILE + AllowCleartextPasswords bool // Allows the cleartext client side plugin + AllowNativePasswords bool // Allows the native password authentication method + AllowOldPasswords bool // Allows the old insecure password method + ClientFoundRows bool // Return number of matching rows instead of rows changed + ColumnsWithAlias bool // Prepend table alias to column names + InterpolateParams bool // Interpolate placeholders into query string + MultiStatements bool // Allow multiple statements in one query + ParseTime bool // Parse time values to time.Time + RejectReadOnly bool // Reject read-only connections +} + +// NewConfig creates a new Config and sets default values. +func NewConfig() *Config { + return &Config{ + Collation: defaultCollation, + Loc: time.UTC, + MaxAllowedPacket: defaultMaxAllowedPacket, + AllowNativePasswords: true, + } +} + +func (cfg *Config) normalize() error { + if cfg.InterpolateParams && unsafeCollations[cfg.Collation] { + return errInvalidDSNUnsafeCollation + } + + // Set default network if empty + if cfg.Net == "" { + cfg.Net = "tcp" + } + + // Set default address if empty + if cfg.Addr == "" { + switch cfg.Net { + case "tcp": + cfg.Addr = "127.0.0.1:3306" + case "unix": + cfg.Addr = "/tmp/mysql.sock" + default: + return errors.New("default addr for network '" + cfg.Net + "' unknown") + } + + } else if cfg.Net == "tcp" { + cfg.Addr = ensureHavePort(cfg.Addr) + } + + if cfg.tls != nil { + if cfg.tls.ServerName == "" && !cfg.tls.InsecureSkipVerify { + host, _, err := net.SplitHostPort(cfg.Addr) + if err == nil { + cfg.tls.ServerName = host + } + } + } + + return nil +} + +// FormatDSN formats the given Config into a DSN string which can be passed to +// the driver. +func (cfg *Config) FormatDSN() string { + var buf bytes.Buffer + + // [username[:password]@] + if len(cfg.User) > 0 { + buf.WriteString(cfg.User) + if len(cfg.Passwd) > 0 { + buf.WriteByte(':') + buf.WriteString(cfg.Passwd) + } + buf.WriteByte('@') + } + + // [protocol[(address)]] + if len(cfg.Net) > 0 { + buf.WriteString(cfg.Net) + if len(cfg.Addr) > 0 { + buf.WriteByte('(') + buf.WriteString(cfg.Addr) + buf.WriteByte(')') + } + } + + // /dbname + buf.WriteByte('/') + buf.WriteString(cfg.DBName) + + // [?param1=value1&...¶mN=valueN] + hasParam := false + + if cfg.AllowAllFiles { + hasParam = true + buf.WriteString("?allowAllFiles=true") + } + + if cfg.AllowCleartextPasswords { + if hasParam { + buf.WriteString("&allowCleartextPasswords=true") + } else { + hasParam = true + buf.WriteString("?allowCleartextPasswords=true") + } + } + + if !cfg.AllowNativePasswords { + if hasParam { + buf.WriteString("&allowNativePasswords=false") + } else { + hasParam = true + buf.WriteString("?allowNativePasswords=false") + } + } + + if cfg.AllowOldPasswords { + if hasParam { + buf.WriteString("&allowOldPasswords=true") + } else { + hasParam = true + buf.WriteString("?allowOldPasswords=true") + } + } + + if cfg.ClientFoundRows { + if hasParam { + buf.WriteString("&clientFoundRows=true") + } else { + hasParam = true + buf.WriteString("?clientFoundRows=true") + } + } + + if col := cfg.Collation; col != defaultCollation && len(col) > 0 { + if hasParam { + buf.WriteString("&collation=") + } else { + hasParam = true + buf.WriteString("?collation=") + } + buf.WriteString(col) + } + + if cfg.ColumnsWithAlias { + if hasParam { + buf.WriteString("&columnsWithAlias=true") + } else { + hasParam = true + buf.WriteString("?columnsWithAlias=true") + } + } + + if cfg.InterpolateParams { + if hasParam { + buf.WriteString("&interpolateParams=true") + } else { + hasParam = true + buf.WriteString("?interpolateParams=true") + } + } + + if cfg.Loc != time.UTC && cfg.Loc != nil { + if hasParam { + buf.WriteString("&loc=") + } else { + hasParam = true + buf.WriteString("?loc=") + } + buf.WriteString(url.QueryEscape(cfg.Loc.String())) + } + + if cfg.MultiStatements { + if hasParam { + buf.WriteString("&multiStatements=true") + } else { + hasParam = true + buf.WriteString("?multiStatements=true") + } + } + + if cfg.ParseTime { + if hasParam { + buf.WriteString("&parseTime=true") + } else { + hasParam = true + buf.WriteString("?parseTime=true") + } + } + + if cfg.ReadTimeout > 0 { + if hasParam { + buf.WriteString("&readTimeout=") + } else { + hasParam = true + buf.WriteString("?readTimeout=") + } + buf.WriteString(cfg.ReadTimeout.String()) + } + + if cfg.RejectReadOnly { + if hasParam { + buf.WriteString("&rejectReadOnly=true") + } else { + hasParam = true + buf.WriteString("?rejectReadOnly=true") + } + } + + if len(cfg.ServerPubKey) > 0 { + if hasParam { + buf.WriteString("&serverPubKey=") + } else { + hasParam = true + buf.WriteString("?serverPubKey=") + } + buf.WriteString(url.QueryEscape(cfg.ServerPubKey)) + } + + if cfg.Timeout > 0 { + if hasParam { + buf.WriteString("&timeout=") + } else { + hasParam = true + buf.WriteString("?timeout=") + } + buf.WriteString(cfg.Timeout.String()) + } + + if len(cfg.TLSConfig) > 0 { + if hasParam { + buf.WriteString("&tls=") + } else { + hasParam = true + buf.WriteString("?tls=") + } + buf.WriteString(url.QueryEscape(cfg.TLSConfig)) + } + + if cfg.WriteTimeout > 0 { + if hasParam { + buf.WriteString("&writeTimeout=") + } else { + hasParam = true + buf.WriteString("?writeTimeout=") + } + buf.WriteString(cfg.WriteTimeout.String()) + } + + if cfg.MaxAllowedPacket != defaultMaxAllowedPacket { + if hasParam { + buf.WriteString("&maxAllowedPacket=") + } else { + hasParam = true + buf.WriteString("?maxAllowedPacket=") + } + buf.WriteString(strconv.Itoa(cfg.MaxAllowedPacket)) + + } + + // other params + if cfg.Params != nil { + var params []string + for param := range cfg.Params { + params = append(params, param) + } + sort.Strings(params) + for _, param := range params { + if hasParam { + buf.WriteByte('&') + } else { + hasParam = true + buf.WriteByte('?') + } + + buf.WriteString(param) + buf.WriteByte('=') + buf.WriteString(url.QueryEscape(cfg.Params[param])) + } + } + + return buf.String() +} + +// ParseDSN parses the DSN string to a Config +func ParseDSN(dsn string) (cfg *Config, err error) { + // New config with some default values + cfg = NewConfig() + + // [user[:password]@][net[(addr)]]/dbname[?param1=value1¶mN=valueN] + // Find the last '/' (since the password or the net addr might contain a '/') + foundSlash := false + for i := len(dsn) - 1; i >= 0; i-- { + if dsn[i] == '/' { + foundSlash = true + var j, k int + + // left part is empty if i <= 0 + if i > 0 { + // [username[:password]@][protocol[(address)]] + // Find the last '@' in dsn[:i] + for j = i; j >= 0; j-- { + if dsn[j] == '@' { + // username[:password] + // Find the first ':' in dsn[:j] + for k = 0; k < j; k++ { + if dsn[k] == ':' { + cfg.Passwd = dsn[k+1 : j] + break + } + } + cfg.User = dsn[:k] + + break + } + } + + // [protocol[(address)]] + // Find the first '(' in dsn[j+1:i] + for k = j + 1; k < i; k++ { + if dsn[k] == '(' { + // dsn[i-1] must be == ')' if an address is specified + if dsn[i-1] != ')' { + if strings.ContainsRune(dsn[k+1:i], ')') { + return nil, errInvalidDSNUnescaped + } + return nil, errInvalidDSNAddr + } + cfg.Addr = dsn[k+1 : i-1] + break + } + } + cfg.Net = dsn[j+1 : k] + } + + // dbname[?param1=value1&...¶mN=valueN] + // Find the first '?' in dsn[i+1:] + for j = i + 1; j < len(dsn); j++ { + if dsn[j] == '?' { + if err = parseDSNParams(cfg, dsn[j+1:]); err != nil { + return + } + break + } + } + cfg.DBName = dsn[i+1 : j] + + break + } + } + + if !foundSlash && len(dsn) > 0 { + return nil, errInvalidDSNNoSlash + } + + if err = cfg.normalize(); err != nil { + return nil, err + } + return +} + +// parseDSNParams parses the DSN "query string" +// Values must be url.QueryEscape'ed +func parseDSNParams(cfg *Config, params string) (err error) { + for _, v := range strings.Split(params, "&") { + param := strings.SplitN(v, "=", 2) + if len(param) != 2 { + continue + } + + // cfg params + switch value := param[1]; param[0] { + // Disable INFILE whitelist / enable all files + case "allowAllFiles": + var isBool bool + cfg.AllowAllFiles, isBool = readBool(value) + if !isBool { + return errors.New("invalid bool value: " + value) + } + + // Use cleartext authentication mode (MySQL 5.5.10+) + case "allowCleartextPasswords": + var isBool bool + cfg.AllowCleartextPasswords, isBool = readBool(value) + if !isBool { + return errors.New("invalid bool value: " + value) + } + + // Use native password authentication + case "allowNativePasswords": + var isBool bool + cfg.AllowNativePasswords, isBool = readBool(value) + if !isBool { + return errors.New("invalid bool value: " + value) + } + + // Use old authentication mode (pre MySQL 4.1) + case "allowOldPasswords": + var isBool bool + cfg.AllowOldPasswords, isBool = readBool(value) + if !isBool { + return errors.New("invalid bool value: " + value) + } + + // Switch "rowsAffected" mode + case "clientFoundRows": + var isBool bool + cfg.ClientFoundRows, isBool = readBool(value) + if !isBool { + return errors.New("invalid bool value: " + value) + } + + // Collation + case "collation": + cfg.Collation = value + break + + case "columnsWithAlias": + var isBool bool + cfg.ColumnsWithAlias, isBool = readBool(value) + if !isBool { + return errors.New("invalid bool value: " + value) + } + + // Compression + case "compress": + return errors.New("compression not implemented yet") + + // Enable client side placeholder substitution + case "interpolateParams": + var isBool bool + cfg.InterpolateParams, isBool = readBool(value) + if !isBool { + return errors.New("invalid bool value: " + value) + } + + // Time Location + case "loc": + if value, err = url.QueryUnescape(value); err != nil { + return + } + cfg.Loc, err = time.LoadLocation(value) + if err != nil { + return + } + + // multiple statements in one query + case "multiStatements": + var isBool bool + cfg.MultiStatements, isBool = readBool(value) + if !isBool { + return errors.New("invalid bool value: " + value) + } + + // time.Time parsing + case "parseTime": + var isBool bool + cfg.ParseTime, isBool = readBool(value) + if !isBool { + return errors.New("invalid bool value: " + value) + } + + // I/O read Timeout + case "readTimeout": + cfg.ReadTimeout, err = time.ParseDuration(value) + if err != nil { + return + } + + // Reject read-only connections + case "rejectReadOnly": + var isBool bool + cfg.RejectReadOnly, isBool = readBool(value) + if !isBool { + return errors.New("invalid bool value: " + value) + } + + // Server public key + case "serverPubKey": + name, err := url.QueryUnescape(value) + if err != nil { + return fmt.Errorf("invalid value for server pub key name: %v", err) + } + + if pubKey := getServerPubKey(name); pubKey != nil { + cfg.ServerPubKey = name + cfg.pubKey = pubKey + } else { + return errors.New("invalid value / unknown server pub key name: " + name) + } + + // Strict mode + case "strict": + panic("strict mode has been removed. See https://github.com/go-sql-driver/mysql/wiki/strict-mode") + + // Dial Timeout + case "timeout": + cfg.Timeout, err = time.ParseDuration(value) + if err != nil { + return + } + + // TLS-Encryption + case "tls": + boolValue, isBool := readBool(value) + if isBool { + if boolValue { + cfg.TLSConfig = "true" + cfg.tls = &tls.Config{} + } else { + cfg.TLSConfig = "false" + } + } else if vl := strings.ToLower(value); vl == "skip-verify" || vl == "preferred" { + cfg.TLSConfig = vl + cfg.tls = &tls.Config{InsecureSkipVerify: true} + } else { + name, err := url.QueryUnescape(value) + if err != nil { + return fmt.Errorf("invalid value for TLS config name: %v", err) + } + + if tlsConfig := getTLSConfigClone(name); tlsConfig != nil { + cfg.TLSConfig = name + cfg.tls = tlsConfig + } else { + return errors.New("invalid value / unknown config name: " + name) + } + } + + // I/O write Timeout + case "writeTimeout": + cfg.WriteTimeout, err = time.ParseDuration(value) + if err != nil { + return + } + case "maxAllowedPacket": + cfg.MaxAllowedPacket, err = strconv.Atoi(value) + if err != nil { + return + } + default: + // lazy init + if cfg.Params == nil { + cfg.Params = make(map[string]string) + } + + if cfg.Params[param[0]], err = url.QueryUnescape(value); err != nil { + return + } + } + } + + return +} + +func ensureHavePort(addr string) string { + if _, _, err := net.SplitHostPort(addr); err != nil { + return net.JoinHostPort(addr, "3306") + } + return addr +} diff --git a/vendor/github.com/go-sql-driver/mysql/errors.go b/vendor/github.com/go-sql-driver/mysql/errors.go new file mode 100644 index 0000000..760782f --- /dev/null +++ b/vendor/github.com/go-sql-driver/mysql/errors.go @@ -0,0 +1,65 @@ +// Go MySQL Driver - A MySQL-Driver for Go's database/sql package +// +// Copyright 2013 The Go-MySQL-Driver Authors. All rights reserved. +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this file, +// You can obtain one at http://mozilla.org/MPL/2.0/. + +package mysql + +import ( + "errors" + "fmt" + "log" + "os" +) + +// Various errors the driver might return. Can change between driver versions. +var ( + ErrInvalidConn = errors.New("invalid connection") + ErrMalformPkt = errors.New("malformed packet") + ErrNoTLS = errors.New("TLS requested but server does not support TLS") + ErrCleartextPassword = errors.New("this user requires clear text authentication. If you still want to use it, please add 'allowCleartextPasswords=1' to your DSN") + ErrNativePassword = errors.New("this user requires mysql native password authentication.") + ErrOldPassword = errors.New("this user requires old password authentication. If you still want to use it, please add 'allowOldPasswords=1' to your DSN. See also https://github.com/go-sql-driver/mysql/wiki/old_passwords") + ErrUnknownPlugin = errors.New("this authentication plugin is not supported") + ErrOldProtocol = errors.New("MySQL server does not support required protocol 41+") + ErrPktSync = errors.New("commands out of sync. You can't run this command now") + ErrPktSyncMul = errors.New("commands out of sync. Did you run multiple statements at once?") + ErrPktTooLarge = errors.New("packet for query is too large. Try adjusting the 'max_allowed_packet' variable on the server") + ErrBusyBuffer = errors.New("busy buffer") + + // errBadConnNoWrite is used for connection errors where nothing was sent to the database yet. + // If this happens first in a function starting a database interaction, it should be replaced by driver.ErrBadConn + // to trigger a resend. + // See https://github.com/go-sql-driver/mysql/pull/302 + errBadConnNoWrite = errors.New("bad connection") +) + +var errLog = Logger(log.New(os.Stderr, "[mysql] ", log.Ldate|log.Ltime|log.Lshortfile)) + +// Logger is used to log critical error messages. +type Logger interface { + Print(v ...interface{}) +} + +// SetLogger is used to set the logger for critical errors. +// The initial logger is os.Stderr. +func SetLogger(logger Logger) error { + if logger == nil { + return errors.New("logger is nil") + } + errLog = logger + return nil +} + +// MySQLError is an error type which represents a single MySQL error +type MySQLError struct { + Number uint16 + Message string +} + +func (me *MySQLError) Error() string { + return fmt.Sprintf("Error %d: %s", me.Number, me.Message) +} diff --git a/vendor/github.com/go-sql-driver/mysql/fields.go b/vendor/github.com/go-sql-driver/mysql/fields.go new file mode 100644 index 0000000..e1e2ece --- /dev/null +++ b/vendor/github.com/go-sql-driver/mysql/fields.go @@ -0,0 +1,194 @@ +// Go MySQL Driver - A MySQL-Driver for Go's database/sql package +// +// Copyright 2017 The Go-MySQL-Driver Authors. All rights reserved. +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this file, +// You can obtain one at http://mozilla.org/MPL/2.0/. + +package mysql + +import ( + "database/sql" + "reflect" +) + +func (mf *mysqlField) typeDatabaseName() string { + switch mf.fieldType { + case fieldTypeBit: + return "BIT" + case fieldTypeBLOB: + if mf.charSet != collations[binaryCollation] { + return "TEXT" + } + return "BLOB" + case fieldTypeDate: + return "DATE" + case fieldTypeDateTime: + return "DATETIME" + case fieldTypeDecimal: + return "DECIMAL" + case fieldTypeDouble: + return "DOUBLE" + case fieldTypeEnum: + return "ENUM" + case fieldTypeFloat: + return "FLOAT" + case fieldTypeGeometry: + return "GEOMETRY" + case fieldTypeInt24: + return "MEDIUMINT" + case fieldTypeJSON: + return "JSON" + case fieldTypeLong: + return "INT" + case fieldTypeLongBLOB: + if mf.charSet != collations[binaryCollation] { + return "LONGTEXT" + } + return "LONGBLOB" + case fieldTypeLongLong: + return "BIGINT" + case fieldTypeMediumBLOB: + if mf.charSet != collations[binaryCollation] { + return "MEDIUMTEXT" + } + return "MEDIUMBLOB" + case fieldTypeNewDate: + return "DATE" + case fieldTypeNewDecimal: + return "DECIMAL" + case fieldTypeNULL: + return "NULL" + case fieldTypeSet: + return "SET" + case fieldTypeShort: + return "SMALLINT" + case fieldTypeString: + if mf.charSet == collations[binaryCollation] { + return "BINARY" + } + return "CHAR" + case fieldTypeTime: + return "TIME" + case fieldTypeTimestamp: + return "TIMESTAMP" + case fieldTypeTiny: + return "TINYINT" + case fieldTypeTinyBLOB: + if mf.charSet != collations[binaryCollation] { + return "TINYTEXT" + } + return "TINYBLOB" + case fieldTypeVarChar: + if mf.charSet == collations[binaryCollation] { + return "VARBINARY" + } + return "VARCHAR" + case fieldTypeVarString: + if mf.charSet == collations[binaryCollation] { + return "VARBINARY" + } + return "VARCHAR" + case fieldTypeYear: + return "YEAR" + default: + return "" + } +} + +var ( + scanTypeFloat32 = reflect.TypeOf(float32(0)) + scanTypeFloat64 = reflect.TypeOf(float64(0)) + scanTypeInt8 = reflect.TypeOf(int8(0)) + scanTypeInt16 = reflect.TypeOf(int16(0)) + scanTypeInt32 = reflect.TypeOf(int32(0)) + scanTypeInt64 = reflect.TypeOf(int64(0)) + scanTypeNullFloat = reflect.TypeOf(sql.NullFloat64{}) + scanTypeNullInt = reflect.TypeOf(sql.NullInt64{}) + scanTypeNullTime = reflect.TypeOf(NullTime{}) + scanTypeUint8 = reflect.TypeOf(uint8(0)) + scanTypeUint16 = reflect.TypeOf(uint16(0)) + scanTypeUint32 = reflect.TypeOf(uint32(0)) + scanTypeUint64 = reflect.TypeOf(uint64(0)) + scanTypeRawBytes = reflect.TypeOf(sql.RawBytes{}) + scanTypeUnknown = reflect.TypeOf(new(interface{})) +) + +type mysqlField struct { + tableName string + name string + length uint32 + flags fieldFlag + fieldType fieldType + decimals byte + charSet uint8 +} + +func (mf *mysqlField) scanType() reflect.Type { + switch mf.fieldType { + case fieldTypeTiny: + if mf.flags&flagNotNULL != 0 { + if mf.flags&flagUnsigned != 0 { + return scanTypeUint8 + } + return scanTypeInt8 + } + return scanTypeNullInt + + case fieldTypeShort, fieldTypeYear: + if mf.flags&flagNotNULL != 0 { + if mf.flags&flagUnsigned != 0 { + return scanTypeUint16 + } + return scanTypeInt16 + } + return scanTypeNullInt + + case fieldTypeInt24, fieldTypeLong: + if mf.flags&flagNotNULL != 0 { + if mf.flags&flagUnsigned != 0 { + return scanTypeUint32 + } + return scanTypeInt32 + } + return scanTypeNullInt + + case fieldTypeLongLong: + if mf.flags&flagNotNULL != 0 { + if mf.flags&flagUnsigned != 0 { + return scanTypeUint64 + } + return scanTypeInt64 + } + return scanTypeNullInt + + case fieldTypeFloat: + if mf.flags&flagNotNULL != 0 { + return scanTypeFloat32 + } + return scanTypeNullFloat + + case fieldTypeDouble: + if mf.flags&flagNotNULL != 0 { + return scanTypeFloat64 + } + return scanTypeNullFloat + + case fieldTypeDecimal, fieldTypeNewDecimal, fieldTypeVarChar, + fieldTypeBit, fieldTypeEnum, fieldTypeSet, fieldTypeTinyBLOB, + fieldTypeMediumBLOB, fieldTypeLongBLOB, fieldTypeBLOB, + fieldTypeVarString, fieldTypeString, fieldTypeGeometry, fieldTypeJSON, + fieldTypeTime: + return scanTypeRawBytes + + case fieldTypeDate, fieldTypeNewDate, + fieldTypeTimestamp, fieldTypeDateTime: + // NullTime is always returned for more consistent behavior as it can + // handle both cases of parseTime regardless if the field is nullable. + return scanTypeNullTime + + default: + return scanTypeUnknown + } +} diff --git a/vendor/github.com/go-sql-driver/mysql/infile.go b/vendor/github.com/go-sql-driver/mysql/infile.go new file mode 100644 index 0000000..273cb0b --- /dev/null +++ b/vendor/github.com/go-sql-driver/mysql/infile.go @@ -0,0 +1,182 @@ +// Go MySQL Driver - A MySQL-Driver for Go's database/sql package +// +// Copyright 2013 The Go-MySQL-Driver Authors. All rights reserved. +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this file, +// You can obtain one at http://mozilla.org/MPL/2.0/. + +package mysql + +import ( + "fmt" + "io" + "os" + "strings" + "sync" +) + +var ( + fileRegister map[string]bool + fileRegisterLock sync.RWMutex + readerRegister map[string]func() io.Reader + readerRegisterLock sync.RWMutex +) + +// RegisterLocalFile adds the given file to the file whitelist, +// so that it can be used by "LOAD DATA LOCAL INFILE ". +// Alternatively you can allow the use of all local files with +// the DSN parameter 'allowAllFiles=true' +// +// filePath := "/home/gopher/data.csv" +// mysql.RegisterLocalFile(filePath) +// err := db.Exec("LOAD DATA LOCAL INFILE '" + filePath + "' INTO TABLE foo") +// if err != nil { +// ... +// +func RegisterLocalFile(filePath string) { + fileRegisterLock.Lock() + // lazy map init + if fileRegister == nil { + fileRegister = make(map[string]bool) + } + + fileRegister[strings.Trim(filePath, `"`)] = true + fileRegisterLock.Unlock() +} + +// DeregisterLocalFile removes the given filepath from the whitelist. +func DeregisterLocalFile(filePath string) { + fileRegisterLock.Lock() + delete(fileRegister, strings.Trim(filePath, `"`)) + fileRegisterLock.Unlock() +} + +// RegisterReaderHandler registers a handler function which is used +// to receive a io.Reader. +// The Reader can be used by "LOAD DATA LOCAL INFILE Reader::". +// If the handler returns a io.ReadCloser Close() is called when the +// request is finished. +// +// mysql.RegisterReaderHandler("data", func() io.Reader { +// var csvReader io.Reader // Some Reader that returns CSV data +// ... // Open Reader here +// return csvReader +// }) +// err := db.Exec("LOAD DATA LOCAL INFILE 'Reader::data' INTO TABLE foo") +// if err != nil { +// ... +// +func RegisterReaderHandler(name string, handler func() io.Reader) { + readerRegisterLock.Lock() + // lazy map init + if readerRegister == nil { + readerRegister = make(map[string]func() io.Reader) + } + + readerRegister[name] = handler + readerRegisterLock.Unlock() +} + +// DeregisterReaderHandler removes the ReaderHandler function with +// the given name from the registry. +func DeregisterReaderHandler(name string) { + readerRegisterLock.Lock() + delete(readerRegister, name) + readerRegisterLock.Unlock() +} + +func deferredClose(err *error, closer io.Closer) { + closeErr := closer.Close() + if *err == nil { + *err = closeErr + } +} + +func (mc *mysqlConn) handleInFileRequest(name string) (err error) { + var rdr io.Reader + var data []byte + packetSize := 16 * 1024 // 16KB is small enough for disk readahead and large enough for TCP + if mc.maxWriteSize < packetSize { + packetSize = mc.maxWriteSize + } + + if idx := strings.Index(name, "Reader::"); idx == 0 || (idx > 0 && name[idx-1] == '/') { // io.Reader + // The server might return an an absolute path. See issue #355. + name = name[idx+8:] + + readerRegisterLock.RLock() + handler, inMap := readerRegister[name] + readerRegisterLock.RUnlock() + + if inMap { + rdr = handler() + if rdr != nil { + if cl, ok := rdr.(io.Closer); ok { + defer deferredClose(&err, cl) + } + } else { + err = fmt.Errorf("Reader '%s' is ", name) + } + } else { + err = fmt.Errorf("Reader '%s' is not registered", name) + } + } else { // File + name = strings.Trim(name, `"`) + fileRegisterLock.RLock() + fr := fileRegister[name] + fileRegisterLock.RUnlock() + if mc.cfg.AllowAllFiles || fr { + var file *os.File + var fi os.FileInfo + + if file, err = os.Open(name); err == nil { + defer deferredClose(&err, file) + + // get file size + if fi, err = file.Stat(); err == nil { + rdr = file + if fileSize := int(fi.Size()); fileSize < packetSize { + packetSize = fileSize + } + } + } + } else { + err = fmt.Errorf("local file '%s' is not registered", name) + } + } + + // send content packets + // if packetSize == 0, the Reader contains no data + if err == nil && packetSize > 0 { + data := make([]byte, 4+packetSize) + var n int + for err == nil { + n, err = rdr.Read(data[4:]) + if n > 0 { + if ioErr := mc.writePacket(data[:4+n]); ioErr != nil { + return ioErr + } + } + } + if err == io.EOF { + err = nil + } + } + + // send empty packet (termination) + if data == nil { + data = make([]byte, 4) + } + if ioErr := mc.writePacket(data[:4]); ioErr != nil { + return ioErr + } + + // read OK packet + if err == nil { + return mc.readResultOK() + } + + mc.readPacket() + return err +} diff --git a/vendor/github.com/go-sql-driver/mysql/packets.go b/vendor/github.com/go-sql-driver/mysql/packets.go new file mode 100644 index 0000000..5e08537 --- /dev/null +++ b/vendor/github.com/go-sql-driver/mysql/packets.go @@ -0,0 +1,1296 @@ +// Go MySQL Driver - A MySQL-Driver for Go's database/sql package +// +// Copyright 2012 The Go-MySQL-Driver Authors. All rights reserved. +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this file, +// You can obtain one at http://mozilla.org/MPL/2.0/. + +package mysql + +import ( + "bytes" + "crypto/tls" + "database/sql/driver" + "encoding/binary" + "errors" + "fmt" + "io" + "math" + "time" +) + +// Packets documentation: +// http://dev.mysql.com/doc/internals/en/client-server-protocol.html + +// Read packet to buffer 'data' +func (mc *mysqlConn) readPacket() ([]byte, error) { + var prevData []byte + for { + // read packet header + data, err := mc.buf.readNext(4) + if err != nil { + if cerr := mc.canceled.Value(); cerr != nil { + return nil, cerr + } + errLog.Print(err) + mc.Close() + return nil, ErrInvalidConn + } + + // packet length [24 bit] + pktLen := int(uint32(data[0]) | uint32(data[1])<<8 | uint32(data[2])<<16) + + // check packet sync [8 bit] + if data[3] != mc.sequence { + if data[3] > mc.sequence { + return nil, ErrPktSyncMul + } + return nil, ErrPktSync + } + mc.sequence++ + + // packets with length 0 terminate a previous packet which is a + // multiple of (2^24)-1 bytes long + if pktLen == 0 { + // there was no previous packet + if prevData == nil { + errLog.Print(ErrMalformPkt) + mc.Close() + return nil, ErrInvalidConn + } + + return prevData, nil + } + + // read packet body [pktLen bytes] + data, err = mc.buf.readNext(pktLen) + if err != nil { + if cerr := mc.canceled.Value(); cerr != nil { + return nil, cerr + } + errLog.Print(err) + mc.Close() + return nil, ErrInvalidConn + } + + // return data if this was the last packet + if pktLen < maxPacketSize { + // zero allocations for non-split packets + if prevData == nil { + return data, nil + } + + return append(prevData, data...), nil + } + + prevData = append(prevData, data...) + } +} + +// Write packet buffer 'data' +func (mc *mysqlConn) writePacket(data []byte) error { + pktLen := len(data) - 4 + + if pktLen > mc.maxAllowedPacket { + return ErrPktTooLarge + } + + for { + var size int + if pktLen >= maxPacketSize { + data[0] = 0xff + data[1] = 0xff + data[2] = 0xff + size = maxPacketSize + } else { + data[0] = byte(pktLen) + data[1] = byte(pktLen >> 8) + data[2] = byte(pktLen >> 16) + size = pktLen + } + data[3] = mc.sequence + + // Write packet + if mc.writeTimeout > 0 { + if err := mc.netConn.SetWriteDeadline(time.Now().Add(mc.writeTimeout)); err != nil { + return err + } + } + + n, err := mc.netConn.Write(data[:4+size]) + if err == nil && n == 4+size { + mc.sequence++ + if size != maxPacketSize { + return nil + } + pktLen -= size + data = data[size:] + continue + } + + // Handle error + if err == nil { // n != len(data) + mc.cleanup() + errLog.Print(ErrMalformPkt) + } else { + if cerr := mc.canceled.Value(); cerr != nil { + return cerr + } + if n == 0 && pktLen == len(data)-4 { + // only for the first loop iteration when nothing was written yet + return errBadConnNoWrite + } + mc.cleanup() + errLog.Print(err) + } + return ErrInvalidConn + } +} + +/****************************************************************************** +* Initialization Process * +******************************************************************************/ + +// Handshake Initialization Packet +// http://dev.mysql.com/doc/internals/en/connection-phase-packets.html#packet-Protocol::Handshake +func (mc *mysqlConn) readHandshakePacket() (data []byte, plugin string, err error) { + data, err = mc.readPacket() + if err != nil { + // for init we can rewrite this to ErrBadConn for sql.Driver to retry, since + // in connection initialization we don't risk retrying non-idempotent actions. + if err == ErrInvalidConn { + return nil, "", driver.ErrBadConn + } + return + } + + if data[0] == iERR { + return nil, "", mc.handleErrorPacket(data) + } + + // protocol version [1 byte] + if data[0] < minProtocolVersion { + return nil, "", fmt.Errorf( + "unsupported protocol version %d. Version %d or higher is required", + data[0], + minProtocolVersion, + ) + } + + // server version [null terminated string] + // connection id [4 bytes] + pos := 1 + bytes.IndexByte(data[1:], 0x00) + 1 + 4 + + // first part of the password cipher [8 bytes] + authData := data[pos : pos+8] + + // (filler) always 0x00 [1 byte] + pos += 8 + 1 + + // capability flags (lower 2 bytes) [2 bytes] + mc.flags = clientFlag(binary.LittleEndian.Uint16(data[pos : pos+2])) + if mc.flags&clientProtocol41 == 0 { + return nil, "", ErrOldProtocol + } + if mc.flags&clientSSL == 0 && mc.cfg.tls != nil { + if mc.cfg.TLSConfig == "preferred" { + mc.cfg.tls = nil + } else { + return nil, "", ErrNoTLS + } + } + pos += 2 + + if len(data) > pos { + // character set [1 byte] + // status flags [2 bytes] + // capability flags (upper 2 bytes) [2 bytes] + // length of auth-plugin-data [1 byte] + // reserved (all [00]) [10 bytes] + pos += 1 + 2 + 2 + 1 + 10 + + // second part of the password cipher [mininum 13 bytes], + // where len=MAX(13, length of auth-plugin-data - 8) + // + // The web documentation is ambiguous about the length. However, + // according to mysql-5.7/sql/auth/sql_authentication.cc line 538, + // the 13th byte is "\0 byte, terminating the second part of + // a scramble". So the second part of the password cipher is + // a NULL terminated string that's at least 13 bytes with the + // last byte being NULL. + // + // The official Python library uses the fixed length 12 + // which seems to work but technically could have a hidden bug. + authData = append(authData, data[pos:pos+12]...) + pos += 13 + + // EOF if version (>= 5.5.7 and < 5.5.10) or (>= 5.6.0 and < 5.6.2) + // \NUL otherwise + if end := bytes.IndexByte(data[pos:], 0x00); end != -1 { + plugin = string(data[pos : pos+end]) + } else { + plugin = string(data[pos:]) + } + + // make a memory safe copy of the cipher slice + var b [20]byte + copy(b[:], authData) + return b[:], plugin, nil + } + + // make a memory safe copy of the cipher slice + var b [8]byte + copy(b[:], authData) + return b[:], plugin, nil +} + +// Client Authentication Packet +// http://dev.mysql.com/doc/internals/en/connection-phase-packets.html#packet-Protocol::HandshakeResponse +func (mc *mysqlConn) writeHandshakeResponsePacket(authResp []byte, plugin string) error { + // Adjust client flags based on server support + clientFlags := clientProtocol41 | + clientSecureConn | + clientLongPassword | + clientTransactions | + clientLocalFiles | + clientPluginAuth | + clientMultiResults | + mc.flags&clientLongFlag + + if mc.cfg.ClientFoundRows { + clientFlags |= clientFoundRows + } + + // To enable TLS / SSL + if mc.cfg.tls != nil { + clientFlags |= clientSSL + } + + if mc.cfg.MultiStatements { + clientFlags |= clientMultiStatements + } + + // encode length of the auth plugin data + var authRespLEIBuf [9]byte + authRespLen := len(authResp) + authRespLEI := appendLengthEncodedInteger(authRespLEIBuf[:0], uint64(authRespLen)) + if len(authRespLEI) > 1 { + // if the length can not be written in 1 byte, it must be written as a + // length encoded integer + clientFlags |= clientPluginAuthLenEncClientData + } + + pktLen := 4 + 4 + 1 + 23 + len(mc.cfg.User) + 1 + len(authRespLEI) + len(authResp) + 21 + 1 + + // To specify a db name + if n := len(mc.cfg.DBName); n > 0 { + clientFlags |= clientConnectWithDB + pktLen += n + 1 + } + + // Calculate packet length and get buffer with that size + data, err := mc.buf.takeSmallBuffer(pktLen + 4) + if err != nil { + // cannot take the buffer. Something must be wrong with the connection + errLog.Print(err) + return errBadConnNoWrite + } + + // ClientFlags [32 bit] + data[4] = byte(clientFlags) + data[5] = byte(clientFlags >> 8) + data[6] = byte(clientFlags >> 16) + data[7] = byte(clientFlags >> 24) + + // MaxPacketSize [32 bit] (none) + data[8] = 0x00 + data[9] = 0x00 + data[10] = 0x00 + data[11] = 0x00 + + // Charset [1 byte] + var found bool + data[12], found = collations[mc.cfg.Collation] + if !found { + // Note possibility for false negatives: + // could be triggered although the collation is valid if the + // collations map does not contain entries the server supports. + return errors.New("unknown collation") + } + + // SSL Connection Request Packet + // http://dev.mysql.com/doc/internals/en/connection-phase-packets.html#packet-Protocol::SSLRequest + if mc.cfg.tls != nil { + // Send TLS / SSL request packet + if err := mc.writePacket(data[:(4+4+1+23)+4]); err != nil { + return err + } + + // Switch to TLS + tlsConn := tls.Client(mc.netConn, mc.cfg.tls) + if err := tlsConn.Handshake(); err != nil { + return err + } + mc.netConn = tlsConn + mc.buf.nc = tlsConn + } + + // Filler [23 bytes] (all 0x00) + pos := 13 + for ; pos < 13+23; pos++ { + data[pos] = 0 + } + + // User [null terminated string] + if len(mc.cfg.User) > 0 { + pos += copy(data[pos:], mc.cfg.User) + } + data[pos] = 0x00 + pos++ + + // Auth Data [length encoded integer] + pos += copy(data[pos:], authRespLEI) + pos += copy(data[pos:], authResp) + + // Databasename [null terminated string] + if len(mc.cfg.DBName) > 0 { + pos += copy(data[pos:], mc.cfg.DBName) + data[pos] = 0x00 + pos++ + } + + pos += copy(data[pos:], plugin) + data[pos] = 0x00 + pos++ + + // Send Auth packet + return mc.writePacket(data[:pos]) +} + +// http://dev.mysql.com/doc/internals/en/connection-phase-packets.html#packet-Protocol::AuthSwitchResponse +func (mc *mysqlConn) writeAuthSwitchPacket(authData []byte) error { + pktLen := 4 + len(authData) + data, err := mc.buf.takeSmallBuffer(pktLen) + if err != nil { + // cannot take the buffer. Something must be wrong with the connection + errLog.Print(err) + return errBadConnNoWrite + } + + // Add the auth data [EOF] + copy(data[4:], authData) + return mc.writePacket(data) +} + +/****************************************************************************** +* Command Packets * +******************************************************************************/ + +func (mc *mysqlConn) writeCommandPacket(command byte) error { + // Reset Packet Sequence + mc.sequence = 0 + + data, err := mc.buf.takeSmallBuffer(4 + 1) + if err != nil { + // cannot take the buffer. Something must be wrong with the connection + errLog.Print(err) + return errBadConnNoWrite + } + + // Add command byte + data[4] = command + + // Send CMD packet + return mc.writePacket(data) +} + +func (mc *mysqlConn) writeCommandPacketStr(command byte, arg string) error { + // Reset Packet Sequence + mc.sequence = 0 + + pktLen := 1 + len(arg) + data, err := mc.buf.takeBuffer(pktLen + 4) + if err != nil { + // cannot take the buffer. Something must be wrong with the connection + errLog.Print(err) + return errBadConnNoWrite + } + + // Add command byte + data[4] = command + + // Add arg + copy(data[5:], arg) + + // Send CMD packet + return mc.writePacket(data) +} + +func (mc *mysqlConn) writeCommandPacketUint32(command byte, arg uint32) error { + // Reset Packet Sequence + mc.sequence = 0 + + data, err := mc.buf.takeSmallBuffer(4 + 1 + 4) + if err != nil { + // cannot take the buffer. Something must be wrong with the connection + errLog.Print(err) + return errBadConnNoWrite + } + + // Add command byte + data[4] = command + + // Add arg [32 bit] + data[5] = byte(arg) + data[6] = byte(arg >> 8) + data[7] = byte(arg >> 16) + data[8] = byte(arg >> 24) + + // Send CMD packet + return mc.writePacket(data) +} + +/****************************************************************************** +* Result Packets * +******************************************************************************/ + +func (mc *mysqlConn) readAuthResult() ([]byte, string, error) { + data, err := mc.readPacket() + if err != nil { + return nil, "", err + } + + // packet indicator + switch data[0] { + + case iOK: + return nil, "", mc.handleOkPacket(data) + + case iAuthMoreData: + return data[1:], "", err + + case iEOF: + if len(data) == 1 { + // https://dev.mysql.com/doc/internals/en/connection-phase-packets.html#packet-Protocol::OldAuthSwitchRequest + return nil, "mysql_old_password", nil + } + pluginEndIndex := bytes.IndexByte(data, 0x00) + if pluginEndIndex < 0 { + return nil, "", ErrMalformPkt + } + plugin := string(data[1:pluginEndIndex]) + authData := data[pluginEndIndex+1:] + return authData, plugin, nil + + default: // Error otherwise + return nil, "", mc.handleErrorPacket(data) + } +} + +// Returns error if Packet is not an 'Result OK'-Packet +func (mc *mysqlConn) readResultOK() error { + data, err := mc.readPacket() + if err != nil { + return err + } + + if data[0] == iOK { + return mc.handleOkPacket(data) + } + return mc.handleErrorPacket(data) +} + +// Result Set Header Packet +// http://dev.mysql.com/doc/internals/en/com-query-response.html#packet-ProtocolText::Resultset +func (mc *mysqlConn) readResultSetHeaderPacket() (int, error) { + data, err := mc.readPacket() + if err == nil { + switch data[0] { + + case iOK: + return 0, mc.handleOkPacket(data) + + case iERR: + return 0, mc.handleErrorPacket(data) + + case iLocalInFile: + return 0, mc.handleInFileRequest(string(data[1:])) + } + + // column count + num, _, n := readLengthEncodedInteger(data) + if n-len(data) == 0 { + return int(num), nil + } + + return 0, ErrMalformPkt + } + return 0, err +} + +// Error Packet +// http://dev.mysql.com/doc/internals/en/generic-response-packets.html#packet-ERR_Packet +func (mc *mysqlConn) handleErrorPacket(data []byte) error { + if data[0] != iERR { + return ErrMalformPkt + } + + // 0xff [1 byte] + + // Error Number [16 bit uint] + errno := binary.LittleEndian.Uint16(data[1:3]) + + // 1792: ER_CANT_EXECUTE_IN_READ_ONLY_TRANSACTION + // 1290: ER_OPTION_PREVENTS_STATEMENT (returned by Aurora during failover) + if (errno == 1792 || errno == 1290) && mc.cfg.RejectReadOnly { + // Oops; we are connected to a read-only connection, and won't be able + // to issue any write statements. Since RejectReadOnly is configured, + // we throw away this connection hoping this one would have write + // permission. This is specifically for a possible race condition + // during failover (e.g. on AWS Aurora). See README.md for more. + // + // We explicitly close the connection before returning + // driver.ErrBadConn to ensure that `database/sql` purges this + // connection and initiates a new one for next statement next time. + mc.Close() + return driver.ErrBadConn + } + + pos := 3 + + // SQL State [optional: # + 5bytes string] + if data[3] == 0x23 { + //sqlstate := string(data[4 : 4+5]) + pos = 9 + } + + // Error Message [string] + return &MySQLError{ + Number: errno, + Message: string(data[pos:]), + } +} + +func readStatus(b []byte) statusFlag { + return statusFlag(b[0]) | statusFlag(b[1])<<8 +} + +// Ok Packet +// http://dev.mysql.com/doc/internals/en/generic-response-packets.html#packet-OK_Packet +func (mc *mysqlConn) handleOkPacket(data []byte) error { + var n, m int + + // 0x00 [1 byte] + + // Affected rows [Length Coded Binary] + mc.affectedRows, _, n = readLengthEncodedInteger(data[1:]) + + // Insert id [Length Coded Binary] + mc.insertId, _, m = readLengthEncodedInteger(data[1+n:]) + + // server_status [2 bytes] + mc.status = readStatus(data[1+n+m : 1+n+m+2]) + if mc.status&statusMoreResultsExists != 0 { + return nil + } + + // warning count [2 bytes] + + return nil +} + +// Read Packets as Field Packets until EOF-Packet or an Error appears +// http://dev.mysql.com/doc/internals/en/com-query-response.html#packet-Protocol::ColumnDefinition41 +func (mc *mysqlConn) readColumns(count int) ([]mysqlField, error) { + columns := make([]mysqlField, count) + + for i := 0; ; i++ { + data, err := mc.readPacket() + if err != nil { + return nil, err + } + + // EOF Packet + if data[0] == iEOF && (len(data) == 5 || len(data) == 1) { + if i == count { + return columns, nil + } + return nil, fmt.Errorf("column count mismatch n:%d len:%d", count, len(columns)) + } + + // Catalog + pos, err := skipLengthEncodedString(data) + if err != nil { + return nil, err + } + + // Database [len coded string] + n, err := skipLengthEncodedString(data[pos:]) + if err != nil { + return nil, err + } + pos += n + + // Table [len coded string] + if mc.cfg.ColumnsWithAlias { + tableName, _, n, err := readLengthEncodedString(data[pos:]) + if err != nil { + return nil, err + } + pos += n + columns[i].tableName = string(tableName) + } else { + n, err = skipLengthEncodedString(data[pos:]) + if err != nil { + return nil, err + } + pos += n + } + + // Original table [len coded string] + n, err = skipLengthEncodedString(data[pos:]) + if err != nil { + return nil, err + } + pos += n + + // Name [len coded string] + name, _, n, err := readLengthEncodedString(data[pos:]) + if err != nil { + return nil, err + } + columns[i].name = string(name) + pos += n + + // Original name [len coded string] + n, err = skipLengthEncodedString(data[pos:]) + if err != nil { + return nil, err + } + pos += n + + // Filler [uint8] + pos++ + + // Charset [charset, collation uint8] + columns[i].charSet = data[pos] + pos += 2 + + // Length [uint32] + columns[i].length = binary.LittleEndian.Uint32(data[pos : pos+4]) + pos += 4 + + // Field type [uint8] + columns[i].fieldType = fieldType(data[pos]) + pos++ + + // Flags [uint16] + columns[i].flags = fieldFlag(binary.LittleEndian.Uint16(data[pos : pos+2])) + pos += 2 + + // Decimals [uint8] + columns[i].decimals = data[pos] + //pos++ + + // Default value [len coded binary] + //if pos < len(data) { + // defaultVal, _, err = bytesToLengthCodedBinary(data[pos:]) + //} + } +} + +// Read Packets as Field Packets until EOF-Packet or an Error appears +// http://dev.mysql.com/doc/internals/en/com-query-response.html#packet-ProtocolText::ResultsetRow +func (rows *textRows) readRow(dest []driver.Value) error { + mc := rows.mc + + if rows.rs.done { + return io.EOF + } + + data, err := mc.readPacket() + if err != nil { + return err + } + + // EOF Packet + if data[0] == iEOF && len(data) == 5 { + // server_status [2 bytes] + rows.mc.status = readStatus(data[3:]) + rows.rs.done = true + if !rows.HasNextResultSet() { + rows.mc = nil + } + return io.EOF + } + if data[0] == iERR { + rows.mc = nil + return mc.handleErrorPacket(data) + } + + // RowSet Packet + var n int + var isNull bool + pos := 0 + + for i := range dest { + // Read bytes and convert to string + dest[i], isNull, n, err = readLengthEncodedString(data[pos:]) + pos += n + if err == nil { + if !isNull { + if !mc.parseTime { + continue + } else { + switch rows.rs.columns[i].fieldType { + case fieldTypeTimestamp, fieldTypeDateTime, + fieldTypeDate, fieldTypeNewDate: + dest[i], err = parseDateTime( + string(dest[i].([]byte)), + mc.cfg.Loc, + ) + if err == nil { + continue + } + default: + continue + } + } + + } else { + dest[i] = nil + continue + } + } + return err // err != nil + } + + return nil +} + +// Reads Packets until EOF-Packet or an Error appears. Returns count of Packets read +func (mc *mysqlConn) readUntilEOF() error { + for { + data, err := mc.readPacket() + if err != nil { + return err + } + + switch data[0] { + case iERR: + return mc.handleErrorPacket(data) + case iEOF: + if len(data) == 5 { + mc.status = readStatus(data[3:]) + } + return nil + } + } +} + +/****************************************************************************** +* Prepared Statements * +******************************************************************************/ + +// Prepare Result Packets +// http://dev.mysql.com/doc/internals/en/com-stmt-prepare-response.html +func (stmt *mysqlStmt) readPrepareResultPacket() (uint16, error) { + data, err := stmt.mc.readPacket() + if err == nil { + // packet indicator [1 byte] + if data[0] != iOK { + return 0, stmt.mc.handleErrorPacket(data) + } + + // statement id [4 bytes] + stmt.id = binary.LittleEndian.Uint32(data[1:5]) + + // Column count [16 bit uint] + columnCount := binary.LittleEndian.Uint16(data[5:7]) + + // Param count [16 bit uint] + stmt.paramCount = int(binary.LittleEndian.Uint16(data[7:9])) + + // Reserved [8 bit] + + // Warning count [16 bit uint] + + return columnCount, nil + } + return 0, err +} + +// http://dev.mysql.com/doc/internals/en/com-stmt-send-long-data.html +func (stmt *mysqlStmt) writeCommandLongData(paramID int, arg []byte) error { + maxLen := stmt.mc.maxAllowedPacket - 1 + pktLen := maxLen + + // After the header (bytes 0-3) follows before the data: + // 1 byte command + // 4 bytes stmtID + // 2 bytes paramID + const dataOffset = 1 + 4 + 2 + + // Cannot use the write buffer since + // a) the buffer is too small + // b) it is in use + data := make([]byte, 4+1+4+2+len(arg)) + + copy(data[4+dataOffset:], arg) + + for argLen := len(arg); argLen > 0; argLen -= pktLen - dataOffset { + if dataOffset+argLen < maxLen { + pktLen = dataOffset + argLen + } + + stmt.mc.sequence = 0 + // Add command byte [1 byte] + data[4] = comStmtSendLongData + + // Add stmtID [32 bit] + data[5] = byte(stmt.id) + data[6] = byte(stmt.id >> 8) + data[7] = byte(stmt.id >> 16) + data[8] = byte(stmt.id >> 24) + + // Add paramID [16 bit] + data[9] = byte(paramID) + data[10] = byte(paramID >> 8) + + // Send CMD packet + err := stmt.mc.writePacket(data[:4+pktLen]) + if err == nil { + data = data[pktLen-dataOffset:] + continue + } + return err + + } + + // Reset Packet Sequence + stmt.mc.sequence = 0 + return nil +} + +// Execute Prepared Statement +// http://dev.mysql.com/doc/internals/en/com-stmt-execute.html +func (stmt *mysqlStmt) writeExecutePacket(args []driver.Value) error { + if len(args) != stmt.paramCount { + return fmt.Errorf( + "argument count mismatch (got: %d; has: %d)", + len(args), + stmt.paramCount, + ) + } + + const minPktLen = 4 + 1 + 4 + 1 + 4 + mc := stmt.mc + + // Determine threshold dynamically to avoid packet size shortage. + longDataSize := mc.maxAllowedPacket / (stmt.paramCount + 1) + if longDataSize < 64 { + longDataSize = 64 + } + + // Reset packet-sequence + mc.sequence = 0 + + var data []byte + var err error + + if len(args) == 0 { + data, err = mc.buf.takeBuffer(minPktLen) + } else { + data, err = mc.buf.takeCompleteBuffer() + // In this case the len(data) == cap(data) which is used to optimise the flow below. + } + if err != nil { + // cannot take the buffer. Something must be wrong with the connection + errLog.Print(err) + return errBadConnNoWrite + } + + // command [1 byte] + data[4] = comStmtExecute + + // statement_id [4 bytes] + data[5] = byte(stmt.id) + data[6] = byte(stmt.id >> 8) + data[7] = byte(stmt.id >> 16) + data[8] = byte(stmt.id >> 24) + + // flags (0: CURSOR_TYPE_NO_CURSOR) [1 byte] + data[9] = 0x00 + + // iteration_count (uint32(1)) [4 bytes] + data[10] = 0x01 + data[11] = 0x00 + data[12] = 0x00 + data[13] = 0x00 + + if len(args) > 0 { + pos := minPktLen + + var nullMask []byte + if maskLen, typesLen := (len(args)+7)/8, 1+2*len(args); pos+maskLen+typesLen >= cap(data) { + // buffer has to be extended but we don't know by how much so + // we depend on append after all data with known sizes fit. + // We stop at that because we deal with a lot of columns here + // which makes the required allocation size hard to guess. + tmp := make([]byte, pos+maskLen+typesLen) + copy(tmp[:pos], data[:pos]) + data = tmp + nullMask = data[pos : pos+maskLen] + // No need to clean nullMask as make ensures that. + pos += maskLen + } else { + nullMask = data[pos : pos+maskLen] + for i := range nullMask { + nullMask[i] = 0 + } + pos += maskLen + } + + // newParameterBoundFlag 1 [1 byte] + data[pos] = 0x01 + pos++ + + // type of each parameter [len(args)*2 bytes] + paramTypes := data[pos:] + pos += len(args) * 2 + + // value of each parameter [n bytes] + paramValues := data[pos:pos] + valuesCap := cap(paramValues) + + for i, arg := range args { + // build NULL-bitmap + if arg == nil { + nullMask[i/8] |= 1 << (uint(i) & 7) + paramTypes[i+i] = byte(fieldTypeNULL) + paramTypes[i+i+1] = 0x00 + continue + } + + // cache types and values + switch v := arg.(type) { + case int64: + paramTypes[i+i] = byte(fieldTypeLongLong) + paramTypes[i+i+1] = 0x00 + + if cap(paramValues)-len(paramValues)-8 >= 0 { + paramValues = paramValues[:len(paramValues)+8] + binary.LittleEndian.PutUint64( + paramValues[len(paramValues)-8:], + uint64(v), + ) + } else { + paramValues = append(paramValues, + uint64ToBytes(uint64(v))..., + ) + } + + case float64: + paramTypes[i+i] = byte(fieldTypeDouble) + paramTypes[i+i+1] = 0x00 + + if cap(paramValues)-len(paramValues)-8 >= 0 { + paramValues = paramValues[:len(paramValues)+8] + binary.LittleEndian.PutUint64( + paramValues[len(paramValues)-8:], + math.Float64bits(v), + ) + } else { + paramValues = append(paramValues, + uint64ToBytes(math.Float64bits(v))..., + ) + } + + case bool: + paramTypes[i+i] = byte(fieldTypeTiny) + paramTypes[i+i+1] = 0x00 + + if v { + paramValues = append(paramValues, 0x01) + } else { + paramValues = append(paramValues, 0x00) + } + + case []byte: + // Common case (non-nil value) first + if v != nil { + paramTypes[i+i] = byte(fieldTypeString) + paramTypes[i+i+1] = 0x00 + + if len(v) < longDataSize { + paramValues = appendLengthEncodedInteger(paramValues, + uint64(len(v)), + ) + paramValues = append(paramValues, v...) + } else { + if err := stmt.writeCommandLongData(i, v); err != nil { + return err + } + } + continue + } + + // Handle []byte(nil) as a NULL value + nullMask[i/8] |= 1 << (uint(i) & 7) + paramTypes[i+i] = byte(fieldTypeNULL) + paramTypes[i+i+1] = 0x00 + + case string: + paramTypes[i+i] = byte(fieldTypeString) + paramTypes[i+i+1] = 0x00 + + if len(v) < longDataSize { + paramValues = appendLengthEncodedInteger(paramValues, + uint64(len(v)), + ) + paramValues = append(paramValues, v...) + } else { + if err := stmt.writeCommandLongData(i, []byte(v)); err != nil { + return err + } + } + + case time.Time: + paramTypes[i+i] = byte(fieldTypeString) + paramTypes[i+i+1] = 0x00 + + var a [64]byte + var b = a[:0] + + if v.IsZero() { + b = append(b, "0000-00-00"...) + } else { + b = v.In(mc.cfg.Loc).AppendFormat(b, timeFormat) + } + + paramValues = appendLengthEncodedInteger(paramValues, + uint64(len(b)), + ) + paramValues = append(paramValues, b...) + + default: + return fmt.Errorf("cannot convert type: %T", arg) + } + } + + // Check if param values exceeded the available buffer + // In that case we must build the data packet with the new values buffer + if valuesCap != cap(paramValues) { + data = append(data[:pos], paramValues...) + if err = mc.buf.store(data); err != nil { + errLog.Print(err) + return errBadConnNoWrite + } + } + + pos += len(paramValues) + data = data[:pos] + } + + return mc.writePacket(data) +} + +func (mc *mysqlConn) discardResults() error { + for mc.status&statusMoreResultsExists != 0 { + resLen, err := mc.readResultSetHeaderPacket() + if err != nil { + return err + } + if resLen > 0 { + // columns + if err := mc.readUntilEOF(); err != nil { + return err + } + // rows + if err := mc.readUntilEOF(); err != nil { + return err + } + } + } + return nil +} + +// http://dev.mysql.com/doc/internals/en/binary-protocol-resultset-row.html +func (rows *binaryRows) readRow(dest []driver.Value) error { + data, err := rows.mc.readPacket() + if err != nil { + return err + } + + // packet indicator [1 byte] + if data[0] != iOK { + // EOF Packet + if data[0] == iEOF && len(data) == 5 { + rows.mc.status = readStatus(data[3:]) + rows.rs.done = true + if !rows.HasNextResultSet() { + rows.mc = nil + } + return io.EOF + } + mc := rows.mc + rows.mc = nil + + // Error otherwise + return mc.handleErrorPacket(data) + } + + // NULL-bitmap, [(column-count + 7 + 2) / 8 bytes] + pos := 1 + (len(dest)+7+2)>>3 + nullMask := data[1:pos] + + for i := range dest { + // Field is NULL + // (byte >> bit-pos) % 2 == 1 + if ((nullMask[(i+2)>>3] >> uint((i+2)&7)) & 1) == 1 { + dest[i] = nil + continue + } + + // Convert to byte-coded string + switch rows.rs.columns[i].fieldType { + case fieldTypeNULL: + dest[i] = nil + continue + + // Numeric Types + case fieldTypeTiny: + if rows.rs.columns[i].flags&flagUnsigned != 0 { + dest[i] = int64(data[pos]) + } else { + dest[i] = int64(int8(data[pos])) + } + pos++ + continue + + case fieldTypeShort, fieldTypeYear: + if rows.rs.columns[i].flags&flagUnsigned != 0 { + dest[i] = int64(binary.LittleEndian.Uint16(data[pos : pos+2])) + } else { + dest[i] = int64(int16(binary.LittleEndian.Uint16(data[pos : pos+2]))) + } + pos += 2 + continue + + case fieldTypeInt24, fieldTypeLong: + if rows.rs.columns[i].flags&flagUnsigned != 0 { + dest[i] = int64(binary.LittleEndian.Uint32(data[pos : pos+4])) + } else { + dest[i] = int64(int32(binary.LittleEndian.Uint32(data[pos : pos+4]))) + } + pos += 4 + continue + + case fieldTypeLongLong: + if rows.rs.columns[i].flags&flagUnsigned != 0 { + val := binary.LittleEndian.Uint64(data[pos : pos+8]) + if val > math.MaxInt64 { + dest[i] = uint64ToString(val) + } else { + dest[i] = int64(val) + } + } else { + dest[i] = int64(binary.LittleEndian.Uint64(data[pos : pos+8])) + } + pos += 8 + continue + + case fieldTypeFloat: + dest[i] = math.Float32frombits(binary.LittleEndian.Uint32(data[pos : pos+4])) + pos += 4 + continue + + case fieldTypeDouble: + dest[i] = math.Float64frombits(binary.LittleEndian.Uint64(data[pos : pos+8])) + pos += 8 + continue + + // Length coded Binary Strings + case fieldTypeDecimal, fieldTypeNewDecimal, fieldTypeVarChar, + fieldTypeBit, fieldTypeEnum, fieldTypeSet, fieldTypeTinyBLOB, + fieldTypeMediumBLOB, fieldTypeLongBLOB, fieldTypeBLOB, + fieldTypeVarString, fieldTypeString, fieldTypeGeometry, fieldTypeJSON: + var isNull bool + var n int + dest[i], isNull, n, err = readLengthEncodedString(data[pos:]) + pos += n + if err == nil { + if !isNull { + continue + } else { + dest[i] = nil + continue + } + } + return err + + case + fieldTypeDate, fieldTypeNewDate, // Date YYYY-MM-DD + fieldTypeTime, // Time [-][H]HH:MM:SS[.fractal] + fieldTypeTimestamp, fieldTypeDateTime: // Timestamp YYYY-MM-DD HH:MM:SS[.fractal] + + num, isNull, n := readLengthEncodedInteger(data[pos:]) + pos += n + + switch { + case isNull: + dest[i] = nil + continue + case rows.rs.columns[i].fieldType == fieldTypeTime: + // database/sql does not support an equivalent to TIME, return a string + var dstlen uint8 + switch decimals := rows.rs.columns[i].decimals; decimals { + case 0x00, 0x1f: + dstlen = 8 + case 1, 2, 3, 4, 5, 6: + dstlen = 8 + 1 + decimals + default: + return fmt.Errorf( + "protocol error, illegal decimals value %d", + rows.rs.columns[i].decimals, + ) + } + dest[i], err = formatBinaryTime(data[pos:pos+int(num)], dstlen) + case rows.mc.parseTime: + dest[i], err = parseBinaryDateTime(num, data[pos:], rows.mc.cfg.Loc) + default: + var dstlen uint8 + if rows.rs.columns[i].fieldType == fieldTypeDate { + dstlen = 10 + } else { + switch decimals := rows.rs.columns[i].decimals; decimals { + case 0x00, 0x1f: + dstlen = 19 + case 1, 2, 3, 4, 5, 6: + dstlen = 19 + 1 + decimals + default: + return fmt.Errorf( + "protocol error, illegal decimals value %d", + rows.rs.columns[i].decimals, + ) + } + } + dest[i], err = formatBinaryDateTime(data[pos:pos+int(num)], dstlen) + } + + if err == nil { + pos += int(num) + continue + } else { + return err + } + + // Please report if this happens! + default: + return fmt.Errorf("unknown field type %d", rows.rs.columns[i].fieldType) + } + } + + return nil +} diff --git a/vendor/github.com/go-sql-driver/mysql/result.go b/vendor/github.com/go-sql-driver/mysql/result.go new file mode 100644 index 0000000..c6438d0 --- /dev/null +++ b/vendor/github.com/go-sql-driver/mysql/result.go @@ -0,0 +1,22 @@ +// Go MySQL Driver - A MySQL-Driver for Go's database/sql package +// +// Copyright 2012 The Go-MySQL-Driver Authors. All rights reserved. +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this file, +// You can obtain one at http://mozilla.org/MPL/2.0/. + +package mysql + +type mysqlResult struct { + affectedRows int64 + insertId int64 +} + +func (res *mysqlResult) LastInsertId() (int64, error) { + return res.insertId, nil +} + +func (res *mysqlResult) RowsAffected() (int64, error) { + return res.affectedRows, nil +} diff --git a/vendor/github.com/go-sql-driver/mysql/rows.go b/vendor/github.com/go-sql-driver/mysql/rows.go new file mode 100644 index 0000000..d3b1e28 --- /dev/null +++ b/vendor/github.com/go-sql-driver/mysql/rows.go @@ -0,0 +1,216 @@ +// Go MySQL Driver - A MySQL-Driver for Go's database/sql package +// +// Copyright 2012 The Go-MySQL-Driver Authors. All rights reserved. +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this file, +// You can obtain one at http://mozilla.org/MPL/2.0/. + +package mysql + +import ( + "database/sql/driver" + "io" + "math" + "reflect" +) + +type resultSet struct { + columns []mysqlField + columnNames []string + done bool +} + +type mysqlRows struct { + mc *mysqlConn + rs resultSet + finish func() +} + +type binaryRows struct { + mysqlRows +} + +type textRows struct { + mysqlRows +} + +func (rows *mysqlRows) Columns() []string { + if rows.rs.columnNames != nil { + return rows.rs.columnNames + } + + columns := make([]string, len(rows.rs.columns)) + if rows.mc != nil && rows.mc.cfg.ColumnsWithAlias { + for i := range columns { + if tableName := rows.rs.columns[i].tableName; len(tableName) > 0 { + columns[i] = tableName + "." + rows.rs.columns[i].name + } else { + columns[i] = rows.rs.columns[i].name + } + } + } else { + for i := range columns { + columns[i] = rows.rs.columns[i].name + } + } + + rows.rs.columnNames = columns + return columns +} + +func (rows *mysqlRows) ColumnTypeDatabaseTypeName(i int) string { + return rows.rs.columns[i].typeDatabaseName() +} + +// func (rows *mysqlRows) ColumnTypeLength(i int) (length int64, ok bool) { +// return int64(rows.rs.columns[i].length), true +// } + +func (rows *mysqlRows) ColumnTypeNullable(i int) (nullable, ok bool) { + return rows.rs.columns[i].flags&flagNotNULL == 0, true +} + +func (rows *mysqlRows) ColumnTypePrecisionScale(i int) (int64, int64, bool) { + column := rows.rs.columns[i] + decimals := int64(column.decimals) + + switch column.fieldType { + case fieldTypeDecimal, fieldTypeNewDecimal: + if decimals > 0 { + return int64(column.length) - 2, decimals, true + } + return int64(column.length) - 1, decimals, true + case fieldTypeTimestamp, fieldTypeDateTime, fieldTypeTime: + return decimals, decimals, true + case fieldTypeFloat, fieldTypeDouble: + if decimals == 0x1f { + return math.MaxInt64, math.MaxInt64, true + } + return math.MaxInt64, decimals, true + } + + return 0, 0, false +} + +func (rows *mysqlRows) ColumnTypeScanType(i int) reflect.Type { + return rows.rs.columns[i].scanType() +} + +func (rows *mysqlRows) Close() (err error) { + if f := rows.finish; f != nil { + f() + rows.finish = nil + } + + mc := rows.mc + if mc == nil { + return nil + } + if err := mc.error(); err != nil { + return err + } + + // Remove unread packets from stream + if !rows.rs.done { + err = mc.readUntilEOF() + } + if err == nil { + if err = mc.discardResults(); err != nil { + return err + } + } + + rows.mc = nil + return err +} + +func (rows *mysqlRows) HasNextResultSet() (b bool) { + if rows.mc == nil { + return false + } + return rows.mc.status&statusMoreResultsExists != 0 +} + +func (rows *mysqlRows) nextResultSet() (int, error) { + if rows.mc == nil { + return 0, io.EOF + } + if err := rows.mc.error(); err != nil { + return 0, err + } + + // Remove unread packets from stream + if !rows.rs.done { + if err := rows.mc.readUntilEOF(); err != nil { + return 0, err + } + rows.rs.done = true + } + + if !rows.HasNextResultSet() { + rows.mc = nil + return 0, io.EOF + } + rows.rs = resultSet{} + return rows.mc.readResultSetHeaderPacket() +} + +func (rows *mysqlRows) nextNotEmptyResultSet() (int, error) { + for { + resLen, err := rows.nextResultSet() + if err != nil { + return 0, err + } + + if resLen > 0 { + return resLen, nil + } + + rows.rs.done = true + } +} + +func (rows *binaryRows) NextResultSet() error { + resLen, err := rows.nextNotEmptyResultSet() + if err != nil { + return err + } + + rows.rs.columns, err = rows.mc.readColumns(resLen) + return err +} + +func (rows *binaryRows) Next(dest []driver.Value) error { + if mc := rows.mc; mc != nil { + if err := mc.error(); err != nil { + return err + } + + // Fetch next row from stream + return rows.readRow(dest) + } + return io.EOF +} + +func (rows *textRows) NextResultSet() (err error) { + resLen, err := rows.nextNotEmptyResultSet() + if err != nil { + return err + } + + rows.rs.columns, err = rows.mc.readColumns(resLen) + return err +} + +func (rows *textRows) Next(dest []driver.Value) error { + if mc := rows.mc; mc != nil { + if err := mc.error(); err != nil { + return err + } + + // Fetch next row from stream + return rows.readRow(dest) + } + return io.EOF +} diff --git a/vendor/github.com/go-sql-driver/mysql/statement.go b/vendor/github.com/go-sql-driver/mysql/statement.go new file mode 100644 index 0000000..ce7fe4c --- /dev/null +++ b/vendor/github.com/go-sql-driver/mysql/statement.go @@ -0,0 +1,211 @@ +// Go MySQL Driver - A MySQL-Driver for Go's database/sql package +// +// Copyright 2012 The Go-MySQL-Driver Authors. All rights reserved. +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this file, +// You can obtain one at http://mozilla.org/MPL/2.0/. + +package mysql + +import ( + "database/sql/driver" + "fmt" + "io" + "reflect" + "strconv" +) + +type mysqlStmt struct { + mc *mysqlConn + id uint32 + paramCount int +} + +func (stmt *mysqlStmt) Close() error { + if stmt.mc == nil || stmt.mc.closed.IsSet() { + // driver.Stmt.Close can be called more than once, thus this function + // has to be idempotent. + // See also Issue #450 and golang/go#16019. + //errLog.Print(ErrInvalidConn) + return driver.ErrBadConn + } + + err := stmt.mc.writeCommandPacketUint32(comStmtClose, stmt.id) + stmt.mc = nil + return err +} + +func (stmt *mysqlStmt) NumInput() int { + return stmt.paramCount +} + +func (stmt *mysqlStmt) ColumnConverter(idx int) driver.ValueConverter { + return converter{} +} + +func (stmt *mysqlStmt) Exec(args []driver.Value) (driver.Result, error) { + if stmt.mc.closed.IsSet() { + errLog.Print(ErrInvalidConn) + return nil, driver.ErrBadConn + } + // Send command + err := stmt.writeExecutePacket(args) + if err != nil { + return nil, stmt.mc.markBadConn(err) + } + + mc := stmt.mc + + mc.affectedRows = 0 + mc.insertId = 0 + + // Read Result + resLen, err := mc.readResultSetHeaderPacket() + if err != nil { + return nil, err + } + + if resLen > 0 { + // Columns + if err = mc.readUntilEOF(); err != nil { + return nil, err + } + + // Rows + if err := mc.readUntilEOF(); err != nil { + return nil, err + } + } + + if err := mc.discardResults(); err != nil { + return nil, err + } + + return &mysqlResult{ + affectedRows: int64(mc.affectedRows), + insertId: int64(mc.insertId), + }, nil +} + +func (stmt *mysqlStmt) Query(args []driver.Value) (driver.Rows, error) { + return stmt.query(args) +} + +func (stmt *mysqlStmt) query(args []driver.Value) (*binaryRows, error) { + if stmt.mc.closed.IsSet() { + errLog.Print(ErrInvalidConn) + return nil, driver.ErrBadConn + } + // Send command + err := stmt.writeExecutePacket(args) + if err != nil { + return nil, stmt.mc.markBadConn(err) + } + + mc := stmt.mc + + // Read Result + resLen, err := mc.readResultSetHeaderPacket() + if err != nil { + return nil, err + } + + rows := new(binaryRows) + + if resLen > 0 { + rows.mc = mc + rows.rs.columns, err = mc.readColumns(resLen) + } else { + rows.rs.done = true + + switch err := rows.NextResultSet(); err { + case nil, io.EOF: + return rows, nil + default: + return nil, err + } + } + + return rows, err +} + +type converter struct{} + +// ConvertValue mirrors the reference/default converter in database/sql/driver +// with _one_ exception. We support uint64 with their high bit and the default +// implementation does not. This function should be kept in sync with +// database/sql/driver defaultConverter.ConvertValue() except for that +// deliberate difference. +func (c converter) ConvertValue(v interface{}) (driver.Value, error) { + if driver.IsValue(v) { + return v, nil + } + + if vr, ok := v.(driver.Valuer); ok { + sv, err := callValuerValue(vr) + if err != nil { + return nil, err + } + if !driver.IsValue(sv) { + return nil, fmt.Errorf("non-Value type %T returned from Value", sv) + } + return sv, nil + } + + rv := reflect.ValueOf(v) + switch rv.Kind() { + case reflect.Ptr: + // indirect pointers + if rv.IsNil() { + return nil, nil + } else { + return c.ConvertValue(rv.Elem().Interface()) + } + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + return rv.Int(), nil + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32: + return int64(rv.Uint()), nil + case reflect.Uint64: + u64 := rv.Uint() + if u64 >= 1<<63 { + return strconv.FormatUint(u64, 10), nil + } + return int64(u64), nil + case reflect.Float32, reflect.Float64: + return rv.Float(), nil + case reflect.Bool: + return rv.Bool(), nil + case reflect.Slice: + ek := rv.Type().Elem().Kind() + if ek == reflect.Uint8 { + return rv.Bytes(), nil + } + return nil, fmt.Errorf("unsupported type %T, a slice of %s", v, ek) + case reflect.String: + return rv.String(), nil + } + return nil, fmt.Errorf("unsupported type %T, a %s", v, rv.Kind()) +} + +var valuerReflectType = reflect.TypeOf((*driver.Valuer)(nil)).Elem() + +// callValuerValue returns vr.Value(), with one exception: +// If vr.Value is an auto-generated method on a pointer type and the +// pointer is nil, it would panic at runtime in the panicwrap +// method. Treat it like nil instead. +// +// This is so people can implement driver.Value on value types and +// still use nil pointers to those types to mean nil/NULL, just like +// string/*string. +// +// This is an exact copy of the same-named unexported function from the +// database/sql package. +func callValuerValue(vr driver.Valuer) (v driver.Value, err error) { + if rv := reflect.ValueOf(vr); rv.Kind() == reflect.Ptr && + rv.IsNil() && + rv.Type().Elem().Implements(valuerReflectType) { + return nil, nil + } + return vr.Value() +} diff --git a/vendor/github.com/go-sql-driver/mysql/transaction.go b/vendor/github.com/go-sql-driver/mysql/transaction.go new file mode 100644 index 0000000..417d727 --- /dev/null +++ b/vendor/github.com/go-sql-driver/mysql/transaction.go @@ -0,0 +1,31 @@ +// Go MySQL Driver - A MySQL-Driver for Go's database/sql package +// +// Copyright 2012 The Go-MySQL-Driver Authors. All rights reserved. +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this file, +// You can obtain one at http://mozilla.org/MPL/2.0/. + +package mysql + +type mysqlTx struct { + mc *mysqlConn +} + +func (tx *mysqlTx) Commit() (err error) { + if tx.mc == nil || tx.mc.closed.IsSet() { + return ErrInvalidConn + } + err = tx.mc.exec("COMMIT") + tx.mc = nil + return +} + +func (tx *mysqlTx) Rollback() (err error) { + if tx.mc == nil || tx.mc.closed.IsSet() { + return ErrInvalidConn + } + err = tx.mc.exec("ROLLBACK") + tx.mc = nil + return +} diff --git a/vendor/github.com/go-sql-driver/mysql/utils.go b/vendor/github.com/go-sql-driver/mysql/utils.go new file mode 100644 index 0000000..201691f --- /dev/null +++ b/vendor/github.com/go-sql-driver/mysql/utils.go @@ -0,0 +1,755 @@ +// Go MySQL Driver - A MySQL-Driver for Go's database/sql package +// +// Copyright 2012 The Go-MySQL-Driver Authors. All rights reserved. +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this file, +// You can obtain one at http://mozilla.org/MPL/2.0/. + +package mysql + +import ( + "crypto/tls" + "database/sql" + "database/sql/driver" + "encoding/binary" + "errors" + "fmt" + "io" + "strconv" + "strings" + "sync" + "sync/atomic" + "time" +) + +// Registry for custom tls.Configs +var ( + tlsConfigLock sync.RWMutex + tlsConfigRegistry map[string]*tls.Config +) + +// RegisterTLSConfig registers a custom tls.Config to be used with sql.Open. +// Use the key as a value in the DSN where tls=value. +// +// Note: The provided tls.Config is exclusively owned by the driver after +// registering it. +// +// rootCertPool := x509.NewCertPool() +// pem, err := ioutil.ReadFile("/path/ca-cert.pem") +// if err != nil { +// log.Fatal(err) +// } +// if ok := rootCertPool.AppendCertsFromPEM(pem); !ok { +// log.Fatal("Failed to append PEM.") +// } +// clientCert := make([]tls.Certificate, 0, 1) +// certs, err := tls.LoadX509KeyPair("/path/client-cert.pem", "/path/client-key.pem") +// if err != nil { +// log.Fatal(err) +// } +// clientCert = append(clientCert, certs) +// mysql.RegisterTLSConfig("custom", &tls.Config{ +// RootCAs: rootCertPool, +// Certificates: clientCert, +// }) +// db, err := sql.Open("mysql", "user@tcp(localhost:3306)/test?tls=custom") +// +func RegisterTLSConfig(key string, config *tls.Config) error { + if _, isBool := readBool(key); isBool || strings.ToLower(key) == "skip-verify" { + return fmt.Errorf("key '%s' is reserved", key) + } + + tlsConfigLock.Lock() + if tlsConfigRegistry == nil { + tlsConfigRegistry = make(map[string]*tls.Config) + } + + tlsConfigRegistry[key] = config + tlsConfigLock.Unlock() + return nil +} + +// DeregisterTLSConfig removes the tls.Config associated with key. +func DeregisterTLSConfig(key string) { + tlsConfigLock.Lock() + if tlsConfigRegistry != nil { + delete(tlsConfigRegistry, key) + } + tlsConfigLock.Unlock() +} + +func getTLSConfigClone(key string) (config *tls.Config) { + tlsConfigLock.RLock() + if v, ok := tlsConfigRegistry[key]; ok { + config = v.Clone() + } + tlsConfigLock.RUnlock() + return +} + +// Returns the bool value of the input. +// The 2nd return value indicates if the input was a valid bool value +func readBool(input string) (value bool, valid bool) { + switch input { + case "1", "true", "TRUE", "True": + return true, true + case "0", "false", "FALSE", "False": + return false, true + } + + // Not a valid bool value + return +} + +/****************************************************************************** +* Time related utils * +******************************************************************************/ + +// NullTime represents a time.Time that may be NULL. +// NullTime implements the Scanner interface so +// it can be used as a scan destination: +// +// var nt NullTime +// err := db.QueryRow("SELECT time FROM foo WHERE id=?", id).Scan(&nt) +// ... +// if nt.Valid { +// // use nt.Time +// } else { +// // NULL value +// } +// +// This NullTime implementation is not driver-specific +type NullTime struct { + Time time.Time + Valid bool // Valid is true if Time is not NULL +} + +// Scan implements the Scanner interface. +// The value type must be time.Time or string / []byte (formatted time-string), +// otherwise Scan fails. +func (nt *NullTime) Scan(value interface{}) (err error) { + if value == nil { + nt.Time, nt.Valid = time.Time{}, false + return + } + + switch v := value.(type) { + case time.Time: + nt.Time, nt.Valid = v, true + return + case []byte: + nt.Time, err = parseDateTime(string(v), time.UTC) + nt.Valid = (err == nil) + return + case string: + nt.Time, err = parseDateTime(v, time.UTC) + nt.Valid = (err == nil) + return + } + + nt.Valid = false + return fmt.Errorf("Can't convert %T to time.Time", value) +} + +// Value implements the driver Valuer interface. +func (nt NullTime) Value() (driver.Value, error) { + if !nt.Valid { + return nil, nil + } + return nt.Time, nil +} + +func parseDateTime(str string, loc *time.Location) (t time.Time, err error) { + base := "0000-00-00 00:00:00.0000000" + switch len(str) { + case 10, 19, 21, 22, 23, 24, 25, 26: // up to "YYYY-MM-DD HH:MM:SS.MMMMMM" + if str == base[:len(str)] { + return + } + t, err = time.Parse(timeFormat[:len(str)], str) + default: + err = fmt.Errorf("invalid time string: %s", str) + return + } + + // Adjust location + if err == nil && loc != time.UTC { + y, mo, d := t.Date() + h, mi, s := t.Clock() + t, err = time.Date(y, mo, d, h, mi, s, t.Nanosecond(), loc), nil + } + + return +} + +func parseBinaryDateTime(num uint64, data []byte, loc *time.Location) (driver.Value, error) { + switch num { + case 0: + return time.Time{}, nil + case 4: + return time.Date( + int(binary.LittleEndian.Uint16(data[:2])), // year + time.Month(data[2]), // month + int(data[3]), // day + 0, 0, 0, 0, + loc, + ), nil + case 7: + return time.Date( + int(binary.LittleEndian.Uint16(data[:2])), // year + time.Month(data[2]), // month + int(data[3]), // day + int(data[4]), // hour + int(data[5]), // minutes + int(data[6]), // seconds + 0, + loc, + ), nil + case 11: + return time.Date( + int(binary.LittleEndian.Uint16(data[:2])), // year + time.Month(data[2]), // month + int(data[3]), // day + int(data[4]), // hour + int(data[5]), // minutes + int(data[6]), // seconds + int(binary.LittleEndian.Uint32(data[7:11]))*1000, // nanoseconds + loc, + ), nil + } + return nil, fmt.Errorf("invalid DATETIME packet length %d", num) +} + +// zeroDateTime is used in formatBinaryDateTime to avoid an allocation +// if the DATE or DATETIME has the zero value. +// It must never be changed. +// The current behavior depends on database/sql copying the result. +var zeroDateTime = []byte("0000-00-00 00:00:00.000000") + +const digits01 = "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" +const digits10 = "0000000000111111111122222222223333333333444444444455555555556666666666777777777788888888889999999999" + +func appendMicrosecs(dst, src []byte, decimals int) []byte { + if decimals <= 0 { + return dst + } + if len(src) == 0 { + return append(dst, ".000000"[:decimals+1]...) + } + + microsecs := binary.LittleEndian.Uint32(src[:4]) + p1 := byte(microsecs / 10000) + microsecs -= 10000 * uint32(p1) + p2 := byte(microsecs / 100) + microsecs -= 100 * uint32(p2) + p3 := byte(microsecs) + + switch decimals { + default: + return append(dst, '.', + digits10[p1], digits01[p1], + digits10[p2], digits01[p2], + digits10[p3], digits01[p3], + ) + case 1: + return append(dst, '.', + digits10[p1], + ) + case 2: + return append(dst, '.', + digits10[p1], digits01[p1], + ) + case 3: + return append(dst, '.', + digits10[p1], digits01[p1], + digits10[p2], + ) + case 4: + return append(dst, '.', + digits10[p1], digits01[p1], + digits10[p2], digits01[p2], + ) + case 5: + return append(dst, '.', + digits10[p1], digits01[p1], + digits10[p2], digits01[p2], + digits10[p3], + ) + } +} + +func formatBinaryDateTime(src []byte, length uint8) (driver.Value, error) { + // length expects the deterministic length of the zero value, + // negative time and 100+ hours are automatically added if needed + if len(src) == 0 { + return zeroDateTime[:length], nil + } + var dst []byte // return value + var p1, p2, p3 byte // current digit pair + + switch length { + case 10, 19, 21, 22, 23, 24, 25, 26: + default: + t := "DATE" + if length > 10 { + t += "TIME" + } + return nil, fmt.Errorf("illegal %s length %d", t, length) + } + switch len(src) { + case 4, 7, 11: + default: + t := "DATE" + if length > 10 { + t += "TIME" + } + return nil, fmt.Errorf("illegal %s packet length %d", t, len(src)) + } + dst = make([]byte, 0, length) + // start with the date + year := binary.LittleEndian.Uint16(src[:2]) + pt := year / 100 + p1 = byte(year - 100*uint16(pt)) + p2, p3 = src[2], src[3] + dst = append(dst, + digits10[pt], digits01[pt], + digits10[p1], digits01[p1], '-', + digits10[p2], digits01[p2], '-', + digits10[p3], digits01[p3], + ) + if length == 10 { + return dst, nil + } + if len(src) == 4 { + return append(dst, zeroDateTime[10:length]...), nil + } + dst = append(dst, ' ') + p1 = src[4] // hour + src = src[5:] + + // p1 is 2-digit hour, src is after hour + p2, p3 = src[0], src[1] + dst = append(dst, + digits10[p1], digits01[p1], ':', + digits10[p2], digits01[p2], ':', + digits10[p3], digits01[p3], + ) + return appendMicrosecs(dst, src[2:], int(length)-20), nil +} + +func formatBinaryTime(src []byte, length uint8) (driver.Value, error) { + // length expects the deterministic length of the zero value, + // negative time and 100+ hours are automatically added if needed + if len(src) == 0 { + return zeroDateTime[11 : 11+length], nil + } + var dst []byte // return value + + switch length { + case + 8, // time (can be up to 10 when negative and 100+ hours) + 10, 11, 12, 13, 14, 15: // time with fractional seconds + default: + return nil, fmt.Errorf("illegal TIME length %d", length) + } + switch len(src) { + case 8, 12: + default: + return nil, fmt.Errorf("invalid TIME packet length %d", len(src)) + } + // +2 to enable negative time and 100+ hours + dst = make([]byte, 0, length+2) + if src[0] == 1 { + dst = append(dst, '-') + } + days := binary.LittleEndian.Uint32(src[1:5]) + hours := int64(days)*24 + int64(src[5]) + + if hours >= 100 { + dst = strconv.AppendInt(dst, hours, 10) + } else { + dst = append(dst, digits10[hours], digits01[hours]) + } + + min, sec := src[6], src[7] + dst = append(dst, ':', + digits10[min], digits01[min], ':', + digits10[sec], digits01[sec], + ) + return appendMicrosecs(dst, src[8:], int(length)-9), nil +} + +/****************************************************************************** +* Convert from and to bytes * +******************************************************************************/ + +func uint64ToBytes(n uint64) []byte { + return []byte{ + byte(n), + byte(n >> 8), + byte(n >> 16), + byte(n >> 24), + byte(n >> 32), + byte(n >> 40), + byte(n >> 48), + byte(n >> 56), + } +} + +func uint64ToString(n uint64) []byte { + var a [20]byte + i := 20 + + // U+0030 = 0 + // ... + // U+0039 = 9 + + var q uint64 + for n >= 10 { + i-- + q = n / 10 + a[i] = uint8(n-q*10) + 0x30 + n = q + } + + i-- + a[i] = uint8(n) + 0x30 + + return a[i:] +} + +// treats string value as unsigned integer representation +func stringToInt(b []byte) int { + val := 0 + for i := range b { + val *= 10 + val += int(b[i] - 0x30) + } + return val +} + +// returns the string read as a bytes slice, wheter the value is NULL, +// the number of bytes read and an error, in case the string is longer than +// the input slice +func readLengthEncodedString(b []byte) ([]byte, bool, int, error) { + // Get length + num, isNull, n := readLengthEncodedInteger(b) + if num < 1 { + return b[n:n], isNull, n, nil + } + + n += int(num) + + // Check data length + if len(b) >= n { + return b[n-int(num) : n : n], false, n, nil + } + return nil, false, n, io.EOF +} + +// returns the number of bytes skipped and an error, in case the string is +// longer than the input slice +func skipLengthEncodedString(b []byte) (int, error) { + // Get length + num, _, n := readLengthEncodedInteger(b) + if num < 1 { + return n, nil + } + + n += int(num) + + // Check data length + if len(b) >= n { + return n, nil + } + return n, io.EOF +} + +// returns the number read, whether the value is NULL and the number of bytes read +func readLengthEncodedInteger(b []byte) (uint64, bool, int) { + // See issue #349 + if len(b) == 0 { + return 0, true, 1 + } + + switch b[0] { + // 251: NULL + case 0xfb: + return 0, true, 1 + + // 252: value of following 2 + case 0xfc: + return uint64(b[1]) | uint64(b[2])<<8, false, 3 + + // 253: value of following 3 + case 0xfd: + return uint64(b[1]) | uint64(b[2])<<8 | uint64(b[3])<<16, false, 4 + + // 254: value of following 8 + case 0xfe: + return uint64(b[1]) | uint64(b[2])<<8 | uint64(b[3])<<16 | + uint64(b[4])<<24 | uint64(b[5])<<32 | uint64(b[6])<<40 | + uint64(b[7])<<48 | uint64(b[8])<<56, + false, 9 + } + + // 0-250: value of first byte + return uint64(b[0]), false, 1 +} + +// encodes a uint64 value and appends it to the given bytes slice +func appendLengthEncodedInteger(b []byte, n uint64) []byte { + switch { + case n <= 250: + return append(b, byte(n)) + + case n <= 0xffff: + return append(b, 0xfc, byte(n), byte(n>>8)) + + case n <= 0xffffff: + return append(b, 0xfd, byte(n), byte(n>>8), byte(n>>16)) + } + return append(b, 0xfe, byte(n), byte(n>>8), byte(n>>16), byte(n>>24), + byte(n>>32), byte(n>>40), byte(n>>48), byte(n>>56)) +} + +// reserveBuffer checks cap(buf) and expand buffer to len(buf) + appendSize. +// If cap(buf) is not enough, reallocate new buffer. +func reserveBuffer(buf []byte, appendSize int) []byte { + newSize := len(buf) + appendSize + if cap(buf) < newSize { + // Grow buffer exponentially + newBuf := make([]byte, len(buf)*2+appendSize) + copy(newBuf, buf) + buf = newBuf + } + return buf[:newSize] +} + +// escapeBytesBackslash escapes []byte with backslashes (\) +// This escapes the contents of a string (provided as []byte) by adding backslashes before special +// characters, and turning others into specific escape sequences, such as +// turning newlines into \n and null bytes into \0. +// https://github.com/mysql/mysql-server/blob/mysql-5.7.5/mysys/charset.c#L823-L932 +func escapeBytesBackslash(buf, v []byte) []byte { + pos := len(buf) + buf = reserveBuffer(buf, len(v)*2) + + for _, c := range v { + switch c { + case '\x00': + buf[pos] = '\\' + buf[pos+1] = '0' + pos += 2 + case '\n': + buf[pos] = '\\' + buf[pos+1] = 'n' + pos += 2 + case '\r': + buf[pos] = '\\' + buf[pos+1] = 'r' + pos += 2 + case '\x1a': + buf[pos] = '\\' + buf[pos+1] = 'Z' + pos += 2 + case '\'': + buf[pos] = '\\' + buf[pos+1] = '\'' + pos += 2 + case '"': + buf[pos] = '\\' + buf[pos+1] = '"' + pos += 2 + case '\\': + buf[pos] = '\\' + buf[pos+1] = '\\' + pos += 2 + default: + buf[pos] = c + pos++ + } + } + + return buf[:pos] +} + +// escapeStringBackslash is similar to escapeBytesBackslash but for string. +func escapeStringBackslash(buf []byte, v string) []byte { + pos := len(buf) + buf = reserveBuffer(buf, len(v)*2) + + for i := 0; i < len(v); i++ { + c := v[i] + switch c { + case '\x00': + buf[pos] = '\\' + buf[pos+1] = '0' + pos += 2 + case '\n': + buf[pos] = '\\' + buf[pos+1] = 'n' + pos += 2 + case '\r': + buf[pos] = '\\' + buf[pos+1] = 'r' + pos += 2 + case '\x1a': + buf[pos] = '\\' + buf[pos+1] = 'Z' + pos += 2 + case '\'': + buf[pos] = '\\' + buf[pos+1] = '\'' + pos += 2 + case '"': + buf[pos] = '\\' + buf[pos+1] = '"' + pos += 2 + case '\\': + buf[pos] = '\\' + buf[pos+1] = '\\' + pos += 2 + default: + buf[pos] = c + pos++ + } + } + + return buf[:pos] +} + +// escapeBytesQuotes escapes apostrophes in []byte by doubling them up. +// This escapes the contents of a string by doubling up any apostrophes that +// it contains. This is used when the NO_BACKSLASH_ESCAPES SQL_MODE is in +// effect on the server. +// https://github.com/mysql/mysql-server/blob/mysql-5.7.5/mysys/charset.c#L963-L1038 +func escapeBytesQuotes(buf, v []byte) []byte { + pos := len(buf) + buf = reserveBuffer(buf, len(v)*2) + + for _, c := range v { + if c == '\'' { + buf[pos] = '\'' + buf[pos+1] = '\'' + pos += 2 + } else { + buf[pos] = c + pos++ + } + } + + return buf[:pos] +} + +// escapeStringQuotes is similar to escapeBytesQuotes but for string. +func escapeStringQuotes(buf []byte, v string) []byte { + pos := len(buf) + buf = reserveBuffer(buf, len(v)*2) + + for i := 0; i < len(v); i++ { + c := v[i] + if c == '\'' { + buf[pos] = '\'' + buf[pos+1] = '\'' + pos += 2 + } else { + buf[pos] = c + pos++ + } + } + + return buf[:pos] +} + +/****************************************************************************** +* Sync utils * +******************************************************************************/ + +// noCopy may be embedded into structs which must not be copied +// after the first use. +// +// See https://github.com/golang/go/issues/8005#issuecomment-190753527 +// for details. +type noCopy struct{} + +// Lock is a no-op used by -copylocks checker from `go vet`. +func (*noCopy) Lock() {} + +// atomicBool is a wrapper around uint32 for usage as a boolean value with +// atomic access. +type atomicBool struct { + _noCopy noCopy + value uint32 +} + +// IsSet returns whether the current boolean value is true +func (ab *atomicBool) IsSet() bool { + return atomic.LoadUint32(&ab.value) > 0 +} + +// Set sets the value of the bool regardless of the previous value +func (ab *atomicBool) Set(value bool) { + if value { + atomic.StoreUint32(&ab.value, 1) + } else { + atomic.StoreUint32(&ab.value, 0) + } +} + +// TrySet sets the value of the bool and returns whether the value changed +func (ab *atomicBool) TrySet(value bool) bool { + if value { + return atomic.SwapUint32(&ab.value, 1) == 0 + } + return atomic.SwapUint32(&ab.value, 0) > 0 +} + +// atomicError is a wrapper for atomically accessed error values +type atomicError struct { + _noCopy noCopy + value atomic.Value +} + +// Set sets the error value regardless of the previous value. +// The value must not be nil +func (ae *atomicError) Set(value error) { + ae.value.Store(value) +} + +// Value returns the current error value +func (ae *atomicError) Value() error { + if v := ae.value.Load(); v != nil { + // this will panic if the value doesn't implement the error interface + return v.(error) + } + return nil +} + +func namedValueToValue(named []driver.NamedValue) ([]driver.Value, error) { + dargs := make([]driver.Value, len(named)) + for n, param := range named { + if len(param.Name) > 0 { + // TODO: support the use of Named Parameters #561 + return nil, errors.New("mysql: driver does not support the use of Named Parameters") + } + dargs[n] = param.Value + } + return dargs, nil +} + +func mapIsolationLevel(level driver.IsolationLevel) (string, error) { + switch sql.IsolationLevel(level) { + case sql.LevelRepeatableRead: + return "REPEATABLE READ", nil + case sql.LevelReadCommitted: + return "READ COMMITTED", nil + case sql.LevelReadUncommitted: + return "READ UNCOMMITTED", nil + case sql.LevelSerializable: + return "SERIALIZABLE", nil + default: + return "", fmt.Errorf("mysql: unsupported isolation level: %v", level) + } +} diff --git a/vendor/github.com/golang/protobuf/LICENSE b/vendor/github.com/golang/protobuf/LICENSE new file mode 100644 index 0000000..0f64693 --- /dev/null +++ b/vendor/github.com/golang/protobuf/LICENSE @@ -0,0 +1,28 @@ +Copyright 2010 The Go Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + diff --git a/vendor/github.com/golang/protobuf/proto/clone.go b/vendor/github.com/golang/protobuf/proto/clone.go new file mode 100644 index 0000000..3cd3249 --- /dev/null +++ b/vendor/github.com/golang/protobuf/proto/clone.go @@ -0,0 +1,253 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2011 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Protocol buffer deep copy and merge. +// TODO: RawMessage. + +package proto + +import ( + "fmt" + "log" + "reflect" + "strings" +) + +// Clone returns a deep copy of a protocol buffer. +func Clone(src Message) Message { + in := reflect.ValueOf(src) + if in.IsNil() { + return src + } + out := reflect.New(in.Type().Elem()) + dst := out.Interface().(Message) + Merge(dst, src) + return dst +} + +// Merger is the interface representing objects that can merge messages of the same type. +type Merger interface { + // Merge merges src into this message. + // Required and optional fields that are set in src will be set to that value in dst. + // Elements of repeated fields will be appended. + // + // Merge may panic if called with a different argument type than the receiver. + Merge(src Message) +} + +// generatedMerger is the custom merge method that generated protos will have. +// We must add this method since a generate Merge method will conflict with +// many existing protos that have a Merge data field already defined. +type generatedMerger interface { + XXX_Merge(src Message) +} + +// Merge merges src into dst. +// Required and optional fields that are set in src will be set to that value in dst. +// Elements of repeated fields will be appended. +// Merge panics if src and dst are not the same type, or if dst is nil. +func Merge(dst, src Message) { + if m, ok := dst.(Merger); ok { + m.Merge(src) + return + } + + in := reflect.ValueOf(src) + out := reflect.ValueOf(dst) + if out.IsNil() { + panic("proto: nil destination") + } + if in.Type() != out.Type() { + panic(fmt.Sprintf("proto.Merge(%T, %T) type mismatch", dst, src)) + } + if in.IsNil() { + return // Merge from nil src is a noop + } + if m, ok := dst.(generatedMerger); ok { + m.XXX_Merge(src) + return + } + mergeStruct(out.Elem(), in.Elem()) +} + +func mergeStruct(out, in reflect.Value) { + sprop := GetProperties(in.Type()) + for i := 0; i < in.NumField(); i++ { + f := in.Type().Field(i) + if strings.HasPrefix(f.Name, "XXX_") { + continue + } + mergeAny(out.Field(i), in.Field(i), false, sprop.Prop[i]) + } + + if emIn, err := extendable(in.Addr().Interface()); err == nil { + emOut, _ := extendable(out.Addr().Interface()) + mIn, muIn := emIn.extensionsRead() + if mIn != nil { + mOut := emOut.extensionsWrite() + muIn.Lock() + mergeExtension(mOut, mIn) + muIn.Unlock() + } + } + + uf := in.FieldByName("XXX_unrecognized") + if !uf.IsValid() { + return + } + uin := uf.Bytes() + if len(uin) > 0 { + out.FieldByName("XXX_unrecognized").SetBytes(append([]byte(nil), uin...)) + } +} + +// mergeAny performs a merge between two values of the same type. +// viaPtr indicates whether the values were indirected through a pointer (implying proto2). +// prop is set if this is a struct field (it may be nil). +func mergeAny(out, in reflect.Value, viaPtr bool, prop *Properties) { + if in.Type() == protoMessageType { + if !in.IsNil() { + if out.IsNil() { + out.Set(reflect.ValueOf(Clone(in.Interface().(Message)))) + } else { + Merge(out.Interface().(Message), in.Interface().(Message)) + } + } + return + } + switch in.Kind() { + case reflect.Bool, reflect.Float32, reflect.Float64, reflect.Int32, reflect.Int64, + reflect.String, reflect.Uint32, reflect.Uint64: + if !viaPtr && isProto3Zero(in) { + return + } + out.Set(in) + case reflect.Interface: + // Probably a oneof field; copy non-nil values. + if in.IsNil() { + return + } + // Allocate destination if it is not set, or set to a different type. + // Otherwise we will merge as normal. + if out.IsNil() || out.Elem().Type() != in.Elem().Type() { + out.Set(reflect.New(in.Elem().Elem().Type())) // interface -> *T -> T -> new(T) + } + mergeAny(out.Elem(), in.Elem(), false, nil) + case reflect.Map: + if in.Len() == 0 { + return + } + if out.IsNil() { + out.Set(reflect.MakeMap(in.Type())) + } + // For maps with value types of *T or []byte we need to deep copy each value. + elemKind := in.Type().Elem().Kind() + for _, key := range in.MapKeys() { + var val reflect.Value + switch elemKind { + case reflect.Ptr: + val = reflect.New(in.Type().Elem().Elem()) + mergeAny(val, in.MapIndex(key), false, nil) + case reflect.Slice: + val = in.MapIndex(key) + val = reflect.ValueOf(append([]byte{}, val.Bytes()...)) + default: + val = in.MapIndex(key) + } + out.SetMapIndex(key, val) + } + case reflect.Ptr: + if in.IsNil() { + return + } + if out.IsNil() { + out.Set(reflect.New(in.Elem().Type())) + } + mergeAny(out.Elem(), in.Elem(), true, nil) + case reflect.Slice: + if in.IsNil() { + return + } + if in.Type().Elem().Kind() == reflect.Uint8 { + // []byte is a scalar bytes field, not a repeated field. + + // Edge case: if this is in a proto3 message, a zero length + // bytes field is considered the zero value, and should not + // be merged. + if prop != nil && prop.proto3 && in.Len() == 0 { + return + } + + // Make a deep copy. + // Append to []byte{} instead of []byte(nil) so that we never end up + // with a nil result. + out.SetBytes(append([]byte{}, in.Bytes()...)) + return + } + n := in.Len() + if out.IsNil() { + out.Set(reflect.MakeSlice(in.Type(), 0, n)) + } + switch in.Type().Elem().Kind() { + case reflect.Bool, reflect.Float32, reflect.Float64, reflect.Int32, reflect.Int64, + reflect.String, reflect.Uint32, reflect.Uint64: + out.Set(reflect.AppendSlice(out, in)) + default: + for i := 0; i < n; i++ { + x := reflect.Indirect(reflect.New(in.Type().Elem())) + mergeAny(x, in.Index(i), false, nil) + out.Set(reflect.Append(out, x)) + } + } + case reflect.Struct: + mergeStruct(out, in) + default: + // unknown type, so not a protocol buffer + log.Printf("proto: don't know how to copy %v", in) + } +} + +func mergeExtension(out, in map[int32]Extension) { + for extNum, eIn := range in { + eOut := Extension{desc: eIn.desc} + if eIn.value != nil { + v := reflect.New(reflect.TypeOf(eIn.value)).Elem() + mergeAny(v, reflect.ValueOf(eIn.value), false, nil) + eOut.value = v.Interface() + } + if eIn.enc != nil { + eOut.enc = make([]byte, len(eIn.enc)) + copy(eOut.enc, eIn.enc) + } + + out[extNum] = eOut + } +} diff --git a/vendor/github.com/golang/protobuf/proto/decode.go b/vendor/github.com/golang/protobuf/proto/decode.go new file mode 100644 index 0000000..63b0f08 --- /dev/null +++ b/vendor/github.com/golang/protobuf/proto/decode.go @@ -0,0 +1,427 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +/* + * Routines for decoding protocol buffer data to construct in-memory representations. + */ + +import ( + "errors" + "fmt" + "io" +) + +// errOverflow is returned when an integer is too large to be represented. +var errOverflow = errors.New("proto: integer overflow") + +// ErrInternalBadWireType is returned by generated code when an incorrect +// wire type is encountered. It does not get returned to user code. +var ErrInternalBadWireType = errors.New("proto: internal error: bad wiretype for oneof") + +// DecodeVarint reads a varint-encoded integer from the slice. +// It returns the integer and the number of bytes consumed, or +// zero if there is not enough. +// This is the format for the +// int32, int64, uint32, uint64, bool, and enum +// protocol buffer types. +func DecodeVarint(buf []byte) (x uint64, n int) { + for shift := uint(0); shift < 64; shift += 7 { + if n >= len(buf) { + return 0, 0 + } + b := uint64(buf[n]) + n++ + x |= (b & 0x7F) << shift + if (b & 0x80) == 0 { + return x, n + } + } + + // The number is too large to represent in a 64-bit value. + return 0, 0 +} + +func (p *Buffer) decodeVarintSlow() (x uint64, err error) { + i := p.index + l := len(p.buf) + + for shift := uint(0); shift < 64; shift += 7 { + if i >= l { + err = io.ErrUnexpectedEOF + return + } + b := p.buf[i] + i++ + x |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + p.index = i + return + } + } + + // The number is too large to represent in a 64-bit value. + err = errOverflow + return +} + +// DecodeVarint reads a varint-encoded integer from the Buffer. +// This is the format for the +// int32, int64, uint32, uint64, bool, and enum +// protocol buffer types. +func (p *Buffer) DecodeVarint() (x uint64, err error) { + i := p.index + buf := p.buf + + if i >= len(buf) { + return 0, io.ErrUnexpectedEOF + } else if buf[i] < 0x80 { + p.index++ + return uint64(buf[i]), nil + } else if len(buf)-i < 10 { + return p.decodeVarintSlow() + } + + var b uint64 + // we already checked the first byte + x = uint64(buf[i]) - 0x80 + i++ + + b = uint64(buf[i]) + i++ + x += b << 7 + if b&0x80 == 0 { + goto done + } + x -= 0x80 << 7 + + b = uint64(buf[i]) + i++ + x += b << 14 + if b&0x80 == 0 { + goto done + } + x -= 0x80 << 14 + + b = uint64(buf[i]) + i++ + x += b << 21 + if b&0x80 == 0 { + goto done + } + x -= 0x80 << 21 + + b = uint64(buf[i]) + i++ + x += b << 28 + if b&0x80 == 0 { + goto done + } + x -= 0x80 << 28 + + b = uint64(buf[i]) + i++ + x += b << 35 + if b&0x80 == 0 { + goto done + } + x -= 0x80 << 35 + + b = uint64(buf[i]) + i++ + x += b << 42 + if b&0x80 == 0 { + goto done + } + x -= 0x80 << 42 + + b = uint64(buf[i]) + i++ + x += b << 49 + if b&0x80 == 0 { + goto done + } + x -= 0x80 << 49 + + b = uint64(buf[i]) + i++ + x += b << 56 + if b&0x80 == 0 { + goto done + } + x -= 0x80 << 56 + + b = uint64(buf[i]) + i++ + x += b << 63 + if b&0x80 == 0 { + goto done + } + + return 0, errOverflow + +done: + p.index = i + return x, nil +} + +// DecodeFixed64 reads a 64-bit integer from the Buffer. +// This is the format for the +// fixed64, sfixed64, and double protocol buffer types. +func (p *Buffer) DecodeFixed64() (x uint64, err error) { + // x, err already 0 + i := p.index + 8 + if i < 0 || i > len(p.buf) { + err = io.ErrUnexpectedEOF + return + } + p.index = i + + x = uint64(p.buf[i-8]) + x |= uint64(p.buf[i-7]) << 8 + x |= uint64(p.buf[i-6]) << 16 + x |= uint64(p.buf[i-5]) << 24 + x |= uint64(p.buf[i-4]) << 32 + x |= uint64(p.buf[i-3]) << 40 + x |= uint64(p.buf[i-2]) << 48 + x |= uint64(p.buf[i-1]) << 56 + return +} + +// DecodeFixed32 reads a 32-bit integer from the Buffer. +// This is the format for the +// fixed32, sfixed32, and float protocol buffer types. +func (p *Buffer) DecodeFixed32() (x uint64, err error) { + // x, err already 0 + i := p.index + 4 + if i < 0 || i > len(p.buf) { + err = io.ErrUnexpectedEOF + return + } + p.index = i + + x = uint64(p.buf[i-4]) + x |= uint64(p.buf[i-3]) << 8 + x |= uint64(p.buf[i-2]) << 16 + x |= uint64(p.buf[i-1]) << 24 + return +} + +// DecodeZigzag64 reads a zigzag-encoded 64-bit integer +// from the Buffer. +// This is the format used for the sint64 protocol buffer type. +func (p *Buffer) DecodeZigzag64() (x uint64, err error) { + x, err = p.DecodeVarint() + if err != nil { + return + } + x = (x >> 1) ^ uint64((int64(x&1)<<63)>>63) + return +} + +// DecodeZigzag32 reads a zigzag-encoded 32-bit integer +// from the Buffer. +// This is the format used for the sint32 protocol buffer type. +func (p *Buffer) DecodeZigzag32() (x uint64, err error) { + x, err = p.DecodeVarint() + if err != nil { + return + } + x = uint64((uint32(x) >> 1) ^ uint32((int32(x&1)<<31)>>31)) + return +} + +// DecodeRawBytes reads a count-delimited byte buffer from the Buffer. +// This is the format used for the bytes protocol buffer +// type and for embedded messages. +func (p *Buffer) DecodeRawBytes(alloc bool) (buf []byte, err error) { + n, err := p.DecodeVarint() + if err != nil { + return nil, err + } + + nb := int(n) + if nb < 0 { + return nil, fmt.Errorf("proto: bad byte length %d", nb) + } + end := p.index + nb + if end < p.index || end > len(p.buf) { + return nil, io.ErrUnexpectedEOF + } + + if !alloc { + // todo: check if can get more uses of alloc=false + buf = p.buf[p.index:end] + p.index += nb + return + } + + buf = make([]byte, nb) + copy(buf, p.buf[p.index:]) + p.index += nb + return +} + +// DecodeStringBytes reads an encoded string from the Buffer. +// This is the format used for the proto2 string type. +func (p *Buffer) DecodeStringBytes() (s string, err error) { + buf, err := p.DecodeRawBytes(false) + if err != nil { + return + } + return string(buf), nil +} + +// Unmarshaler is the interface representing objects that can +// unmarshal themselves. The argument points to data that may be +// overwritten, so implementations should not keep references to the +// buffer. +// Unmarshal implementations should not clear the receiver. +// Any unmarshaled data should be merged into the receiver. +// Callers of Unmarshal that do not want to retain existing data +// should Reset the receiver before calling Unmarshal. +type Unmarshaler interface { + Unmarshal([]byte) error +} + +// newUnmarshaler is the interface representing objects that can +// unmarshal themselves. The semantics are identical to Unmarshaler. +// +// This exists to support protoc-gen-go generated messages. +// The proto package will stop type-asserting to this interface in the future. +// +// DO NOT DEPEND ON THIS. +type newUnmarshaler interface { + XXX_Unmarshal([]byte) error +} + +// Unmarshal parses the protocol buffer representation in buf and places the +// decoded result in pb. If the struct underlying pb does not match +// the data in buf, the results can be unpredictable. +// +// Unmarshal resets pb before starting to unmarshal, so any +// existing data in pb is always removed. Use UnmarshalMerge +// to preserve and append to existing data. +func Unmarshal(buf []byte, pb Message) error { + pb.Reset() + if u, ok := pb.(newUnmarshaler); ok { + return u.XXX_Unmarshal(buf) + } + if u, ok := pb.(Unmarshaler); ok { + return u.Unmarshal(buf) + } + return NewBuffer(buf).Unmarshal(pb) +} + +// UnmarshalMerge parses the protocol buffer representation in buf and +// writes the decoded result to pb. If the struct underlying pb does not match +// the data in buf, the results can be unpredictable. +// +// UnmarshalMerge merges into existing data in pb. +// Most code should use Unmarshal instead. +func UnmarshalMerge(buf []byte, pb Message) error { + if u, ok := pb.(newUnmarshaler); ok { + return u.XXX_Unmarshal(buf) + } + if u, ok := pb.(Unmarshaler); ok { + // NOTE: The history of proto have unfortunately been inconsistent + // whether Unmarshaler should or should not implicitly clear itself. + // Some implementations do, most do not. + // Thus, calling this here may or may not do what people want. + // + // See https://github.com/golang/protobuf/issues/424 + return u.Unmarshal(buf) + } + return NewBuffer(buf).Unmarshal(pb) +} + +// DecodeMessage reads a count-delimited message from the Buffer. +func (p *Buffer) DecodeMessage(pb Message) error { + enc, err := p.DecodeRawBytes(false) + if err != nil { + return err + } + return NewBuffer(enc).Unmarshal(pb) +} + +// DecodeGroup reads a tag-delimited group from the Buffer. +// StartGroup tag is already consumed. This function consumes +// EndGroup tag. +func (p *Buffer) DecodeGroup(pb Message) error { + b := p.buf[p.index:] + x, y := findEndGroup(b) + if x < 0 { + return io.ErrUnexpectedEOF + } + err := Unmarshal(b[:x], pb) + p.index += y + return err +} + +// Unmarshal parses the protocol buffer representation in the +// Buffer and places the decoded result in pb. If the struct +// underlying pb does not match the data in the buffer, the results can be +// unpredictable. +// +// Unlike proto.Unmarshal, this does not reset pb before starting to unmarshal. +func (p *Buffer) Unmarshal(pb Message) error { + // If the object can unmarshal itself, let it. + if u, ok := pb.(newUnmarshaler); ok { + err := u.XXX_Unmarshal(p.buf[p.index:]) + p.index = len(p.buf) + return err + } + if u, ok := pb.(Unmarshaler); ok { + // NOTE: The history of proto have unfortunately been inconsistent + // whether Unmarshaler should or should not implicitly clear itself. + // Some implementations do, most do not. + // Thus, calling this here may or may not do what people want. + // + // See https://github.com/golang/protobuf/issues/424 + err := u.Unmarshal(p.buf[p.index:]) + p.index = len(p.buf) + return err + } + + // Slow workaround for messages that aren't Unmarshalers. + // This includes some hand-coded .pb.go files and + // bootstrap protos. + // TODO: fix all of those and then add Unmarshal to + // the Message interface. Then: + // The cast above and code below can be deleted. + // The old unmarshaler can be deleted. + // Clients can call Unmarshal directly (can already do that, actually). + var info InternalMessageInfo + err := info.Unmarshal(pb, p.buf[p.index:]) + p.index = len(p.buf) + return err +} diff --git a/vendor/github.com/golang/protobuf/proto/deprecated.go b/vendor/github.com/golang/protobuf/proto/deprecated.go new file mode 100644 index 0000000..35b882c --- /dev/null +++ b/vendor/github.com/golang/protobuf/proto/deprecated.go @@ -0,0 +1,63 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2018 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +import "errors" + +// Deprecated: do not use. +type Stats struct{ Emalloc, Dmalloc, Encode, Decode, Chit, Cmiss, Size uint64 } + +// Deprecated: do not use. +func GetStats() Stats { return Stats{} } + +// Deprecated: do not use. +func MarshalMessageSet(interface{}) ([]byte, error) { + return nil, errors.New("proto: not implemented") +} + +// Deprecated: do not use. +func UnmarshalMessageSet([]byte, interface{}) error { + return errors.New("proto: not implemented") +} + +// Deprecated: do not use. +func MarshalMessageSetJSON(interface{}) ([]byte, error) { + return nil, errors.New("proto: not implemented") +} + +// Deprecated: do not use. +func UnmarshalMessageSetJSON([]byte, interface{}) error { + return errors.New("proto: not implemented") +} + +// Deprecated: do not use. +func RegisterMessageSetType(Message, int32, string) {} diff --git a/vendor/github.com/golang/protobuf/proto/discard.go b/vendor/github.com/golang/protobuf/proto/discard.go new file mode 100644 index 0000000..dea2617 --- /dev/null +++ b/vendor/github.com/golang/protobuf/proto/discard.go @@ -0,0 +1,350 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2017 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +import ( + "fmt" + "reflect" + "strings" + "sync" + "sync/atomic" +) + +type generatedDiscarder interface { + XXX_DiscardUnknown() +} + +// DiscardUnknown recursively discards all unknown fields from this message +// and all embedded messages. +// +// When unmarshaling a message with unrecognized fields, the tags and values +// of such fields are preserved in the Message. This allows a later call to +// marshal to be able to produce a message that continues to have those +// unrecognized fields. To avoid this, DiscardUnknown is used to +// explicitly clear the unknown fields after unmarshaling. +// +// For proto2 messages, the unknown fields of message extensions are only +// discarded from messages that have been accessed via GetExtension. +func DiscardUnknown(m Message) { + if m, ok := m.(generatedDiscarder); ok { + m.XXX_DiscardUnknown() + return + } + // TODO: Dynamically populate a InternalMessageInfo for legacy messages, + // but the master branch has no implementation for InternalMessageInfo, + // so it would be more work to replicate that approach. + discardLegacy(m) +} + +// DiscardUnknown recursively discards all unknown fields. +func (a *InternalMessageInfo) DiscardUnknown(m Message) { + di := atomicLoadDiscardInfo(&a.discard) + if di == nil { + di = getDiscardInfo(reflect.TypeOf(m).Elem()) + atomicStoreDiscardInfo(&a.discard, di) + } + di.discard(toPointer(&m)) +} + +type discardInfo struct { + typ reflect.Type + + initialized int32 // 0: only typ is valid, 1: everything is valid + lock sync.Mutex + + fields []discardFieldInfo + unrecognized field +} + +type discardFieldInfo struct { + field field // Offset of field, guaranteed to be valid + discard func(src pointer) +} + +var ( + discardInfoMap = map[reflect.Type]*discardInfo{} + discardInfoLock sync.Mutex +) + +func getDiscardInfo(t reflect.Type) *discardInfo { + discardInfoLock.Lock() + defer discardInfoLock.Unlock() + di := discardInfoMap[t] + if di == nil { + di = &discardInfo{typ: t} + discardInfoMap[t] = di + } + return di +} + +func (di *discardInfo) discard(src pointer) { + if src.isNil() { + return // Nothing to do. + } + + if atomic.LoadInt32(&di.initialized) == 0 { + di.computeDiscardInfo() + } + + for _, fi := range di.fields { + sfp := src.offset(fi.field) + fi.discard(sfp) + } + + // For proto2 messages, only discard unknown fields in message extensions + // that have been accessed via GetExtension. + if em, err := extendable(src.asPointerTo(di.typ).Interface()); err == nil { + // Ignore lock since DiscardUnknown is not concurrency safe. + emm, _ := em.extensionsRead() + for _, mx := range emm { + if m, ok := mx.value.(Message); ok { + DiscardUnknown(m) + } + } + } + + if di.unrecognized.IsValid() { + *src.offset(di.unrecognized).toBytes() = nil + } +} + +func (di *discardInfo) computeDiscardInfo() { + di.lock.Lock() + defer di.lock.Unlock() + if di.initialized != 0 { + return + } + t := di.typ + n := t.NumField() + + for i := 0; i < n; i++ { + f := t.Field(i) + if strings.HasPrefix(f.Name, "XXX_") { + continue + } + + dfi := discardFieldInfo{field: toField(&f)} + tf := f.Type + + // Unwrap tf to get its most basic type. + var isPointer, isSlice bool + if tf.Kind() == reflect.Slice && tf.Elem().Kind() != reflect.Uint8 { + isSlice = true + tf = tf.Elem() + } + if tf.Kind() == reflect.Ptr { + isPointer = true + tf = tf.Elem() + } + if isPointer && isSlice && tf.Kind() != reflect.Struct { + panic(fmt.Sprintf("%v.%s cannot be a slice of pointers to primitive types", t, f.Name)) + } + + switch tf.Kind() { + case reflect.Struct: + switch { + case !isPointer: + panic(fmt.Sprintf("%v.%s cannot be a direct struct value", t, f.Name)) + case isSlice: // E.g., []*pb.T + di := getDiscardInfo(tf) + dfi.discard = func(src pointer) { + sps := src.getPointerSlice() + for _, sp := range sps { + if !sp.isNil() { + di.discard(sp) + } + } + } + default: // E.g., *pb.T + di := getDiscardInfo(tf) + dfi.discard = func(src pointer) { + sp := src.getPointer() + if !sp.isNil() { + di.discard(sp) + } + } + } + case reflect.Map: + switch { + case isPointer || isSlice: + panic(fmt.Sprintf("%v.%s cannot be a pointer to a map or a slice of map values", t, f.Name)) + default: // E.g., map[K]V + if tf.Elem().Kind() == reflect.Ptr { // Proto struct (e.g., *T) + dfi.discard = func(src pointer) { + sm := src.asPointerTo(tf).Elem() + if sm.Len() == 0 { + return + } + for _, key := range sm.MapKeys() { + val := sm.MapIndex(key) + DiscardUnknown(val.Interface().(Message)) + } + } + } else { + dfi.discard = func(pointer) {} // Noop + } + } + case reflect.Interface: + // Must be oneof field. + switch { + case isPointer || isSlice: + panic(fmt.Sprintf("%v.%s cannot be a pointer to a interface or a slice of interface values", t, f.Name)) + default: // E.g., interface{} + // TODO: Make this faster? + dfi.discard = func(src pointer) { + su := src.asPointerTo(tf).Elem() + if !su.IsNil() { + sv := su.Elem().Elem().Field(0) + if sv.Kind() == reflect.Ptr && sv.IsNil() { + return + } + switch sv.Type().Kind() { + case reflect.Ptr: // Proto struct (e.g., *T) + DiscardUnknown(sv.Interface().(Message)) + } + } + } + } + default: + continue + } + di.fields = append(di.fields, dfi) + } + + di.unrecognized = invalidField + if f, ok := t.FieldByName("XXX_unrecognized"); ok { + if f.Type != reflect.TypeOf([]byte{}) { + panic("expected XXX_unrecognized to be of type []byte") + } + di.unrecognized = toField(&f) + } + + atomic.StoreInt32(&di.initialized, 1) +} + +func discardLegacy(m Message) { + v := reflect.ValueOf(m) + if v.Kind() != reflect.Ptr || v.IsNil() { + return + } + v = v.Elem() + if v.Kind() != reflect.Struct { + return + } + t := v.Type() + + for i := 0; i < v.NumField(); i++ { + f := t.Field(i) + if strings.HasPrefix(f.Name, "XXX_") { + continue + } + vf := v.Field(i) + tf := f.Type + + // Unwrap tf to get its most basic type. + var isPointer, isSlice bool + if tf.Kind() == reflect.Slice && tf.Elem().Kind() != reflect.Uint8 { + isSlice = true + tf = tf.Elem() + } + if tf.Kind() == reflect.Ptr { + isPointer = true + tf = tf.Elem() + } + if isPointer && isSlice && tf.Kind() != reflect.Struct { + panic(fmt.Sprintf("%T.%s cannot be a slice of pointers to primitive types", m, f.Name)) + } + + switch tf.Kind() { + case reflect.Struct: + switch { + case !isPointer: + panic(fmt.Sprintf("%T.%s cannot be a direct struct value", m, f.Name)) + case isSlice: // E.g., []*pb.T + for j := 0; j < vf.Len(); j++ { + discardLegacy(vf.Index(j).Interface().(Message)) + } + default: // E.g., *pb.T + discardLegacy(vf.Interface().(Message)) + } + case reflect.Map: + switch { + case isPointer || isSlice: + panic(fmt.Sprintf("%T.%s cannot be a pointer to a map or a slice of map values", m, f.Name)) + default: // E.g., map[K]V + tv := vf.Type().Elem() + if tv.Kind() == reflect.Ptr && tv.Implements(protoMessageType) { // Proto struct (e.g., *T) + for _, key := range vf.MapKeys() { + val := vf.MapIndex(key) + discardLegacy(val.Interface().(Message)) + } + } + } + case reflect.Interface: + // Must be oneof field. + switch { + case isPointer || isSlice: + panic(fmt.Sprintf("%T.%s cannot be a pointer to a interface or a slice of interface values", m, f.Name)) + default: // E.g., test_proto.isCommunique_Union interface + if !vf.IsNil() && f.Tag.Get("protobuf_oneof") != "" { + vf = vf.Elem() // E.g., *test_proto.Communique_Msg + if !vf.IsNil() { + vf = vf.Elem() // E.g., test_proto.Communique_Msg + vf = vf.Field(0) // E.g., Proto struct (e.g., *T) or primitive value + if vf.Kind() == reflect.Ptr { + discardLegacy(vf.Interface().(Message)) + } + } + } + } + } + } + + if vf := v.FieldByName("XXX_unrecognized"); vf.IsValid() { + if vf.Type() != reflect.TypeOf([]byte{}) { + panic("expected XXX_unrecognized to be of type []byte") + } + vf.Set(reflect.ValueOf([]byte(nil))) + } + + // For proto2 messages, only discard unknown fields in message extensions + // that have been accessed via GetExtension. + if em, err := extendable(m); err == nil { + // Ignore lock since discardLegacy is not concurrency safe. + emm, _ := em.extensionsRead() + for _, mx := range emm { + if m, ok := mx.value.(Message); ok { + discardLegacy(m) + } + } + } +} diff --git a/vendor/github.com/golang/protobuf/proto/encode.go b/vendor/github.com/golang/protobuf/proto/encode.go new file mode 100644 index 0000000..3abfed2 --- /dev/null +++ b/vendor/github.com/golang/protobuf/proto/encode.go @@ -0,0 +1,203 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +/* + * Routines for encoding data into the wire format for protocol buffers. + */ + +import ( + "errors" + "reflect" +) + +var ( + // errRepeatedHasNil is the error returned if Marshal is called with + // a struct with a repeated field containing a nil element. + errRepeatedHasNil = errors.New("proto: repeated field has nil element") + + // errOneofHasNil is the error returned if Marshal is called with + // a struct with a oneof field containing a nil element. + errOneofHasNil = errors.New("proto: oneof field has nil value") + + // ErrNil is the error returned if Marshal is called with nil. + ErrNil = errors.New("proto: Marshal called with nil") + + // ErrTooLarge is the error returned if Marshal is called with a + // message that encodes to >2GB. + ErrTooLarge = errors.New("proto: message encodes to over 2 GB") +) + +// The fundamental encoders that put bytes on the wire. +// Those that take integer types all accept uint64 and are +// therefore of type valueEncoder. + +const maxVarintBytes = 10 // maximum length of a varint + +// EncodeVarint returns the varint encoding of x. +// This is the format for the +// int32, int64, uint32, uint64, bool, and enum +// protocol buffer types. +// Not used by the package itself, but helpful to clients +// wishing to use the same encoding. +func EncodeVarint(x uint64) []byte { + var buf [maxVarintBytes]byte + var n int + for n = 0; x > 127; n++ { + buf[n] = 0x80 | uint8(x&0x7F) + x >>= 7 + } + buf[n] = uint8(x) + n++ + return buf[0:n] +} + +// EncodeVarint writes a varint-encoded integer to the Buffer. +// This is the format for the +// int32, int64, uint32, uint64, bool, and enum +// protocol buffer types. +func (p *Buffer) EncodeVarint(x uint64) error { + for x >= 1<<7 { + p.buf = append(p.buf, uint8(x&0x7f|0x80)) + x >>= 7 + } + p.buf = append(p.buf, uint8(x)) + return nil +} + +// SizeVarint returns the varint encoding size of an integer. +func SizeVarint(x uint64) int { + switch { + case x < 1<<7: + return 1 + case x < 1<<14: + return 2 + case x < 1<<21: + return 3 + case x < 1<<28: + return 4 + case x < 1<<35: + return 5 + case x < 1<<42: + return 6 + case x < 1<<49: + return 7 + case x < 1<<56: + return 8 + case x < 1<<63: + return 9 + } + return 10 +} + +// EncodeFixed64 writes a 64-bit integer to the Buffer. +// This is the format for the +// fixed64, sfixed64, and double protocol buffer types. +func (p *Buffer) EncodeFixed64(x uint64) error { + p.buf = append(p.buf, + uint8(x), + uint8(x>>8), + uint8(x>>16), + uint8(x>>24), + uint8(x>>32), + uint8(x>>40), + uint8(x>>48), + uint8(x>>56)) + return nil +} + +// EncodeFixed32 writes a 32-bit integer to the Buffer. +// This is the format for the +// fixed32, sfixed32, and float protocol buffer types. +func (p *Buffer) EncodeFixed32(x uint64) error { + p.buf = append(p.buf, + uint8(x), + uint8(x>>8), + uint8(x>>16), + uint8(x>>24)) + return nil +} + +// EncodeZigzag64 writes a zigzag-encoded 64-bit integer +// to the Buffer. +// This is the format used for the sint64 protocol buffer type. +func (p *Buffer) EncodeZigzag64(x uint64) error { + // use signed number to get arithmetic right shift. + return p.EncodeVarint(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} + +// EncodeZigzag32 writes a zigzag-encoded 32-bit integer +// to the Buffer. +// This is the format used for the sint32 protocol buffer type. +func (p *Buffer) EncodeZigzag32(x uint64) error { + // use signed number to get arithmetic right shift. + return p.EncodeVarint(uint64((uint32(x) << 1) ^ uint32((int32(x) >> 31)))) +} + +// EncodeRawBytes writes a count-delimited byte buffer to the Buffer. +// This is the format used for the bytes protocol buffer +// type and for embedded messages. +func (p *Buffer) EncodeRawBytes(b []byte) error { + p.EncodeVarint(uint64(len(b))) + p.buf = append(p.buf, b...) + return nil +} + +// EncodeStringBytes writes an encoded string to the Buffer. +// This is the format used for the proto2 string type. +func (p *Buffer) EncodeStringBytes(s string) error { + p.EncodeVarint(uint64(len(s))) + p.buf = append(p.buf, s...) + return nil +} + +// Marshaler is the interface representing objects that can marshal themselves. +type Marshaler interface { + Marshal() ([]byte, error) +} + +// EncodeMessage writes the protocol buffer to the Buffer, +// prefixed by a varint-encoded length. +func (p *Buffer) EncodeMessage(pb Message) error { + siz := Size(pb) + p.EncodeVarint(uint64(siz)) + return p.Marshal(pb) +} + +// All protocol buffer fields are nillable, but be careful. +func isNil(v reflect.Value) bool { + switch v.Kind() { + case reflect.Interface, reflect.Map, reflect.Ptr, reflect.Slice: + return v.IsNil() + } + return false +} diff --git a/vendor/github.com/golang/protobuf/proto/equal.go b/vendor/github.com/golang/protobuf/proto/equal.go new file mode 100644 index 0000000..f9b6e41 --- /dev/null +++ b/vendor/github.com/golang/protobuf/proto/equal.go @@ -0,0 +1,301 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2011 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Protocol buffer comparison. + +package proto + +import ( + "bytes" + "log" + "reflect" + "strings" +) + +/* +Equal returns true iff protocol buffers a and b are equal. +The arguments must both be pointers to protocol buffer structs. + +Equality is defined in this way: + - Two messages are equal iff they are the same type, + corresponding fields are equal, unknown field sets + are equal, and extensions sets are equal. + - Two set scalar fields are equal iff their values are equal. + If the fields are of a floating-point type, remember that + NaN != x for all x, including NaN. If the message is defined + in a proto3 .proto file, fields are not "set"; specifically, + zero length proto3 "bytes" fields are equal (nil == {}). + - Two repeated fields are equal iff their lengths are the same, + and their corresponding elements are equal. Note a "bytes" field, + although represented by []byte, is not a repeated field and the + rule for the scalar fields described above applies. + - Two unset fields are equal. + - Two unknown field sets are equal if their current + encoded state is equal. + - Two extension sets are equal iff they have corresponding + elements that are pairwise equal. + - Two map fields are equal iff their lengths are the same, + and they contain the same set of elements. Zero-length map + fields are equal. + - Every other combination of things are not equal. + +The return value is undefined if a and b are not protocol buffers. +*/ +func Equal(a, b Message) bool { + if a == nil || b == nil { + return a == b + } + v1, v2 := reflect.ValueOf(a), reflect.ValueOf(b) + if v1.Type() != v2.Type() { + return false + } + if v1.Kind() == reflect.Ptr { + if v1.IsNil() { + return v2.IsNil() + } + if v2.IsNil() { + return false + } + v1, v2 = v1.Elem(), v2.Elem() + } + if v1.Kind() != reflect.Struct { + return false + } + return equalStruct(v1, v2) +} + +// v1 and v2 are known to have the same type. +func equalStruct(v1, v2 reflect.Value) bool { + sprop := GetProperties(v1.Type()) + for i := 0; i < v1.NumField(); i++ { + f := v1.Type().Field(i) + if strings.HasPrefix(f.Name, "XXX_") { + continue + } + f1, f2 := v1.Field(i), v2.Field(i) + if f.Type.Kind() == reflect.Ptr { + if n1, n2 := f1.IsNil(), f2.IsNil(); n1 && n2 { + // both unset + continue + } else if n1 != n2 { + // set/unset mismatch + return false + } + f1, f2 = f1.Elem(), f2.Elem() + } + if !equalAny(f1, f2, sprop.Prop[i]) { + return false + } + } + + if em1 := v1.FieldByName("XXX_InternalExtensions"); em1.IsValid() { + em2 := v2.FieldByName("XXX_InternalExtensions") + if !equalExtensions(v1.Type(), em1.Interface().(XXX_InternalExtensions), em2.Interface().(XXX_InternalExtensions)) { + return false + } + } + + if em1 := v1.FieldByName("XXX_extensions"); em1.IsValid() { + em2 := v2.FieldByName("XXX_extensions") + if !equalExtMap(v1.Type(), em1.Interface().(map[int32]Extension), em2.Interface().(map[int32]Extension)) { + return false + } + } + + uf := v1.FieldByName("XXX_unrecognized") + if !uf.IsValid() { + return true + } + + u1 := uf.Bytes() + u2 := v2.FieldByName("XXX_unrecognized").Bytes() + return bytes.Equal(u1, u2) +} + +// v1 and v2 are known to have the same type. +// prop may be nil. +func equalAny(v1, v2 reflect.Value, prop *Properties) bool { + if v1.Type() == protoMessageType { + m1, _ := v1.Interface().(Message) + m2, _ := v2.Interface().(Message) + return Equal(m1, m2) + } + switch v1.Kind() { + case reflect.Bool: + return v1.Bool() == v2.Bool() + case reflect.Float32, reflect.Float64: + return v1.Float() == v2.Float() + case reflect.Int32, reflect.Int64: + return v1.Int() == v2.Int() + case reflect.Interface: + // Probably a oneof field; compare the inner values. + n1, n2 := v1.IsNil(), v2.IsNil() + if n1 || n2 { + return n1 == n2 + } + e1, e2 := v1.Elem(), v2.Elem() + if e1.Type() != e2.Type() { + return false + } + return equalAny(e1, e2, nil) + case reflect.Map: + if v1.Len() != v2.Len() { + return false + } + for _, key := range v1.MapKeys() { + val2 := v2.MapIndex(key) + if !val2.IsValid() { + // This key was not found in the second map. + return false + } + if !equalAny(v1.MapIndex(key), val2, nil) { + return false + } + } + return true + case reflect.Ptr: + // Maps may have nil values in them, so check for nil. + if v1.IsNil() && v2.IsNil() { + return true + } + if v1.IsNil() != v2.IsNil() { + return false + } + return equalAny(v1.Elem(), v2.Elem(), prop) + case reflect.Slice: + if v1.Type().Elem().Kind() == reflect.Uint8 { + // short circuit: []byte + + // Edge case: if this is in a proto3 message, a zero length + // bytes field is considered the zero value. + if prop != nil && prop.proto3 && v1.Len() == 0 && v2.Len() == 0 { + return true + } + if v1.IsNil() != v2.IsNil() { + return false + } + return bytes.Equal(v1.Interface().([]byte), v2.Interface().([]byte)) + } + + if v1.Len() != v2.Len() { + return false + } + for i := 0; i < v1.Len(); i++ { + if !equalAny(v1.Index(i), v2.Index(i), prop) { + return false + } + } + return true + case reflect.String: + return v1.Interface().(string) == v2.Interface().(string) + case reflect.Struct: + return equalStruct(v1, v2) + case reflect.Uint32, reflect.Uint64: + return v1.Uint() == v2.Uint() + } + + // unknown type, so not a protocol buffer + log.Printf("proto: don't know how to compare %v", v1) + return false +} + +// base is the struct type that the extensions are based on. +// x1 and x2 are InternalExtensions. +func equalExtensions(base reflect.Type, x1, x2 XXX_InternalExtensions) bool { + em1, _ := x1.extensionsRead() + em2, _ := x2.extensionsRead() + return equalExtMap(base, em1, em2) +} + +func equalExtMap(base reflect.Type, em1, em2 map[int32]Extension) bool { + if len(em1) != len(em2) { + return false + } + + for extNum, e1 := range em1 { + e2, ok := em2[extNum] + if !ok { + return false + } + + m1 := extensionAsLegacyType(e1.value) + m2 := extensionAsLegacyType(e2.value) + + if m1 == nil && m2 == nil { + // Both have only encoded form. + if bytes.Equal(e1.enc, e2.enc) { + continue + } + // The bytes are different, but the extensions might still be + // equal. We need to decode them to compare. + } + + if m1 != nil && m2 != nil { + // Both are unencoded. + if !equalAny(reflect.ValueOf(m1), reflect.ValueOf(m2), nil) { + return false + } + continue + } + + // At least one is encoded. To do a semantically correct comparison + // we need to unmarshal them first. + var desc *ExtensionDesc + if m := extensionMaps[base]; m != nil { + desc = m[extNum] + } + if desc == nil { + // If both have only encoded form and the bytes are the same, + // it is handled above. We get here when the bytes are different. + // We don't know how to decode it, so just compare them as byte + // slices. + log.Printf("proto: don't know how to compare extension %d of %v", extNum, base) + return false + } + var err error + if m1 == nil { + m1, err = decodeExtension(e1.enc, desc) + } + if m2 == nil && err == nil { + m2, err = decodeExtension(e2.enc, desc) + } + if err != nil { + // The encoded form is invalid. + log.Printf("proto: badly encoded extension %d of %v: %v", extNum, base, err) + return false + } + if !equalAny(reflect.ValueOf(m1), reflect.ValueOf(m2), nil) { + return false + } + } + + return true +} diff --git a/vendor/github.com/golang/protobuf/proto/extensions.go b/vendor/github.com/golang/protobuf/proto/extensions.go new file mode 100644 index 0000000..fa88add --- /dev/null +++ b/vendor/github.com/golang/protobuf/proto/extensions.go @@ -0,0 +1,607 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +/* + * Types and routines for supporting protocol buffer extensions. + */ + +import ( + "errors" + "fmt" + "io" + "reflect" + "strconv" + "sync" +) + +// ErrMissingExtension is the error returned by GetExtension if the named extension is not in the message. +var ErrMissingExtension = errors.New("proto: missing extension") + +// ExtensionRange represents a range of message extensions for a protocol buffer. +// Used in code generated by the protocol compiler. +type ExtensionRange struct { + Start, End int32 // both inclusive +} + +// extendableProto is an interface implemented by any protocol buffer generated by the current +// proto compiler that may be extended. +type extendableProto interface { + Message + ExtensionRangeArray() []ExtensionRange + extensionsWrite() map[int32]Extension + extensionsRead() (map[int32]Extension, sync.Locker) +} + +// extendableProtoV1 is an interface implemented by a protocol buffer generated by the previous +// version of the proto compiler that may be extended. +type extendableProtoV1 interface { + Message + ExtensionRangeArray() []ExtensionRange + ExtensionMap() map[int32]Extension +} + +// extensionAdapter is a wrapper around extendableProtoV1 that implements extendableProto. +type extensionAdapter struct { + extendableProtoV1 +} + +func (e extensionAdapter) extensionsWrite() map[int32]Extension { + return e.ExtensionMap() +} + +func (e extensionAdapter) extensionsRead() (map[int32]Extension, sync.Locker) { + return e.ExtensionMap(), notLocker{} +} + +// notLocker is a sync.Locker whose Lock and Unlock methods are nops. +type notLocker struct{} + +func (n notLocker) Lock() {} +func (n notLocker) Unlock() {} + +// extendable returns the extendableProto interface for the given generated proto message. +// If the proto message has the old extension format, it returns a wrapper that implements +// the extendableProto interface. +func extendable(p interface{}) (extendableProto, error) { + switch p := p.(type) { + case extendableProto: + if isNilPtr(p) { + return nil, fmt.Errorf("proto: nil %T is not extendable", p) + } + return p, nil + case extendableProtoV1: + if isNilPtr(p) { + return nil, fmt.Errorf("proto: nil %T is not extendable", p) + } + return extensionAdapter{p}, nil + } + // Don't allocate a specific error containing %T: + // this is the hot path for Clone and MarshalText. + return nil, errNotExtendable +} + +var errNotExtendable = errors.New("proto: not an extendable proto.Message") + +func isNilPtr(x interface{}) bool { + v := reflect.ValueOf(x) + return v.Kind() == reflect.Ptr && v.IsNil() +} + +// XXX_InternalExtensions is an internal representation of proto extensions. +// +// Each generated message struct type embeds an anonymous XXX_InternalExtensions field, +// thus gaining the unexported 'extensions' method, which can be called only from the proto package. +// +// The methods of XXX_InternalExtensions are not concurrency safe in general, +// but calls to logically read-only methods such as has and get may be executed concurrently. +type XXX_InternalExtensions struct { + // The struct must be indirect so that if a user inadvertently copies a + // generated message and its embedded XXX_InternalExtensions, they + // avoid the mayhem of a copied mutex. + // + // The mutex serializes all logically read-only operations to p.extensionMap. + // It is up to the client to ensure that write operations to p.extensionMap are + // mutually exclusive with other accesses. + p *struct { + mu sync.Mutex + extensionMap map[int32]Extension + } +} + +// extensionsWrite returns the extension map, creating it on first use. +func (e *XXX_InternalExtensions) extensionsWrite() map[int32]Extension { + if e.p == nil { + e.p = new(struct { + mu sync.Mutex + extensionMap map[int32]Extension + }) + e.p.extensionMap = make(map[int32]Extension) + } + return e.p.extensionMap +} + +// extensionsRead returns the extensions map for read-only use. It may be nil. +// The caller must hold the returned mutex's lock when accessing Elements within the map. +func (e *XXX_InternalExtensions) extensionsRead() (map[int32]Extension, sync.Locker) { + if e.p == nil { + return nil, nil + } + return e.p.extensionMap, &e.p.mu +} + +// ExtensionDesc represents an extension specification. +// Used in generated code from the protocol compiler. +type ExtensionDesc struct { + ExtendedType Message // nil pointer to the type that is being extended + ExtensionType interface{} // nil pointer to the extension type + Field int32 // field number + Name string // fully-qualified name of extension, for text formatting + Tag string // protobuf tag style + Filename string // name of the file in which the extension is defined +} + +func (ed *ExtensionDesc) repeated() bool { + t := reflect.TypeOf(ed.ExtensionType) + return t.Kind() == reflect.Slice && t.Elem().Kind() != reflect.Uint8 +} + +// Extension represents an extension in a message. +type Extension struct { + // When an extension is stored in a message using SetExtension + // only desc and value are set. When the message is marshaled + // enc will be set to the encoded form of the message. + // + // When a message is unmarshaled and contains extensions, each + // extension will have only enc set. When such an extension is + // accessed using GetExtension (or GetExtensions) desc and value + // will be set. + desc *ExtensionDesc + + // value is a concrete value for the extension field. Let the type of + // desc.ExtensionType be the "API type" and the type of Extension.value + // be the "storage type". The API type and storage type are the same except: + // * For scalars (except []byte), the API type uses *T, + // while the storage type uses T. + // * For repeated fields, the API type uses []T, while the storage type + // uses *[]T. + // + // The reason for the divergence is so that the storage type more naturally + // matches what is expected of when retrieving the values through the + // protobuf reflection APIs. + // + // The value may only be populated if desc is also populated. + value interface{} + + // enc is the raw bytes for the extension field. + enc []byte +} + +// SetRawExtension is for testing only. +func SetRawExtension(base Message, id int32, b []byte) { + epb, err := extendable(base) + if err != nil { + return + } + extmap := epb.extensionsWrite() + extmap[id] = Extension{enc: b} +} + +// isExtensionField returns true iff the given field number is in an extension range. +func isExtensionField(pb extendableProto, field int32) bool { + for _, er := range pb.ExtensionRangeArray() { + if er.Start <= field && field <= er.End { + return true + } + } + return false +} + +// checkExtensionTypes checks that the given extension is valid for pb. +func checkExtensionTypes(pb extendableProto, extension *ExtensionDesc) error { + var pbi interface{} = pb + // Check the extended type. + if ea, ok := pbi.(extensionAdapter); ok { + pbi = ea.extendableProtoV1 + } + if a, b := reflect.TypeOf(pbi), reflect.TypeOf(extension.ExtendedType); a != b { + return fmt.Errorf("proto: bad extended type; %v does not extend %v", b, a) + } + // Check the range. + if !isExtensionField(pb, extension.Field) { + return errors.New("proto: bad extension number; not in declared ranges") + } + return nil +} + +// extPropKey is sufficient to uniquely identify an extension. +type extPropKey struct { + base reflect.Type + field int32 +} + +var extProp = struct { + sync.RWMutex + m map[extPropKey]*Properties +}{ + m: make(map[extPropKey]*Properties), +} + +func extensionProperties(ed *ExtensionDesc) *Properties { + key := extPropKey{base: reflect.TypeOf(ed.ExtendedType), field: ed.Field} + + extProp.RLock() + if prop, ok := extProp.m[key]; ok { + extProp.RUnlock() + return prop + } + extProp.RUnlock() + + extProp.Lock() + defer extProp.Unlock() + // Check again. + if prop, ok := extProp.m[key]; ok { + return prop + } + + prop := new(Properties) + prop.Init(reflect.TypeOf(ed.ExtensionType), "unknown_name", ed.Tag, nil) + extProp.m[key] = prop + return prop +} + +// HasExtension returns whether the given extension is present in pb. +func HasExtension(pb Message, extension *ExtensionDesc) bool { + // TODO: Check types, field numbers, etc.? + epb, err := extendable(pb) + if err != nil { + return false + } + extmap, mu := epb.extensionsRead() + if extmap == nil { + return false + } + mu.Lock() + _, ok := extmap[extension.Field] + mu.Unlock() + return ok +} + +// ClearExtension removes the given extension from pb. +func ClearExtension(pb Message, extension *ExtensionDesc) { + epb, err := extendable(pb) + if err != nil { + return + } + // TODO: Check types, field numbers, etc.? + extmap := epb.extensionsWrite() + delete(extmap, extension.Field) +} + +// GetExtension retrieves a proto2 extended field from pb. +// +// If the descriptor is type complete (i.e., ExtensionDesc.ExtensionType is non-nil), +// then GetExtension parses the encoded field and returns a Go value of the specified type. +// If the field is not present, then the default value is returned (if one is specified), +// otherwise ErrMissingExtension is reported. +// +// If the descriptor is not type complete (i.e., ExtensionDesc.ExtensionType is nil), +// then GetExtension returns the raw encoded bytes of the field extension. +func GetExtension(pb Message, extension *ExtensionDesc) (interface{}, error) { + epb, err := extendable(pb) + if err != nil { + return nil, err + } + + if extension.ExtendedType != nil { + // can only check type if this is a complete descriptor + if err := checkExtensionTypes(epb, extension); err != nil { + return nil, err + } + } + + emap, mu := epb.extensionsRead() + if emap == nil { + return defaultExtensionValue(extension) + } + mu.Lock() + defer mu.Unlock() + e, ok := emap[extension.Field] + if !ok { + // defaultExtensionValue returns the default value or + // ErrMissingExtension if there is no default. + return defaultExtensionValue(extension) + } + + if e.value != nil { + // Already decoded. Check the descriptor, though. + if e.desc != extension { + // This shouldn't happen. If it does, it means that + // GetExtension was called twice with two different + // descriptors with the same field number. + return nil, errors.New("proto: descriptor conflict") + } + return extensionAsLegacyType(e.value), nil + } + + if extension.ExtensionType == nil { + // incomplete descriptor + return e.enc, nil + } + + v, err := decodeExtension(e.enc, extension) + if err != nil { + return nil, err + } + + // Remember the decoded version and drop the encoded version. + // That way it is safe to mutate what we return. + e.value = extensionAsStorageType(v) + e.desc = extension + e.enc = nil + emap[extension.Field] = e + return extensionAsLegacyType(e.value), nil +} + +// defaultExtensionValue returns the default value for extension. +// If no default for an extension is defined ErrMissingExtension is returned. +func defaultExtensionValue(extension *ExtensionDesc) (interface{}, error) { + if extension.ExtensionType == nil { + // incomplete descriptor, so no default + return nil, ErrMissingExtension + } + + t := reflect.TypeOf(extension.ExtensionType) + props := extensionProperties(extension) + + sf, _, err := fieldDefault(t, props) + if err != nil { + return nil, err + } + + if sf == nil || sf.value == nil { + // There is no default value. + return nil, ErrMissingExtension + } + + if t.Kind() != reflect.Ptr { + // We do not need to return a Ptr, we can directly return sf.value. + return sf.value, nil + } + + // We need to return an interface{} that is a pointer to sf.value. + value := reflect.New(t).Elem() + value.Set(reflect.New(value.Type().Elem())) + if sf.kind == reflect.Int32 { + // We may have an int32 or an enum, but the underlying data is int32. + // Since we can't set an int32 into a non int32 reflect.value directly + // set it as a int32. + value.Elem().SetInt(int64(sf.value.(int32))) + } else { + value.Elem().Set(reflect.ValueOf(sf.value)) + } + return value.Interface(), nil +} + +// decodeExtension decodes an extension encoded in b. +func decodeExtension(b []byte, extension *ExtensionDesc) (interface{}, error) { + t := reflect.TypeOf(extension.ExtensionType) + unmarshal := typeUnmarshaler(t, extension.Tag) + + // t is a pointer to a struct, pointer to basic type or a slice. + // Allocate space to store the pointer/slice. + value := reflect.New(t).Elem() + + var err error + for { + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + wire := int(x) & 7 + + b, err = unmarshal(b, valToPointer(value.Addr()), wire) + if err != nil { + return nil, err + } + + if len(b) == 0 { + break + } + } + return value.Interface(), nil +} + +// GetExtensions returns a slice of the extensions present in pb that are also listed in es. +// The returned slice has the same length as es; missing extensions will appear as nil elements. +func GetExtensions(pb Message, es []*ExtensionDesc) (extensions []interface{}, err error) { + epb, err := extendable(pb) + if err != nil { + return nil, err + } + extensions = make([]interface{}, len(es)) + for i, e := range es { + extensions[i], err = GetExtension(epb, e) + if err == ErrMissingExtension { + err = nil + } + if err != nil { + return + } + } + return +} + +// ExtensionDescs returns a new slice containing pb's extension descriptors, in undefined order. +// For non-registered extensions, ExtensionDescs returns an incomplete descriptor containing +// just the Field field, which defines the extension's field number. +func ExtensionDescs(pb Message) ([]*ExtensionDesc, error) { + epb, err := extendable(pb) + if err != nil { + return nil, err + } + registeredExtensions := RegisteredExtensions(pb) + + emap, mu := epb.extensionsRead() + if emap == nil { + return nil, nil + } + mu.Lock() + defer mu.Unlock() + extensions := make([]*ExtensionDesc, 0, len(emap)) + for extid, e := range emap { + desc := e.desc + if desc == nil { + desc = registeredExtensions[extid] + if desc == nil { + desc = &ExtensionDesc{Field: extid} + } + } + + extensions = append(extensions, desc) + } + return extensions, nil +} + +// SetExtension sets the specified extension of pb to the specified value. +func SetExtension(pb Message, extension *ExtensionDesc, value interface{}) error { + epb, err := extendable(pb) + if err != nil { + return err + } + if err := checkExtensionTypes(epb, extension); err != nil { + return err + } + typ := reflect.TypeOf(extension.ExtensionType) + if typ != reflect.TypeOf(value) { + return fmt.Errorf("proto: bad extension value type. got: %T, want: %T", value, extension.ExtensionType) + } + // nil extension values need to be caught early, because the + // encoder can't distinguish an ErrNil due to a nil extension + // from an ErrNil due to a missing field. Extensions are + // always optional, so the encoder would just swallow the error + // and drop all the extensions from the encoded message. + if reflect.ValueOf(value).IsNil() { + return fmt.Errorf("proto: SetExtension called with nil value of type %T", value) + } + + extmap := epb.extensionsWrite() + extmap[extension.Field] = Extension{desc: extension, value: extensionAsStorageType(value)} + return nil +} + +// ClearAllExtensions clears all extensions from pb. +func ClearAllExtensions(pb Message) { + epb, err := extendable(pb) + if err != nil { + return + } + m := epb.extensionsWrite() + for k := range m { + delete(m, k) + } +} + +// A global registry of extensions. +// The generated code will register the generated descriptors by calling RegisterExtension. + +var extensionMaps = make(map[reflect.Type]map[int32]*ExtensionDesc) + +// RegisterExtension is called from the generated code. +func RegisterExtension(desc *ExtensionDesc) { + st := reflect.TypeOf(desc.ExtendedType).Elem() + m := extensionMaps[st] + if m == nil { + m = make(map[int32]*ExtensionDesc) + extensionMaps[st] = m + } + if _, ok := m[desc.Field]; ok { + panic("proto: duplicate extension registered: " + st.String() + " " + strconv.Itoa(int(desc.Field))) + } + m[desc.Field] = desc +} + +// RegisteredExtensions returns a map of the registered extensions of a +// protocol buffer struct, indexed by the extension number. +// The argument pb should be a nil pointer to the struct type. +func RegisteredExtensions(pb Message) map[int32]*ExtensionDesc { + return extensionMaps[reflect.TypeOf(pb).Elem()] +} + +// extensionAsLegacyType converts an value in the storage type as the API type. +// See Extension.value. +func extensionAsLegacyType(v interface{}) interface{} { + switch rv := reflect.ValueOf(v); rv.Kind() { + case reflect.Bool, reflect.Int32, reflect.Int64, reflect.Uint32, reflect.Uint64, reflect.Float32, reflect.Float64, reflect.String: + // Represent primitive types as a pointer to the value. + rv2 := reflect.New(rv.Type()) + rv2.Elem().Set(rv) + v = rv2.Interface() + case reflect.Ptr: + // Represent slice types as the value itself. + switch rv.Type().Elem().Kind() { + case reflect.Slice: + if rv.IsNil() { + v = reflect.Zero(rv.Type().Elem()).Interface() + } else { + v = rv.Elem().Interface() + } + } + } + return v +} + +// extensionAsStorageType converts an value in the API type as the storage type. +// See Extension.value. +func extensionAsStorageType(v interface{}) interface{} { + switch rv := reflect.ValueOf(v); rv.Kind() { + case reflect.Ptr: + // Represent slice types as the value itself. + switch rv.Type().Elem().Kind() { + case reflect.Bool, reflect.Int32, reflect.Int64, reflect.Uint32, reflect.Uint64, reflect.Float32, reflect.Float64, reflect.String: + if rv.IsNil() { + v = reflect.Zero(rv.Type().Elem()).Interface() + } else { + v = rv.Elem().Interface() + } + } + case reflect.Slice: + // Represent slice types as a pointer to the value. + if rv.Type().Elem().Kind() != reflect.Uint8 { + rv2 := reflect.New(rv.Type()) + rv2.Elem().Set(rv) + v = rv2.Interface() + } + } + return v +} diff --git a/vendor/github.com/golang/protobuf/proto/lib.go b/vendor/github.com/golang/protobuf/proto/lib.go new file mode 100644 index 0000000..fdd328b --- /dev/null +++ b/vendor/github.com/golang/protobuf/proto/lib.go @@ -0,0 +1,965 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +/* +Package proto converts data structures to and from the wire format of +protocol buffers. It works in concert with the Go source code generated +for .proto files by the protocol compiler. + +A summary of the properties of the protocol buffer interface +for a protocol buffer variable v: + + - Names are turned from camel_case to CamelCase for export. + - There are no methods on v to set fields; just treat + them as structure fields. + - There are getters that return a field's value if set, + and return the field's default value if unset. + The getters work even if the receiver is a nil message. + - The zero value for a struct is its correct initialization state. + All desired fields must be set before marshaling. + - A Reset() method will restore a protobuf struct to its zero state. + - Non-repeated fields are pointers to the values; nil means unset. + That is, optional or required field int32 f becomes F *int32. + - Repeated fields are slices. + - Helper functions are available to aid the setting of fields. + msg.Foo = proto.String("hello") // set field + - Constants are defined to hold the default values of all fields that + have them. They have the form Default_StructName_FieldName. + Because the getter methods handle defaulted values, + direct use of these constants should be rare. + - Enums are given type names and maps from names to values. + Enum values are prefixed by the enclosing message's name, or by the + enum's type name if it is a top-level enum. Enum types have a String + method, and a Enum method to assist in message construction. + - Nested messages, groups and enums have type names prefixed with the name of + the surrounding message type. + - Extensions are given descriptor names that start with E_, + followed by an underscore-delimited list of the nested messages + that contain it (if any) followed by the CamelCased name of the + extension field itself. HasExtension, ClearExtension, GetExtension + and SetExtension are functions for manipulating extensions. + - Oneof field sets are given a single field in their message, + with distinguished wrapper types for each possible field value. + - Marshal and Unmarshal are functions to encode and decode the wire format. + +When the .proto file specifies `syntax="proto3"`, there are some differences: + + - Non-repeated fields of non-message type are values instead of pointers. + - Enum types do not get an Enum method. + +The simplest way to describe this is to see an example. +Given file test.proto, containing + + package example; + + enum FOO { X = 17; } + + message Test { + required string label = 1; + optional int32 type = 2 [default=77]; + repeated int64 reps = 3; + optional group OptionalGroup = 4 { + required string RequiredField = 5; + } + oneof union { + int32 number = 6; + string name = 7; + } + } + +The resulting file, test.pb.go, is: + + package example + + import proto "github.com/golang/protobuf/proto" + import math "math" + + type FOO int32 + const ( + FOO_X FOO = 17 + ) + var FOO_name = map[int32]string{ + 17: "X", + } + var FOO_value = map[string]int32{ + "X": 17, + } + + func (x FOO) Enum() *FOO { + p := new(FOO) + *p = x + return p + } + func (x FOO) String() string { + return proto.EnumName(FOO_name, int32(x)) + } + func (x *FOO) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(FOO_value, data) + if err != nil { + return err + } + *x = FOO(value) + return nil + } + + type Test struct { + Label *string `protobuf:"bytes,1,req,name=label" json:"label,omitempty"` + Type *int32 `protobuf:"varint,2,opt,name=type,def=77" json:"type,omitempty"` + Reps []int64 `protobuf:"varint,3,rep,name=reps" json:"reps,omitempty"` + Optionalgroup *Test_OptionalGroup `protobuf:"group,4,opt,name=OptionalGroup" json:"optionalgroup,omitempty"` + // Types that are valid to be assigned to Union: + // *Test_Number + // *Test_Name + Union isTest_Union `protobuf_oneof:"union"` + XXX_unrecognized []byte `json:"-"` + } + func (m *Test) Reset() { *m = Test{} } + func (m *Test) String() string { return proto.CompactTextString(m) } + func (*Test) ProtoMessage() {} + + type isTest_Union interface { + isTest_Union() + } + + type Test_Number struct { + Number int32 `protobuf:"varint,6,opt,name=number"` + } + type Test_Name struct { + Name string `protobuf:"bytes,7,opt,name=name"` + } + + func (*Test_Number) isTest_Union() {} + func (*Test_Name) isTest_Union() {} + + func (m *Test) GetUnion() isTest_Union { + if m != nil { + return m.Union + } + return nil + } + const Default_Test_Type int32 = 77 + + func (m *Test) GetLabel() string { + if m != nil && m.Label != nil { + return *m.Label + } + return "" + } + + func (m *Test) GetType() int32 { + if m != nil && m.Type != nil { + return *m.Type + } + return Default_Test_Type + } + + func (m *Test) GetOptionalgroup() *Test_OptionalGroup { + if m != nil { + return m.Optionalgroup + } + return nil + } + + type Test_OptionalGroup struct { + RequiredField *string `protobuf:"bytes,5,req" json:"RequiredField,omitempty"` + } + func (m *Test_OptionalGroup) Reset() { *m = Test_OptionalGroup{} } + func (m *Test_OptionalGroup) String() string { return proto.CompactTextString(m) } + + func (m *Test_OptionalGroup) GetRequiredField() string { + if m != nil && m.RequiredField != nil { + return *m.RequiredField + } + return "" + } + + func (m *Test) GetNumber() int32 { + if x, ok := m.GetUnion().(*Test_Number); ok { + return x.Number + } + return 0 + } + + func (m *Test) GetName() string { + if x, ok := m.GetUnion().(*Test_Name); ok { + return x.Name + } + return "" + } + + func init() { + proto.RegisterEnum("example.FOO", FOO_name, FOO_value) + } + +To create and play with a Test object: + + package main + + import ( + "log" + + "github.com/golang/protobuf/proto" + pb "./example.pb" + ) + + func main() { + test := &pb.Test{ + Label: proto.String("hello"), + Type: proto.Int32(17), + Reps: []int64{1, 2, 3}, + Optionalgroup: &pb.Test_OptionalGroup{ + RequiredField: proto.String("good bye"), + }, + Union: &pb.Test_Name{"fred"}, + } + data, err := proto.Marshal(test) + if err != nil { + log.Fatal("marshaling error: ", err) + } + newTest := &pb.Test{} + err = proto.Unmarshal(data, newTest) + if err != nil { + log.Fatal("unmarshaling error: ", err) + } + // Now test and newTest contain the same data. + if test.GetLabel() != newTest.GetLabel() { + log.Fatalf("data mismatch %q != %q", test.GetLabel(), newTest.GetLabel()) + } + // Use a type switch to determine which oneof was set. + switch u := test.Union.(type) { + case *pb.Test_Number: // u.Number contains the number. + case *pb.Test_Name: // u.Name contains the string. + } + // etc. + } +*/ +package proto + +import ( + "encoding/json" + "fmt" + "log" + "reflect" + "sort" + "strconv" + "sync" +) + +// RequiredNotSetError is an error type returned by either Marshal or Unmarshal. +// Marshal reports this when a required field is not initialized. +// Unmarshal reports this when a required field is missing from the wire data. +type RequiredNotSetError struct{ field string } + +func (e *RequiredNotSetError) Error() string { + if e.field == "" { + return fmt.Sprintf("proto: required field not set") + } + return fmt.Sprintf("proto: required field %q not set", e.field) +} +func (e *RequiredNotSetError) RequiredNotSet() bool { + return true +} + +type invalidUTF8Error struct{ field string } + +func (e *invalidUTF8Error) Error() string { + if e.field == "" { + return "proto: invalid UTF-8 detected" + } + return fmt.Sprintf("proto: field %q contains invalid UTF-8", e.field) +} +func (e *invalidUTF8Error) InvalidUTF8() bool { + return true +} + +// errInvalidUTF8 is a sentinel error to identify fields with invalid UTF-8. +// This error should not be exposed to the external API as such errors should +// be recreated with the field information. +var errInvalidUTF8 = &invalidUTF8Error{} + +// isNonFatal reports whether the error is either a RequiredNotSet error +// or a InvalidUTF8 error. +func isNonFatal(err error) bool { + if re, ok := err.(interface{ RequiredNotSet() bool }); ok && re.RequiredNotSet() { + return true + } + if re, ok := err.(interface{ InvalidUTF8() bool }); ok && re.InvalidUTF8() { + return true + } + return false +} + +type nonFatal struct{ E error } + +// Merge merges err into nf and reports whether it was successful. +// Otherwise it returns false for any fatal non-nil errors. +func (nf *nonFatal) Merge(err error) (ok bool) { + if err == nil { + return true // not an error + } + if !isNonFatal(err) { + return false // fatal error + } + if nf.E == nil { + nf.E = err // store first instance of non-fatal error + } + return true +} + +// Message is implemented by generated protocol buffer messages. +type Message interface { + Reset() + String() string + ProtoMessage() +} + +// A Buffer is a buffer manager for marshaling and unmarshaling +// protocol buffers. It may be reused between invocations to +// reduce memory usage. It is not necessary to use a Buffer; +// the global functions Marshal and Unmarshal create a +// temporary Buffer and are fine for most applications. +type Buffer struct { + buf []byte // encode/decode byte stream + index int // read point + + deterministic bool +} + +// NewBuffer allocates a new Buffer and initializes its internal data to +// the contents of the argument slice. +func NewBuffer(e []byte) *Buffer { + return &Buffer{buf: e} +} + +// Reset resets the Buffer, ready for marshaling a new protocol buffer. +func (p *Buffer) Reset() { + p.buf = p.buf[0:0] // for reading/writing + p.index = 0 // for reading +} + +// SetBuf replaces the internal buffer with the slice, +// ready for unmarshaling the contents of the slice. +func (p *Buffer) SetBuf(s []byte) { + p.buf = s + p.index = 0 +} + +// Bytes returns the contents of the Buffer. +func (p *Buffer) Bytes() []byte { return p.buf } + +// SetDeterministic sets whether to use deterministic serialization. +// +// Deterministic serialization guarantees that for a given binary, equal +// messages will always be serialized to the same bytes. This implies: +// +// - Repeated serialization of a message will return the same bytes. +// - Different processes of the same binary (which may be executing on +// different machines) will serialize equal messages to the same bytes. +// +// Note that the deterministic serialization is NOT canonical across +// languages. It is not guaranteed to remain stable over time. It is unstable +// across different builds with schema changes due to unknown fields. +// Users who need canonical serialization (e.g., persistent storage in a +// canonical form, fingerprinting, etc.) should define their own +// canonicalization specification and implement their own serializer rather +// than relying on this API. +// +// If deterministic serialization is requested, map entries will be sorted +// by keys in lexographical order. This is an implementation detail and +// subject to change. +func (p *Buffer) SetDeterministic(deterministic bool) { + p.deterministic = deterministic +} + +/* + * Helper routines for simplifying the creation of optional fields of basic type. + */ + +// Bool is a helper routine that allocates a new bool value +// to store v and returns a pointer to it. +func Bool(v bool) *bool { + return &v +} + +// Int32 is a helper routine that allocates a new int32 value +// to store v and returns a pointer to it. +func Int32(v int32) *int32 { + return &v +} + +// Int is a helper routine that allocates a new int32 value +// to store v and returns a pointer to it, but unlike Int32 +// its argument value is an int. +func Int(v int) *int32 { + p := new(int32) + *p = int32(v) + return p +} + +// Int64 is a helper routine that allocates a new int64 value +// to store v and returns a pointer to it. +func Int64(v int64) *int64 { + return &v +} + +// Float32 is a helper routine that allocates a new float32 value +// to store v and returns a pointer to it. +func Float32(v float32) *float32 { + return &v +} + +// Float64 is a helper routine that allocates a new float64 value +// to store v and returns a pointer to it. +func Float64(v float64) *float64 { + return &v +} + +// Uint32 is a helper routine that allocates a new uint32 value +// to store v and returns a pointer to it. +func Uint32(v uint32) *uint32 { + return &v +} + +// Uint64 is a helper routine that allocates a new uint64 value +// to store v and returns a pointer to it. +func Uint64(v uint64) *uint64 { + return &v +} + +// String is a helper routine that allocates a new string value +// to store v and returns a pointer to it. +func String(v string) *string { + return &v +} + +// EnumName is a helper function to simplify printing protocol buffer enums +// by name. Given an enum map and a value, it returns a useful string. +func EnumName(m map[int32]string, v int32) string { + s, ok := m[v] + if ok { + return s + } + return strconv.Itoa(int(v)) +} + +// UnmarshalJSONEnum is a helper function to simplify recovering enum int values +// from their JSON-encoded representation. Given a map from the enum's symbolic +// names to its int values, and a byte buffer containing the JSON-encoded +// value, it returns an int32 that can be cast to the enum type by the caller. +// +// The function can deal with both JSON representations, numeric and symbolic. +func UnmarshalJSONEnum(m map[string]int32, data []byte, enumName string) (int32, error) { + if data[0] == '"' { + // New style: enums are strings. + var repr string + if err := json.Unmarshal(data, &repr); err != nil { + return -1, err + } + val, ok := m[repr] + if !ok { + return 0, fmt.Errorf("unrecognized enum %s value %q", enumName, repr) + } + return val, nil + } + // Old style: enums are ints. + var val int32 + if err := json.Unmarshal(data, &val); err != nil { + return 0, fmt.Errorf("cannot unmarshal %#q into enum %s", data, enumName) + } + return val, nil +} + +// DebugPrint dumps the encoded data in b in a debugging format with a header +// including the string s. Used in testing but made available for general debugging. +func (p *Buffer) DebugPrint(s string, b []byte) { + var u uint64 + + obuf := p.buf + index := p.index + p.buf = b + p.index = 0 + depth := 0 + + fmt.Printf("\n--- %s ---\n", s) + +out: + for { + for i := 0; i < depth; i++ { + fmt.Print(" ") + } + + index := p.index + if index == len(p.buf) { + break + } + + op, err := p.DecodeVarint() + if err != nil { + fmt.Printf("%3d: fetching op err %v\n", index, err) + break out + } + tag := op >> 3 + wire := op & 7 + + switch wire { + default: + fmt.Printf("%3d: t=%3d unknown wire=%d\n", + index, tag, wire) + break out + + case WireBytes: + var r []byte + + r, err = p.DecodeRawBytes(false) + if err != nil { + break out + } + fmt.Printf("%3d: t=%3d bytes [%d]", index, tag, len(r)) + if len(r) <= 6 { + for i := 0; i < len(r); i++ { + fmt.Printf(" %.2x", r[i]) + } + } else { + for i := 0; i < 3; i++ { + fmt.Printf(" %.2x", r[i]) + } + fmt.Printf(" ..") + for i := len(r) - 3; i < len(r); i++ { + fmt.Printf(" %.2x", r[i]) + } + } + fmt.Printf("\n") + + case WireFixed32: + u, err = p.DecodeFixed32() + if err != nil { + fmt.Printf("%3d: t=%3d fix32 err %v\n", index, tag, err) + break out + } + fmt.Printf("%3d: t=%3d fix32 %d\n", index, tag, u) + + case WireFixed64: + u, err = p.DecodeFixed64() + if err != nil { + fmt.Printf("%3d: t=%3d fix64 err %v\n", index, tag, err) + break out + } + fmt.Printf("%3d: t=%3d fix64 %d\n", index, tag, u) + + case WireVarint: + u, err = p.DecodeVarint() + if err != nil { + fmt.Printf("%3d: t=%3d varint err %v\n", index, tag, err) + break out + } + fmt.Printf("%3d: t=%3d varint %d\n", index, tag, u) + + case WireStartGroup: + fmt.Printf("%3d: t=%3d start\n", index, tag) + depth++ + + case WireEndGroup: + depth-- + fmt.Printf("%3d: t=%3d end\n", index, tag) + } + } + + if depth != 0 { + fmt.Printf("%3d: start-end not balanced %d\n", p.index, depth) + } + fmt.Printf("\n") + + p.buf = obuf + p.index = index +} + +// SetDefaults sets unset protocol buffer fields to their default values. +// It only modifies fields that are both unset and have defined defaults. +// It recursively sets default values in any non-nil sub-messages. +func SetDefaults(pb Message) { + setDefaults(reflect.ValueOf(pb), true, false) +} + +// v is a pointer to a struct. +func setDefaults(v reflect.Value, recur, zeros bool) { + v = v.Elem() + + defaultMu.RLock() + dm, ok := defaults[v.Type()] + defaultMu.RUnlock() + if !ok { + dm = buildDefaultMessage(v.Type()) + defaultMu.Lock() + defaults[v.Type()] = dm + defaultMu.Unlock() + } + + for _, sf := range dm.scalars { + f := v.Field(sf.index) + if !f.IsNil() { + // field already set + continue + } + dv := sf.value + if dv == nil && !zeros { + // no explicit default, and don't want to set zeros + continue + } + fptr := f.Addr().Interface() // **T + // TODO: Consider batching the allocations we do here. + switch sf.kind { + case reflect.Bool: + b := new(bool) + if dv != nil { + *b = dv.(bool) + } + *(fptr.(**bool)) = b + case reflect.Float32: + f := new(float32) + if dv != nil { + *f = dv.(float32) + } + *(fptr.(**float32)) = f + case reflect.Float64: + f := new(float64) + if dv != nil { + *f = dv.(float64) + } + *(fptr.(**float64)) = f + case reflect.Int32: + // might be an enum + if ft := f.Type(); ft != int32PtrType { + // enum + f.Set(reflect.New(ft.Elem())) + if dv != nil { + f.Elem().SetInt(int64(dv.(int32))) + } + } else { + // int32 field + i := new(int32) + if dv != nil { + *i = dv.(int32) + } + *(fptr.(**int32)) = i + } + case reflect.Int64: + i := new(int64) + if dv != nil { + *i = dv.(int64) + } + *(fptr.(**int64)) = i + case reflect.String: + s := new(string) + if dv != nil { + *s = dv.(string) + } + *(fptr.(**string)) = s + case reflect.Uint8: + // exceptional case: []byte + var b []byte + if dv != nil { + db := dv.([]byte) + b = make([]byte, len(db)) + copy(b, db) + } else { + b = []byte{} + } + *(fptr.(*[]byte)) = b + case reflect.Uint32: + u := new(uint32) + if dv != nil { + *u = dv.(uint32) + } + *(fptr.(**uint32)) = u + case reflect.Uint64: + u := new(uint64) + if dv != nil { + *u = dv.(uint64) + } + *(fptr.(**uint64)) = u + default: + log.Printf("proto: can't set default for field %v (sf.kind=%v)", f, sf.kind) + } + } + + for _, ni := range dm.nested { + f := v.Field(ni) + // f is *T or []*T or map[T]*T + switch f.Kind() { + case reflect.Ptr: + if f.IsNil() { + continue + } + setDefaults(f, recur, zeros) + + case reflect.Slice: + for i := 0; i < f.Len(); i++ { + e := f.Index(i) + if e.IsNil() { + continue + } + setDefaults(e, recur, zeros) + } + + case reflect.Map: + for _, k := range f.MapKeys() { + e := f.MapIndex(k) + if e.IsNil() { + continue + } + setDefaults(e, recur, zeros) + } + } + } +} + +var ( + // defaults maps a protocol buffer struct type to a slice of the fields, + // with its scalar fields set to their proto-declared non-zero default values. + defaultMu sync.RWMutex + defaults = make(map[reflect.Type]defaultMessage) + + int32PtrType = reflect.TypeOf((*int32)(nil)) +) + +// defaultMessage represents information about the default values of a message. +type defaultMessage struct { + scalars []scalarField + nested []int // struct field index of nested messages +} + +type scalarField struct { + index int // struct field index + kind reflect.Kind // element type (the T in *T or []T) + value interface{} // the proto-declared default value, or nil +} + +// t is a struct type. +func buildDefaultMessage(t reflect.Type) (dm defaultMessage) { + sprop := GetProperties(t) + for _, prop := range sprop.Prop { + fi, ok := sprop.decoderTags.get(prop.Tag) + if !ok { + // XXX_unrecognized + continue + } + ft := t.Field(fi).Type + + sf, nested, err := fieldDefault(ft, prop) + switch { + case err != nil: + log.Print(err) + case nested: + dm.nested = append(dm.nested, fi) + case sf != nil: + sf.index = fi + dm.scalars = append(dm.scalars, *sf) + } + } + + return dm +} + +// fieldDefault returns the scalarField for field type ft. +// sf will be nil if the field can not have a default. +// nestedMessage will be true if this is a nested message. +// Note that sf.index is not set on return. +func fieldDefault(ft reflect.Type, prop *Properties) (sf *scalarField, nestedMessage bool, err error) { + var canHaveDefault bool + switch ft.Kind() { + case reflect.Ptr: + if ft.Elem().Kind() == reflect.Struct { + nestedMessage = true + } else { + canHaveDefault = true // proto2 scalar field + } + + case reflect.Slice: + switch ft.Elem().Kind() { + case reflect.Ptr: + nestedMessage = true // repeated message + case reflect.Uint8: + canHaveDefault = true // bytes field + } + + case reflect.Map: + if ft.Elem().Kind() == reflect.Ptr { + nestedMessage = true // map with message values + } + } + + if !canHaveDefault { + if nestedMessage { + return nil, true, nil + } + return nil, false, nil + } + + // We now know that ft is a pointer or slice. + sf = &scalarField{kind: ft.Elem().Kind()} + + // scalar fields without defaults + if !prop.HasDefault { + return sf, false, nil + } + + // a scalar field: either *T or []byte + switch ft.Elem().Kind() { + case reflect.Bool: + x, err := strconv.ParseBool(prop.Default) + if err != nil { + return nil, false, fmt.Errorf("proto: bad default bool %q: %v", prop.Default, err) + } + sf.value = x + case reflect.Float32: + x, err := strconv.ParseFloat(prop.Default, 32) + if err != nil { + return nil, false, fmt.Errorf("proto: bad default float32 %q: %v", prop.Default, err) + } + sf.value = float32(x) + case reflect.Float64: + x, err := strconv.ParseFloat(prop.Default, 64) + if err != nil { + return nil, false, fmt.Errorf("proto: bad default float64 %q: %v", prop.Default, err) + } + sf.value = x + case reflect.Int32: + x, err := strconv.ParseInt(prop.Default, 10, 32) + if err != nil { + return nil, false, fmt.Errorf("proto: bad default int32 %q: %v", prop.Default, err) + } + sf.value = int32(x) + case reflect.Int64: + x, err := strconv.ParseInt(prop.Default, 10, 64) + if err != nil { + return nil, false, fmt.Errorf("proto: bad default int64 %q: %v", prop.Default, err) + } + sf.value = x + case reflect.String: + sf.value = prop.Default + case reflect.Uint8: + // []byte (not *uint8) + sf.value = []byte(prop.Default) + case reflect.Uint32: + x, err := strconv.ParseUint(prop.Default, 10, 32) + if err != nil { + return nil, false, fmt.Errorf("proto: bad default uint32 %q: %v", prop.Default, err) + } + sf.value = uint32(x) + case reflect.Uint64: + x, err := strconv.ParseUint(prop.Default, 10, 64) + if err != nil { + return nil, false, fmt.Errorf("proto: bad default uint64 %q: %v", prop.Default, err) + } + sf.value = x + default: + return nil, false, fmt.Errorf("proto: unhandled def kind %v", ft.Elem().Kind()) + } + + return sf, false, nil +} + +// mapKeys returns a sort.Interface to be used for sorting the map keys. +// Map fields may have key types of non-float scalars, strings and enums. +func mapKeys(vs []reflect.Value) sort.Interface { + s := mapKeySorter{vs: vs} + + // Type specialization per https://developers.google.com/protocol-buffers/docs/proto#maps. + if len(vs) == 0 { + return s + } + switch vs[0].Kind() { + case reflect.Int32, reflect.Int64: + s.less = func(a, b reflect.Value) bool { return a.Int() < b.Int() } + case reflect.Uint32, reflect.Uint64: + s.less = func(a, b reflect.Value) bool { return a.Uint() < b.Uint() } + case reflect.Bool: + s.less = func(a, b reflect.Value) bool { return !a.Bool() && b.Bool() } // false < true + case reflect.String: + s.less = func(a, b reflect.Value) bool { return a.String() < b.String() } + default: + panic(fmt.Sprintf("unsupported map key type: %v", vs[0].Kind())) + } + + return s +} + +type mapKeySorter struct { + vs []reflect.Value + less func(a, b reflect.Value) bool +} + +func (s mapKeySorter) Len() int { return len(s.vs) } +func (s mapKeySorter) Swap(i, j int) { s.vs[i], s.vs[j] = s.vs[j], s.vs[i] } +func (s mapKeySorter) Less(i, j int) bool { + return s.less(s.vs[i], s.vs[j]) +} + +// isProto3Zero reports whether v is a zero proto3 value. +func isProto3Zero(v reflect.Value) bool { + switch v.Kind() { + case reflect.Bool: + return !v.Bool() + case reflect.Int32, reflect.Int64: + return v.Int() == 0 + case reflect.Uint32, reflect.Uint64: + return v.Uint() == 0 + case reflect.Float32, reflect.Float64: + return v.Float() == 0 + case reflect.String: + return v.String() == "" + } + return false +} + +const ( + // ProtoPackageIsVersion3 is referenced from generated protocol buffer files + // to assert that that code is compatible with this version of the proto package. + ProtoPackageIsVersion3 = true + + // ProtoPackageIsVersion2 is referenced from generated protocol buffer files + // to assert that that code is compatible with this version of the proto package. + ProtoPackageIsVersion2 = true + + // ProtoPackageIsVersion1 is referenced from generated protocol buffer files + // to assert that that code is compatible with this version of the proto package. + ProtoPackageIsVersion1 = true +) + +// InternalMessageInfo is a type used internally by generated .pb.go files. +// This type is not intended to be used by non-generated code. +// This type is not subject to any compatibility guarantee. +type InternalMessageInfo struct { + marshal *marshalInfo + unmarshal *unmarshalInfo + merge *mergeInfo + discard *discardInfo +} diff --git a/vendor/github.com/golang/protobuf/proto/message_set.go b/vendor/github.com/golang/protobuf/proto/message_set.go new file mode 100644 index 0000000..f48a756 --- /dev/null +++ b/vendor/github.com/golang/protobuf/proto/message_set.go @@ -0,0 +1,181 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +/* + * Support for message sets. + */ + +import ( + "errors" +) + +// errNoMessageTypeID occurs when a protocol buffer does not have a message type ID. +// A message type ID is required for storing a protocol buffer in a message set. +var errNoMessageTypeID = errors.New("proto does not have a message type ID") + +// The first two types (_MessageSet_Item and messageSet) +// model what the protocol compiler produces for the following protocol message: +// message MessageSet { +// repeated group Item = 1 { +// required int32 type_id = 2; +// required string message = 3; +// }; +// } +// That is the MessageSet wire format. We can't use a proto to generate these +// because that would introduce a circular dependency between it and this package. + +type _MessageSet_Item struct { + TypeId *int32 `protobuf:"varint,2,req,name=type_id"` + Message []byte `protobuf:"bytes,3,req,name=message"` +} + +type messageSet struct { + Item []*_MessageSet_Item `protobuf:"group,1,rep"` + XXX_unrecognized []byte + // TODO: caching? +} + +// Make sure messageSet is a Message. +var _ Message = (*messageSet)(nil) + +// messageTypeIder is an interface satisfied by a protocol buffer type +// that may be stored in a MessageSet. +type messageTypeIder interface { + MessageTypeId() int32 +} + +func (ms *messageSet) find(pb Message) *_MessageSet_Item { + mti, ok := pb.(messageTypeIder) + if !ok { + return nil + } + id := mti.MessageTypeId() + for _, item := range ms.Item { + if *item.TypeId == id { + return item + } + } + return nil +} + +func (ms *messageSet) Has(pb Message) bool { + return ms.find(pb) != nil +} + +func (ms *messageSet) Unmarshal(pb Message) error { + if item := ms.find(pb); item != nil { + return Unmarshal(item.Message, pb) + } + if _, ok := pb.(messageTypeIder); !ok { + return errNoMessageTypeID + } + return nil // TODO: return error instead? +} + +func (ms *messageSet) Marshal(pb Message) error { + msg, err := Marshal(pb) + if err != nil { + return err + } + if item := ms.find(pb); item != nil { + // reuse existing item + item.Message = msg + return nil + } + + mti, ok := pb.(messageTypeIder) + if !ok { + return errNoMessageTypeID + } + + mtid := mti.MessageTypeId() + ms.Item = append(ms.Item, &_MessageSet_Item{ + TypeId: &mtid, + Message: msg, + }) + return nil +} + +func (ms *messageSet) Reset() { *ms = messageSet{} } +func (ms *messageSet) String() string { return CompactTextString(ms) } +func (*messageSet) ProtoMessage() {} + +// Support for the message_set_wire_format message option. + +func skipVarint(buf []byte) []byte { + i := 0 + for ; buf[i]&0x80 != 0; i++ { + } + return buf[i+1:] +} + +// unmarshalMessageSet decodes the extension map encoded in buf in the message set wire format. +// It is called by Unmarshal methods on protocol buffer messages with the message_set_wire_format option. +func unmarshalMessageSet(buf []byte, exts interface{}) error { + var m map[int32]Extension + switch exts := exts.(type) { + case *XXX_InternalExtensions: + m = exts.extensionsWrite() + case map[int32]Extension: + m = exts + default: + return errors.New("proto: not an extension map") + } + + ms := new(messageSet) + if err := Unmarshal(buf, ms); err != nil { + return err + } + for _, item := range ms.Item { + id := *item.TypeId + msg := item.Message + + // Restore wire type and field number varint, plus length varint. + // Be careful to preserve duplicate items. + b := EncodeVarint(uint64(id)<<3 | WireBytes) + if ext, ok := m[id]; ok { + // Existing data; rip off the tag and length varint + // so we join the new data correctly. + // We can assume that ext.enc is set because we are unmarshaling. + o := ext.enc[len(b):] // skip wire type and field number + _, n := DecodeVarint(o) // calculate length of length varint + o = o[n:] // skip length varint + msg = append(o, msg...) // join old data and new data + } + b = append(b, EncodeVarint(uint64(len(msg)))...) + b = append(b, msg...) + + m[id] = Extension{enc: b} + } + return nil +} diff --git a/vendor/github.com/golang/protobuf/proto/pointer_reflect.go b/vendor/github.com/golang/protobuf/proto/pointer_reflect.go new file mode 100644 index 0000000..94fa919 --- /dev/null +++ b/vendor/github.com/golang/protobuf/proto/pointer_reflect.go @@ -0,0 +1,360 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2012 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// +build purego appengine js + +// This file contains an implementation of proto field accesses using package reflect. +// It is slower than the code in pointer_unsafe.go but it avoids package unsafe and can +// be used on App Engine. + +package proto + +import ( + "reflect" + "sync" +) + +const unsafeAllowed = false + +// A field identifies a field in a struct, accessible from a pointer. +// In this implementation, a field is identified by the sequence of field indices +// passed to reflect's FieldByIndex. +type field []int + +// toField returns a field equivalent to the given reflect field. +func toField(f *reflect.StructField) field { + return f.Index +} + +// invalidField is an invalid field identifier. +var invalidField = field(nil) + +// zeroField is a noop when calling pointer.offset. +var zeroField = field([]int{}) + +// IsValid reports whether the field identifier is valid. +func (f field) IsValid() bool { return f != nil } + +// The pointer type is for the table-driven decoder. +// The implementation here uses a reflect.Value of pointer type to +// create a generic pointer. In pointer_unsafe.go we use unsafe +// instead of reflect to implement the same (but faster) interface. +type pointer struct { + v reflect.Value +} + +// toPointer converts an interface of pointer type to a pointer +// that points to the same target. +func toPointer(i *Message) pointer { + return pointer{v: reflect.ValueOf(*i)} +} + +// toAddrPointer converts an interface to a pointer that points to +// the interface data. +func toAddrPointer(i *interface{}, isptr, deref bool) pointer { + v := reflect.ValueOf(*i) + u := reflect.New(v.Type()) + u.Elem().Set(v) + if deref { + u = u.Elem() + } + return pointer{v: u} +} + +// valToPointer converts v to a pointer. v must be of pointer type. +func valToPointer(v reflect.Value) pointer { + return pointer{v: v} +} + +// offset converts from a pointer to a structure to a pointer to +// one of its fields. +func (p pointer) offset(f field) pointer { + return pointer{v: p.v.Elem().FieldByIndex(f).Addr()} +} + +func (p pointer) isNil() bool { + return p.v.IsNil() +} + +// grow updates the slice s in place to make it one element longer. +// s must be addressable. +// Returns the (addressable) new element. +func grow(s reflect.Value) reflect.Value { + n, m := s.Len(), s.Cap() + if n < m { + s.SetLen(n + 1) + } else { + s.Set(reflect.Append(s, reflect.Zero(s.Type().Elem()))) + } + return s.Index(n) +} + +func (p pointer) toInt64() *int64 { + return p.v.Interface().(*int64) +} +func (p pointer) toInt64Ptr() **int64 { + return p.v.Interface().(**int64) +} +func (p pointer) toInt64Slice() *[]int64 { + return p.v.Interface().(*[]int64) +} + +var int32ptr = reflect.TypeOf((*int32)(nil)) + +func (p pointer) toInt32() *int32 { + return p.v.Convert(int32ptr).Interface().(*int32) +} + +// The toInt32Ptr/Slice methods don't work because of enums. +// Instead, we must use set/get methods for the int32ptr/slice case. +/* + func (p pointer) toInt32Ptr() **int32 { + return p.v.Interface().(**int32) +} + func (p pointer) toInt32Slice() *[]int32 { + return p.v.Interface().(*[]int32) +} +*/ +func (p pointer) getInt32Ptr() *int32 { + if p.v.Type().Elem().Elem() == reflect.TypeOf(int32(0)) { + // raw int32 type + return p.v.Elem().Interface().(*int32) + } + // an enum + return p.v.Elem().Convert(int32PtrType).Interface().(*int32) +} +func (p pointer) setInt32Ptr(v int32) { + // Allocate value in a *int32. Possibly convert that to a *enum. + // Then assign it to a **int32 or **enum. + // Note: we can convert *int32 to *enum, but we can't convert + // **int32 to **enum! + p.v.Elem().Set(reflect.ValueOf(&v).Convert(p.v.Type().Elem())) +} + +// getInt32Slice copies []int32 from p as a new slice. +// This behavior differs from the implementation in pointer_unsafe.go. +func (p pointer) getInt32Slice() []int32 { + if p.v.Type().Elem().Elem() == reflect.TypeOf(int32(0)) { + // raw int32 type + return p.v.Elem().Interface().([]int32) + } + // an enum + // Allocate a []int32, then assign []enum's values into it. + // Note: we can't convert []enum to []int32. + slice := p.v.Elem() + s := make([]int32, slice.Len()) + for i := 0; i < slice.Len(); i++ { + s[i] = int32(slice.Index(i).Int()) + } + return s +} + +// setInt32Slice copies []int32 into p as a new slice. +// This behavior differs from the implementation in pointer_unsafe.go. +func (p pointer) setInt32Slice(v []int32) { + if p.v.Type().Elem().Elem() == reflect.TypeOf(int32(0)) { + // raw int32 type + p.v.Elem().Set(reflect.ValueOf(v)) + return + } + // an enum + // Allocate a []enum, then assign []int32's values into it. + // Note: we can't convert []enum to []int32. + slice := reflect.MakeSlice(p.v.Type().Elem(), len(v), cap(v)) + for i, x := range v { + slice.Index(i).SetInt(int64(x)) + } + p.v.Elem().Set(slice) +} +func (p pointer) appendInt32Slice(v int32) { + grow(p.v.Elem()).SetInt(int64(v)) +} + +func (p pointer) toUint64() *uint64 { + return p.v.Interface().(*uint64) +} +func (p pointer) toUint64Ptr() **uint64 { + return p.v.Interface().(**uint64) +} +func (p pointer) toUint64Slice() *[]uint64 { + return p.v.Interface().(*[]uint64) +} +func (p pointer) toUint32() *uint32 { + return p.v.Interface().(*uint32) +} +func (p pointer) toUint32Ptr() **uint32 { + return p.v.Interface().(**uint32) +} +func (p pointer) toUint32Slice() *[]uint32 { + return p.v.Interface().(*[]uint32) +} +func (p pointer) toBool() *bool { + return p.v.Interface().(*bool) +} +func (p pointer) toBoolPtr() **bool { + return p.v.Interface().(**bool) +} +func (p pointer) toBoolSlice() *[]bool { + return p.v.Interface().(*[]bool) +} +func (p pointer) toFloat64() *float64 { + return p.v.Interface().(*float64) +} +func (p pointer) toFloat64Ptr() **float64 { + return p.v.Interface().(**float64) +} +func (p pointer) toFloat64Slice() *[]float64 { + return p.v.Interface().(*[]float64) +} +func (p pointer) toFloat32() *float32 { + return p.v.Interface().(*float32) +} +func (p pointer) toFloat32Ptr() **float32 { + return p.v.Interface().(**float32) +} +func (p pointer) toFloat32Slice() *[]float32 { + return p.v.Interface().(*[]float32) +} +func (p pointer) toString() *string { + return p.v.Interface().(*string) +} +func (p pointer) toStringPtr() **string { + return p.v.Interface().(**string) +} +func (p pointer) toStringSlice() *[]string { + return p.v.Interface().(*[]string) +} +func (p pointer) toBytes() *[]byte { + return p.v.Interface().(*[]byte) +} +func (p pointer) toBytesSlice() *[][]byte { + return p.v.Interface().(*[][]byte) +} +func (p pointer) toExtensions() *XXX_InternalExtensions { + return p.v.Interface().(*XXX_InternalExtensions) +} +func (p pointer) toOldExtensions() *map[int32]Extension { + return p.v.Interface().(*map[int32]Extension) +} +func (p pointer) getPointer() pointer { + return pointer{v: p.v.Elem()} +} +func (p pointer) setPointer(q pointer) { + p.v.Elem().Set(q.v) +} +func (p pointer) appendPointer(q pointer) { + grow(p.v.Elem()).Set(q.v) +} + +// getPointerSlice copies []*T from p as a new []pointer. +// This behavior differs from the implementation in pointer_unsafe.go. +func (p pointer) getPointerSlice() []pointer { + if p.v.IsNil() { + return nil + } + n := p.v.Elem().Len() + s := make([]pointer, n) + for i := 0; i < n; i++ { + s[i] = pointer{v: p.v.Elem().Index(i)} + } + return s +} + +// setPointerSlice copies []pointer into p as a new []*T. +// This behavior differs from the implementation in pointer_unsafe.go. +func (p pointer) setPointerSlice(v []pointer) { + if v == nil { + p.v.Elem().Set(reflect.New(p.v.Elem().Type()).Elem()) + return + } + s := reflect.MakeSlice(p.v.Elem().Type(), 0, len(v)) + for _, p := range v { + s = reflect.Append(s, p.v) + } + p.v.Elem().Set(s) +} + +// getInterfacePointer returns a pointer that points to the +// interface data of the interface pointed by p. +func (p pointer) getInterfacePointer() pointer { + if p.v.Elem().IsNil() { + return pointer{v: p.v.Elem()} + } + return pointer{v: p.v.Elem().Elem().Elem().Field(0).Addr()} // *interface -> interface -> *struct -> struct +} + +func (p pointer) asPointerTo(t reflect.Type) reflect.Value { + // TODO: check that p.v.Type().Elem() == t? + return p.v +} + +func atomicLoadUnmarshalInfo(p **unmarshalInfo) *unmarshalInfo { + atomicLock.Lock() + defer atomicLock.Unlock() + return *p +} +func atomicStoreUnmarshalInfo(p **unmarshalInfo, v *unmarshalInfo) { + atomicLock.Lock() + defer atomicLock.Unlock() + *p = v +} +func atomicLoadMarshalInfo(p **marshalInfo) *marshalInfo { + atomicLock.Lock() + defer atomicLock.Unlock() + return *p +} +func atomicStoreMarshalInfo(p **marshalInfo, v *marshalInfo) { + atomicLock.Lock() + defer atomicLock.Unlock() + *p = v +} +func atomicLoadMergeInfo(p **mergeInfo) *mergeInfo { + atomicLock.Lock() + defer atomicLock.Unlock() + return *p +} +func atomicStoreMergeInfo(p **mergeInfo, v *mergeInfo) { + atomicLock.Lock() + defer atomicLock.Unlock() + *p = v +} +func atomicLoadDiscardInfo(p **discardInfo) *discardInfo { + atomicLock.Lock() + defer atomicLock.Unlock() + return *p +} +func atomicStoreDiscardInfo(p **discardInfo, v *discardInfo) { + atomicLock.Lock() + defer atomicLock.Unlock() + *p = v +} + +var atomicLock sync.Mutex diff --git a/vendor/github.com/golang/protobuf/proto/pointer_unsafe.go b/vendor/github.com/golang/protobuf/proto/pointer_unsafe.go new file mode 100644 index 0000000..dbfffe0 --- /dev/null +++ b/vendor/github.com/golang/protobuf/proto/pointer_unsafe.go @@ -0,0 +1,313 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2012 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// +build !purego,!appengine,!js + +// This file contains the implementation of the proto field accesses using package unsafe. + +package proto + +import ( + "reflect" + "sync/atomic" + "unsafe" +) + +const unsafeAllowed = true + +// A field identifies a field in a struct, accessible from a pointer. +// In this implementation, a field is identified by its byte offset from the start of the struct. +type field uintptr + +// toField returns a field equivalent to the given reflect field. +func toField(f *reflect.StructField) field { + return field(f.Offset) +} + +// invalidField is an invalid field identifier. +const invalidField = ^field(0) + +// zeroField is a noop when calling pointer.offset. +const zeroField = field(0) + +// IsValid reports whether the field identifier is valid. +func (f field) IsValid() bool { + return f != invalidField +} + +// The pointer type below is for the new table-driven encoder/decoder. +// The implementation here uses unsafe.Pointer to create a generic pointer. +// In pointer_reflect.go we use reflect instead of unsafe to implement +// the same (but slower) interface. +type pointer struct { + p unsafe.Pointer +} + +// size of pointer +var ptrSize = unsafe.Sizeof(uintptr(0)) + +// toPointer converts an interface of pointer type to a pointer +// that points to the same target. +func toPointer(i *Message) pointer { + // Super-tricky - read pointer out of data word of interface value. + // Saves ~25ns over the equivalent: + // return valToPointer(reflect.ValueOf(*i)) + return pointer{p: (*[2]unsafe.Pointer)(unsafe.Pointer(i))[1]} +} + +// toAddrPointer converts an interface to a pointer that points to +// the interface data. +func toAddrPointer(i *interface{}, isptr, deref bool) (p pointer) { + // Super-tricky - read or get the address of data word of interface value. + if isptr { + // The interface is of pointer type, thus it is a direct interface. + // The data word is the pointer data itself. We take its address. + p = pointer{p: unsafe.Pointer(uintptr(unsafe.Pointer(i)) + ptrSize)} + } else { + // The interface is not of pointer type. The data word is the pointer + // to the data. + p = pointer{p: (*[2]unsafe.Pointer)(unsafe.Pointer(i))[1]} + } + if deref { + p.p = *(*unsafe.Pointer)(p.p) + } + return p +} + +// valToPointer converts v to a pointer. v must be of pointer type. +func valToPointer(v reflect.Value) pointer { + return pointer{p: unsafe.Pointer(v.Pointer())} +} + +// offset converts from a pointer to a structure to a pointer to +// one of its fields. +func (p pointer) offset(f field) pointer { + // For safety, we should panic if !f.IsValid, however calling panic causes + // this to no longer be inlineable, which is a serious performance cost. + /* + if !f.IsValid() { + panic("invalid field") + } + */ + return pointer{p: unsafe.Pointer(uintptr(p.p) + uintptr(f))} +} + +func (p pointer) isNil() bool { + return p.p == nil +} + +func (p pointer) toInt64() *int64 { + return (*int64)(p.p) +} +func (p pointer) toInt64Ptr() **int64 { + return (**int64)(p.p) +} +func (p pointer) toInt64Slice() *[]int64 { + return (*[]int64)(p.p) +} +func (p pointer) toInt32() *int32 { + return (*int32)(p.p) +} + +// See pointer_reflect.go for why toInt32Ptr/Slice doesn't exist. +/* + func (p pointer) toInt32Ptr() **int32 { + return (**int32)(p.p) + } + func (p pointer) toInt32Slice() *[]int32 { + return (*[]int32)(p.p) + } +*/ +func (p pointer) getInt32Ptr() *int32 { + return *(**int32)(p.p) +} +func (p pointer) setInt32Ptr(v int32) { + *(**int32)(p.p) = &v +} + +// getInt32Slice loads a []int32 from p. +// The value returned is aliased with the original slice. +// This behavior differs from the implementation in pointer_reflect.go. +func (p pointer) getInt32Slice() []int32 { + return *(*[]int32)(p.p) +} + +// setInt32Slice stores a []int32 to p. +// The value set is aliased with the input slice. +// This behavior differs from the implementation in pointer_reflect.go. +func (p pointer) setInt32Slice(v []int32) { + *(*[]int32)(p.p) = v +} + +// TODO: Can we get rid of appendInt32Slice and use setInt32Slice instead? +func (p pointer) appendInt32Slice(v int32) { + s := (*[]int32)(p.p) + *s = append(*s, v) +} + +func (p pointer) toUint64() *uint64 { + return (*uint64)(p.p) +} +func (p pointer) toUint64Ptr() **uint64 { + return (**uint64)(p.p) +} +func (p pointer) toUint64Slice() *[]uint64 { + return (*[]uint64)(p.p) +} +func (p pointer) toUint32() *uint32 { + return (*uint32)(p.p) +} +func (p pointer) toUint32Ptr() **uint32 { + return (**uint32)(p.p) +} +func (p pointer) toUint32Slice() *[]uint32 { + return (*[]uint32)(p.p) +} +func (p pointer) toBool() *bool { + return (*bool)(p.p) +} +func (p pointer) toBoolPtr() **bool { + return (**bool)(p.p) +} +func (p pointer) toBoolSlice() *[]bool { + return (*[]bool)(p.p) +} +func (p pointer) toFloat64() *float64 { + return (*float64)(p.p) +} +func (p pointer) toFloat64Ptr() **float64 { + return (**float64)(p.p) +} +func (p pointer) toFloat64Slice() *[]float64 { + return (*[]float64)(p.p) +} +func (p pointer) toFloat32() *float32 { + return (*float32)(p.p) +} +func (p pointer) toFloat32Ptr() **float32 { + return (**float32)(p.p) +} +func (p pointer) toFloat32Slice() *[]float32 { + return (*[]float32)(p.p) +} +func (p pointer) toString() *string { + return (*string)(p.p) +} +func (p pointer) toStringPtr() **string { + return (**string)(p.p) +} +func (p pointer) toStringSlice() *[]string { + return (*[]string)(p.p) +} +func (p pointer) toBytes() *[]byte { + return (*[]byte)(p.p) +} +func (p pointer) toBytesSlice() *[][]byte { + return (*[][]byte)(p.p) +} +func (p pointer) toExtensions() *XXX_InternalExtensions { + return (*XXX_InternalExtensions)(p.p) +} +func (p pointer) toOldExtensions() *map[int32]Extension { + return (*map[int32]Extension)(p.p) +} + +// getPointerSlice loads []*T from p as a []pointer. +// The value returned is aliased with the original slice. +// This behavior differs from the implementation in pointer_reflect.go. +func (p pointer) getPointerSlice() []pointer { + // Super-tricky - p should point to a []*T where T is a + // message type. We load it as []pointer. + return *(*[]pointer)(p.p) +} + +// setPointerSlice stores []pointer into p as a []*T. +// The value set is aliased with the input slice. +// This behavior differs from the implementation in pointer_reflect.go. +func (p pointer) setPointerSlice(v []pointer) { + // Super-tricky - p should point to a []*T where T is a + // message type. We store it as []pointer. + *(*[]pointer)(p.p) = v +} + +// getPointer loads the pointer at p and returns it. +func (p pointer) getPointer() pointer { + return pointer{p: *(*unsafe.Pointer)(p.p)} +} + +// setPointer stores the pointer q at p. +func (p pointer) setPointer(q pointer) { + *(*unsafe.Pointer)(p.p) = q.p +} + +// append q to the slice pointed to by p. +func (p pointer) appendPointer(q pointer) { + s := (*[]unsafe.Pointer)(p.p) + *s = append(*s, q.p) +} + +// getInterfacePointer returns a pointer that points to the +// interface data of the interface pointed by p. +func (p pointer) getInterfacePointer() pointer { + // Super-tricky - read pointer out of data word of interface value. + return pointer{p: (*(*[2]unsafe.Pointer)(p.p))[1]} +} + +// asPointerTo returns a reflect.Value that is a pointer to an +// object of type t stored at p. +func (p pointer) asPointerTo(t reflect.Type) reflect.Value { + return reflect.NewAt(t, p.p) +} + +func atomicLoadUnmarshalInfo(p **unmarshalInfo) *unmarshalInfo { + return (*unmarshalInfo)(atomic.LoadPointer((*unsafe.Pointer)(unsafe.Pointer(p)))) +} +func atomicStoreUnmarshalInfo(p **unmarshalInfo, v *unmarshalInfo) { + atomic.StorePointer((*unsafe.Pointer)(unsafe.Pointer(p)), unsafe.Pointer(v)) +} +func atomicLoadMarshalInfo(p **marshalInfo) *marshalInfo { + return (*marshalInfo)(atomic.LoadPointer((*unsafe.Pointer)(unsafe.Pointer(p)))) +} +func atomicStoreMarshalInfo(p **marshalInfo, v *marshalInfo) { + atomic.StorePointer((*unsafe.Pointer)(unsafe.Pointer(p)), unsafe.Pointer(v)) +} +func atomicLoadMergeInfo(p **mergeInfo) *mergeInfo { + return (*mergeInfo)(atomic.LoadPointer((*unsafe.Pointer)(unsafe.Pointer(p)))) +} +func atomicStoreMergeInfo(p **mergeInfo, v *mergeInfo) { + atomic.StorePointer((*unsafe.Pointer)(unsafe.Pointer(p)), unsafe.Pointer(v)) +} +func atomicLoadDiscardInfo(p **discardInfo) *discardInfo { + return (*discardInfo)(atomic.LoadPointer((*unsafe.Pointer)(unsafe.Pointer(p)))) +} +func atomicStoreDiscardInfo(p **discardInfo, v *discardInfo) { + atomic.StorePointer((*unsafe.Pointer)(unsafe.Pointer(p)), unsafe.Pointer(v)) +} diff --git a/vendor/github.com/golang/protobuf/proto/properties.go b/vendor/github.com/golang/protobuf/proto/properties.go new file mode 100644 index 0000000..79668ff --- /dev/null +++ b/vendor/github.com/golang/protobuf/proto/properties.go @@ -0,0 +1,545 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +/* + * Routines for encoding data into the wire format for protocol buffers. + */ + +import ( + "fmt" + "log" + "os" + "reflect" + "sort" + "strconv" + "strings" + "sync" +) + +const debug bool = false + +// Constants that identify the encoding of a value on the wire. +const ( + WireVarint = 0 + WireFixed64 = 1 + WireBytes = 2 + WireStartGroup = 3 + WireEndGroup = 4 + WireFixed32 = 5 +) + +// tagMap is an optimization over map[int]int for typical protocol buffer +// use-cases. Encoded protocol buffers are often in tag order with small tag +// numbers. +type tagMap struct { + fastTags []int + slowTags map[int]int +} + +// tagMapFastLimit is the upper bound on the tag number that will be stored in +// the tagMap slice rather than its map. +const tagMapFastLimit = 1024 + +func (p *tagMap) get(t int) (int, bool) { + if t > 0 && t < tagMapFastLimit { + if t >= len(p.fastTags) { + return 0, false + } + fi := p.fastTags[t] + return fi, fi >= 0 + } + fi, ok := p.slowTags[t] + return fi, ok +} + +func (p *tagMap) put(t int, fi int) { + if t > 0 && t < tagMapFastLimit { + for len(p.fastTags) < t+1 { + p.fastTags = append(p.fastTags, -1) + } + p.fastTags[t] = fi + return + } + if p.slowTags == nil { + p.slowTags = make(map[int]int) + } + p.slowTags[t] = fi +} + +// StructProperties represents properties for all the fields of a struct. +// decoderTags and decoderOrigNames should only be used by the decoder. +type StructProperties struct { + Prop []*Properties // properties for each field + reqCount int // required count + decoderTags tagMap // map from proto tag to struct field number + decoderOrigNames map[string]int // map from original name to struct field number + order []int // list of struct field numbers in tag order + + // OneofTypes contains information about the oneof fields in this message. + // It is keyed by the original name of a field. + OneofTypes map[string]*OneofProperties +} + +// OneofProperties represents information about a specific field in a oneof. +type OneofProperties struct { + Type reflect.Type // pointer to generated struct type for this oneof field + Field int // struct field number of the containing oneof in the message + Prop *Properties +} + +// Implement the sorting interface so we can sort the fields in tag order, as recommended by the spec. +// See encode.go, (*Buffer).enc_struct. + +func (sp *StructProperties) Len() int { return len(sp.order) } +func (sp *StructProperties) Less(i, j int) bool { + return sp.Prop[sp.order[i]].Tag < sp.Prop[sp.order[j]].Tag +} +func (sp *StructProperties) Swap(i, j int) { sp.order[i], sp.order[j] = sp.order[j], sp.order[i] } + +// Properties represents the protocol-specific behavior of a single struct field. +type Properties struct { + Name string // name of the field, for error messages + OrigName string // original name before protocol compiler (always set) + JSONName string // name to use for JSON; determined by protoc + Wire string + WireType int + Tag int + Required bool + Optional bool + Repeated bool + Packed bool // relevant for repeated primitives only + Enum string // set for enum types only + proto3 bool // whether this is known to be a proto3 field + oneof bool // whether this is a oneof field + + Default string // default value + HasDefault bool // whether an explicit default was provided + + stype reflect.Type // set for struct types only + sprop *StructProperties // set for struct types only + + mtype reflect.Type // set for map types only + MapKeyProp *Properties // set for map types only + MapValProp *Properties // set for map types only +} + +// String formats the properties in the protobuf struct field tag style. +func (p *Properties) String() string { + s := p.Wire + s += "," + s += strconv.Itoa(p.Tag) + if p.Required { + s += ",req" + } + if p.Optional { + s += ",opt" + } + if p.Repeated { + s += ",rep" + } + if p.Packed { + s += ",packed" + } + s += ",name=" + p.OrigName + if p.JSONName != p.OrigName { + s += ",json=" + p.JSONName + } + if p.proto3 { + s += ",proto3" + } + if p.oneof { + s += ",oneof" + } + if len(p.Enum) > 0 { + s += ",enum=" + p.Enum + } + if p.HasDefault { + s += ",def=" + p.Default + } + return s +} + +// Parse populates p by parsing a string in the protobuf struct field tag style. +func (p *Properties) Parse(s string) { + // "bytes,49,opt,name=foo,def=hello!" + fields := strings.Split(s, ",") // breaks def=, but handled below. + if len(fields) < 2 { + fmt.Fprintf(os.Stderr, "proto: tag has too few fields: %q\n", s) + return + } + + p.Wire = fields[0] + switch p.Wire { + case "varint": + p.WireType = WireVarint + case "fixed32": + p.WireType = WireFixed32 + case "fixed64": + p.WireType = WireFixed64 + case "zigzag32": + p.WireType = WireVarint + case "zigzag64": + p.WireType = WireVarint + case "bytes", "group": + p.WireType = WireBytes + // no numeric converter for non-numeric types + default: + fmt.Fprintf(os.Stderr, "proto: tag has unknown wire type: %q\n", s) + return + } + + var err error + p.Tag, err = strconv.Atoi(fields[1]) + if err != nil { + return + } + +outer: + for i := 2; i < len(fields); i++ { + f := fields[i] + switch { + case f == "req": + p.Required = true + case f == "opt": + p.Optional = true + case f == "rep": + p.Repeated = true + case f == "packed": + p.Packed = true + case strings.HasPrefix(f, "name="): + p.OrigName = f[5:] + case strings.HasPrefix(f, "json="): + p.JSONName = f[5:] + case strings.HasPrefix(f, "enum="): + p.Enum = f[5:] + case f == "proto3": + p.proto3 = true + case f == "oneof": + p.oneof = true + case strings.HasPrefix(f, "def="): + p.HasDefault = true + p.Default = f[4:] // rest of string + if i+1 < len(fields) { + // Commas aren't escaped, and def is always last. + p.Default += "," + strings.Join(fields[i+1:], ",") + break outer + } + } + } +} + +var protoMessageType = reflect.TypeOf((*Message)(nil)).Elem() + +// setFieldProps initializes the field properties for submessages and maps. +func (p *Properties) setFieldProps(typ reflect.Type, f *reflect.StructField, lockGetProp bool) { + switch t1 := typ; t1.Kind() { + case reflect.Ptr: + if t1.Elem().Kind() == reflect.Struct { + p.stype = t1.Elem() + } + + case reflect.Slice: + if t2 := t1.Elem(); t2.Kind() == reflect.Ptr && t2.Elem().Kind() == reflect.Struct { + p.stype = t2.Elem() + } + + case reflect.Map: + p.mtype = t1 + p.MapKeyProp = &Properties{} + p.MapKeyProp.init(reflect.PtrTo(p.mtype.Key()), "Key", f.Tag.Get("protobuf_key"), nil, lockGetProp) + p.MapValProp = &Properties{} + vtype := p.mtype.Elem() + if vtype.Kind() != reflect.Ptr && vtype.Kind() != reflect.Slice { + // The value type is not a message (*T) or bytes ([]byte), + // so we need encoders for the pointer to this type. + vtype = reflect.PtrTo(vtype) + } + p.MapValProp.init(vtype, "Value", f.Tag.Get("protobuf_val"), nil, lockGetProp) + } + + if p.stype != nil { + if lockGetProp { + p.sprop = GetProperties(p.stype) + } else { + p.sprop = getPropertiesLocked(p.stype) + } + } +} + +var ( + marshalerType = reflect.TypeOf((*Marshaler)(nil)).Elem() +) + +// Init populates the properties from a protocol buffer struct tag. +func (p *Properties) Init(typ reflect.Type, name, tag string, f *reflect.StructField) { + p.init(typ, name, tag, f, true) +} + +func (p *Properties) init(typ reflect.Type, name, tag string, f *reflect.StructField, lockGetProp bool) { + // "bytes,49,opt,def=hello!" + p.Name = name + p.OrigName = name + if tag == "" { + return + } + p.Parse(tag) + p.setFieldProps(typ, f, lockGetProp) +} + +var ( + propertiesMu sync.RWMutex + propertiesMap = make(map[reflect.Type]*StructProperties) +) + +// GetProperties returns the list of properties for the type represented by t. +// t must represent a generated struct type of a protocol message. +func GetProperties(t reflect.Type) *StructProperties { + if t.Kind() != reflect.Struct { + panic("proto: type must have kind struct") + } + + // Most calls to GetProperties in a long-running program will be + // retrieving details for types we have seen before. + propertiesMu.RLock() + sprop, ok := propertiesMap[t] + propertiesMu.RUnlock() + if ok { + return sprop + } + + propertiesMu.Lock() + sprop = getPropertiesLocked(t) + propertiesMu.Unlock() + return sprop +} + +type ( + oneofFuncsIface interface { + XXX_OneofFuncs() (func(Message, *Buffer) error, func(Message, int, int, *Buffer) (bool, error), func(Message) int, []interface{}) + } + oneofWrappersIface interface { + XXX_OneofWrappers() []interface{} + } +) + +// getPropertiesLocked requires that propertiesMu is held. +func getPropertiesLocked(t reflect.Type) *StructProperties { + if prop, ok := propertiesMap[t]; ok { + return prop + } + + prop := new(StructProperties) + // in case of recursive protos, fill this in now. + propertiesMap[t] = prop + + // build properties + prop.Prop = make([]*Properties, t.NumField()) + prop.order = make([]int, t.NumField()) + + for i := 0; i < t.NumField(); i++ { + f := t.Field(i) + p := new(Properties) + name := f.Name + p.init(f.Type, name, f.Tag.Get("protobuf"), &f, false) + + oneof := f.Tag.Get("protobuf_oneof") // special case + if oneof != "" { + // Oneof fields don't use the traditional protobuf tag. + p.OrigName = oneof + } + prop.Prop[i] = p + prop.order[i] = i + if debug { + print(i, " ", f.Name, " ", t.String(), " ") + if p.Tag > 0 { + print(p.String()) + } + print("\n") + } + } + + // Re-order prop.order. + sort.Sort(prop) + + var oots []interface{} + switch m := reflect.Zero(reflect.PtrTo(t)).Interface().(type) { + case oneofFuncsIface: + _, _, _, oots = m.XXX_OneofFuncs() + case oneofWrappersIface: + oots = m.XXX_OneofWrappers() + } + if len(oots) > 0 { + // Interpret oneof metadata. + prop.OneofTypes = make(map[string]*OneofProperties) + for _, oot := range oots { + oop := &OneofProperties{ + Type: reflect.ValueOf(oot).Type(), // *T + Prop: new(Properties), + } + sft := oop.Type.Elem().Field(0) + oop.Prop.Name = sft.Name + oop.Prop.Parse(sft.Tag.Get("protobuf")) + // There will be exactly one interface field that + // this new value is assignable to. + for i := 0; i < t.NumField(); i++ { + f := t.Field(i) + if f.Type.Kind() != reflect.Interface { + continue + } + if !oop.Type.AssignableTo(f.Type) { + continue + } + oop.Field = i + break + } + prop.OneofTypes[oop.Prop.OrigName] = oop + } + } + + // build required counts + // build tags + reqCount := 0 + prop.decoderOrigNames = make(map[string]int) + for i, p := range prop.Prop { + if strings.HasPrefix(p.Name, "XXX_") { + // Internal fields should not appear in tags/origNames maps. + // They are handled specially when encoding and decoding. + continue + } + if p.Required { + reqCount++ + } + prop.decoderTags.put(p.Tag, i) + prop.decoderOrigNames[p.OrigName] = i + } + prop.reqCount = reqCount + + return prop +} + +// A global registry of enum types. +// The generated code will register the generated maps by calling RegisterEnum. + +var enumValueMaps = make(map[string]map[string]int32) + +// RegisterEnum is called from the generated code to install the enum descriptor +// maps into the global table to aid parsing text format protocol buffers. +func RegisterEnum(typeName string, unusedNameMap map[int32]string, valueMap map[string]int32) { + if _, ok := enumValueMaps[typeName]; ok { + panic("proto: duplicate enum registered: " + typeName) + } + enumValueMaps[typeName] = valueMap +} + +// EnumValueMap returns the mapping from names to integers of the +// enum type enumType, or a nil if not found. +func EnumValueMap(enumType string) map[string]int32 { + return enumValueMaps[enumType] +} + +// A registry of all linked message types. +// The string is a fully-qualified proto name ("pkg.Message"). +var ( + protoTypedNils = make(map[string]Message) // a map from proto names to typed nil pointers + protoMapTypes = make(map[string]reflect.Type) // a map from proto names to map types + revProtoTypes = make(map[reflect.Type]string) +) + +// RegisterType is called from generated code and maps from the fully qualified +// proto name to the type (pointer to struct) of the protocol buffer. +func RegisterType(x Message, name string) { + if _, ok := protoTypedNils[name]; ok { + // TODO: Some day, make this a panic. + log.Printf("proto: duplicate proto type registered: %s", name) + return + } + t := reflect.TypeOf(x) + if v := reflect.ValueOf(x); v.Kind() == reflect.Ptr && v.Pointer() == 0 { + // Generated code always calls RegisterType with nil x. + // This check is just for extra safety. + protoTypedNils[name] = x + } else { + protoTypedNils[name] = reflect.Zero(t).Interface().(Message) + } + revProtoTypes[t] = name +} + +// RegisterMapType is called from generated code and maps from the fully qualified +// proto name to the native map type of the proto map definition. +func RegisterMapType(x interface{}, name string) { + if reflect.TypeOf(x).Kind() != reflect.Map { + panic(fmt.Sprintf("RegisterMapType(%T, %q); want map", x, name)) + } + if _, ok := protoMapTypes[name]; ok { + log.Printf("proto: duplicate proto type registered: %s", name) + return + } + t := reflect.TypeOf(x) + protoMapTypes[name] = t + revProtoTypes[t] = name +} + +// MessageName returns the fully-qualified proto name for the given message type. +func MessageName(x Message) string { + type xname interface { + XXX_MessageName() string + } + if m, ok := x.(xname); ok { + return m.XXX_MessageName() + } + return revProtoTypes[reflect.TypeOf(x)] +} + +// MessageType returns the message type (pointer to struct) for a named message. +// The type is not guaranteed to implement proto.Message if the name refers to a +// map entry. +func MessageType(name string) reflect.Type { + if t, ok := protoTypedNils[name]; ok { + return reflect.TypeOf(t) + } + return protoMapTypes[name] +} + +// A registry of all linked proto files. +var ( + protoFiles = make(map[string][]byte) // file name => fileDescriptor +) + +// RegisterFile is called from generated code and maps from the +// full file name of a .proto file to its compressed FileDescriptorProto. +func RegisterFile(filename string, fileDescriptor []byte) { + protoFiles[filename] = fileDescriptor +} + +// FileDescriptor returns the compressed FileDescriptorProto for a .proto file. +func FileDescriptor(filename string) []byte { return protoFiles[filename] } diff --git a/vendor/github.com/golang/protobuf/proto/table_marshal.go b/vendor/github.com/golang/protobuf/proto/table_marshal.go new file mode 100644 index 0000000..5cb11fa --- /dev/null +++ b/vendor/github.com/golang/protobuf/proto/table_marshal.go @@ -0,0 +1,2776 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2016 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +import ( + "errors" + "fmt" + "math" + "reflect" + "sort" + "strconv" + "strings" + "sync" + "sync/atomic" + "unicode/utf8" +) + +// a sizer takes a pointer to a field and the size of its tag, computes the size of +// the encoded data. +type sizer func(pointer, int) int + +// a marshaler takes a byte slice, a pointer to a field, and its tag (in wire format), +// marshals the field to the end of the slice, returns the slice and error (if any). +type marshaler func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) + +// marshalInfo is the information used for marshaling a message. +type marshalInfo struct { + typ reflect.Type + fields []*marshalFieldInfo + unrecognized field // offset of XXX_unrecognized + extensions field // offset of XXX_InternalExtensions + v1extensions field // offset of XXX_extensions + sizecache field // offset of XXX_sizecache + initialized int32 // 0 -- only typ is set, 1 -- fully initialized + messageset bool // uses message set wire format + hasmarshaler bool // has custom marshaler + sync.RWMutex // protect extElems map, also for initialization + extElems map[int32]*marshalElemInfo // info of extension elements +} + +// marshalFieldInfo is the information used for marshaling a field of a message. +type marshalFieldInfo struct { + field field + wiretag uint64 // tag in wire format + tagsize int // size of tag in wire format + sizer sizer + marshaler marshaler + isPointer bool + required bool // field is required + name string // name of the field, for error reporting + oneofElems map[reflect.Type]*marshalElemInfo // info of oneof elements +} + +// marshalElemInfo is the information used for marshaling an extension or oneof element. +type marshalElemInfo struct { + wiretag uint64 // tag in wire format + tagsize int // size of tag in wire format + sizer sizer + marshaler marshaler + isptr bool // elem is pointer typed, thus interface of this type is a direct interface (extension only) + deref bool // dereference the pointer before operating on it; implies isptr +} + +var ( + marshalInfoMap = map[reflect.Type]*marshalInfo{} + marshalInfoLock sync.Mutex +) + +// getMarshalInfo returns the information to marshal a given type of message. +// The info it returns may not necessarily initialized. +// t is the type of the message (NOT the pointer to it). +func getMarshalInfo(t reflect.Type) *marshalInfo { + marshalInfoLock.Lock() + u, ok := marshalInfoMap[t] + if !ok { + u = &marshalInfo{typ: t} + marshalInfoMap[t] = u + } + marshalInfoLock.Unlock() + return u +} + +// Size is the entry point from generated code, +// and should be ONLY called by generated code. +// It computes the size of encoded data of msg. +// a is a pointer to a place to store cached marshal info. +func (a *InternalMessageInfo) Size(msg Message) int { + u := getMessageMarshalInfo(msg, a) + ptr := toPointer(&msg) + if ptr.isNil() { + // We get here if msg is a typed nil ((*SomeMessage)(nil)), + // so it satisfies the interface, and msg == nil wouldn't + // catch it. We don't want crash in this case. + return 0 + } + return u.size(ptr) +} + +// Marshal is the entry point from generated code, +// and should be ONLY called by generated code. +// It marshals msg to the end of b. +// a is a pointer to a place to store cached marshal info. +func (a *InternalMessageInfo) Marshal(b []byte, msg Message, deterministic bool) ([]byte, error) { + u := getMessageMarshalInfo(msg, a) + ptr := toPointer(&msg) + if ptr.isNil() { + // We get here if msg is a typed nil ((*SomeMessage)(nil)), + // so it satisfies the interface, and msg == nil wouldn't + // catch it. We don't want crash in this case. + return b, ErrNil + } + return u.marshal(b, ptr, deterministic) +} + +func getMessageMarshalInfo(msg interface{}, a *InternalMessageInfo) *marshalInfo { + // u := a.marshal, but atomically. + // We use an atomic here to ensure memory consistency. + u := atomicLoadMarshalInfo(&a.marshal) + if u == nil { + // Get marshal information from type of message. + t := reflect.ValueOf(msg).Type() + if t.Kind() != reflect.Ptr { + panic(fmt.Sprintf("cannot handle non-pointer message type %v", t)) + } + u = getMarshalInfo(t.Elem()) + // Store it in the cache for later users. + // a.marshal = u, but atomically. + atomicStoreMarshalInfo(&a.marshal, u) + } + return u +} + +// size is the main function to compute the size of the encoded data of a message. +// ptr is the pointer to the message. +func (u *marshalInfo) size(ptr pointer) int { + if atomic.LoadInt32(&u.initialized) == 0 { + u.computeMarshalInfo() + } + + // If the message can marshal itself, let it do it, for compatibility. + // NOTE: This is not efficient. + if u.hasmarshaler { + m := ptr.asPointerTo(u.typ).Interface().(Marshaler) + b, _ := m.Marshal() + return len(b) + } + + n := 0 + for _, f := range u.fields { + if f.isPointer && ptr.offset(f.field).getPointer().isNil() { + // nil pointer always marshals to nothing + continue + } + n += f.sizer(ptr.offset(f.field), f.tagsize) + } + if u.extensions.IsValid() { + e := ptr.offset(u.extensions).toExtensions() + if u.messageset { + n += u.sizeMessageSet(e) + } else { + n += u.sizeExtensions(e) + } + } + if u.v1extensions.IsValid() { + m := *ptr.offset(u.v1extensions).toOldExtensions() + n += u.sizeV1Extensions(m) + } + if u.unrecognized.IsValid() { + s := *ptr.offset(u.unrecognized).toBytes() + n += len(s) + } + // cache the result for use in marshal + if u.sizecache.IsValid() { + atomic.StoreInt32(ptr.offset(u.sizecache).toInt32(), int32(n)) + } + return n +} + +// cachedsize gets the size from cache. If there is no cache (i.e. message is not generated), +// fall back to compute the size. +func (u *marshalInfo) cachedsize(ptr pointer) int { + if u.sizecache.IsValid() { + return int(atomic.LoadInt32(ptr.offset(u.sizecache).toInt32())) + } + return u.size(ptr) +} + +// marshal is the main function to marshal a message. It takes a byte slice and appends +// the encoded data to the end of the slice, returns the slice and error (if any). +// ptr is the pointer to the message. +// If deterministic is true, map is marshaled in deterministic order. +func (u *marshalInfo) marshal(b []byte, ptr pointer, deterministic bool) ([]byte, error) { + if atomic.LoadInt32(&u.initialized) == 0 { + u.computeMarshalInfo() + } + + // If the message can marshal itself, let it do it, for compatibility. + // NOTE: This is not efficient. + if u.hasmarshaler { + m := ptr.asPointerTo(u.typ).Interface().(Marshaler) + b1, err := m.Marshal() + b = append(b, b1...) + return b, err + } + + var err, errLater error + // The old marshaler encodes extensions at beginning. + if u.extensions.IsValid() { + e := ptr.offset(u.extensions).toExtensions() + if u.messageset { + b, err = u.appendMessageSet(b, e, deterministic) + } else { + b, err = u.appendExtensions(b, e, deterministic) + } + if err != nil { + return b, err + } + } + if u.v1extensions.IsValid() { + m := *ptr.offset(u.v1extensions).toOldExtensions() + b, err = u.appendV1Extensions(b, m, deterministic) + if err != nil { + return b, err + } + } + for _, f := range u.fields { + if f.required { + if ptr.offset(f.field).getPointer().isNil() { + // Required field is not set. + // We record the error but keep going, to give a complete marshaling. + if errLater == nil { + errLater = &RequiredNotSetError{f.name} + } + continue + } + } + if f.isPointer && ptr.offset(f.field).getPointer().isNil() { + // nil pointer always marshals to nothing + continue + } + b, err = f.marshaler(b, ptr.offset(f.field), f.wiretag, deterministic) + if err != nil { + if err1, ok := err.(*RequiredNotSetError); ok { + // Required field in submessage is not set. + // We record the error but keep going, to give a complete marshaling. + if errLater == nil { + errLater = &RequiredNotSetError{f.name + "." + err1.field} + } + continue + } + if err == errRepeatedHasNil { + err = errors.New("proto: repeated field " + f.name + " has nil element") + } + if err == errInvalidUTF8 { + if errLater == nil { + fullName := revProtoTypes[reflect.PtrTo(u.typ)] + "." + f.name + errLater = &invalidUTF8Error{fullName} + } + continue + } + return b, err + } + } + if u.unrecognized.IsValid() { + s := *ptr.offset(u.unrecognized).toBytes() + b = append(b, s...) + } + return b, errLater +} + +// computeMarshalInfo initializes the marshal info. +func (u *marshalInfo) computeMarshalInfo() { + u.Lock() + defer u.Unlock() + if u.initialized != 0 { // non-atomic read is ok as it is protected by the lock + return + } + + t := u.typ + u.unrecognized = invalidField + u.extensions = invalidField + u.v1extensions = invalidField + u.sizecache = invalidField + + // If the message can marshal itself, let it do it, for compatibility. + // NOTE: This is not efficient. + if reflect.PtrTo(t).Implements(marshalerType) { + u.hasmarshaler = true + atomic.StoreInt32(&u.initialized, 1) + return + } + + // get oneof implementers + var oneofImplementers []interface{} + switch m := reflect.Zero(reflect.PtrTo(t)).Interface().(type) { + case oneofFuncsIface: + _, _, _, oneofImplementers = m.XXX_OneofFuncs() + case oneofWrappersIface: + oneofImplementers = m.XXX_OneofWrappers() + } + + n := t.NumField() + + // deal with XXX fields first + for i := 0; i < t.NumField(); i++ { + f := t.Field(i) + if !strings.HasPrefix(f.Name, "XXX_") { + continue + } + switch f.Name { + case "XXX_sizecache": + u.sizecache = toField(&f) + case "XXX_unrecognized": + u.unrecognized = toField(&f) + case "XXX_InternalExtensions": + u.extensions = toField(&f) + u.messageset = f.Tag.Get("protobuf_messageset") == "1" + case "XXX_extensions": + u.v1extensions = toField(&f) + case "XXX_NoUnkeyedLiteral": + // nothing to do + default: + panic("unknown XXX field: " + f.Name) + } + n-- + } + + // normal fields + fields := make([]marshalFieldInfo, n) // batch allocation + u.fields = make([]*marshalFieldInfo, 0, n) + for i, j := 0, 0; i < t.NumField(); i++ { + f := t.Field(i) + + if strings.HasPrefix(f.Name, "XXX_") { + continue + } + field := &fields[j] + j++ + field.name = f.Name + u.fields = append(u.fields, field) + if f.Tag.Get("protobuf_oneof") != "" { + field.computeOneofFieldInfo(&f, oneofImplementers) + continue + } + if f.Tag.Get("protobuf") == "" { + // field has no tag (not in generated message), ignore it + u.fields = u.fields[:len(u.fields)-1] + j-- + continue + } + field.computeMarshalFieldInfo(&f) + } + + // fields are marshaled in tag order on the wire. + sort.Sort(byTag(u.fields)) + + atomic.StoreInt32(&u.initialized, 1) +} + +// helper for sorting fields by tag +type byTag []*marshalFieldInfo + +func (a byTag) Len() int { return len(a) } +func (a byTag) Swap(i, j int) { a[i], a[j] = a[j], a[i] } +func (a byTag) Less(i, j int) bool { return a[i].wiretag < a[j].wiretag } + +// getExtElemInfo returns the information to marshal an extension element. +// The info it returns is initialized. +func (u *marshalInfo) getExtElemInfo(desc *ExtensionDesc) *marshalElemInfo { + // get from cache first + u.RLock() + e, ok := u.extElems[desc.Field] + u.RUnlock() + if ok { + return e + } + + t := reflect.TypeOf(desc.ExtensionType) // pointer or slice to basic type or struct + tags := strings.Split(desc.Tag, ",") + tag, err := strconv.Atoi(tags[1]) + if err != nil { + panic("tag is not an integer") + } + wt := wiretype(tags[0]) + if t.Kind() == reflect.Ptr && t.Elem().Kind() != reflect.Struct { + t = t.Elem() + } + sizer, marshaler := typeMarshaler(t, tags, false, false) + var deref bool + if t.Kind() == reflect.Slice && t.Elem().Kind() != reflect.Uint8 { + t = reflect.PtrTo(t) + deref = true + } + e = &marshalElemInfo{ + wiretag: uint64(tag)<<3 | wt, + tagsize: SizeVarint(uint64(tag) << 3), + sizer: sizer, + marshaler: marshaler, + isptr: t.Kind() == reflect.Ptr, + deref: deref, + } + + // update cache + u.Lock() + if u.extElems == nil { + u.extElems = make(map[int32]*marshalElemInfo) + } + u.extElems[desc.Field] = e + u.Unlock() + return e +} + +// computeMarshalFieldInfo fills up the information to marshal a field. +func (fi *marshalFieldInfo) computeMarshalFieldInfo(f *reflect.StructField) { + // parse protobuf tag of the field. + // tag has format of "bytes,49,opt,name=foo,def=hello!" + tags := strings.Split(f.Tag.Get("protobuf"), ",") + if tags[0] == "" { + return + } + tag, err := strconv.Atoi(tags[1]) + if err != nil { + panic("tag is not an integer") + } + wt := wiretype(tags[0]) + if tags[2] == "req" { + fi.required = true + } + fi.setTag(f, tag, wt) + fi.setMarshaler(f, tags) +} + +func (fi *marshalFieldInfo) computeOneofFieldInfo(f *reflect.StructField, oneofImplementers []interface{}) { + fi.field = toField(f) + fi.wiretag = math.MaxInt32 // Use a large tag number, make oneofs sorted at the end. This tag will not appear on the wire. + fi.isPointer = true + fi.sizer, fi.marshaler = makeOneOfMarshaler(fi, f) + fi.oneofElems = make(map[reflect.Type]*marshalElemInfo) + + ityp := f.Type // interface type + for _, o := range oneofImplementers { + t := reflect.TypeOf(o) + if !t.Implements(ityp) { + continue + } + sf := t.Elem().Field(0) // oneof implementer is a struct with a single field + tags := strings.Split(sf.Tag.Get("protobuf"), ",") + tag, err := strconv.Atoi(tags[1]) + if err != nil { + panic("tag is not an integer") + } + wt := wiretype(tags[0]) + sizer, marshaler := typeMarshaler(sf.Type, tags, false, true) // oneof should not omit any zero value + fi.oneofElems[t.Elem()] = &marshalElemInfo{ + wiretag: uint64(tag)<<3 | wt, + tagsize: SizeVarint(uint64(tag) << 3), + sizer: sizer, + marshaler: marshaler, + } + } +} + +// wiretype returns the wire encoding of the type. +func wiretype(encoding string) uint64 { + switch encoding { + case "fixed32": + return WireFixed32 + case "fixed64": + return WireFixed64 + case "varint", "zigzag32", "zigzag64": + return WireVarint + case "bytes": + return WireBytes + case "group": + return WireStartGroup + } + panic("unknown wire type " + encoding) +} + +// setTag fills up the tag (in wire format) and its size in the info of a field. +func (fi *marshalFieldInfo) setTag(f *reflect.StructField, tag int, wt uint64) { + fi.field = toField(f) + fi.wiretag = uint64(tag)<<3 | wt + fi.tagsize = SizeVarint(uint64(tag) << 3) +} + +// setMarshaler fills up the sizer and marshaler in the info of a field. +func (fi *marshalFieldInfo) setMarshaler(f *reflect.StructField, tags []string) { + switch f.Type.Kind() { + case reflect.Map: + // map field + fi.isPointer = true + fi.sizer, fi.marshaler = makeMapMarshaler(f) + return + case reflect.Ptr, reflect.Slice: + fi.isPointer = true + } + fi.sizer, fi.marshaler = typeMarshaler(f.Type, tags, true, false) +} + +// typeMarshaler returns the sizer and marshaler of a given field. +// t is the type of the field. +// tags is the generated "protobuf" tag of the field. +// If nozero is true, zero value is not marshaled to the wire. +// If oneof is true, it is a oneof field. +func typeMarshaler(t reflect.Type, tags []string, nozero, oneof bool) (sizer, marshaler) { + encoding := tags[0] + + pointer := false + slice := false + if t.Kind() == reflect.Slice && t.Elem().Kind() != reflect.Uint8 { + slice = true + t = t.Elem() + } + if t.Kind() == reflect.Ptr { + pointer = true + t = t.Elem() + } + + packed := false + proto3 := false + validateUTF8 := true + for i := 2; i < len(tags); i++ { + if tags[i] == "packed" { + packed = true + } + if tags[i] == "proto3" { + proto3 = true + } + } + validateUTF8 = validateUTF8 && proto3 + + switch t.Kind() { + case reflect.Bool: + if pointer { + return sizeBoolPtr, appendBoolPtr + } + if slice { + if packed { + return sizeBoolPackedSlice, appendBoolPackedSlice + } + return sizeBoolSlice, appendBoolSlice + } + if nozero { + return sizeBoolValueNoZero, appendBoolValueNoZero + } + return sizeBoolValue, appendBoolValue + case reflect.Uint32: + switch encoding { + case "fixed32": + if pointer { + return sizeFixed32Ptr, appendFixed32Ptr + } + if slice { + if packed { + return sizeFixed32PackedSlice, appendFixed32PackedSlice + } + return sizeFixed32Slice, appendFixed32Slice + } + if nozero { + return sizeFixed32ValueNoZero, appendFixed32ValueNoZero + } + return sizeFixed32Value, appendFixed32Value + case "varint": + if pointer { + return sizeVarint32Ptr, appendVarint32Ptr + } + if slice { + if packed { + return sizeVarint32PackedSlice, appendVarint32PackedSlice + } + return sizeVarint32Slice, appendVarint32Slice + } + if nozero { + return sizeVarint32ValueNoZero, appendVarint32ValueNoZero + } + return sizeVarint32Value, appendVarint32Value + } + case reflect.Int32: + switch encoding { + case "fixed32": + if pointer { + return sizeFixedS32Ptr, appendFixedS32Ptr + } + if slice { + if packed { + return sizeFixedS32PackedSlice, appendFixedS32PackedSlice + } + return sizeFixedS32Slice, appendFixedS32Slice + } + if nozero { + return sizeFixedS32ValueNoZero, appendFixedS32ValueNoZero + } + return sizeFixedS32Value, appendFixedS32Value + case "varint": + if pointer { + return sizeVarintS32Ptr, appendVarintS32Ptr + } + if slice { + if packed { + return sizeVarintS32PackedSlice, appendVarintS32PackedSlice + } + return sizeVarintS32Slice, appendVarintS32Slice + } + if nozero { + return sizeVarintS32ValueNoZero, appendVarintS32ValueNoZero + } + return sizeVarintS32Value, appendVarintS32Value + case "zigzag32": + if pointer { + return sizeZigzag32Ptr, appendZigzag32Ptr + } + if slice { + if packed { + return sizeZigzag32PackedSlice, appendZigzag32PackedSlice + } + return sizeZigzag32Slice, appendZigzag32Slice + } + if nozero { + return sizeZigzag32ValueNoZero, appendZigzag32ValueNoZero + } + return sizeZigzag32Value, appendZigzag32Value + } + case reflect.Uint64: + switch encoding { + case "fixed64": + if pointer { + return sizeFixed64Ptr, appendFixed64Ptr + } + if slice { + if packed { + return sizeFixed64PackedSlice, appendFixed64PackedSlice + } + return sizeFixed64Slice, appendFixed64Slice + } + if nozero { + return sizeFixed64ValueNoZero, appendFixed64ValueNoZero + } + return sizeFixed64Value, appendFixed64Value + case "varint": + if pointer { + return sizeVarint64Ptr, appendVarint64Ptr + } + if slice { + if packed { + return sizeVarint64PackedSlice, appendVarint64PackedSlice + } + return sizeVarint64Slice, appendVarint64Slice + } + if nozero { + return sizeVarint64ValueNoZero, appendVarint64ValueNoZero + } + return sizeVarint64Value, appendVarint64Value + } + case reflect.Int64: + switch encoding { + case "fixed64": + if pointer { + return sizeFixedS64Ptr, appendFixedS64Ptr + } + if slice { + if packed { + return sizeFixedS64PackedSlice, appendFixedS64PackedSlice + } + return sizeFixedS64Slice, appendFixedS64Slice + } + if nozero { + return sizeFixedS64ValueNoZero, appendFixedS64ValueNoZero + } + return sizeFixedS64Value, appendFixedS64Value + case "varint": + if pointer { + return sizeVarintS64Ptr, appendVarintS64Ptr + } + if slice { + if packed { + return sizeVarintS64PackedSlice, appendVarintS64PackedSlice + } + return sizeVarintS64Slice, appendVarintS64Slice + } + if nozero { + return sizeVarintS64ValueNoZero, appendVarintS64ValueNoZero + } + return sizeVarintS64Value, appendVarintS64Value + case "zigzag64": + if pointer { + return sizeZigzag64Ptr, appendZigzag64Ptr + } + if slice { + if packed { + return sizeZigzag64PackedSlice, appendZigzag64PackedSlice + } + return sizeZigzag64Slice, appendZigzag64Slice + } + if nozero { + return sizeZigzag64ValueNoZero, appendZigzag64ValueNoZero + } + return sizeZigzag64Value, appendZigzag64Value + } + case reflect.Float32: + if pointer { + return sizeFloat32Ptr, appendFloat32Ptr + } + if slice { + if packed { + return sizeFloat32PackedSlice, appendFloat32PackedSlice + } + return sizeFloat32Slice, appendFloat32Slice + } + if nozero { + return sizeFloat32ValueNoZero, appendFloat32ValueNoZero + } + return sizeFloat32Value, appendFloat32Value + case reflect.Float64: + if pointer { + return sizeFloat64Ptr, appendFloat64Ptr + } + if slice { + if packed { + return sizeFloat64PackedSlice, appendFloat64PackedSlice + } + return sizeFloat64Slice, appendFloat64Slice + } + if nozero { + return sizeFloat64ValueNoZero, appendFloat64ValueNoZero + } + return sizeFloat64Value, appendFloat64Value + case reflect.String: + if validateUTF8 { + if pointer { + return sizeStringPtr, appendUTF8StringPtr + } + if slice { + return sizeStringSlice, appendUTF8StringSlice + } + if nozero { + return sizeStringValueNoZero, appendUTF8StringValueNoZero + } + return sizeStringValue, appendUTF8StringValue + } + if pointer { + return sizeStringPtr, appendStringPtr + } + if slice { + return sizeStringSlice, appendStringSlice + } + if nozero { + return sizeStringValueNoZero, appendStringValueNoZero + } + return sizeStringValue, appendStringValue + case reflect.Slice: + if slice { + return sizeBytesSlice, appendBytesSlice + } + if oneof { + // Oneof bytes field may also have "proto3" tag. + // We want to marshal it as a oneof field. Do this + // check before the proto3 check. + return sizeBytesOneof, appendBytesOneof + } + if proto3 { + return sizeBytes3, appendBytes3 + } + return sizeBytes, appendBytes + case reflect.Struct: + switch encoding { + case "group": + if slice { + return makeGroupSliceMarshaler(getMarshalInfo(t)) + } + return makeGroupMarshaler(getMarshalInfo(t)) + case "bytes": + if slice { + return makeMessageSliceMarshaler(getMarshalInfo(t)) + } + return makeMessageMarshaler(getMarshalInfo(t)) + } + } + panic(fmt.Sprintf("unknown or mismatched type: type: %v, wire type: %v", t, encoding)) +} + +// Below are functions to size/marshal a specific type of a field. +// They are stored in the field's info, and called by function pointers. +// They have type sizer or marshaler. + +func sizeFixed32Value(_ pointer, tagsize int) int { + return 4 + tagsize +} +func sizeFixed32ValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toUint32() + if v == 0 { + return 0 + } + return 4 + tagsize +} +func sizeFixed32Ptr(ptr pointer, tagsize int) int { + p := *ptr.toUint32Ptr() + if p == nil { + return 0 + } + return 4 + tagsize +} +func sizeFixed32Slice(ptr pointer, tagsize int) int { + s := *ptr.toUint32Slice() + return (4 + tagsize) * len(s) +} +func sizeFixed32PackedSlice(ptr pointer, tagsize int) int { + s := *ptr.toUint32Slice() + if len(s) == 0 { + return 0 + } + return 4*len(s) + SizeVarint(uint64(4*len(s))) + tagsize +} +func sizeFixedS32Value(_ pointer, tagsize int) int { + return 4 + tagsize +} +func sizeFixedS32ValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toInt32() + if v == 0 { + return 0 + } + return 4 + tagsize +} +func sizeFixedS32Ptr(ptr pointer, tagsize int) int { + p := ptr.getInt32Ptr() + if p == nil { + return 0 + } + return 4 + tagsize +} +func sizeFixedS32Slice(ptr pointer, tagsize int) int { + s := ptr.getInt32Slice() + return (4 + tagsize) * len(s) +} +func sizeFixedS32PackedSlice(ptr pointer, tagsize int) int { + s := ptr.getInt32Slice() + if len(s) == 0 { + return 0 + } + return 4*len(s) + SizeVarint(uint64(4*len(s))) + tagsize +} +func sizeFloat32Value(_ pointer, tagsize int) int { + return 4 + tagsize +} +func sizeFloat32ValueNoZero(ptr pointer, tagsize int) int { + v := math.Float32bits(*ptr.toFloat32()) + if v == 0 { + return 0 + } + return 4 + tagsize +} +func sizeFloat32Ptr(ptr pointer, tagsize int) int { + p := *ptr.toFloat32Ptr() + if p == nil { + return 0 + } + return 4 + tagsize +} +func sizeFloat32Slice(ptr pointer, tagsize int) int { + s := *ptr.toFloat32Slice() + return (4 + tagsize) * len(s) +} +func sizeFloat32PackedSlice(ptr pointer, tagsize int) int { + s := *ptr.toFloat32Slice() + if len(s) == 0 { + return 0 + } + return 4*len(s) + SizeVarint(uint64(4*len(s))) + tagsize +} +func sizeFixed64Value(_ pointer, tagsize int) int { + return 8 + tagsize +} +func sizeFixed64ValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toUint64() + if v == 0 { + return 0 + } + return 8 + tagsize +} +func sizeFixed64Ptr(ptr pointer, tagsize int) int { + p := *ptr.toUint64Ptr() + if p == nil { + return 0 + } + return 8 + tagsize +} +func sizeFixed64Slice(ptr pointer, tagsize int) int { + s := *ptr.toUint64Slice() + return (8 + tagsize) * len(s) +} +func sizeFixed64PackedSlice(ptr pointer, tagsize int) int { + s := *ptr.toUint64Slice() + if len(s) == 0 { + return 0 + } + return 8*len(s) + SizeVarint(uint64(8*len(s))) + tagsize +} +func sizeFixedS64Value(_ pointer, tagsize int) int { + return 8 + tagsize +} +func sizeFixedS64ValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toInt64() + if v == 0 { + return 0 + } + return 8 + tagsize +} +func sizeFixedS64Ptr(ptr pointer, tagsize int) int { + p := *ptr.toInt64Ptr() + if p == nil { + return 0 + } + return 8 + tagsize +} +func sizeFixedS64Slice(ptr pointer, tagsize int) int { + s := *ptr.toInt64Slice() + return (8 + tagsize) * len(s) +} +func sizeFixedS64PackedSlice(ptr pointer, tagsize int) int { + s := *ptr.toInt64Slice() + if len(s) == 0 { + return 0 + } + return 8*len(s) + SizeVarint(uint64(8*len(s))) + tagsize +} +func sizeFloat64Value(_ pointer, tagsize int) int { + return 8 + tagsize +} +func sizeFloat64ValueNoZero(ptr pointer, tagsize int) int { + v := math.Float64bits(*ptr.toFloat64()) + if v == 0 { + return 0 + } + return 8 + tagsize +} +func sizeFloat64Ptr(ptr pointer, tagsize int) int { + p := *ptr.toFloat64Ptr() + if p == nil { + return 0 + } + return 8 + tagsize +} +func sizeFloat64Slice(ptr pointer, tagsize int) int { + s := *ptr.toFloat64Slice() + return (8 + tagsize) * len(s) +} +func sizeFloat64PackedSlice(ptr pointer, tagsize int) int { + s := *ptr.toFloat64Slice() + if len(s) == 0 { + return 0 + } + return 8*len(s) + SizeVarint(uint64(8*len(s))) + tagsize +} +func sizeVarint32Value(ptr pointer, tagsize int) int { + v := *ptr.toUint32() + return SizeVarint(uint64(v)) + tagsize +} +func sizeVarint32ValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toUint32() + if v == 0 { + return 0 + } + return SizeVarint(uint64(v)) + tagsize +} +func sizeVarint32Ptr(ptr pointer, tagsize int) int { + p := *ptr.toUint32Ptr() + if p == nil { + return 0 + } + return SizeVarint(uint64(*p)) + tagsize +} +func sizeVarint32Slice(ptr pointer, tagsize int) int { + s := *ptr.toUint32Slice() + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v)) + tagsize + } + return n +} +func sizeVarint32PackedSlice(ptr pointer, tagsize int) int { + s := *ptr.toUint32Slice() + if len(s) == 0 { + return 0 + } + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v)) + } + return n + SizeVarint(uint64(n)) + tagsize +} +func sizeVarintS32Value(ptr pointer, tagsize int) int { + v := *ptr.toInt32() + return SizeVarint(uint64(v)) + tagsize +} +func sizeVarintS32ValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toInt32() + if v == 0 { + return 0 + } + return SizeVarint(uint64(v)) + tagsize +} +func sizeVarintS32Ptr(ptr pointer, tagsize int) int { + p := ptr.getInt32Ptr() + if p == nil { + return 0 + } + return SizeVarint(uint64(*p)) + tagsize +} +func sizeVarintS32Slice(ptr pointer, tagsize int) int { + s := ptr.getInt32Slice() + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v)) + tagsize + } + return n +} +func sizeVarintS32PackedSlice(ptr pointer, tagsize int) int { + s := ptr.getInt32Slice() + if len(s) == 0 { + return 0 + } + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v)) + } + return n + SizeVarint(uint64(n)) + tagsize +} +func sizeVarint64Value(ptr pointer, tagsize int) int { + v := *ptr.toUint64() + return SizeVarint(v) + tagsize +} +func sizeVarint64ValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toUint64() + if v == 0 { + return 0 + } + return SizeVarint(v) + tagsize +} +func sizeVarint64Ptr(ptr pointer, tagsize int) int { + p := *ptr.toUint64Ptr() + if p == nil { + return 0 + } + return SizeVarint(*p) + tagsize +} +func sizeVarint64Slice(ptr pointer, tagsize int) int { + s := *ptr.toUint64Slice() + n := 0 + for _, v := range s { + n += SizeVarint(v) + tagsize + } + return n +} +func sizeVarint64PackedSlice(ptr pointer, tagsize int) int { + s := *ptr.toUint64Slice() + if len(s) == 0 { + return 0 + } + n := 0 + for _, v := range s { + n += SizeVarint(v) + } + return n + SizeVarint(uint64(n)) + tagsize +} +func sizeVarintS64Value(ptr pointer, tagsize int) int { + v := *ptr.toInt64() + return SizeVarint(uint64(v)) + tagsize +} +func sizeVarintS64ValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toInt64() + if v == 0 { + return 0 + } + return SizeVarint(uint64(v)) + tagsize +} +func sizeVarintS64Ptr(ptr pointer, tagsize int) int { + p := *ptr.toInt64Ptr() + if p == nil { + return 0 + } + return SizeVarint(uint64(*p)) + tagsize +} +func sizeVarintS64Slice(ptr pointer, tagsize int) int { + s := *ptr.toInt64Slice() + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v)) + tagsize + } + return n +} +func sizeVarintS64PackedSlice(ptr pointer, tagsize int) int { + s := *ptr.toInt64Slice() + if len(s) == 0 { + return 0 + } + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v)) + } + return n + SizeVarint(uint64(n)) + tagsize +} +func sizeZigzag32Value(ptr pointer, tagsize int) int { + v := *ptr.toInt32() + return SizeVarint(uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) + tagsize +} +func sizeZigzag32ValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toInt32() + if v == 0 { + return 0 + } + return SizeVarint(uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) + tagsize +} +func sizeZigzag32Ptr(ptr pointer, tagsize int) int { + p := ptr.getInt32Ptr() + if p == nil { + return 0 + } + v := *p + return SizeVarint(uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) + tagsize +} +func sizeZigzag32Slice(ptr pointer, tagsize int) int { + s := ptr.getInt32Slice() + n := 0 + for _, v := range s { + n += SizeVarint(uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) + tagsize + } + return n +} +func sizeZigzag32PackedSlice(ptr pointer, tagsize int) int { + s := ptr.getInt32Slice() + if len(s) == 0 { + return 0 + } + n := 0 + for _, v := range s { + n += SizeVarint(uint64((uint32(v) << 1) ^ uint32((int32(v) >> 31)))) + } + return n + SizeVarint(uint64(n)) + tagsize +} +func sizeZigzag64Value(ptr pointer, tagsize int) int { + v := *ptr.toInt64() + return SizeVarint(uint64(v<<1)^uint64((int64(v)>>63))) + tagsize +} +func sizeZigzag64ValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toInt64() + if v == 0 { + return 0 + } + return SizeVarint(uint64(v<<1)^uint64((int64(v)>>63))) + tagsize +} +func sizeZigzag64Ptr(ptr pointer, tagsize int) int { + p := *ptr.toInt64Ptr() + if p == nil { + return 0 + } + v := *p + return SizeVarint(uint64(v<<1)^uint64((int64(v)>>63))) + tagsize +} +func sizeZigzag64Slice(ptr pointer, tagsize int) int { + s := *ptr.toInt64Slice() + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v<<1)^uint64((int64(v)>>63))) + tagsize + } + return n +} +func sizeZigzag64PackedSlice(ptr pointer, tagsize int) int { + s := *ptr.toInt64Slice() + if len(s) == 0 { + return 0 + } + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v<<1) ^ uint64((int64(v) >> 63))) + } + return n + SizeVarint(uint64(n)) + tagsize +} +func sizeBoolValue(_ pointer, tagsize int) int { + return 1 + tagsize +} +func sizeBoolValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toBool() + if !v { + return 0 + } + return 1 + tagsize +} +func sizeBoolPtr(ptr pointer, tagsize int) int { + p := *ptr.toBoolPtr() + if p == nil { + return 0 + } + return 1 + tagsize +} +func sizeBoolSlice(ptr pointer, tagsize int) int { + s := *ptr.toBoolSlice() + return (1 + tagsize) * len(s) +} +func sizeBoolPackedSlice(ptr pointer, tagsize int) int { + s := *ptr.toBoolSlice() + if len(s) == 0 { + return 0 + } + return len(s) + SizeVarint(uint64(len(s))) + tagsize +} +func sizeStringValue(ptr pointer, tagsize int) int { + v := *ptr.toString() + return len(v) + SizeVarint(uint64(len(v))) + tagsize +} +func sizeStringValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toString() + if v == "" { + return 0 + } + return len(v) + SizeVarint(uint64(len(v))) + tagsize +} +func sizeStringPtr(ptr pointer, tagsize int) int { + p := *ptr.toStringPtr() + if p == nil { + return 0 + } + v := *p + return len(v) + SizeVarint(uint64(len(v))) + tagsize +} +func sizeStringSlice(ptr pointer, tagsize int) int { + s := *ptr.toStringSlice() + n := 0 + for _, v := range s { + n += len(v) + SizeVarint(uint64(len(v))) + tagsize + } + return n +} +func sizeBytes(ptr pointer, tagsize int) int { + v := *ptr.toBytes() + if v == nil { + return 0 + } + return len(v) + SizeVarint(uint64(len(v))) + tagsize +} +func sizeBytes3(ptr pointer, tagsize int) int { + v := *ptr.toBytes() + if len(v) == 0 { + return 0 + } + return len(v) + SizeVarint(uint64(len(v))) + tagsize +} +func sizeBytesOneof(ptr pointer, tagsize int) int { + v := *ptr.toBytes() + return len(v) + SizeVarint(uint64(len(v))) + tagsize +} +func sizeBytesSlice(ptr pointer, tagsize int) int { + s := *ptr.toBytesSlice() + n := 0 + for _, v := range s { + n += len(v) + SizeVarint(uint64(len(v))) + tagsize + } + return n +} + +// appendFixed32 appends an encoded fixed32 to b. +func appendFixed32(b []byte, v uint32) []byte { + b = append(b, + byte(v), + byte(v>>8), + byte(v>>16), + byte(v>>24)) + return b +} + +// appendFixed64 appends an encoded fixed64 to b. +func appendFixed64(b []byte, v uint64) []byte { + b = append(b, + byte(v), + byte(v>>8), + byte(v>>16), + byte(v>>24), + byte(v>>32), + byte(v>>40), + byte(v>>48), + byte(v>>56)) + return b +} + +// appendVarint appends an encoded varint to b. +func appendVarint(b []byte, v uint64) []byte { + // TODO: make 1-byte (maybe 2-byte) case inline-able, once we + // have non-leaf inliner. + switch { + case v < 1<<7: + b = append(b, byte(v)) + case v < 1<<14: + b = append(b, + byte(v&0x7f|0x80), + byte(v>>7)) + case v < 1<<21: + b = append(b, + byte(v&0x7f|0x80), + byte((v>>7)&0x7f|0x80), + byte(v>>14)) + case v < 1<<28: + b = append(b, + byte(v&0x7f|0x80), + byte((v>>7)&0x7f|0x80), + byte((v>>14)&0x7f|0x80), + byte(v>>21)) + case v < 1<<35: + b = append(b, + byte(v&0x7f|0x80), + byte((v>>7)&0x7f|0x80), + byte((v>>14)&0x7f|0x80), + byte((v>>21)&0x7f|0x80), + byte(v>>28)) + case v < 1<<42: + b = append(b, + byte(v&0x7f|0x80), + byte((v>>7)&0x7f|0x80), + byte((v>>14)&0x7f|0x80), + byte((v>>21)&0x7f|0x80), + byte((v>>28)&0x7f|0x80), + byte(v>>35)) + case v < 1<<49: + b = append(b, + byte(v&0x7f|0x80), + byte((v>>7)&0x7f|0x80), + byte((v>>14)&0x7f|0x80), + byte((v>>21)&0x7f|0x80), + byte((v>>28)&0x7f|0x80), + byte((v>>35)&0x7f|0x80), + byte(v>>42)) + case v < 1<<56: + b = append(b, + byte(v&0x7f|0x80), + byte((v>>7)&0x7f|0x80), + byte((v>>14)&0x7f|0x80), + byte((v>>21)&0x7f|0x80), + byte((v>>28)&0x7f|0x80), + byte((v>>35)&0x7f|0x80), + byte((v>>42)&0x7f|0x80), + byte(v>>49)) + case v < 1<<63: + b = append(b, + byte(v&0x7f|0x80), + byte((v>>7)&0x7f|0x80), + byte((v>>14)&0x7f|0x80), + byte((v>>21)&0x7f|0x80), + byte((v>>28)&0x7f|0x80), + byte((v>>35)&0x7f|0x80), + byte((v>>42)&0x7f|0x80), + byte((v>>49)&0x7f|0x80), + byte(v>>56)) + default: + b = append(b, + byte(v&0x7f|0x80), + byte((v>>7)&0x7f|0x80), + byte((v>>14)&0x7f|0x80), + byte((v>>21)&0x7f|0x80), + byte((v>>28)&0x7f|0x80), + byte((v>>35)&0x7f|0x80), + byte((v>>42)&0x7f|0x80), + byte((v>>49)&0x7f|0x80), + byte((v>>56)&0x7f|0x80), + 1) + } + return b +} + +func appendFixed32Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toUint32() + b = appendVarint(b, wiretag) + b = appendFixed32(b, v) + return b, nil +} +func appendFixed32ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toUint32() + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed32(b, v) + return b, nil +} +func appendFixed32Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := *ptr.toUint32Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed32(b, *p) + return b, nil +} +func appendFixed32Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toUint32Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendFixed32(b, v) + } + return b, nil +} +func appendFixed32PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toUint32Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + b = appendVarint(b, uint64(4*len(s))) + for _, v := range s { + b = appendFixed32(b, v) + } + return b, nil +} +func appendFixedS32Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt32() + b = appendVarint(b, wiretag) + b = appendFixed32(b, uint32(v)) + return b, nil +} +func appendFixedS32ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt32() + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed32(b, uint32(v)) + return b, nil +} +func appendFixedS32Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := ptr.getInt32Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed32(b, uint32(*p)) + return b, nil +} +func appendFixedS32Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := ptr.getInt32Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendFixed32(b, uint32(v)) + } + return b, nil +} +func appendFixedS32PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := ptr.getInt32Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + b = appendVarint(b, uint64(4*len(s))) + for _, v := range s { + b = appendFixed32(b, uint32(v)) + } + return b, nil +} +func appendFloat32Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := math.Float32bits(*ptr.toFloat32()) + b = appendVarint(b, wiretag) + b = appendFixed32(b, v) + return b, nil +} +func appendFloat32ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := math.Float32bits(*ptr.toFloat32()) + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed32(b, v) + return b, nil +} +func appendFloat32Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := *ptr.toFloat32Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed32(b, math.Float32bits(*p)) + return b, nil +} +func appendFloat32Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toFloat32Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendFixed32(b, math.Float32bits(v)) + } + return b, nil +} +func appendFloat32PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toFloat32Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + b = appendVarint(b, uint64(4*len(s))) + for _, v := range s { + b = appendFixed32(b, math.Float32bits(v)) + } + return b, nil +} +func appendFixed64Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toUint64() + b = appendVarint(b, wiretag) + b = appendFixed64(b, v) + return b, nil +} +func appendFixed64ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toUint64() + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed64(b, v) + return b, nil +} +func appendFixed64Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := *ptr.toUint64Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed64(b, *p) + return b, nil +} +func appendFixed64Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toUint64Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendFixed64(b, v) + } + return b, nil +} +func appendFixed64PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toUint64Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + b = appendVarint(b, uint64(8*len(s))) + for _, v := range s { + b = appendFixed64(b, v) + } + return b, nil +} +func appendFixedS64Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt64() + b = appendVarint(b, wiretag) + b = appendFixed64(b, uint64(v)) + return b, nil +} +func appendFixedS64ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt64() + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed64(b, uint64(v)) + return b, nil +} +func appendFixedS64Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := *ptr.toInt64Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed64(b, uint64(*p)) + return b, nil +} +func appendFixedS64Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toInt64Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendFixed64(b, uint64(v)) + } + return b, nil +} +func appendFixedS64PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toInt64Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + b = appendVarint(b, uint64(8*len(s))) + for _, v := range s { + b = appendFixed64(b, uint64(v)) + } + return b, nil +} +func appendFloat64Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := math.Float64bits(*ptr.toFloat64()) + b = appendVarint(b, wiretag) + b = appendFixed64(b, v) + return b, nil +} +func appendFloat64ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := math.Float64bits(*ptr.toFloat64()) + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed64(b, v) + return b, nil +} +func appendFloat64Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := *ptr.toFloat64Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed64(b, math.Float64bits(*p)) + return b, nil +} +func appendFloat64Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toFloat64Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendFixed64(b, math.Float64bits(v)) + } + return b, nil +} +func appendFloat64PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toFloat64Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + b = appendVarint(b, uint64(8*len(s))) + for _, v := range s { + b = appendFixed64(b, math.Float64bits(v)) + } + return b, nil +} +func appendVarint32Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toUint32() + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v)) + return b, nil +} +func appendVarint32ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toUint32() + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v)) + return b, nil +} +func appendVarint32Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := *ptr.toUint32Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(*p)) + return b, nil +} +func appendVarint32Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toUint32Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v)) + } + return b, nil +} +func appendVarint32PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toUint32Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + // compute size + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v)) + } + b = appendVarint(b, uint64(n)) + for _, v := range s { + b = appendVarint(b, uint64(v)) + } + return b, nil +} +func appendVarintS32Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt32() + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v)) + return b, nil +} +func appendVarintS32ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt32() + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v)) + return b, nil +} +func appendVarintS32Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := ptr.getInt32Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(*p)) + return b, nil +} +func appendVarintS32Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := ptr.getInt32Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v)) + } + return b, nil +} +func appendVarintS32PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := ptr.getInt32Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + // compute size + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v)) + } + b = appendVarint(b, uint64(n)) + for _, v := range s { + b = appendVarint(b, uint64(v)) + } + return b, nil +} +func appendVarint64Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toUint64() + b = appendVarint(b, wiretag) + b = appendVarint(b, v) + return b, nil +} +func appendVarint64ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toUint64() + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, v) + return b, nil +} +func appendVarint64Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := *ptr.toUint64Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, *p) + return b, nil +} +func appendVarint64Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toUint64Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendVarint(b, v) + } + return b, nil +} +func appendVarint64PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toUint64Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + // compute size + n := 0 + for _, v := range s { + n += SizeVarint(v) + } + b = appendVarint(b, uint64(n)) + for _, v := range s { + b = appendVarint(b, v) + } + return b, nil +} +func appendVarintS64Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt64() + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v)) + return b, nil +} +func appendVarintS64ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt64() + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v)) + return b, nil +} +func appendVarintS64Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := *ptr.toInt64Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(*p)) + return b, nil +} +func appendVarintS64Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toInt64Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v)) + } + return b, nil +} +func appendVarintS64PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toInt64Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + // compute size + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v)) + } + b = appendVarint(b, uint64(n)) + for _, v := range s { + b = appendVarint(b, uint64(v)) + } + return b, nil +} +func appendZigzag32Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt32() + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) + return b, nil +} +func appendZigzag32ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt32() + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) + return b, nil +} +func appendZigzag32Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := ptr.getInt32Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + v := *p + b = appendVarint(b, uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) + return b, nil +} +func appendZigzag32Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := ptr.getInt32Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) + } + return b, nil +} +func appendZigzag32PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := ptr.getInt32Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + // compute size + n := 0 + for _, v := range s { + n += SizeVarint(uint64((uint32(v) << 1) ^ uint32((int32(v) >> 31)))) + } + b = appendVarint(b, uint64(n)) + for _, v := range s { + b = appendVarint(b, uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) + } + return b, nil +} +func appendZigzag64Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt64() + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v<<1)^uint64((int64(v)>>63))) + return b, nil +} +func appendZigzag64ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt64() + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v<<1)^uint64((int64(v)>>63))) + return b, nil +} +func appendZigzag64Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := *ptr.toInt64Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + v := *p + b = appendVarint(b, uint64(v<<1)^uint64((int64(v)>>63))) + return b, nil +} +func appendZigzag64Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toInt64Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v<<1)^uint64((int64(v)>>63))) + } + return b, nil +} +func appendZigzag64PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toInt64Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + // compute size + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v<<1) ^ uint64((int64(v) >> 63))) + } + b = appendVarint(b, uint64(n)) + for _, v := range s { + b = appendVarint(b, uint64(v<<1)^uint64((int64(v)>>63))) + } + return b, nil +} +func appendBoolValue(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toBool() + b = appendVarint(b, wiretag) + if v { + b = append(b, 1) + } else { + b = append(b, 0) + } + return b, nil +} +func appendBoolValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toBool() + if !v { + return b, nil + } + b = appendVarint(b, wiretag) + b = append(b, 1) + return b, nil +} + +func appendBoolPtr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := *ptr.toBoolPtr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + if *p { + b = append(b, 1) + } else { + b = append(b, 0) + } + return b, nil +} +func appendBoolSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toBoolSlice() + for _, v := range s { + b = appendVarint(b, wiretag) + if v { + b = append(b, 1) + } else { + b = append(b, 0) + } + } + return b, nil +} +func appendBoolPackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toBoolSlice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + b = appendVarint(b, uint64(len(s))) + for _, v := range s { + if v { + b = append(b, 1) + } else { + b = append(b, 0) + } + } + return b, nil +} +func appendStringValue(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toString() + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(v))) + b = append(b, v...) + return b, nil +} +func appendStringValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toString() + if v == "" { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(v))) + b = append(b, v...) + return b, nil +} +func appendStringPtr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := *ptr.toStringPtr() + if p == nil { + return b, nil + } + v := *p + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(v))) + b = append(b, v...) + return b, nil +} +func appendStringSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toStringSlice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(v))) + b = append(b, v...) + } + return b, nil +} +func appendUTF8StringValue(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + var invalidUTF8 bool + v := *ptr.toString() + if !utf8.ValidString(v) { + invalidUTF8 = true + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(v))) + b = append(b, v...) + if invalidUTF8 { + return b, errInvalidUTF8 + } + return b, nil +} +func appendUTF8StringValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + var invalidUTF8 bool + v := *ptr.toString() + if v == "" { + return b, nil + } + if !utf8.ValidString(v) { + invalidUTF8 = true + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(v))) + b = append(b, v...) + if invalidUTF8 { + return b, errInvalidUTF8 + } + return b, nil +} +func appendUTF8StringPtr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + var invalidUTF8 bool + p := *ptr.toStringPtr() + if p == nil { + return b, nil + } + v := *p + if !utf8.ValidString(v) { + invalidUTF8 = true + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(v))) + b = append(b, v...) + if invalidUTF8 { + return b, errInvalidUTF8 + } + return b, nil +} +func appendUTF8StringSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + var invalidUTF8 bool + s := *ptr.toStringSlice() + for _, v := range s { + if !utf8.ValidString(v) { + invalidUTF8 = true + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(v))) + b = append(b, v...) + } + if invalidUTF8 { + return b, errInvalidUTF8 + } + return b, nil +} +func appendBytes(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toBytes() + if v == nil { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(v))) + b = append(b, v...) + return b, nil +} +func appendBytes3(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toBytes() + if len(v) == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(v))) + b = append(b, v...) + return b, nil +} +func appendBytesOneof(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toBytes() + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(v))) + b = append(b, v...) + return b, nil +} +func appendBytesSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toBytesSlice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(v))) + b = append(b, v...) + } + return b, nil +} + +// makeGroupMarshaler returns the sizer and marshaler for a group. +// u is the marshal info of the underlying message. +func makeGroupMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + p := ptr.getPointer() + if p.isNil() { + return 0 + } + return u.size(p) + 2*tagsize + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + p := ptr.getPointer() + if p.isNil() { + return b, nil + } + var err error + b = appendVarint(b, wiretag) // start group + b, err = u.marshal(b, p, deterministic) + b = appendVarint(b, wiretag+(WireEndGroup-WireStartGroup)) // end group + return b, err + } +} + +// makeGroupSliceMarshaler returns the sizer and marshaler for a group slice. +// u is the marshal info of the underlying message. +func makeGroupSliceMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + s := ptr.getPointerSlice() + n := 0 + for _, v := range s { + if v.isNil() { + continue + } + n += u.size(v) + 2*tagsize + } + return n + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + s := ptr.getPointerSlice() + var err error + var nerr nonFatal + for _, v := range s { + if v.isNil() { + return b, errRepeatedHasNil + } + b = appendVarint(b, wiretag) // start group + b, err = u.marshal(b, v, deterministic) + b = appendVarint(b, wiretag+(WireEndGroup-WireStartGroup)) // end group + if !nerr.Merge(err) { + if err == ErrNil { + err = errRepeatedHasNil + } + return b, err + } + } + return b, nerr.E + } +} + +// makeMessageMarshaler returns the sizer and marshaler for a message field. +// u is the marshal info of the message. +func makeMessageMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + p := ptr.getPointer() + if p.isNil() { + return 0 + } + siz := u.size(p) + return siz + SizeVarint(uint64(siz)) + tagsize + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + p := ptr.getPointer() + if p.isNil() { + return b, nil + } + b = appendVarint(b, wiretag) + siz := u.cachedsize(p) + b = appendVarint(b, uint64(siz)) + return u.marshal(b, p, deterministic) + } +} + +// makeMessageSliceMarshaler returns the sizer and marshaler for a message slice. +// u is the marshal info of the message. +func makeMessageSliceMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + s := ptr.getPointerSlice() + n := 0 + for _, v := range s { + if v.isNil() { + continue + } + siz := u.size(v) + n += siz + SizeVarint(uint64(siz)) + tagsize + } + return n + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + s := ptr.getPointerSlice() + var err error + var nerr nonFatal + for _, v := range s { + if v.isNil() { + return b, errRepeatedHasNil + } + b = appendVarint(b, wiretag) + siz := u.cachedsize(v) + b = appendVarint(b, uint64(siz)) + b, err = u.marshal(b, v, deterministic) + + if !nerr.Merge(err) { + if err == ErrNil { + err = errRepeatedHasNil + } + return b, err + } + } + return b, nerr.E + } +} + +// makeMapMarshaler returns the sizer and marshaler for a map field. +// f is the pointer to the reflect data structure of the field. +func makeMapMarshaler(f *reflect.StructField) (sizer, marshaler) { + // figure out key and value type + t := f.Type + keyType := t.Key() + valType := t.Elem() + keyTags := strings.Split(f.Tag.Get("protobuf_key"), ",") + valTags := strings.Split(f.Tag.Get("protobuf_val"), ",") + keySizer, keyMarshaler := typeMarshaler(keyType, keyTags, false, false) // don't omit zero value in map + valSizer, valMarshaler := typeMarshaler(valType, valTags, false, false) // don't omit zero value in map + keyWireTag := 1<<3 | wiretype(keyTags[0]) + valWireTag := 2<<3 | wiretype(valTags[0]) + + // We create an interface to get the addresses of the map key and value. + // If value is pointer-typed, the interface is a direct interface, the + // idata itself is the value. Otherwise, the idata is the pointer to the + // value. + // Key cannot be pointer-typed. + valIsPtr := valType.Kind() == reflect.Ptr + + // If value is a message with nested maps, calling + // valSizer in marshal may be quadratic. We should use + // cached version in marshal (but not in size). + // If value is not message type, we don't have size cache, + // but it cannot be nested either. Just use valSizer. + valCachedSizer := valSizer + if valIsPtr && valType.Elem().Kind() == reflect.Struct { + u := getMarshalInfo(valType.Elem()) + valCachedSizer = func(ptr pointer, tagsize int) int { + // Same as message sizer, but use cache. + p := ptr.getPointer() + if p.isNil() { + return 0 + } + siz := u.cachedsize(p) + return siz + SizeVarint(uint64(siz)) + tagsize + } + } + return func(ptr pointer, tagsize int) int { + m := ptr.asPointerTo(t).Elem() // the map + n := 0 + for _, k := range m.MapKeys() { + ki := k.Interface() + vi := m.MapIndex(k).Interface() + kaddr := toAddrPointer(&ki, false, false) // pointer to key + vaddr := toAddrPointer(&vi, valIsPtr, false) // pointer to value + siz := keySizer(kaddr, 1) + valSizer(vaddr, 1) // tag of key = 1 (size=1), tag of val = 2 (size=1) + n += siz + SizeVarint(uint64(siz)) + tagsize + } + return n + }, + func(b []byte, ptr pointer, tag uint64, deterministic bool) ([]byte, error) { + m := ptr.asPointerTo(t).Elem() // the map + var err error + keys := m.MapKeys() + if len(keys) > 1 && deterministic { + sort.Sort(mapKeys(keys)) + } + + var nerr nonFatal + for _, k := range keys { + ki := k.Interface() + vi := m.MapIndex(k).Interface() + kaddr := toAddrPointer(&ki, false, false) // pointer to key + vaddr := toAddrPointer(&vi, valIsPtr, false) // pointer to value + b = appendVarint(b, tag) + siz := keySizer(kaddr, 1) + valCachedSizer(vaddr, 1) // tag of key = 1 (size=1), tag of val = 2 (size=1) + b = appendVarint(b, uint64(siz)) + b, err = keyMarshaler(b, kaddr, keyWireTag, deterministic) + if !nerr.Merge(err) { + return b, err + } + b, err = valMarshaler(b, vaddr, valWireTag, deterministic) + if err != ErrNil && !nerr.Merge(err) { // allow nil value in map + return b, err + } + } + return b, nerr.E + } +} + +// makeOneOfMarshaler returns the sizer and marshaler for a oneof field. +// fi is the marshal info of the field. +// f is the pointer to the reflect data structure of the field. +func makeOneOfMarshaler(fi *marshalFieldInfo, f *reflect.StructField) (sizer, marshaler) { + // Oneof field is an interface. We need to get the actual data type on the fly. + t := f.Type + return func(ptr pointer, _ int) int { + p := ptr.getInterfacePointer() + if p.isNil() { + return 0 + } + v := ptr.asPointerTo(t).Elem().Elem().Elem() // *interface -> interface -> *struct -> struct + telem := v.Type() + e := fi.oneofElems[telem] + return e.sizer(p, e.tagsize) + }, + func(b []byte, ptr pointer, _ uint64, deterministic bool) ([]byte, error) { + p := ptr.getInterfacePointer() + if p.isNil() { + return b, nil + } + v := ptr.asPointerTo(t).Elem().Elem().Elem() // *interface -> interface -> *struct -> struct + telem := v.Type() + if telem.Field(0).Type.Kind() == reflect.Ptr && p.getPointer().isNil() { + return b, errOneofHasNil + } + e := fi.oneofElems[telem] + return e.marshaler(b, p, e.wiretag, deterministic) + } +} + +// sizeExtensions computes the size of encoded data for a XXX_InternalExtensions field. +func (u *marshalInfo) sizeExtensions(ext *XXX_InternalExtensions) int { + m, mu := ext.extensionsRead() + if m == nil { + return 0 + } + mu.Lock() + + n := 0 + for _, e := range m { + if e.value == nil || e.desc == nil { + // Extension is only in its encoded form. + n += len(e.enc) + continue + } + + // We don't skip extensions that have an encoded form set, + // because the extension value may have been mutated after + // the last time this function was called. + ei := u.getExtElemInfo(e.desc) + v := e.value + p := toAddrPointer(&v, ei.isptr, ei.deref) + n += ei.sizer(p, ei.tagsize) + } + mu.Unlock() + return n +} + +// appendExtensions marshals a XXX_InternalExtensions field to the end of byte slice b. +func (u *marshalInfo) appendExtensions(b []byte, ext *XXX_InternalExtensions, deterministic bool) ([]byte, error) { + m, mu := ext.extensionsRead() + if m == nil { + return b, nil + } + mu.Lock() + defer mu.Unlock() + + var err error + var nerr nonFatal + + // Fast-path for common cases: zero or one extensions. + // Don't bother sorting the keys. + if len(m) <= 1 { + for _, e := range m { + if e.value == nil || e.desc == nil { + // Extension is only in its encoded form. + b = append(b, e.enc...) + continue + } + + // We don't skip extensions that have an encoded form set, + // because the extension value may have been mutated after + // the last time this function was called. + + ei := u.getExtElemInfo(e.desc) + v := e.value + p := toAddrPointer(&v, ei.isptr, ei.deref) + b, err = ei.marshaler(b, p, ei.wiretag, deterministic) + if !nerr.Merge(err) { + return b, err + } + } + return b, nerr.E + } + + // Sort the keys to provide a deterministic encoding. + // Not sure this is required, but the old code does it. + keys := make([]int, 0, len(m)) + for k := range m { + keys = append(keys, int(k)) + } + sort.Ints(keys) + + for _, k := range keys { + e := m[int32(k)] + if e.value == nil || e.desc == nil { + // Extension is only in its encoded form. + b = append(b, e.enc...) + continue + } + + // We don't skip extensions that have an encoded form set, + // because the extension value may have been mutated after + // the last time this function was called. + + ei := u.getExtElemInfo(e.desc) + v := e.value + p := toAddrPointer(&v, ei.isptr, ei.deref) + b, err = ei.marshaler(b, p, ei.wiretag, deterministic) + if !nerr.Merge(err) { + return b, err + } + } + return b, nerr.E +} + +// message set format is: +// message MessageSet { +// repeated group Item = 1 { +// required int32 type_id = 2; +// required string message = 3; +// }; +// } + +// sizeMessageSet computes the size of encoded data for a XXX_InternalExtensions field +// in message set format (above). +func (u *marshalInfo) sizeMessageSet(ext *XXX_InternalExtensions) int { + m, mu := ext.extensionsRead() + if m == nil { + return 0 + } + mu.Lock() + + n := 0 + for id, e := range m { + n += 2 // start group, end group. tag = 1 (size=1) + n += SizeVarint(uint64(id)) + 1 // type_id, tag = 2 (size=1) + + if e.value == nil || e.desc == nil { + // Extension is only in its encoded form. + msgWithLen := skipVarint(e.enc) // skip old tag, but leave the length varint + siz := len(msgWithLen) + n += siz + 1 // message, tag = 3 (size=1) + continue + } + + // We don't skip extensions that have an encoded form set, + // because the extension value may have been mutated after + // the last time this function was called. + + ei := u.getExtElemInfo(e.desc) + v := e.value + p := toAddrPointer(&v, ei.isptr, ei.deref) + n += ei.sizer(p, 1) // message, tag = 3 (size=1) + } + mu.Unlock() + return n +} + +// appendMessageSet marshals a XXX_InternalExtensions field in message set format (above) +// to the end of byte slice b. +func (u *marshalInfo) appendMessageSet(b []byte, ext *XXX_InternalExtensions, deterministic bool) ([]byte, error) { + m, mu := ext.extensionsRead() + if m == nil { + return b, nil + } + mu.Lock() + defer mu.Unlock() + + var err error + var nerr nonFatal + + // Fast-path for common cases: zero or one extensions. + // Don't bother sorting the keys. + if len(m) <= 1 { + for id, e := range m { + b = append(b, 1<<3|WireStartGroup) + b = append(b, 2<<3|WireVarint) + b = appendVarint(b, uint64(id)) + + if e.value == nil || e.desc == nil { + // Extension is only in its encoded form. + msgWithLen := skipVarint(e.enc) // skip old tag, but leave the length varint + b = append(b, 3<<3|WireBytes) + b = append(b, msgWithLen...) + b = append(b, 1<<3|WireEndGroup) + continue + } + + // We don't skip extensions that have an encoded form set, + // because the extension value may have been mutated after + // the last time this function was called. + + ei := u.getExtElemInfo(e.desc) + v := e.value + p := toAddrPointer(&v, ei.isptr, ei.deref) + b, err = ei.marshaler(b, p, 3<<3|WireBytes, deterministic) + if !nerr.Merge(err) { + return b, err + } + b = append(b, 1<<3|WireEndGroup) + } + return b, nerr.E + } + + // Sort the keys to provide a deterministic encoding. + keys := make([]int, 0, len(m)) + for k := range m { + keys = append(keys, int(k)) + } + sort.Ints(keys) + + for _, id := range keys { + e := m[int32(id)] + b = append(b, 1<<3|WireStartGroup) + b = append(b, 2<<3|WireVarint) + b = appendVarint(b, uint64(id)) + + if e.value == nil || e.desc == nil { + // Extension is only in its encoded form. + msgWithLen := skipVarint(e.enc) // skip old tag, but leave the length varint + b = append(b, 3<<3|WireBytes) + b = append(b, msgWithLen...) + b = append(b, 1<<3|WireEndGroup) + continue + } + + // We don't skip extensions that have an encoded form set, + // because the extension value may have been mutated after + // the last time this function was called. + + ei := u.getExtElemInfo(e.desc) + v := e.value + p := toAddrPointer(&v, ei.isptr, ei.deref) + b, err = ei.marshaler(b, p, 3<<3|WireBytes, deterministic) + b = append(b, 1<<3|WireEndGroup) + if !nerr.Merge(err) { + return b, err + } + } + return b, nerr.E +} + +// sizeV1Extensions computes the size of encoded data for a V1-API extension field. +func (u *marshalInfo) sizeV1Extensions(m map[int32]Extension) int { + if m == nil { + return 0 + } + + n := 0 + for _, e := range m { + if e.value == nil || e.desc == nil { + // Extension is only in its encoded form. + n += len(e.enc) + continue + } + + // We don't skip extensions that have an encoded form set, + // because the extension value may have been mutated after + // the last time this function was called. + + ei := u.getExtElemInfo(e.desc) + v := e.value + p := toAddrPointer(&v, ei.isptr, ei.deref) + n += ei.sizer(p, ei.tagsize) + } + return n +} + +// appendV1Extensions marshals a V1-API extension field to the end of byte slice b. +func (u *marshalInfo) appendV1Extensions(b []byte, m map[int32]Extension, deterministic bool) ([]byte, error) { + if m == nil { + return b, nil + } + + // Sort the keys to provide a deterministic encoding. + keys := make([]int, 0, len(m)) + for k := range m { + keys = append(keys, int(k)) + } + sort.Ints(keys) + + var err error + var nerr nonFatal + for _, k := range keys { + e := m[int32(k)] + if e.value == nil || e.desc == nil { + // Extension is only in its encoded form. + b = append(b, e.enc...) + continue + } + + // We don't skip extensions that have an encoded form set, + // because the extension value may have been mutated after + // the last time this function was called. + + ei := u.getExtElemInfo(e.desc) + v := e.value + p := toAddrPointer(&v, ei.isptr, ei.deref) + b, err = ei.marshaler(b, p, ei.wiretag, deterministic) + if !nerr.Merge(err) { + return b, err + } + } + return b, nerr.E +} + +// newMarshaler is the interface representing objects that can marshal themselves. +// +// This exists to support protoc-gen-go generated messages. +// The proto package will stop type-asserting to this interface in the future. +// +// DO NOT DEPEND ON THIS. +type newMarshaler interface { + XXX_Size() int + XXX_Marshal(b []byte, deterministic bool) ([]byte, error) +} + +// Size returns the encoded size of a protocol buffer message. +// This is the main entry point. +func Size(pb Message) int { + if m, ok := pb.(newMarshaler); ok { + return m.XXX_Size() + } + if m, ok := pb.(Marshaler); ok { + // If the message can marshal itself, let it do it, for compatibility. + // NOTE: This is not efficient. + b, _ := m.Marshal() + return len(b) + } + // in case somehow we didn't generate the wrapper + if pb == nil { + return 0 + } + var info InternalMessageInfo + return info.Size(pb) +} + +// Marshal takes a protocol buffer message +// and encodes it into the wire format, returning the data. +// This is the main entry point. +func Marshal(pb Message) ([]byte, error) { + if m, ok := pb.(newMarshaler); ok { + siz := m.XXX_Size() + b := make([]byte, 0, siz) + return m.XXX_Marshal(b, false) + } + if m, ok := pb.(Marshaler); ok { + // If the message can marshal itself, let it do it, for compatibility. + // NOTE: This is not efficient. + return m.Marshal() + } + // in case somehow we didn't generate the wrapper + if pb == nil { + return nil, ErrNil + } + var info InternalMessageInfo + siz := info.Size(pb) + b := make([]byte, 0, siz) + return info.Marshal(b, pb, false) +} + +// Marshal takes a protocol buffer message +// and encodes it into the wire format, writing the result to the +// Buffer. +// This is an alternative entry point. It is not necessary to use +// a Buffer for most applications. +func (p *Buffer) Marshal(pb Message) error { + var err error + if m, ok := pb.(newMarshaler); ok { + siz := m.XXX_Size() + p.grow(siz) // make sure buf has enough capacity + p.buf, err = m.XXX_Marshal(p.buf, p.deterministic) + return err + } + if m, ok := pb.(Marshaler); ok { + // If the message can marshal itself, let it do it, for compatibility. + // NOTE: This is not efficient. + b, err := m.Marshal() + p.buf = append(p.buf, b...) + return err + } + // in case somehow we didn't generate the wrapper + if pb == nil { + return ErrNil + } + var info InternalMessageInfo + siz := info.Size(pb) + p.grow(siz) // make sure buf has enough capacity + p.buf, err = info.Marshal(p.buf, pb, p.deterministic) + return err +} + +// grow grows the buffer's capacity, if necessary, to guarantee space for +// another n bytes. After grow(n), at least n bytes can be written to the +// buffer without another allocation. +func (p *Buffer) grow(n int) { + need := len(p.buf) + n + if need <= cap(p.buf) { + return + } + newCap := len(p.buf) * 2 + if newCap < need { + newCap = need + } + p.buf = append(make([]byte, 0, newCap), p.buf...) +} diff --git a/vendor/github.com/golang/protobuf/proto/table_merge.go b/vendor/github.com/golang/protobuf/proto/table_merge.go new file mode 100644 index 0000000..5525def --- /dev/null +++ b/vendor/github.com/golang/protobuf/proto/table_merge.go @@ -0,0 +1,654 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2016 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +import ( + "fmt" + "reflect" + "strings" + "sync" + "sync/atomic" +) + +// Merge merges the src message into dst. +// This assumes that dst and src of the same type and are non-nil. +func (a *InternalMessageInfo) Merge(dst, src Message) { + mi := atomicLoadMergeInfo(&a.merge) + if mi == nil { + mi = getMergeInfo(reflect.TypeOf(dst).Elem()) + atomicStoreMergeInfo(&a.merge, mi) + } + mi.merge(toPointer(&dst), toPointer(&src)) +} + +type mergeInfo struct { + typ reflect.Type + + initialized int32 // 0: only typ is valid, 1: everything is valid + lock sync.Mutex + + fields []mergeFieldInfo + unrecognized field // Offset of XXX_unrecognized +} + +type mergeFieldInfo struct { + field field // Offset of field, guaranteed to be valid + + // isPointer reports whether the value in the field is a pointer. + // This is true for the following situations: + // * Pointer to struct + // * Pointer to basic type (proto2 only) + // * Slice (first value in slice header is a pointer) + // * String (first value in string header is a pointer) + isPointer bool + + // basicWidth reports the width of the field assuming that it is directly + // embedded in the struct (as is the case for basic types in proto3). + // The possible values are: + // 0: invalid + // 1: bool + // 4: int32, uint32, float32 + // 8: int64, uint64, float64 + basicWidth int + + // Where dst and src are pointers to the types being merged. + merge func(dst, src pointer) +} + +var ( + mergeInfoMap = map[reflect.Type]*mergeInfo{} + mergeInfoLock sync.Mutex +) + +func getMergeInfo(t reflect.Type) *mergeInfo { + mergeInfoLock.Lock() + defer mergeInfoLock.Unlock() + mi := mergeInfoMap[t] + if mi == nil { + mi = &mergeInfo{typ: t} + mergeInfoMap[t] = mi + } + return mi +} + +// merge merges src into dst assuming they are both of type *mi.typ. +func (mi *mergeInfo) merge(dst, src pointer) { + if dst.isNil() { + panic("proto: nil destination") + } + if src.isNil() { + return // Nothing to do. + } + + if atomic.LoadInt32(&mi.initialized) == 0 { + mi.computeMergeInfo() + } + + for _, fi := range mi.fields { + sfp := src.offset(fi.field) + + // As an optimization, we can avoid the merge function call cost + // if we know for sure that the source will have no effect + // by checking if it is the zero value. + if unsafeAllowed { + if fi.isPointer && sfp.getPointer().isNil() { // Could be slice or string + continue + } + if fi.basicWidth > 0 { + switch { + case fi.basicWidth == 1 && !*sfp.toBool(): + continue + case fi.basicWidth == 4 && *sfp.toUint32() == 0: + continue + case fi.basicWidth == 8 && *sfp.toUint64() == 0: + continue + } + } + } + + dfp := dst.offset(fi.field) + fi.merge(dfp, sfp) + } + + // TODO: Make this faster? + out := dst.asPointerTo(mi.typ).Elem() + in := src.asPointerTo(mi.typ).Elem() + if emIn, err := extendable(in.Addr().Interface()); err == nil { + emOut, _ := extendable(out.Addr().Interface()) + mIn, muIn := emIn.extensionsRead() + if mIn != nil { + mOut := emOut.extensionsWrite() + muIn.Lock() + mergeExtension(mOut, mIn) + muIn.Unlock() + } + } + + if mi.unrecognized.IsValid() { + if b := *src.offset(mi.unrecognized).toBytes(); len(b) > 0 { + *dst.offset(mi.unrecognized).toBytes() = append([]byte(nil), b...) + } + } +} + +func (mi *mergeInfo) computeMergeInfo() { + mi.lock.Lock() + defer mi.lock.Unlock() + if mi.initialized != 0 { + return + } + t := mi.typ + n := t.NumField() + + props := GetProperties(t) + for i := 0; i < n; i++ { + f := t.Field(i) + if strings.HasPrefix(f.Name, "XXX_") { + continue + } + + mfi := mergeFieldInfo{field: toField(&f)} + tf := f.Type + + // As an optimization, we can avoid the merge function call cost + // if we know for sure that the source will have no effect + // by checking if it is the zero value. + if unsafeAllowed { + switch tf.Kind() { + case reflect.Ptr, reflect.Slice, reflect.String: + // As a special case, we assume slices and strings are pointers + // since we know that the first field in the SliceSlice or + // StringHeader is a data pointer. + mfi.isPointer = true + case reflect.Bool: + mfi.basicWidth = 1 + case reflect.Int32, reflect.Uint32, reflect.Float32: + mfi.basicWidth = 4 + case reflect.Int64, reflect.Uint64, reflect.Float64: + mfi.basicWidth = 8 + } + } + + // Unwrap tf to get at its most basic type. + var isPointer, isSlice bool + if tf.Kind() == reflect.Slice && tf.Elem().Kind() != reflect.Uint8 { + isSlice = true + tf = tf.Elem() + } + if tf.Kind() == reflect.Ptr { + isPointer = true + tf = tf.Elem() + } + if isPointer && isSlice && tf.Kind() != reflect.Struct { + panic("both pointer and slice for basic type in " + tf.Name()) + } + + switch tf.Kind() { + case reflect.Int32: + switch { + case isSlice: // E.g., []int32 + mfi.merge = func(dst, src pointer) { + // NOTE: toInt32Slice is not defined (see pointer_reflect.go). + /* + sfsp := src.toInt32Slice() + if *sfsp != nil { + dfsp := dst.toInt32Slice() + *dfsp = append(*dfsp, *sfsp...) + if *dfsp == nil { + *dfsp = []int64{} + } + } + */ + sfs := src.getInt32Slice() + if sfs != nil { + dfs := dst.getInt32Slice() + dfs = append(dfs, sfs...) + if dfs == nil { + dfs = []int32{} + } + dst.setInt32Slice(dfs) + } + } + case isPointer: // E.g., *int32 + mfi.merge = func(dst, src pointer) { + // NOTE: toInt32Ptr is not defined (see pointer_reflect.go). + /* + sfpp := src.toInt32Ptr() + if *sfpp != nil { + dfpp := dst.toInt32Ptr() + if *dfpp == nil { + *dfpp = Int32(**sfpp) + } else { + **dfpp = **sfpp + } + } + */ + sfp := src.getInt32Ptr() + if sfp != nil { + dfp := dst.getInt32Ptr() + if dfp == nil { + dst.setInt32Ptr(*sfp) + } else { + *dfp = *sfp + } + } + } + default: // E.g., int32 + mfi.merge = func(dst, src pointer) { + if v := *src.toInt32(); v != 0 { + *dst.toInt32() = v + } + } + } + case reflect.Int64: + switch { + case isSlice: // E.g., []int64 + mfi.merge = func(dst, src pointer) { + sfsp := src.toInt64Slice() + if *sfsp != nil { + dfsp := dst.toInt64Slice() + *dfsp = append(*dfsp, *sfsp...) + if *dfsp == nil { + *dfsp = []int64{} + } + } + } + case isPointer: // E.g., *int64 + mfi.merge = func(dst, src pointer) { + sfpp := src.toInt64Ptr() + if *sfpp != nil { + dfpp := dst.toInt64Ptr() + if *dfpp == nil { + *dfpp = Int64(**sfpp) + } else { + **dfpp = **sfpp + } + } + } + default: // E.g., int64 + mfi.merge = func(dst, src pointer) { + if v := *src.toInt64(); v != 0 { + *dst.toInt64() = v + } + } + } + case reflect.Uint32: + switch { + case isSlice: // E.g., []uint32 + mfi.merge = func(dst, src pointer) { + sfsp := src.toUint32Slice() + if *sfsp != nil { + dfsp := dst.toUint32Slice() + *dfsp = append(*dfsp, *sfsp...) + if *dfsp == nil { + *dfsp = []uint32{} + } + } + } + case isPointer: // E.g., *uint32 + mfi.merge = func(dst, src pointer) { + sfpp := src.toUint32Ptr() + if *sfpp != nil { + dfpp := dst.toUint32Ptr() + if *dfpp == nil { + *dfpp = Uint32(**sfpp) + } else { + **dfpp = **sfpp + } + } + } + default: // E.g., uint32 + mfi.merge = func(dst, src pointer) { + if v := *src.toUint32(); v != 0 { + *dst.toUint32() = v + } + } + } + case reflect.Uint64: + switch { + case isSlice: // E.g., []uint64 + mfi.merge = func(dst, src pointer) { + sfsp := src.toUint64Slice() + if *sfsp != nil { + dfsp := dst.toUint64Slice() + *dfsp = append(*dfsp, *sfsp...) + if *dfsp == nil { + *dfsp = []uint64{} + } + } + } + case isPointer: // E.g., *uint64 + mfi.merge = func(dst, src pointer) { + sfpp := src.toUint64Ptr() + if *sfpp != nil { + dfpp := dst.toUint64Ptr() + if *dfpp == nil { + *dfpp = Uint64(**sfpp) + } else { + **dfpp = **sfpp + } + } + } + default: // E.g., uint64 + mfi.merge = func(dst, src pointer) { + if v := *src.toUint64(); v != 0 { + *dst.toUint64() = v + } + } + } + case reflect.Float32: + switch { + case isSlice: // E.g., []float32 + mfi.merge = func(dst, src pointer) { + sfsp := src.toFloat32Slice() + if *sfsp != nil { + dfsp := dst.toFloat32Slice() + *dfsp = append(*dfsp, *sfsp...) + if *dfsp == nil { + *dfsp = []float32{} + } + } + } + case isPointer: // E.g., *float32 + mfi.merge = func(dst, src pointer) { + sfpp := src.toFloat32Ptr() + if *sfpp != nil { + dfpp := dst.toFloat32Ptr() + if *dfpp == nil { + *dfpp = Float32(**sfpp) + } else { + **dfpp = **sfpp + } + } + } + default: // E.g., float32 + mfi.merge = func(dst, src pointer) { + if v := *src.toFloat32(); v != 0 { + *dst.toFloat32() = v + } + } + } + case reflect.Float64: + switch { + case isSlice: // E.g., []float64 + mfi.merge = func(dst, src pointer) { + sfsp := src.toFloat64Slice() + if *sfsp != nil { + dfsp := dst.toFloat64Slice() + *dfsp = append(*dfsp, *sfsp...) + if *dfsp == nil { + *dfsp = []float64{} + } + } + } + case isPointer: // E.g., *float64 + mfi.merge = func(dst, src pointer) { + sfpp := src.toFloat64Ptr() + if *sfpp != nil { + dfpp := dst.toFloat64Ptr() + if *dfpp == nil { + *dfpp = Float64(**sfpp) + } else { + **dfpp = **sfpp + } + } + } + default: // E.g., float64 + mfi.merge = func(dst, src pointer) { + if v := *src.toFloat64(); v != 0 { + *dst.toFloat64() = v + } + } + } + case reflect.Bool: + switch { + case isSlice: // E.g., []bool + mfi.merge = func(dst, src pointer) { + sfsp := src.toBoolSlice() + if *sfsp != nil { + dfsp := dst.toBoolSlice() + *dfsp = append(*dfsp, *sfsp...) + if *dfsp == nil { + *dfsp = []bool{} + } + } + } + case isPointer: // E.g., *bool + mfi.merge = func(dst, src pointer) { + sfpp := src.toBoolPtr() + if *sfpp != nil { + dfpp := dst.toBoolPtr() + if *dfpp == nil { + *dfpp = Bool(**sfpp) + } else { + **dfpp = **sfpp + } + } + } + default: // E.g., bool + mfi.merge = func(dst, src pointer) { + if v := *src.toBool(); v { + *dst.toBool() = v + } + } + } + case reflect.String: + switch { + case isSlice: // E.g., []string + mfi.merge = func(dst, src pointer) { + sfsp := src.toStringSlice() + if *sfsp != nil { + dfsp := dst.toStringSlice() + *dfsp = append(*dfsp, *sfsp...) + if *dfsp == nil { + *dfsp = []string{} + } + } + } + case isPointer: // E.g., *string + mfi.merge = func(dst, src pointer) { + sfpp := src.toStringPtr() + if *sfpp != nil { + dfpp := dst.toStringPtr() + if *dfpp == nil { + *dfpp = String(**sfpp) + } else { + **dfpp = **sfpp + } + } + } + default: // E.g., string + mfi.merge = func(dst, src pointer) { + if v := *src.toString(); v != "" { + *dst.toString() = v + } + } + } + case reflect.Slice: + isProto3 := props.Prop[i].proto3 + switch { + case isPointer: + panic("bad pointer in byte slice case in " + tf.Name()) + case tf.Elem().Kind() != reflect.Uint8: + panic("bad element kind in byte slice case in " + tf.Name()) + case isSlice: // E.g., [][]byte + mfi.merge = func(dst, src pointer) { + sbsp := src.toBytesSlice() + if *sbsp != nil { + dbsp := dst.toBytesSlice() + for _, sb := range *sbsp { + if sb == nil { + *dbsp = append(*dbsp, nil) + } else { + *dbsp = append(*dbsp, append([]byte{}, sb...)) + } + } + if *dbsp == nil { + *dbsp = [][]byte{} + } + } + } + default: // E.g., []byte + mfi.merge = func(dst, src pointer) { + sbp := src.toBytes() + if *sbp != nil { + dbp := dst.toBytes() + if !isProto3 || len(*sbp) > 0 { + *dbp = append([]byte{}, *sbp...) + } + } + } + } + case reflect.Struct: + switch { + case !isPointer: + panic(fmt.Sprintf("message field %s without pointer", tf)) + case isSlice: // E.g., []*pb.T + mi := getMergeInfo(tf) + mfi.merge = func(dst, src pointer) { + sps := src.getPointerSlice() + if sps != nil { + dps := dst.getPointerSlice() + for _, sp := range sps { + var dp pointer + if !sp.isNil() { + dp = valToPointer(reflect.New(tf)) + mi.merge(dp, sp) + } + dps = append(dps, dp) + } + if dps == nil { + dps = []pointer{} + } + dst.setPointerSlice(dps) + } + } + default: // E.g., *pb.T + mi := getMergeInfo(tf) + mfi.merge = func(dst, src pointer) { + sp := src.getPointer() + if !sp.isNil() { + dp := dst.getPointer() + if dp.isNil() { + dp = valToPointer(reflect.New(tf)) + dst.setPointer(dp) + } + mi.merge(dp, sp) + } + } + } + case reflect.Map: + switch { + case isPointer || isSlice: + panic("bad pointer or slice in map case in " + tf.Name()) + default: // E.g., map[K]V + mfi.merge = func(dst, src pointer) { + sm := src.asPointerTo(tf).Elem() + if sm.Len() == 0 { + return + } + dm := dst.asPointerTo(tf).Elem() + if dm.IsNil() { + dm.Set(reflect.MakeMap(tf)) + } + + switch tf.Elem().Kind() { + case reflect.Ptr: // Proto struct (e.g., *T) + for _, key := range sm.MapKeys() { + val := sm.MapIndex(key) + val = reflect.ValueOf(Clone(val.Interface().(Message))) + dm.SetMapIndex(key, val) + } + case reflect.Slice: // E.g. Bytes type (e.g., []byte) + for _, key := range sm.MapKeys() { + val := sm.MapIndex(key) + val = reflect.ValueOf(append([]byte{}, val.Bytes()...)) + dm.SetMapIndex(key, val) + } + default: // Basic type (e.g., string) + for _, key := range sm.MapKeys() { + val := sm.MapIndex(key) + dm.SetMapIndex(key, val) + } + } + } + } + case reflect.Interface: + // Must be oneof field. + switch { + case isPointer || isSlice: + panic("bad pointer or slice in interface case in " + tf.Name()) + default: // E.g., interface{} + // TODO: Make this faster? + mfi.merge = func(dst, src pointer) { + su := src.asPointerTo(tf).Elem() + if !su.IsNil() { + du := dst.asPointerTo(tf).Elem() + typ := su.Elem().Type() + if du.IsNil() || du.Elem().Type() != typ { + du.Set(reflect.New(typ.Elem())) // Initialize interface if empty + } + sv := su.Elem().Elem().Field(0) + if sv.Kind() == reflect.Ptr && sv.IsNil() { + return + } + dv := du.Elem().Elem().Field(0) + if dv.Kind() == reflect.Ptr && dv.IsNil() { + dv.Set(reflect.New(sv.Type().Elem())) // Initialize proto message if empty + } + switch sv.Type().Kind() { + case reflect.Ptr: // Proto struct (e.g., *T) + Merge(dv.Interface().(Message), sv.Interface().(Message)) + case reflect.Slice: // E.g. Bytes type (e.g., []byte) + dv.Set(reflect.ValueOf(append([]byte{}, sv.Bytes()...))) + default: // Basic type (e.g., string) + dv.Set(sv) + } + } + } + } + default: + panic(fmt.Sprintf("merger not found for type:%s", tf)) + } + mi.fields = append(mi.fields, mfi) + } + + mi.unrecognized = invalidField + if f, ok := t.FieldByName("XXX_unrecognized"); ok { + if f.Type != reflect.TypeOf([]byte{}) { + panic("expected XXX_unrecognized to be of type []byte") + } + mi.unrecognized = toField(&f) + } + + atomic.StoreInt32(&mi.initialized, 1) +} diff --git a/vendor/github.com/golang/protobuf/proto/table_unmarshal.go b/vendor/github.com/golang/protobuf/proto/table_unmarshal.go new file mode 100644 index 0000000..acee2fc --- /dev/null +++ b/vendor/github.com/golang/protobuf/proto/table_unmarshal.go @@ -0,0 +1,2053 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2016 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +import ( + "errors" + "fmt" + "io" + "math" + "reflect" + "strconv" + "strings" + "sync" + "sync/atomic" + "unicode/utf8" +) + +// Unmarshal is the entry point from the generated .pb.go files. +// This function is not intended to be used by non-generated code. +// This function is not subject to any compatibility guarantee. +// msg contains a pointer to a protocol buffer struct. +// b is the data to be unmarshaled into the protocol buffer. +// a is a pointer to a place to store cached unmarshal information. +func (a *InternalMessageInfo) Unmarshal(msg Message, b []byte) error { + // Load the unmarshal information for this message type. + // The atomic load ensures memory consistency. + u := atomicLoadUnmarshalInfo(&a.unmarshal) + if u == nil { + // Slow path: find unmarshal info for msg, update a with it. + u = getUnmarshalInfo(reflect.TypeOf(msg).Elem()) + atomicStoreUnmarshalInfo(&a.unmarshal, u) + } + // Then do the unmarshaling. + err := u.unmarshal(toPointer(&msg), b) + return err +} + +type unmarshalInfo struct { + typ reflect.Type // type of the protobuf struct + + // 0 = only typ field is initialized + // 1 = completely initialized + initialized int32 + lock sync.Mutex // prevents double initialization + dense []unmarshalFieldInfo // fields indexed by tag # + sparse map[uint64]unmarshalFieldInfo // fields indexed by tag # + reqFields []string // names of required fields + reqMask uint64 // 1< 0 { + // Read tag and wire type. + // Special case 1 and 2 byte varints. + var x uint64 + if b[0] < 128 { + x = uint64(b[0]) + b = b[1:] + } else if len(b) >= 2 && b[1] < 128 { + x = uint64(b[0]&0x7f) + uint64(b[1])<<7 + b = b[2:] + } else { + var n int + x, n = decodeVarint(b) + if n == 0 { + return io.ErrUnexpectedEOF + } + b = b[n:] + } + tag := x >> 3 + wire := int(x) & 7 + + // Dispatch on the tag to one of the unmarshal* functions below. + var f unmarshalFieldInfo + if tag < uint64(len(u.dense)) { + f = u.dense[tag] + } else { + f = u.sparse[tag] + } + if fn := f.unmarshal; fn != nil { + var err error + b, err = fn(b, m.offset(f.field), wire) + if err == nil { + reqMask |= f.reqMask + continue + } + if r, ok := err.(*RequiredNotSetError); ok { + // Remember this error, but keep parsing. We need to produce + // a full parse even if a required field is missing. + if errLater == nil { + errLater = r + } + reqMask |= f.reqMask + continue + } + if err != errInternalBadWireType { + if err == errInvalidUTF8 { + if errLater == nil { + fullName := revProtoTypes[reflect.PtrTo(u.typ)] + "." + f.name + errLater = &invalidUTF8Error{fullName} + } + continue + } + return err + } + // Fragments with bad wire type are treated as unknown fields. + } + + // Unknown tag. + if !u.unrecognized.IsValid() { + // Don't keep unrecognized data; just skip it. + var err error + b, err = skipField(b, wire) + if err != nil { + return err + } + continue + } + // Keep unrecognized data around. + // maybe in extensions, maybe in the unrecognized field. + z := m.offset(u.unrecognized).toBytes() + var emap map[int32]Extension + var e Extension + for _, r := range u.extensionRanges { + if uint64(r.Start) <= tag && tag <= uint64(r.End) { + if u.extensions.IsValid() { + mp := m.offset(u.extensions).toExtensions() + emap = mp.extensionsWrite() + e = emap[int32(tag)] + z = &e.enc + break + } + if u.oldExtensions.IsValid() { + p := m.offset(u.oldExtensions).toOldExtensions() + emap = *p + if emap == nil { + emap = map[int32]Extension{} + *p = emap + } + e = emap[int32(tag)] + z = &e.enc + break + } + panic("no extensions field available") + } + } + + // Use wire type to skip data. + var err error + b0 := b + b, err = skipField(b, wire) + if err != nil { + return err + } + *z = encodeVarint(*z, tag<<3|uint64(wire)) + *z = append(*z, b0[:len(b0)-len(b)]...) + + if emap != nil { + emap[int32(tag)] = e + } + } + if reqMask != u.reqMask && errLater == nil { + // A required field of this message is missing. + for _, n := range u.reqFields { + if reqMask&1 == 0 { + errLater = &RequiredNotSetError{n} + } + reqMask >>= 1 + } + } + return errLater +} + +// computeUnmarshalInfo fills in u with information for use +// in unmarshaling protocol buffers of type u.typ. +func (u *unmarshalInfo) computeUnmarshalInfo() { + u.lock.Lock() + defer u.lock.Unlock() + if u.initialized != 0 { + return + } + t := u.typ + n := t.NumField() + + // Set up the "not found" value for the unrecognized byte buffer. + // This is the default for proto3. + u.unrecognized = invalidField + u.extensions = invalidField + u.oldExtensions = invalidField + + // List of the generated type and offset for each oneof field. + type oneofField struct { + ityp reflect.Type // interface type of oneof field + field field // offset in containing message + } + var oneofFields []oneofField + + for i := 0; i < n; i++ { + f := t.Field(i) + if f.Name == "XXX_unrecognized" { + // The byte slice used to hold unrecognized input is special. + if f.Type != reflect.TypeOf(([]byte)(nil)) { + panic("bad type for XXX_unrecognized field: " + f.Type.Name()) + } + u.unrecognized = toField(&f) + continue + } + if f.Name == "XXX_InternalExtensions" { + // Ditto here. + if f.Type != reflect.TypeOf(XXX_InternalExtensions{}) { + panic("bad type for XXX_InternalExtensions field: " + f.Type.Name()) + } + u.extensions = toField(&f) + if f.Tag.Get("protobuf_messageset") == "1" { + u.isMessageSet = true + } + continue + } + if f.Name == "XXX_extensions" { + // An older form of the extensions field. + if f.Type != reflect.TypeOf((map[int32]Extension)(nil)) { + panic("bad type for XXX_extensions field: " + f.Type.Name()) + } + u.oldExtensions = toField(&f) + continue + } + if f.Name == "XXX_NoUnkeyedLiteral" || f.Name == "XXX_sizecache" { + continue + } + + oneof := f.Tag.Get("protobuf_oneof") + if oneof != "" { + oneofFields = append(oneofFields, oneofField{f.Type, toField(&f)}) + // The rest of oneof processing happens below. + continue + } + + tags := f.Tag.Get("protobuf") + tagArray := strings.Split(tags, ",") + if len(tagArray) < 2 { + panic("protobuf tag not enough fields in " + t.Name() + "." + f.Name + ": " + tags) + } + tag, err := strconv.Atoi(tagArray[1]) + if err != nil { + panic("protobuf tag field not an integer: " + tagArray[1]) + } + + name := "" + for _, tag := range tagArray[3:] { + if strings.HasPrefix(tag, "name=") { + name = tag[5:] + } + } + + // Extract unmarshaling function from the field (its type and tags). + unmarshal := fieldUnmarshaler(&f) + + // Required field? + var reqMask uint64 + if tagArray[2] == "req" { + bit := len(u.reqFields) + u.reqFields = append(u.reqFields, name) + reqMask = uint64(1) << uint(bit) + // TODO: if we have more than 64 required fields, we end up + // not verifying that all required fields are present. + // Fix this, perhaps using a count of required fields? + } + + // Store the info in the correct slot in the message. + u.setTag(tag, toField(&f), unmarshal, reqMask, name) + } + + // Find any types associated with oneof fields. + var oneofImplementers []interface{} + switch m := reflect.Zero(reflect.PtrTo(t)).Interface().(type) { + case oneofFuncsIface: + _, _, _, oneofImplementers = m.XXX_OneofFuncs() + case oneofWrappersIface: + oneofImplementers = m.XXX_OneofWrappers() + } + for _, v := range oneofImplementers { + tptr := reflect.TypeOf(v) // *Msg_X + typ := tptr.Elem() // Msg_X + + f := typ.Field(0) // oneof implementers have one field + baseUnmarshal := fieldUnmarshaler(&f) + tags := strings.Split(f.Tag.Get("protobuf"), ",") + fieldNum, err := strconv.Atoi(tags[1]) + if err != nil { + panic("protobuf tag field not an integer: " + tags[1]) + } + var name string + for _, tag := range tags { + if strings.HasPrefix(tag, "name=") { + name = strings.TrimPrefix(tag, "name=") + break + } + } + + // Find the oneof field that this struct implements. + // Might take O(n^2) to process all of the oneofs, but who cares. + for _, of := range oneofFields { + if tptr.Implements(of.ityp) { + // We have found the corresponding interface for this struct. + // That lets us know where this struct should be stored + // when we encounter it during unmarshaling. + unmarshal := makeUnmarshalOneof(typ, of.ityp, baseUnmarshal) + u.setTag(fieldNum, of.field, unmarshal, 0, name) + } + } + + } + + // Get extension ranges, if any. + fn := reflect.Zero(reflect.PtrTo(t)).MethodByName("ExtensionRangeArray") + if fn.IsValid() { + if !u.extensions.IsValid() && !u.oldExtensions.IsValid() { + panic("a message with extensions, but no extensions field in " + t.Name()) + } + u.extensionRanges = fn.Call(nil)[0].Interface().([]ExtensionRange) + } + + // Explicitly disallow tag 0. This will ensure we flag an error + // when decoding a buffer of all zeros. Without this code, we + // would decode and skip an all-zero buffer of even length. + // [0 0] is [tag=0/wiretype=varint varint-encoded-0]. + u.setTag(0, zeroField, func(b []byte, f pointer, w int) ([]byte, error) { + return nil, fmt.Errorf("proto: %s: illegal tag 0 (wire type %d)", t, w) + }, 0, "") + + // Set mask for required field check. + u.reqMask = uint64(1)<= 0 && (tag < 16 || tag < 2*n) { // TODO: what are the right numbers here? + for len(u.dense) <= tag { + u.dense = append(u.dense, unmarshalFieldInfo{}) + } + u.dense[tag] = i + return + } + if u.sparse == nil { + u.sparse = map[uint64]unmarshalFieldInfo{} + } + u.sparse[uint64(tag)] = i +} + +// fieldUnmarshaler returns an unmarshaler for the given field. +func fieldUnmarshaler(f *reflect.StructField) unmarshaler { + if f.Type.Kind() == reflect.Map { + return makeUnmarshalMap(f) + } + return typeUnmarshaler(f.Type, f.Tag.Get("protobuf")) +} + +// typeUnmarshaler returns an unmarshaler for the given field type / field tag pair. +func typeUnmarshaler(t reflect.Type, tags string) unmarshaler { + tagArray := strings.Split(tags, ",") + encoding := tagArray[0] + name := "unknown" + proto3 := false + validateUTF8 := true + for _, tag := range tagArray[3:] { + if strings.HasPrefix(tag, "name=") { + name = tag[5:] + } + if tag == "proto3" { + proto3 = true + } + } + validateUTF8 = validateUTF8 && proto3 + + // Figure out packaging (pointer, slice, or both) + slice := false + pointer := false + if t.Kind() == reflect.Slice && t.Elem().Kind() != reflect.Uint8 { + slice = true + t = t.Elem() + } + if t.Kind() == reflect.Ptr { + pointer = true + t = t.Elem() + } + + // We'll never have both pointer and slice for basic types. + if pointer && slice && t.Kind() != reflect.Struct { + panic("both pointer and slice for basic type in " + t.Name()) + } + + switch t.Kind() { + case reflect.Bool: + if pointer { + return unmarshalBoolPtr + } + if slice { + return unmarshalBoolSlice + } + return unmarshalBoolValue + case reflect.Int32: + switch encoding { + case "fixed32": + if pointer { + return unmarshalFixedS32Ptr + } + if slice { + return unmarshalFixedS32Slice + } + return unmarshalFixedS32Value + case "varint": + // this could be int32 or enum + if pointer { + return unmarshalInt32Ptr + } + if slice { + return unmarshalInt32Slice + } + return unmarshalInt32Value + case "zigzag32": + if pointer { + return unmarshalSint32Ptr + } + if slice { + return unmarshalSint32Slice + } + return unmarshalSint32Value + } + case reflect.Int64: + switch encoding { + case "fixed64": + if pointer { + return unmarshalFixedS64Ptr + } + if slice { + return unmarshalFixedS64Slice + } + return unmarshalFixedS64Value + case "varint": + if pointer { + return unmarshalInt64Ptr + } + if slice { + return unmarshalInt64Slice + } + return unmarshalInt64Value + case "zigzag64": + if pointer { + return unmarshalSint64Ptr + } + if slice { + return unmarshalSint64Slice + } + return unmarshalSint64Value + } + case reflect.Uint32: + switch encoding { + case "fixed32": + if pointer { + return unmarshalFixed32Ptr + } + if slice { + return unmarshalFixed32Slice + } + return unmarshalFixed32Value + case "varint": + if pointer { + return unmarshalUint32Ptr + } + if slice { + return unmarshalUint32Slice + } + return unmarshalUint32Value + } + case reflect.Uint64: + switch encoding { + case "fixed64": + if pointer { + return unmarshalFixed64Ptr + } + if slice { + return unmarshalFixed64Slice + } + return unmarshalFixed64Value + case "varint": + if pointer { + return unmarshalUint64Ptr + } + if slice { + return unmarshalUint64Slice + } + return unmarshalUint64Value + } + case reflect.Float32: + if pointer { + return unmarshalFloat32Ptr + } + if slice { + return unmarshalFloat32Slice + } + return unmarshalFloat32Value + case reflect.Float64: + if pointer { + return unmarshalFloat64Ptr + } + if slice { + return unmarshalFloat64Slice + } + return unmarshalFloat64Value + case reflect.Map: + panic("map type in typeUnmarshaler in " + t.Name()) + case reflect.Slice: + if pointer { + panic("bad pointer in slice case in " + t.Name()) + } + if slice { + return unmarshalBytesSlice + } + return unmarshalBytesValue + case reflect.String: + if validateUTF8 { + if pointer { + return unmarshalUTF8StringPtr + } + if slice { + return unmarshalUTF8StringSlice + } + return unmarshalUTF8StringValue + } + if pointer { + return unmarshalStringPtr + } + if slice { + return unmarshalStringSlice + } + return unmarshalStringValue + case reflect.Struct: + // message or group field + if !pointer { + panic(fmt.Sprintf("message/group field %s:%s without pointer", t, encoding)) + } + switch encoding { + case "bytes": + if slice { + return makeUnmarshalMessageSlicePtr(getUnmarshalInfo(t), name) + } + return makeUnmarshalMessagePtr(getUnmarshalInfo(t), name) + case "group": + if slice { + return makeUnmarshalGroupSlicePtr(getUnmarshalInfo(t), name) + } + return makeUnmarshalGroupPtr(getUnmarshalInfo(t), name) + } + } + panic(fmt.Sprintf("unmarshaler not found type:%s encoding:%s", t, encoding)) +} + +// Below are all the unmarshalers for individual fields of various types. + +func unmarshalInt64Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int64(x) + *f.toInt64() = v + return b, nil +} + +func unmarshalInt64Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int64(x) + *f.toInt64Ptr() = &v + return b, nil +} + +func unmarshalInt64Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + x, n = decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int64(x) + s := f.toInt64Slice() + *s = append(*s, v) + } + return res, nil + } + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int64(x) + s := f.toInt64Slice() + *s = append(*s, v) + return b, nil +} + +func unmarshalSint64Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int64(x>>1) ^ int64(x)<<63>>63 + *f.toInt64() = v + return b, nil +} + +func unmarshalSint64Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int64(x>>1) ^ int64(x)<<63>>63 + *f.toInt64Ptr() = &v + return b, nil +} + +func unmarshalSint64Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + x, n = decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int64(x>>1) ^ int64(x)<<63>>63 + s := f.toInt64Slice() + *s = append(*s, v) + } + return res, nil + } + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int64(x>>1) ^ int64(x)<<63>>63 + s := f.toInt64Slice() + *s = append(*s, v) + return b, nil +} + +func unmarshalUint64Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := uint64(x) + *f.toUint64() = v + return b, nil +} + +func unmarshalUint64Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := uint64(x) + *f.toUint64Ptr() = &v + return b, nil +} + +func unmarshalUint64Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + x, n = decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := uint64(x) + s := f.toUint64Slice() + *s = append(*s, v) + } + return res, nil + } + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := uint64(x) + s := f.toUint64Slice() + *s = append(*s, v) + return b, nil +} + +func unmarshalInt32Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int32(x) + *f.toInt32() = v + return b, nil +} + +func unmarshalInt32Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int32(x) + f.setInt32Ptr(v) + return b, nil +} + +func unmarshalInt32Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + x, n = decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int32(x) + f.appendInt32Slice(v) + } + return res, nil + } + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int32(x) + f.appendInt32Slice(v) + return b, nil +} + +func unmarshalSint32Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int32(x>>1) ^ int32(x)<<31>>31 + *f.toInt32() = v + return b, nil +} + +func unmarshalSint32Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int32(x>>1) ^ int32(x)<<31>>31 + f.setInt32Ptr(v) + return b, nil +} + +func unmarshalSint32Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + x, n = decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int32(x>>1) ^ int32(x)<<31>>31 + f.appendInt32Slice(v) + } + return res, nil + } + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int32(x>>1) ^ int32(x)<<31>>31 + f.appendInt32Slice(v) + return b, nil +} + +func unmarshalUint32Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := uint32(x) + *f.toUint32() = v + return b, nil +} + +func unmarshalUint32Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := uint32(x) + *f.toUint32Ptr() = &v + return b, nil +} + +func unmarshalUint32Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + x, n = decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := uint32(x) + s := f.toUint32Slice() + *s = append(*s, v) + } + return res, nil + } + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := uint32(x) + s := f.toUint32Slice() + *s = append(*s, v) + return b, nil +} + +func unmarshalFixed64Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed64 { + return b, errInternalBadWireType + } + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56 + *f.toUint64() = v + return b[8:], nil +} + +func unmarshalFixed64Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed64 { + return b, errInternalBadWireType + } + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56 + *f.toUint64Ptr() = &v + return b[8:], nil +} + +func unmarshalFixed64Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56 + s := f.toUint64Slice() + *s = append(*s, v) + b = b[8:] + } + return res, nil + } + if w != WireFixed64 { + return b, errInternalBadWireType + } + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56 + s := f.toUint64Slice() + *s = append(*s, v) + return b[8:], nil +} + +func unmarshalFixedS64Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed64 { + return b, errInternalBadWireType + } + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := int64(b[0]) | int64(b[1])<<8 | int64(b[2])<<16 | int64(b[3])<<24 | int64(b[4])<<32 | int64(b[5])<<40 | int64(b[6])<<48 | int64(b[7])<<56 + *f.toInt64() = v + return b[8:], nil +} + +func unmarshalFixedS64Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed64 { + return b, errInternalBadWireType + } + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := int64(b[0]) | int64(b[1])<<8 | int64(b[2])<<16 | int64(b[3])<<24 | int64(b[4])<<32 | int64(b[5])<<40 | int64(b[6])<<48 | int64(b[7])<<56 + *f.toInt64Ptr() = &v + return b[8:], nil +} + +func unmarshalFixedS64Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := int64(b[0]) | int64(b[1])<<8 | int64(b[2])<<16 | int64(b[3])<<24 | int64(b[4])<<32 | int64(b[5])<<40 | int64(b[6])<<48 | int64(b[7])<<56 + s := f.toInt64Slice() + *s = append(*s, v) + b = b[8:] + } + return res, nil + } + if w != WireFixed64 { + return b, errInternalBadWireType + } + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := int64(b[0]) | int64(b[1])<<8 | int64(b[2])<<16 | int64(b[3])<<24 | int64(b[4])<<32 | int64(b[5])<<40 | int64(b[6])<<48 | int64(b[7])<<56 + s := f.toInt64Slice() + *s = append(*s, v) + return b[8:], nil +} + +func unmarshalFixed32Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed32 { + return b, errInternalBadWireType + } + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24 + *f.toUint32() = v + return b[4:], nil +} + +func unmarshalFixed32Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed32 { + return b, errInternalBadWireType + } + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24 + *f.toUint32Ptr() = &v + return b[4:], nil +} + +func unmarshalFixed32Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24 + s := f.toUint32Slice() + *s = append(*s, v) + b = b[4:] + } + return res, nil + } + if w != WireFixed32 { + return b, errInternalBadWireType + } + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24 + s := f.toUint32Slice() + *s = append(*s, v) + return b[4:], nil +} + +func unmarshalFixedS32Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed32 { + return b, errInternalBadWireType + } + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := int32(b[0]) | int32(b[1])<<8 | int32(b[2])<<16 | int32(b[3])<<24 + *f.toInt32() = v + return b[4:], nil +} + +func unmarshalFixedS32Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed32 { + return b, errInternalBadWireType + } + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := int32(b[0]) | int32(b[1])<<8 | int32(b[2])<<16 | int32(b[3])<<24 + f.setInt32Ptr(v) + return b[4:], nil +} + +func unmarshalFixedS32Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := int32(b[0]) | int32(b[1])<<8 | int32(b[2])<<16 | int32(b[3])<<24 + f.appendInt32Slice(v) + b = b[4:] + } + return res, nil + } + if w != WireFixed32 { + return b, errInternalBadWireType + } + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := int32(b[0]) | int32(b[1])<<8 | int32(b[2])<<16 | int32(b[3])<<24 + f.appendInt32Slice(v) + return b[4:], nil +} + +func unmarshalBoolValue(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + // Note: any length varint is allowed, even though any sane + // encoder will use one byte. + // See https://github.com/golang/protobuf/issues/76 + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + // TODO: check if x>1? Tests seem to indicate no. + v := x != 0 + *f.toBool() = v + return b[n:], nil +} + +func unmarshalBoolPtr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + v := x != 0 + *f.toBoolPtr() = &v + return b[n:], nil +} + +func unmarshalBoolSlice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + x, n = decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + v := x != 0 + s := f.toBoolSlice() + *s = append(*s, v) + b = b[n:] + } + return res, nil + } + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + v := x != 0 + s := f.toBoolSlice() + *s = append(*s, v) + return b[n:], nil +} + +func unmarshalFloat64Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed64 { + return b, errInternalBadWireType + } + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := math.Float64frombits(uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56) + *f.toFloat64() = v + return b[8:], nil +} + +func unmarshalFloat64Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed64 { + return b, errInternalBadWireType + } + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := math.Float64frombits(uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56) + *f.toFloat64Ptr() = &v + return b[8:], nil +} + +func unmarshalFloat64Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := math.Float64frombits(uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56) + s := f.toFloat64Slice() + *s = append(*s, v) + b = b[8:] + } + return res, nil + } + if w != WireFixed64 { + return b, errInternalBadWireType + } + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := math.Float64frombits(uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56) + s := f.toFloat64Slice() + *s = append(*s, v) + return b[8:], nil +} + +func unmarshalFloat32Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed32 { + return b, errInternalBadWireType + } + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := math.Float32frombits(uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24) + *f.toFloat32() = v + return b[4:], nil +} + +func unmarshalFloat32Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed32 { + return b, errInternalBadWireType + } + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := math.Float32frombits(uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24) + *f.toFloat32Ptr() = &v + return b[4:], nil +} + +func unmarshalFloat32Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := math.Float32frombits(uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24) + s := f.toFloat32Slice() + *s = append(*s, v) + b = b[4:] + } + return res, nil + } + if w != WireFixed32 { + return b, errInternalBadWireType + } + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := math.Float32frombits(uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24) + s := f.toFloat32Slice() + *s = append(*s, v) + return b[4:], nil +} + +func unmarshalStringValue(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + v := string(b[:x]) + *f.toString() = v + return b[x:], nil +} + +func unmarshalStringPtr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + v := string(b[:x]) + *f.toStringPtr() = &v + return b[x:], nil +} + +func unmarshalStringSlice(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + v := string(b[:x]) + s := f.toStringSlice() + *s = append(*s, v) + return b[x:], nil +} + +func unmarshalUTF8StringValue(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + v := string(b[:x]) + *f.toString() = v + if !utf8.ValidString(v) { + return b[x:], errInvalidUTF8 + } + return b[x:], nil +} + +func unmarshalUTF8StringPtr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + v := string(b[:x]) + *f.toStringPtr() = &v + if !utf8.ValidString(v) { + return b[x:], errInvalidUTF8 + } + return b[x:], nil +} + +func unmarshalUTF8StringSlice(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + v := string(b[:x]) + s := f.toStringSlice() + *s = append(*s, v) + if !utf8.ValidString(v) { + return b[x:], errInvalidUTF8 + } + return b[x:], nil +} + +var emptyBuf [0]byte + +func unmarshalBytesValue(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + // The use of append here is a trick which avoids the zeroing + // that would be required if we used a make/copy pair. + // We append to emptyBuf instead of nil because we want + // a non-nil result even when the length is 0. + v := append(emptyBuf[:], b[:x]...) + *f.toBytes() = v + return b[x:], nil +} + +func unmarshalBytesSlice(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + v := append(emptyBuf[:], b[:x]...) + s := f.toBytesSlice() + *s = append(*s, v) + return b[x:], nil +} + +func makeUnmarshalMessagePtr(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + // First read the message field to see if something is there. + // The semantics of multiple submessages are weird. Instead of + // the last one winning (as it is for all other fields), multiple + // submessages are merged. + v := f.getPointer() + if v.isNil() { + v = valToPointer(reflect.New(sub.typ)) + f.setPointer(v) + } + err := sub.unmarshal(v, b[:x]) + if err != nil { + if r, ok := err.(*RequiredNotSetError); ok { + r.field = name + "." + r.field + } else { + return nil, err + } + } + return b[x:], err + } +} + +func makeUnmarshalMessageSlicePtr(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + v := valToPointer(reflect.New(sub.typ)) + err := sub.unmarshal(v, b[:x]) + if err != nil { + if r, ok := err.(*RequiredNotSetError); ok { + r.field = name + "." + r.field + } else { + return nil, err + } + } + f.appendPointer(v) + return b[x:], err + } +} + +func makeUnmarshalGroupPtr(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireStartGroup { + return b, errInternalBadWireType + } + x, y := findEndGroup(b) + if x < 0 { + return nil, io.ErrUnexpectedEOF + } + v := f.getPointer() + if v.isNil() { + v = valToPointer(reflect.New(sub.typ)) + f.setPointer(v) + } + err := sub.unmarshal(v, b[:x]) + if err != nil { + if r, ok := err.(*RequiredNotSetError); ok { + r.field = name + "." + r.field + } else { + return nil, err + } + } + return b[y:], err + } +} + +func makeUnmarshalGroupSlicePtr(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireStartGroup { + return b, errInternalBadWireType + } + x, y := findEndGroup(b) + if x < 0 { + return nil, io.ErrUnexpectedEOF + } + v := valToPointer(reflect.New(sub.typ)) + err := sub.unmarshal(v, b[:x]) + if err != nil { + if r, ok := err.(*RequiredNotSetError); ok { + r.field = name + "." + r.field + } else { + return nil, err + } + } + f.appendPointer(v) + return b[y:], err + } +} + +func makeUnmarshalMap(f *reflect.StructField) unmarshaler { + t := f.Type + kt := t.Key() + vt := t.Elem() + unmarshalKey := typeUnmarshaler(kt, f.Tag.Get("protobuf_key")) + unmarshalVal := typeUnmarshaler(vt, f.Tag.Get("protobuf_val")) + return func(b []byte, f pointer, w int) ([]byte, error) { + // The map entry is a submessage. Figure out how big it is. + if w != WireBytes { + return nil, fmt.Errorf("proto: bad wiretype for map field: got %d want %d", w, WireBytes) + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + r := b[x:] // unused data to return + b = b[:x] // data for map entry + + // Note: we could use #keys * #values ~= 200 functions + // to do map decoding without reflection. Probably not worth it. + // Maps will be somewhat slow. Oh well. + + // Read key and value from data. + var nerr nonFatal + k := reflect.New(kt) + v := reflect.New(vt) + for len(b) > 0 { + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + wire := int(x) & 7 + b = b[n:] + + var err error + switch x >> 3 { + case 1: + b, err = unmarshalKey(b, valToPointer(k), wire) + case 2: + b, err = unmarshalVal(b, valToPointer(v), wire) + default: + err = errInternalBadWireType // skip unknown tag + } + + if nerr.Merge(err) { + continue + } + if err != errInternalBadWireType { + return nil, err + } + + // Skip past unknown fields. + b, err = skipField(b, wire) + if err != nil { + return nil, err + } + } + + // Get map, allocate if needed. + m := f.asPointerTo(t).Elem() // an addressable map[K]T + if m.IsNil() { + m.Set(reflect.MakeMap(t)) + } + + // Insert into map. + m.SetMapIndex(k.Elem(), v.Elem()) + + return r, nerr.E + } +} + +// makeUnmarshalOneof makes an unmarshaler for oneof fields. +// for: +// message Msg { +// oneof F { +// int64 X = 1; +// float64 Y = 2; +// } +// } +// typ is the type of the concrete entry for a oneof case (e.g. Msg_X). +// ityp is the interface type of the oneof field (e.g. isMsg_F). +// unmarshal is the unmarshaler for the base type of the oneof case (e.g. int64). +// Note that this function will be called once for each case in the oneof. +func makeUnmarshalOneof(typ, ityp reflect.Type, unmarshal unmarshaler) unmarshaler { + sf := typ.Field(0) + field0 := toField(&sf) + return func(b []byte, f pointer, w int) ([]byte, error) { + // Allocate holder for value. + v := reflect.New(typ) + + // Unmarshal data into holder. + // We unmarshal into the first field of the holder object. + var err error + var nerr nonFatal + b, err = unmarshal(b, valToPointer(v).offset(field0), w) + if !nerr.Merge(err) { + return nil, err + } + + // Write pointer to holder into target field. + f.asPointerTo(ityp).Elem().Set(v) + + return b, nerr.E + } +} + +// Error used by decode internally. +var errInternalBadWireType = errors.New("proto: internal error: bad wiretype") + +// skipField skips past a field of type wire and returns the remaining bytes. +func skipField(b []byte, wire int) ([]byte, error) { + switch wire { + case WireVarint: + _, k := decodeVarint(b) + if k == 0 { + return b, io.ErrUnexpectedEOF + } + b = b[k:] + case WireFixed32: + if len(b) < 4 { + return b, io.ErrUnexpectedEOF + } + b = b[4:] + case WireFixed64: + if len(b) < 8 { + return b, io.ErrUnexpectedEOF + } + b = b[8:] + case WireBytes: + m, k := decodeVarint(b) + if k == 0 || uint64(len(b)-k) < m { + return b, io.ErrUnexpectedEOF + } + b = b[uint64(k)+m:] + case WireStartGroup: + _, i := findEndGroup(b) + if i == -1 { + return b, io.ErrUnexpectedEOF + } + b = b[i:] + default: + return b, fmt.Errorf("proto: can't skip unknown wire type %d", wire) + } + return b, nil +} + +// findEndGroup finds the index of the next EndGroup tag. +// Groups may be nested, so the "next" EndGroup tag is the first +// unpaired EndGroup. +// findEndGroup returns the indexes of the start and end of the EndGroup tag. +// Returns (-1,-1) if it can't find one. +func findEndGroup(b []byte) (int, int) { + depth := 1 + i := 0 + for { + x, n := decodeVarint(b[i:]) + if n == 0 { + return -1, -1 + } + j := i + i += n + switch x & 7 { + case WireVarint: + _, k := decodeVarint(b[i:]) + if k == 0 { + return -1, -1 + } + i += k + case WireFixed32: + if len(b)-4 < i { + return -1, -1 + } + i += 4 + case WireFixed64: + if len(b)-8 < i { + return -1, -1 + } + i += 8 + case WireBytes: + m, k := decodeVarint(b[i:]) + if k == 0 { + return -1, -1 + } + i += k + if uint64(len(b)-i) < m { + return -1, -1 + } + i += int(m) + case WireStartGroup: + depth++ + case WireEndGroup: + depth-- + if depth == 0 { + return j, i + } + default: + return -1, -1 + } + } +} + +// encodeVarint appends a varint-encoded integer to b and returns the result. +func encodeVarint(b []byte, x uint64) []byte { + for x >= 1<<7 { + b = append(b, byte(x&0x7f|0x80)) + x >>= 7 + } + return append(b, byte(x)) +} + +// decodeVarint reads a varint-encoded integer from b. +// Returns the decoded integer and the number of bytes read. +// If there is an error, it returns 0,0. +func decodeVarint(b []byte) (uint64, int) { + var x, y uint64 + if len(b) == 0 { + goto bad + } + x = uint64(b[0]) + if x < 0x80 { + return x, 1 + } + x -= 0x80 + + if len(b) <= 1 { + goto bad + } + y = uint64(b[1]) + x += y << 7 + if y < 0x80 { + return x, 2 + } + x -= 0x80 << 7 + + if len(b) <= 2 { + goto bad + } + y = uint64(b[2]) + x += y << 14 + if y < 0x80 { + return x, 3 + } + x -= 0x80 << 14 + + if len(b) <= 3 { + goto bad + } + y = uint64(b[3]) + x += y << 21 + if y < 0x80 { + return x, 4 + } + x -= 0x80 << 21 + + if len(b) <= 4 { + goto bad + } + y = uint64(b[4]) + x += y << 28 + if y < 0x80 { + return x, 5 + } + x -= 0x80 << 28 + + if len(b) <= 5 { + goto bad + } + y = uint64(b[5]) + x += y << 35 + if y < 0x80 { + return x, 6 + } + x -= 0x80 << 35 + + if len(b) <= 6 { + goto bad + } + y = uint64(b[6]) + x += y << 42 + if y < 0x80 { + return x, 7 + } + x -= 0x80 << 42 + + if len(b) <= 7 { + goto bad + } + y = uint64(b[7]) + x += y << 49 + if y < 0x80 { + return x, 8 + } + x -= 0x80 << 49 + + if len(b) <= 8 { + goto bad + } + y = uint64(b[8]) + x += y << 56 + if y < 0x80 { + return x, 9 + } + x -= 0x80 << 56 + + if len(b) <= 9 { + goto bad + } + y = uint64(b[9]) + x += y << 63 + if y < 2 { + return x, 10 + } + +bad: + return 0, 0 +} diff --git a/vendor/github.com/golang/protobuf/proto/text.go b/vendor/github.com/golang/protobuf/proto/text.go new file mode 100644 index 0000000..1aaee72 --- /dev/null +++ b/vendor/github.com/golang/protobuf/proto/text.go @@ -0,0 +1,843 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +// Functions for writing the text protocol buffer format. + +import ( + "bufio" + "bytes" + "encoding" + "errors" + "fmt" + "io" + "log" + "math" + "reflect" + "sort" + "strings" +) + +var ( + newline = []byte("\n") + spaces = []byte(" ") + endBraceNewline = []byte("}\n") + backslashN = []byte{'\\', 'n'} + backslashR = []byte{'\\', 'r'} + backslashT = []byte{'\\', 't'} + backslashDQ = []byte{'\\', '"'} + backslashBS = []byte{'\\', '\\'} + posInf = []byte("inf") + negInf = []byte("-inf") + nan = []byte("nan") +) + +type writer interface { + io.Writer + WriteByte(byte) error +} + +// textWriter is an io.Writer that tracks its indentation level. +type textWriter struct { + ind int + complete bool // if the current position is a complete line + compact bool // whether to write out as a one-liner + w writer +} + +func (w *textWriter) WriteString(s string) (n int, err error) { + if !strings.Contains(s, "\n") { + if !w.compact && w.complete { + w.writeIndent() + } + w.complete = false + return io.WriteString(w.w, s) + } + // WriteString is typically called without newlines, so this + // codepath and its copy are rare. We copy to avoid + // duplicating all of Write's logic here. + return w.Write([]byte(s)) +} + +func (w *textWriter) Write(p []byte) (n int, err error) { + newlines := bytes.Count(p, newline) + if newlines == 0 { + if !w.compact && w.complete { + w.writeIndent() + } + n, err = w.w.Write(p) + w.complete = false + return n, err + } + + frags := bytes.SplitN(p, newline, newlines+1) + if w.compact { + for i, frag := range frags { + if i > 0 { + if err := w.w.WriteByte(' '); err != nil { + return n, err + } + n++ + } + nn, err := w.w.Write(frag) + n += nn + if err != nil { + return n, err + } + } + return n, nil + } + + for i, frag := range frags { + if w.complete { + w.writeIndent() + } + nn, err := w.w.Write(frag) + n += nn + if err != nil { + return n, err + } + if i+1 < len(frags) { + if err := w.w.WriteByte('\n'); err != nil { + return n, err + } + n++ + } + } + w.complete = len(frags[len(frags)-1]) == 0 + return n, nil +} + +func (w *textWriter) WriteByte(c byte) error { + if w.compact && c == '\n' { + c = ' ' + } + if !w.compact && w.complete { + w.writeIndent() + } + err := w.w.WriteByte(c) + w.complete = c == '\n' + return err +} + +func (w *textWriter) indent() { w.ind++ } + +func (w *textWriter) unindent() { + if w.ind == 0 { + log.Print("proto: textWriter unindented too far") + return + } + w.ind-- +} + +func writeName(w *textWriter, props *Properties) error { + if _, err := w.WriteString(props.OrigName); err != nil { + return err + } + if props.Wire != "group" { + return w.WriteByte(':') + } + return nil +} + +func requiresQuotes(u string) bool { + // When type URL contains any characters except [0-9A-Za-z./\-]*, it must be quoted. + for _, ch := range u { + switch { + case ch == '.' || ch == '/' || ch == '_': + continue + case '0' <= ch && ch <= '9': + continue + case 'A' <= ch && ch <= 'Z': + continue + case 'a' <= ch && ch <= 'z': + continue + default: + return true + } + } + return false +} + +// isAny reports whether sv is a google.protobuf.Any message +func isAny(sv reflect.Value) bool { + type wkt interface { + XXX_WellKnownType() string + } + t, ok := sv.Addr().Interface().(wkt) + return ok && t.XXX_WellKnownType() == "Any" +} + +// writeProto3Any writes an expanded google.protobuf.Any message. +// +// It returns (false, nil) if sv value can't be unmarshaled (e.g. because +// required messages are not linked in). +// +// It returns (true, error) when sv was written in expanded format or an error +// was encountered. +func (tm *TextMarshaler) writeProto3Any(w *textWriter, sv reflect.Value) (bool, error) { + turl := sv.FieldByName("TypeUrl") + val := sv.FieldByName("Value") + if !turl.IsValid() || !val.IsValid() { + return true, errors.New("proto: invalid google.protobuf.Any message") + } + + b, ok := val.Interface().([]byte) + if !ok { + return true, errors.New("proto: invalid google.protobuf.Any message") + } + + parts := strings.Split(turl.String(), "/") + mt := MessageType(parts[len(parts)-1]) + if mt == nil { + return false, nil + } + m := reflect.New(mt.Elem()) + if err := Unmarshal(b, m.Interface().(Message)); err != nil { + return false, nil + } + w.Write([]byte("[")) + u := turl.String() + if requiresQuotes(u) { + writeString(w, u) + } else { + w.Write([]byte(u)) + } + if w.compact { + w.Write([]byte("]:<")) + } else { + w.Write([]byte("]: <\n")) + w.ind++ + } + if err := tm.writeStruct(w, m.Elem()); err != nil { + return true, err + } + if w.compact { + w.Write([]byte("> ")) + } else { + w.ind-- + w.Write([]byte(">\n")) + } + return true, nil +} + +func (tm *TextMarshaler) writeStruct(w *textWriter, sv reflect.Value) error { + if tm.ExpandAny && isAny(sv) { + if canExpand, err := tm.writeProto3Any(w, sv); canExpand { + return err + } + } + st := sv.Type() + sprops := GetProperties(st) + for i := 0; i < sv.NumField(); i++ { + fv := sv.Field(i) + props := sprops.Prop[i] + name := st.Field(i).Name + + if name == "XXX_NoUnkeyedLiteral" { + continue + } + + if strings.HasPrefix(name, "XXX_") { + // There are two XXX_ fields: + // XXX_unrecognized []byte + // XXX_extensions map[int32]proto.Extension + // The first is handled here; + // the second is handled at the bottom of this function. + if name == "XXX_unrecognized" && !fv.IsNil() { + if err := writeUnknownStruct(w, fv.Interface().([]byte)); err != nil { + return err + } + } + continue + } + if fv.Kind() == reflect.Ptr && fv.IsNil() { + // Field not filled in. This could be an optional field or + // a required field that wasn't filled in. Either way, there + // isn't anything we can show for it. + continue + } + if fv.Kind() == reflect.Slice && fv.IsNil() { + // Repeated field that is empty, or a bytes field that is unused. + continue + } + + if props.Repeated && fv.Kind() == reflect.Slice { + // Repeated field. + for j := 0; j < fv.Len(); j++ { + if err := writeName(w, props); err != nil { + return err + } + if !w.compact { + if err := w.WriteByte(' '); err != nil { + return err + } + } + v := fv.Index(j) + if v.Kind() == reflect.Ptr && v.IsNil() { + // A nil message in a repeated field is not valid, + // but we can handle that more gracefully than panicking. + if _, err := w.Write([]byte("\n")); err != nil { + return err + } + continue + } + if err := tm.writeAny(w, v, props); err != nil { + return err + } + if err := w.WriteByte('\n'); err != nil { + return err + } + } + continue + } + if fv.Kind() == reflect.Map { + // Map fields are rendered as a repeated struct with key/value fields. + keys := fv.MapKeys() + sort.Sort(mapKeys(keys)) + for _, key := range keys { + val := fv.MapIndex(key) + if err := writeName(w, props); err != nil { + return err + } + if !w.compact { + if err := w.WriteByte(' '); err != nil { + return err + } + } + // open struct + if err := w.WriteByte('<'); err != nil { + return err + } + if !w.compact { + if err := w.WriteByte('\n'); err != nil { + return err + } + } + w.indent() + // key + if _, err := w.WriteString("key:"); err != nil { + return err + } + if !w.compact { + if err := w.WriteByte(' '); err != nil { + return err + } + } + if err := tm.writeAny(w, key, props.MapKeyProp); err != nil { + return err + } + if err := w.WriteByte('\n'); err != nil { + return err + } + // nil values aren't legal, but we can avoid panicking because of them. + if val.Kind() != reflect.Ptr || !val.IsNil() { + // value + if _, err := w.WriteString("value:"); err != nil { + return err + } + if !w.compact { + if err := w.WriteByte(' '); err != nil { + return err + } + } + if err := tm.writeAny(w, val, props.MapValProp); err != nil { + return err + } + if err := w.WriteByte('\n'); err != nil { + return err + } + } + // close struct + w.unindent() + if err := w.WriteByte('>'); err != nil { + return err + } + if err := w.WriteByte('\n'); err != nil { + return err + } + } + continue + } + if props.proto3 && fv.Kind() == reflect.Slice && fv.Len() == 0 { + // empty bytes field + continue + } + if fv.Kind() != reflect.Ptr && fv.Kind() != reflect.Slice { + // proto3 non-repeated scalar field; skip if zero value + if isProto3Zero(fv) { + continue + } + } + + if fv.Kind() == reflect.Interface { + // Check if it is a oneof. + if st.Field(i).Tag.Get("protobuf_oneof") != "" { + // fv is nil, or holds a pointer to generated struct. + // That generated struct has exactly one field, + // which has a protobuf struct tag. + if fv.IsNil() { + continue + } + inner := fv.Elem().Elem() // interface -> *T -> T + tag := inner.Type().Field(0).Tag.Get("protobuf") + props = new(Properties) // Overwrite the outer props var, but not its pointee. + props.Parse(tag) + // Write the value in the oneof, not the oneof itself. + fv = inner.Field(0) + + // Special case to cope with malformed messages gracefully: + // If the value in the oneof is a nil pointer, don't panic + // in writeAny. + if fv.Kind() == reflect.Ptr && fv.IsNil() { + // Use errors.New so writeAny won't render quotes. + msg := errors.New("/* nil */") + fv = reflect.ValueOf(&msg).Elem() + } + } + } + + if err := writeName(w, props); err != nil { + return err + } + if !w.compact { + if err := w.WriteByte(' '); err != nil { + return err + } + } + + // Enums have a String method, so writeAny will work fine. + if err := tm.writeAny(w, fv, props); err != nil { + return err + } + + if err := w.WriteByte('\n'); err != nil { + return err + } + } + + // Extensions (the XXX_extensions field). + pv := sv.Addr() + if _, err := extendable(pv.Interface()); err == nil { + if err := tm.writeExtensions(w, pv); err != nil { + return err + } + } + + return nil +} + +// writeAny writes an arbitrary field. +func (tm *TextMarshaler) writeAny(w *textWriter, v reflect.Value, props *Properties) error { + v = reflect.Indirect(v) + + // Floats have special cases. + if v.Kind() == reflect.Float32 || v.Kind() == reflect.Float64 { + x := v.Float() + var b []byte + switch { + case math.IsInf(x, 1): + b = posInf + case math.IsInf(x, -1): + b = negInf + case math.IsNaN(x): + b = nan + } + if b != nil { + _, err := w.Write(b) + return err + } + // Other values are handled below. + } + + // We don't attempt to serialise every possible value type; only those + // that can occur in protocol buffers. + switch v.Kind() { + case reflect.Slice: + // Should only be a []byte; repeated fields are handled in writeStruct. + if err := writeString(w, string(v.Bytes())); err != nil { + return err + } + case reflect.String: + if err := writeString(w, v.String()); err != nil { + return err + } + case reflect.Struct: + // Required/optional group/message. + var bra, ket byte = '<', '>' + if props != nil && props.Wire == "group" { + bra, ket = '{', '}' + } + if err := w.WriteByte(bra); err != nil { + return err + } + if !w.compact { + if err := w.WriteByte('\n'); err != nil { + return err + } + } + w.indent() + if v.CanAddr() { + // Calling v.Interface on a struct causes the reflect package to + // copy the entire struct. This is racy with the new Marshaler + // since we atomically update the XXX_sizecache. + // + // Thus, we retrieve a pointer to the struct if possible to avoid + // a race since v.Interface on the pointer doesn't copy the struct. + // + // If v is not addressable, then we are not worried about a race + // since it implies that the binary Marshaler cannot possibly be + // mutating this value. + v = v.Addr() + } + if etm, ok := v.Interface().(encoding.TextMarshaler); ok { + text, err := etm.MarshalText() + if err != nil { + return err + } + if _, err = w.Write(text); err != nil { + return err + } + } else { + if v.Kind() == reflect.Ptr { + v = v.Elem() + } + if err := tm.writeStruct(w, v); err != nil { + return err + } + } + w.unindent() + if err := w.WriteByte(ket); err != nil { + return err + } + default: + _, err := fmt.Fprint(w, v.Interface()) + return err + } + return nil +} + +// equivalent to C's isprint. +func isprint(c byte) bool { + return c >= 0x20 && c < 0x7f +} + +// writeString writes a string in the protocol buffer text format. +// It is similar to strconv.Quote except we don't use Go escape sequences, +// we treat the string as a byte sequence, and we use octal escapes. +// These differences are to maintain interoperability with the other +// languages' implementations of the text format. +func writeString(w *textWriter, s string) error { + // use WriteByte here to get any needed indent + if err := w.WriteByte('"'); err != nil { + return err + } + // Loop over the bytes, not the runes. + for i := 0; i < len(s); i++ { + var err error + // Divergence from C++: we don't escape apostrophes. + // There's no need to escape them, and the C++ parser + // copes with a naked apostrophe. + switch c := s[i]; c { + case '\n': + _, err = w.w.Write(backslashN) + case '\r': + _, err = w.w.Write(backslashR) + case '\t': + _, err = w.w.Write(backslashT) + case '"': + _, err = w.w.Write(backslashDQ) + case '\\': + _, err = w.w.Write(backslashBS) + default: + if isprint(c) { + err = w.w.WriteByte(c) + } else { + _, err = fmt.Fprintf(w.w, "\\%03o", c) + } + } + if err != nil { + return err + } + } + return w.WriteByte('"') +} + +func writeUnknownStruct(w *textWriter, data []byte) (err error) { + if !w.compact { + if _, err := fmt.Fprintf(w, "/* %d unknown bytes */\n", len(data)); err != nil { + return err + } + } + b := NewBuffer(data) + for b.index < len(b.buf) { + x, err := b.DecodeVarint() + if err != nil { + _, err := fmt.Fprintf(w, "/* %v */\n", err) + return err + } + wire, tag := x&7, x>>3 + if wire == WireEndGroup { + w.unindent() + if _, err := w.Write(endBraceNewline); err != nil { + return err + } + continue + } + if _, err := fmt.Fprint(w, tag); err != nil { + return err + } + if wire != WireStartGroup { + if err := w.WriteByte(':'); err != nil { + return err + } + } + if !w.compact || wire == WireStartGroup { + if err := w.WriteByte(' '); err != nil { + return err + } + } + switch wire { + case WireBytes: + buf, e := b.DecodeRawBytes(false) + if e == nil { + _, err = fmt.Fprintf(w, "%q", buf) + } else { + _, err = fmt.Fprintf(w, "/* %v */", e) + } + case WireFixed32: + x, err = b.DecodeFixed32() + err = writeUnknownInt(w, x, err) + case WireFixed64: + x, err = b.DecodeFixed64() + err = writeUnknownInt(w, x, err) + case WireStartGroup: + err = w.WriteByte('{') + w.indent() + case WireVarint: + x, err = b.DecodeVarint() + err = writeUnknownInt(w, x, err) + default: + _, err = fmt.Fprintf(w, "/* unknown wire type %d */", wire) + } + if err != nil { + return err + } + if err = w.WriteByte('\n'); err != nil { + return err + } + } + return nil +} + +func writeUnknownInt(w *textWriter, x uint64, err error) error { + if err == nil { + _, err = fmt.Fprint(w, x) + } else { + _, err = fmt.Fprintf(w, "/* %v */", err) + } + return err +} + +type int32Slice []int32 + +func (s int32Slice) Len() int { return len(s) } +func (s int32Slice) Less(i, j int) bool { return s[i] < s[j] } +func (s int32Slice) Swap(i, j int) { s[i], s[j] = s[j], s[i] } + +// writeExtensions writes all the extensions in pv. +// pv is assumed to be a pointer to a protocol message struct that is extendable. +func (tm *TextMarshaler) writeExtensions(w *textWriter, pv reflect.Value) error { + emap := extensionMaps[pv.Type().Elem()] + ep, _ := extendable(pv.Interface()) + + // Order the extensions by ID. + // This isn't strictly necessary, but it will give us + // canonical output, which will also make testing easier. + m, mu := ep.extensionsRead() + if m == nil { + return nil + } + mu.Lock() + ids := make([]int32, 0, len(m)) + for id := range m { + ids = append(ids, id) + } + sort.Sort(int32Slice(ids)) + mu.Unlock() + + for _, extNum := range ids { + ext := m[extNum] + var desc *ExtensionDesc + if emap != nil { + desc = emap[extNum] + } + if desc == nil { + // Unknown extension. + if err := writeUnknownStruct(w, ext.enc); err != nil { + return err + } + continue + } + + pb, err := GetExtension(ep, desc) + if err != nil { + return fmt.Errorf("failed getting extension: %v", err) + } + + // Repeated extensions will appear as a slice. + if !desc.repeated() { + if err := tm.writeExtension(w, desc.Name, pb); err != nil { + return err + } + } else { + v := reflect.ValueOf(pb) + for i := 0; i < v.Len(); i++ { + if err := tm.writeExtension(w, desc.Name, v.Index(i).Interface()); err != nil { + return err + } + } + } + } + return nil +} + +func (tm *TextMarshaler) writeExtension(w *textWriter, name string, pb interface{}) error { + if _, err := fmt.Fprintf(w, "[%s]:", name); err != nil { + return err + } + if !w.compact { + if err := w.WriteByte(' '); err != nil { + return err + } + } + if err := tm.writeAny(w, reflect.ValueOf(pb), nil); err != nil { + return err + } + if err := w.WriteByte('\n'); err != nil { + return err + } + return nil +} + +func (w *textWriter) writeIndent() { + if !w.complete { + return + } + remain := w.ind * 2 + for remain > 0 { + n := remain + if n > len(spaces) { + n = len(spaces) + } + w.w.Write(spaces[:n]) + remain -= n + } + w.complete = false +} + +// TextMarshaler is a configurable text format marshaler. +type TextMarshaler struct { + Compact bool // use compact text format (one line). + ExpandAny bool // expand google.protobuf.Any messages of known types +} + +// Marshal writes a given protocol buffer in text format. +// The only errors returned are from w. +func (tm *TextMarshaler) Marshal(w io.Writer, pb Message) error { + val := reflect.ValueOf(pb) + if pb == nil || val.IsNil() { + w.Write([]byte("")) + return nil + } + var bw *bufio.Writer + ww, ok := w.(writer) + if !ok { + bw = bufio.NewWriter(w) + ww = bw + } + aw := &textWriter{ + w: ww, + complete: true, + compact: tm.Compact, + } + + if etm, ok := pb.(encoding.TextMarshaler); ok { + text, err := etm.MarshalText() + if err != nil { + return err + } + if _, err = aw.Write(text); err != nil { + return err + } + if bw != nil { + return bw.Flush() + } + return nil + } + // Dereference the received pointer so we don't have outer < and >. + v := reflect.Indirect(val) + if err := tm.writeStruct(aw, v); err != nil { + return err + } + if bw != nil { + return bw.Flush() + } + return nil +} + +// Text is the same as Marshal, but returns the string directly. +func (tm *TextMarshaler) Text(pb Message) string { + var buf bytes.Buffer + tm.Marshal(&buf, pb) + return buf.String() +} + +var ( + defaultTextMarshaler = TextMarshaler{} + compactTextMarshaler = TextMarshaler{Compact: true} +) + +// TODO: consider removing some of the Marshal functions below. + +// MarshalText writes a given protocol buffer in text format. +// The only errors returned are from w. +func MarshalText(w io.Writer, pb Message) error { return defaultTextMarshaler.Marshal(w, pb) } + +// MarshalTextString is the same as MarshalText, but returns the string directly. +func MarshalTextString(pb Message) string { return defaultTextMarshaler.Text(pb) } + +// CompactText writes a given protocol buffer in compact text format (one line). +func CompactText(w io.Writer, pb Message) error { return compactTextMarshaler.Marshal(w, pb) } + +// CompactTextString is the same as CompactText, but returns the string directly. +func CompactTextString(pb Message) string { return compactTextMarshaler.Text(pb) } diff --git a/vendor/github.com/golang/protobuf/proto/text_parser.go b/vendor/github.com/golang/protobuf/proto/text_parser.go new file mode 100644 index 0000000..bb55a3a --- /dev/null +++ b/vendor/github.com/golang/protobuf/proto/text_parser.go @@ -0,0 +1,880 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +// Functions for parsing the Text protocol buffer format. +// TODO: message sets. + +import ( + "encoding" + "errors" + "fmt" + "reflect" + "strconv" + "strings" + "unicode/utf8" +) + +// Error string emitted when deserializing Any and fields are already set +const anyRepeatedlyUnpacked = "Any message unpacked multiple times, or %q already set" + +type ParseError struct { + Message string + Line int // 1-based line number + Offset int // 0-based byte offset from start of input +} + +func (p *ParseError) Error() string { + if p.Line == 1 { + // show offset only for first line + return fmt.Sprintf("line 1.%d: %v", p.Offset, p.Message) + } + return fmt.Sprintf("line %d: %v", p.Line, p.Message) +} + +type token struct { + value string + err *ParseError + line int // line number + offset int // byte number from start of input, not start of line + unquoted string // the unquoted version of value, if it was a quoted string +} + +func (t *token) String() string { + if t.err == nil { + return fmt.Sprintf("%q (line=%d, offset=%d)", t.value, t.line, t.offset) + } + return fmt.Sprintf("parse error: %v", t.err) +} + +type textParser struct { + s string // remaining input + done bool // whether the parsing is finished (success or error) + backed bool // whether back() was called + offset, line int + cur token +} + +func newTextParser(s string) *textParser { + p := new(textParser) + p.s = s + p.line = 1 + p.cur.line = 1 + return p +} + +func (p *textParser) errorf(format string, a ...interface{}) *ParseError { + pe := &ParseError{fmt.Sprintf(format, a...), p.cur.line, p.cur.offset} + p.cur.err = pe + p.done = true + return pe +} + +// Numbers and identifiers are matched by [-+._A-Za-z0-9] +func isIdentOrNumberChar(c byte) bool { + switch { + case 'A' <= c && c <= 'Z', 'a' <= c && c <= 'z': + return true + case '0' <= c && c <= '9': + return true + } + switch c { + case '-', '+', '.', '_': + return true + } + return false +} + +func isWhitespace(c byte) bool { + switch c { + case ' ', '\t', '\n', '\r': + return true + } + return false +} + +func isQuote(c byte) bool { + switch c { + case '"', '\'': + return true + } + return false +} + +func (p *textParser) skipWhitespace() { + i := 0 + for i < len(p.s) && (isWhitespace(p.s[i]) || p.s[i] == '#') { + if p.s[i] == '#' { + // comment; skip to end of line or input + for i < len(p.s) && p.s[i] != '\n' { + i++ + } + if i == len(p.s) { + break + } + } + if p.s[i] == '\n' { + p.line++ + } + i++ + } + p.offset += i + p.s = p.s[i:len(p.s)] + if len(p.s) == 0 { + p.done = true + } +} + +func (p *textParser) advance() { + // Skip whitespace + p.skipWhitespace() + if p.done { + return + } + + // Start of non-whitespace + p.cur.err = nil + p.cur.offset, p.cur.line = p.offset, p.line + p.cur.unquoted = "" + switch p.s[0] { + case '<', '>', '{', '}', ':', '[', ']', ';', ',', '/': + // Single symbol + p.cur.value, p.s = p.s[0:1], p.s[1:len(p.s)] + case '"', '\'': + // Quoted string + i := 1 + for i < len(p.s) && p.s[i] != p.s[0] && p.s[i] != '\n' { + if p.s[i] == '\\' && i+1 < len(p.s) { + // skip escaped char + i++ + } + i++ + } + if i >= len(p.s) || p.s[i] != p.s[0] { + p.errorf("unmatched quote") + return + } + unq, err := unquoteC(p.s[1:i], rune(p.s[0])) + if err != nil { + p.errorf("invalid quoted string %s: %v", p.s[0:i+1], err) + return + } + p.cur.value, p.s = p.s[0:i+1], p.s[i+1:len(p.s)] + p.cur.unquoted = unq + default: + i := 0 + for i < len(p.s) && isIdentOrNumberChar(p.s[i]) { + i++ + } + if i == 0 { + p.errorf("unexpected byte %#x", p.s[0]) + return + } + p.cur.value, p.s = p.s[0:i], p.s[i:len(p.s)] + } + p.offset += len(p.cur.value) +} + +var ( + errBadUTF8 = errors.New("proto: bad UTF-8") +) + +func unquoteC(s string, quote rune) (string, error) { + // This is based on C++'s tokenizer.cc. + // Despite its name, this is *not* parsing C syntax. + // For instance, "\0" is an invalid quoted string. + + // Avoid allocation in trivial cases. + simple := true + for _, r := range s { + if r == '\\' || r == quote { + simple = false + break + } + } + if simple { + return s, nil + } + + buf := make([]byte, 0, 3*len(s)/2) + for len(s) > 0 { + r, n := utf8.DecodeRuneInString(s) + if r == utf8.RuneError && n == 1 { + return "", errBadUTF8 + } + s = s[n:] + if r != '\\' { + if r < utf8.RuneSelf { + buf = append(buf, byte(r)) + } else { + buf = append(buf, string(r)...) + } + continue + } + + ch, tail, err := unescape(s) + if err != nil { + return "", err + } + buf = append(buf, ch...) + s = tail + } + return string(buf), nil +} + +func unescape(s string) (ch string, tail string, err error) { + r, n := utf8.DecodeRuneInString(s) + if r == utf8.RuneError && n == 1 { + return "", "", errBadUTF8 + } + s = s[n:] + switch r { + case 'a': + return "\a", s, nil + case 'b': + return "\b", s, nil + case 'f': + return "\f", s, nil + case 'n': + return "\n", s, nil + case 'r': + return "\r", s, nil + case 't': + return "\t", s, nil + case 'v': + return "\v", s, nil + case '?': + return "?", s, nil // trigraph workaround + case '\'', '"', '\\': + return string(r), s, nil + case '0', '1', '2', '3', '4', '5', '6', '7': + if len(s) < 2 { + return "", "", fmt.Errorf(`\%c requires 2 following digits`, r) + } + ss := string(r) + s[:2] + s = s[2:] + i, err := strconv.ParseUint(ss, 8, 8) + if err != nil { + return "", "", fmt.Errorf(`\%s contains non-octal digits`, ss) + } + return string([]byte{byte(i)}), s, nil + case 'x', 'X', 'u', 'U': + var n int + switch r { + case 'x', 'X': + n = 2 + case 'u': + n = 4 + case 'U': + n = 8 + } + if len(s) < n { + return "", "", fmt.Errorf(`\%c requires %d following digits`, r, n) + } + ss := s[:n] + s = s[n:] + i, err := strconv.ParseUint(ss, 16, 64) + if err != nil { + return "", "", fmt.Errorf(`\%c%s contains non-hexadecimal digits`, r, ss) + } + if r == 'x' || r == 'X' { + return string([]byte{byte(i)}), s, nil + } + if i > utf8.MaxRune { + return "", "", fmt.Errorf(`\%c%s is not a valid Unicode code point`, r, ss) + } + return string(i), s, nil + } + return "", "", fmt.Errorf(`unknown escape \%c`, r) +} + +// Back off the parser by one token. Can only be done between calls to next(). +// It makes the next advance() a no-op. +func (p *textParser) back() { p.backed = true } + +// Advances the parser and returns the new current token. +func (p *textParser) next() *token { + if p.backed || p.done { + p.backed = false + return &p.cur + } + p.advance() + if p.done { + p.cur.value = "" + } else if len(p.cur.value) > 0 && isQuote(p.cur.value[0]) { + // Look for multiple quoted strings separated by whitespace, + // and concatenate them. + cat := p.cur + for { + p.skipWhitespace() + if p.done || !isQuote(p.s[0]) { + break + } + p.advance() + if p.cur.err != nil { + return &p.cur + } + cat.value += " " + p.cur.value + cat.unquoted += p.cur.unquoted + } + p.done = false // parser may have seen EOF, but we want to return cat + p.cur = cat + } + return &p.cur +} + +func (p *textParser) consumeToken(s string) error { + tok := p.next() + if tok.err != nil { + return tok.err + } + if tok.value != s { + p.back() + return p.errorf("expected %q, found %q", s, tok.value) + } + return nil +} + +// Return a RequiredNotSetError indicating which required field was not set. +func (p *textParser) missingRequiredFieldError(sv reflect.Value) *RequiredNotSetError { + st := sv.Type() + sprops := GetProperties(st) + for i := 0; i < st.NumField(); i++ { + if !isNil(sv.Field(i)) { + continue + } + + props := sprops.Prop[i] + if props.Required { + return &RequiredNotSetError{fmt.Sprintf("%v.%v", st, props.OrigName)} + } + } + return &RequiredNotSetError{fmt.Sprintf("%v.", st)} // should not happen +} + +// Returns the index in the struct for the named field, as well as the parsed tag properties. +func structFieldByName(sprops *StructProperties, name string) (int, *Properties, bool) { + i, ok := sprops.decoderOrigNames[name] + if ok { + return i, sprops.Prop[i], true + } + return -1, nil, false +} + +// Consume a ':' from the input stream (if the next token is a colon), +// returning an error if a colon is needed but not present. +func (p *textParser) checkForColon(props *Properties, typ reflect.Type) *ParseError { + tok := p.next() + if tok.err != nil { + return tok.err + } + if tok.value != ":" { + // Colon is optional when the field is a group or message. + needColon := true + switch props.Wire { + case "group": + needColon = false + case "bytes": + // A "bytes" field is either a message, a string, or a repeated field; + // those three become *T, *string and []T respectively, so we can check for + // this field being a pointer to a non-string. + if typ.Kind() == reflect.Ptr { + // *T or *string + if typ.Elem().Kind() == reflect.String { + break + } + } else if typ.Kind() == reflect.Slice { + // []T or []*T + if typ.Elem().Kind() != reflect.Ptr { + break + } + } else if typ.Kind() == reflect.String { + // The proto3 exception is for a string field, + // which requires a colon. + break + } + needColon = false + } + if needColon { + return p.errorf("expected ':', found %q", tok.value) + } + p.back() + } + return nil +} + +func (p *textParser) readStruct(sv reflect.Value, terminator string) error { + st := sv.Type() + sprops := GetProperties(st) + reqCount := sprops.reqCount + var reqFieldErr error + fieldSet := make(map[string]bool) + // A struct is a sequence of "name: value", terminated by one of + // '>' or '}', or the end of the input. A name may also be + // "[extension]" or "[type/url]". + // + // The whole struct can also be an expanded Any message, like: + // [type/url] < ... struct contents ... > + for { + tok := p.next() + if tok.err != nil { + return tok.err + } + if tok.value == terminator { + break + } + if tok.value == "[" { + // Looks like an extension or an Any. + // + // TODO: Check whether we need to handle + // namespace rooted names (e.g. ".something.Foo"). + extName, err := p.consumeExtName() + if err != nil { + return err + } + + if s := strings.LastIndex(extName, "/"); s >= 0 { + // If it contains a slash, it's an Any type URL. + messageName := extName[s+1:] + mt := MessageType(messageName) + if mt == nil { + return p.errorf("unrecognized message %q in google.protobuf.Any", messageName) + } + tok = p.next() + if tok.err != nil { + return tok.err + } + // consume an optional colon + if tok.value == ":" { + tok = p.next() + if tok.err != nil { + return tok.err + } + } + var terminator string + switch tok.value { + case "<": + terminator = ">" + case "{": + terminator = "}" + default: + return p.errorf("expected '{' or '<', found %q", tok.value) + } + v := reflect.New(mt.Elem()) + if pe := p.readStruct(v.Elem(), terminator); pe != nil { + return pe + } + b, err := Marshal(v.Interface().(Message)) + if err != nil { + return p.errorf("failed to marshal message of type %q: %v", messageName, err) + } + if fieldSet["type_url"] { + return p.errorf(anyRepeatedlyUnpacked, "type_url") + } + if fieldSet["value"] { + return p.errorf(anyRepeatedlyUnpacked, "value") + } + sv.FieldByName("TypeUrl").SetString(extName) + sv.FieldByName("Value").SetBytes(b) + fieldSet["type_url"] = true + fieldSet["value"] = true + continue + } + + var desc *ExtensionDesc + // This could be faster, but it's functional. + // TODO: Do something smarter than a linear scan. + for _, d := range RegisteredExtensions(reflect.New(st).Interface().(Message)) { + if d.Name == extName { + desc = d + break + } + } + if desc == nil { + return p.errorf("unrecognized extension %q", extName) + } + + props := &Properties{} + props.Parse(desc.Tag) + + typ := reflect.TypeOf(desc.ExtensionType) + if err := p.checkForColon(props, typ); err != nil { + return err + } + + rep := desc.repeated() + + // Read the extension structure, and set it in + // the value we're constructing. + var ext reflect.Value + if !rep { + ext = reflect.New(typ).Elem() + } else { + ext = reflect.New(typ.Elem()).Elem() + } + if err := p.readAny(ext, props); err != nil { + if _, ok := err.(*RequiredNotSetError); !ok { + return err + } + reqFieldErr = err + } + ep := sv.Addr().Interface().(Message) + if !rep { + SetExtension(ep, desc, ext.Interface()) + } else { + old, err := GetExtension(ep, desc) + var sl reflect.Value + if err == nil { + sl = reflect.ValueOf(old) // existing slice + } else { + sl = reflect.MakeSlice(typ, 0, 1) + } + sl = reflect.Append(sl, ext) + SetExtension(ep, desc, sl.Interface()) + } + if err := p.consumeOptionalSeparator(); err != nil { + return err + } + continue + } + + // This is a normal, non-extension field. + name := tok.value + var dst reflect.Value + fi, props, ok := structFieldByName(sprops, name) + if ok { + dst = sv.Field(fi) + } else if oop, ok := sprops.OneofTypes[name]; ok { + // It is a oneof. + props = oop.Prop + nv := reflect.New(oop.Type.Elem()) + dst = nv.Elem().Field(0) + field := sv.Field(oop.Field) + if !field.IsNil() { + return p.errorf("field '%s' would overwrite already parsed oneof '%s'", name, sv.Type().Field(oop.Field).Name) + } + field.Set(nv) + } + if !dst.IsValid() { + return p.errorf("unknown field name %q in %v", name, st) + } + + if dst.Kind() == reflect.Map { + // Consume any colon. + if err := p.checkForColon(props, dst.Type()); err != nil { + return err + } + + // Construct the map if it doesn't already exist. + if dst.IsNil() { + dst.Set(reflect.MakeMap(dst.Type())) + } + key := reflect.New(dst.Type().Key()).Elem() + val := reflect.New(dst.Type().Elem()).Elem() + + // The map entry should be this sequence of tokens: + // < key : KEY value : VALUE > + // However, implementations may omit key or value, and technically + // we should support them in any order. See b/28924776 for a time + // this went wrong. + + tok := p.next() + var terminator string + switch tok.value { + case "<": + terminator = ">" + case "{": + terminator = "}" + default: + return p.errorf("expected '{' or '<', found %q", tok.value) + } + for { + tok := p.next() + if tok.err != nil { + return tok.err + } + if tok.value == terminator { + break + } + switch tok.value { + case "key": + if err := p.consumeToken(":"); err != nil { + return err + } + if err := p.readAny(key, props.MapKeyProp); err != nil { + return err + } + if err := p.consumeOptionalSeparator(); err != nil { + return err + } + case "value": + if err := p.checkForColon(props.MapValProp, dst.Type().Elem()); err != nil { + return err + } + if err := p.readAny(val, props.MapValProp); err != nil { + return err + } + if err := p.consumeOptionalSeparator(); err != nil { + return err + } + default: + p.back() + return p.errorf(`expected "key", "value", or %q, found %q`, terminator, tok.value) + } + } + + dst.SetMapIndex(key, val) + continue + } + + // Check that it's not already set if it's not a repeated field. + if !props.Repeated && fieldSet[name] { + return p.errorf("non-repeated field %q was repeated", name) + } + + if err := p.checkForColon(props, dst.Type()); err != nil { + return err + } + + // Parse into the field. + fieldSet[name] = true + if err := p.readAny(dst, props); err != nil { + if _, ok := err.(*RequiredNotSetError); !ok { + return err + } + reqFieldErr = err + } + if props.Required { + reqCount-- + } + + if err := p.consumeOptionalSeparator(); err != nil { + return err + } + + } + + if reqCount > 0 { + return p.missingRequiredFieldError(sv) + } + return reqFieldErr +} + +// consumeExtName consumes extension name or expanded Any type URL and the +// following ']'. It returns the name or URL consumed. +func (p *textParser) consumeExtName() (string, error) { + tok := p.next() + if tok.err != nil { + return "", tok.err + } + + // If extension name or type url is quoted, it's a single token. + if len(tok.value) > 2 && isQuote(tok.value[0]) && tok.value[len(tok.value)-1] == tok.value[0] { + name, err := unquoteC(tok.value[1:len(tok.value)-1], rune(tok.value[0])) + if err != nil { + return "", err + } + return name, p.consumeToken("]") + } + + // Consume everything up to "]" + var parts []string + for tok.value != "]" { + parts = append(parts, tok.value) + tok = p.next() + if tok.err != nil { + return "", p.errorf("unrecognized type_url or extension name: %s", tok.err) + } + if p.done && tok.value != "]" { + return "", p.errorf("unclosed type_url or extension name") + } + } + return strings.Join(parts, ""), nil +} + +// consumeOptionalSeparator consumes an optional semicolon or comma. +// It is used in readStruct to provide backward compatibility. +func (p *textParser) consumeOptionalSeparator() error { + tok := p.next() + if tok.err != nil { + return tok.err + } + if tok.value != ";" && tok.value != "," { + p.back() + } + return nil +} + +func (p *textParser) readAny(v reflect.Value, props *Properties) error { + tok := p.next() + if tok.err != nil { + return tok.err + } + if tok.value == "" { + return p.errorf("unexpected EOF") + } + + switch fv := v; fv.Kind() { + case reflect.Slice: + at := v.Type() + if at.Elem().Kind() == reflect.Uint8 { + // Special case for []byte + if tok.value[0] != '"' && tok.value[0] != '\'' { + // Deliberately written out here, as the error after + // this switch statement would write "invalid []byte: ...", + // which is not as user-friendly. + return p.errorf("invalid string: %v", tok.value) + } + bytes := []byte(tok.unquoted) + fv.Set(reflect.ValueOf(bytes)) + return nil + } + // Repeated field. + if tok.value == "[" { + // Repeated field with list notation, like [1,2,3]. + for { + fv.Set(reflect.Append(fv, reflect.New(at.Elem()).Elem())) + err := p.readAny(fv.Index(fv.Len()-1), props) + if err != nil { + return err + } + tok := p.next() + if tok.err != nil { + return tok.err + } + if tok.value == "]" { + break + } + if tok.value != "," { + return p.errorf("Expected ']' or ',' found %q", tok.value) + } + } + return nil + } + // One value of the repeated field. + p.back() + fv.Set(reflect.Append(fv, reflect.New(at.Elem()).Elem())) + return p.readAny(fv.Index(fv.Len()-1), props) + case reflect.Bool: + // true/1/t/True or false/f/0/False. + switch tok.value { + case "true", "1", "t", "True": + fv.SetBool(true) + return nil + case "false", "0", "f", "False": + fv.SetBool(false) + return nil + } + case reflect.Float32, reflect.Float64: + v := tok.value + // Ignore 'f' for compatibility with output generated by C++, but don't + // remove 'f' when the value is "-inf" or "inf". + if strings.HasSuffix(v, "f") && tok.value != "-inf" && tok.value != "inf" { + v = v[:len(v)-1] + } + if f, err := strconv.ParseFloat(v, fv.Type().Bits()); err == nil { + fv.SetFloat(f) + return nil + } + case reflect.Int32: + if x, err := strconv.ParseInt(tok.value, 0, 32); err == nil { + fv.SetInt(x) + return nil + } + + if len(props.Enum) == 0 { + break + } + m, ok := enumValueMaps[props.Enum] + if !ok { + break + } + x, ok := m[tok.value] + if !ok { + break + } + fv.SetInt(int64(x)) + return nil + case reflect.Int64: + if x, err := strconv.ParseInt(tok.value, 0, 64); err == nil { + fv.SetInt(x) + return nil + } + + case reflect.Ptr: + // A basic field (indirected through pointer), or a repeated message/group + p.back() + fv.Set(reflect.New(fv.Type().Elem())) + return p.readAny(fv.Elem(), props) + case reflect.String: + if tok.value[0] == '"' || tok.value[0] == '\'' { + fv.SetString(tok.unquoted) + return nil + } + case reflect.Struct: + var terminator string + switch tok.value { + case "{": + terminator = "}" + case "<": + terminator = ">" + default: + return p.errorf("expected '{' or '<', found %q", tok.value) + } + // TODO: Handle nested messages which implement encoding.TextUnmarshaler. + return p.readStruct(fv, terminator) + case reflect.Uint32: + if x, err := strconv.ParseUint(tok.value, 0, 32); err == nil { + fv.SetUint(uint64(x)) + return nil + } + case reflect.Uint64: + if x, err := strconv.ParseUint(tok.value, 0, 64); err == nil { + fv.SetUint(x) + return nil + } + } + return p.errorf("invalid %v: %v", v.Type(), tok.value) +} + +// UnmarshalText reads a protocol buffer in Text format. UnmarshalText resets pb +// before starting to unmarshal, so any existing data in pb is always removed. +// If a required field is not set and no other error occurs, +// UnmarshalText returns *RequiredNotSetError. +func UnmarshalText(s string, pb Message) error { + if um, ok := pb.(encoding.TextUnmarshaler); ok { + return um.UnmarshalText([]byte(s)) + } + pb.Reset() + v := reflect.ValueOf(pb) + return newTextParser(s).readStruct(v.Elem(), "") +} diff --git a/vendor/github.com/juju/errors/LICENSE b/vendor/github.com/juju/errors/LICENSE new file mode 100644 index 0000000..ade9307 --- /dev/null +++ b/vendor/github.com/juju/errors/LICENSE @@ -0,0 +1,191 @@ +All files in this repository are licensed as follows. If you contribute +to this repository, it is assumed that you license your contribution +under the same license unless you state otherwise. + +All files Copyright (C) 2015 Canonical Ltd. unless otherwise specified in the file. + +This software is licensed under the LGPLv3, included below. + +As a special exception to the GNU Lesser General Public License version 3 +("LGPL3"), the copyright holders of this Library give you permission to +convey to a third party a Combined Work that links statically or dynamically +to this Library without providing any Minimal Corresponding Source or +Minimal Application Code as set out in 4d or providing the installation +information set out in section 4e, provided that you comply with the other +provisions of LGPL3 and provided that you meet, for the Application the +terms and conditions of the license(s) which apply to the Application. + +Except as stated in this special exception, the provisions of LGPL3 will +continue to comply in full to this Library. If you modify this Library, you +may apply this exception to your version of this Library, but you are not +obliged to do so. If you do not wish to do so, delete this exception +statement from your version. This exception does not (and cannot) modify any +license terms which apply to the Application, with which you must still +comply. + + + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. diff --git a/vendor/github.com/juju/errors/Makefile b/vendor/github.com/juju/errors/Makefile new file mode 100644 index 0000000..38e7c1c --- /dev/null +++ b/vendor/github.com/juju/errors/Makefile @@ -0,0 +1,24 @@ +PROJECT := github.com/juju/errors + +.PHONY: check-licence check-go check docs + +check: check-licence check-go + go test $(PROJECT)/... + +check-licence: + @(fgrep -rl "Licensed under the LGPLv3" --exclude *.s .;\ + fgrep -rl "MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT" --exclude *.s .;\ + find . -name "*.go") | sed -e 's,\./,,' | sort | uniq -u | \ + xargs -I {} echo FAIL: licence missed: {} + +check-go: + $(eval GOFMT := $(strip $(shell gofmt -l .| sed -e "s/^/ /g"))) + @(if [ x$(GOFMT) != x"" ]; then \ + echo go fmt is sad: $(GOFMT); \ + exit 1; \ + fi ) + @(go tool vet -all -composites=false -copylocks=false .) + +docs: + godoc2md github.com/juju/errors > README.md + sed -i '5i[\[GoDoc](https://godoc.org/github.com/juju/errors?status.svg)](https://godoc.org/github.com/juju/errors)' README.md diff --git a/vendor/github.com/juju/errors/README.md b/vendor/github.com/juju/errors/README.md new file mode 100644 index 0000000..4584d10 --- /dev/null +++ b/vendor/github.com/juju/errors/README.md @@ -0,0 +1,707 @@ + +# errors + import "github.com/juju/errors" + +[![GoDoc](https://godoc.org/github.com/juju/errors?status.svg)](https://godoc.org/github.com/juju/errors) + +The juju/errors provides an easy way to annotate errors without losing the +orginal error context. + +The exported `New` and `Errorf` functions are designed to replace the +`errors.New` and `fmt.Errorf` functions respectively. The same underlying +error is there, but the package also records the location at which the error +was created. + +A primary use case for this library is to add extra context any time an +error is returned from a function. + + + if err := SomeFunc(); err != nil { + return err + } + +This instead becomes: + + + if err := SomeFunc(); err != nil { + return errors.Trace(err) + } + +which just records the file and line number of the Trace call, or + + + if err := SomeFunc(); err != nil { + return errors.Annotate(err, "more context") + } + +which also adds an annotation to the error. + +When you want to check to see if an error is of a particular type, a helper +function is normally exported by the package that returned the error, like the +`os` package does. The underlying cause of the error is available using the +`Cause` function. + + + os.IsNotExist(errors.Cause(err)) + +The result of the `Error()` call on an annotated error is the annotations joined +with colons, then the result of the `Error()` method for the underlying error +that was the cause. + + + err := errors.Errorf("original") + err = errors.Annotatef(err, "context") + err = errors.Annotatef(err, "more context") + err.Error() -> "more context: context: original" + +Obviously recording the file, line and functions is not very useful if you +cannot get them back out again. + + + errors.ErrorStack(err) + +will return something like: + + + first error + github.com/juju/errors/annotation_test.go:193: + github.com/juju/errors/annotation_test.go:194: annotation + github.com/juju/errors/annotation_test.go:195: + github.com/juju/errors/annotation_test.go:196: more context + github.com/juju/errors/annotation_test.go:197: + +The first error was generated by an external system, so there was no location +associated. The second, fourth, and last lines were generated with Trace calls, +and the other two through Annotate. + +Sometimes when responding to an error you want to return a more specific error +for the situation. + + + if err := FindField(field); err != nil { + return errors.Wrap(err, errors.NotFoundf(field)) + } + +This returns an error where the complete error stack is still available, and +`errors.Cause()` will return the `NotFound` error. + + + + + + +## func AlreadyExistsf +``` go +func AlreadyExistsf(format string, args ...interface{}) error +``` +AlreadyExistsf returns an error which satisfies IsAlreadyExists(). + + +## func Annotate +``` go +func Annotate(other error, message string) error +``` +Annotate is used to add extra context to an existing error. The location of +the Annotate call is recorded with the annotations. The file, line and +function are also recorded. + +For example: + + + if err := SomeFunc(); err != nil { + return errors.Annotate(err, "failed to frombulate") + } + + +## func Annotatef +``` go +func Annotatef(other error, format string, args ...interface{}) error +``` +Annotatef is used to add extra context to an existing error. The location of +the Annotate call is recorded with the annotations. The file, line and +function are also recorded. + +For example: + + + if err := SomeFunc(); err != nil { + return errors.Annotatef(err, "failed to frombulate the %s", arg) + } + + +## func BadRequestf +``` go +func BadRequestf(format string, args ...interface{}) error +``` +BadRequestf returns an error which satisfies IsBadRequest(). + + +## func Cause +``` go +func Cause(err error) error +``` +Cause returns the cause of the given error. This will be either the +original error, or the result of a Wrap or Mask call. + +Cause is the usual way to diagnose errors that may have been wrapped by +the other errors functions. + + +## func DeferredAnnotatef +``` go +func DeferredAnnotatef(err *error, format string, args ...interface{}) +``` +DeferredAnnotatef annotates the given error (when it is not nil) with the given +format string and arguments (like fmt.Sprintf). If *err is nil, DeferredAnnotatef +does nothing. This method is used in a defer statement in order to annotate any +resulting error with the same message. + +For example: + + + defer DeferredAnnotatef(&err, "failed to frombulate the %s", arg) + + +## func Details +``` go +func Details(err error) string +``` +Details returns information about the stack of errors wrapped by err, in +the format: + + + [{filename:99: error one} {otherfile:55: cause of error one}] + +This is a terse alternative to ErrorStack as it returns a single line. + + +## func ErrorStack +``` go +func ErrorStack(err error) string +``` +ErrorStack returns a string representation of the annotated error. If the +error passed as the parameter is not an annotated error, the result is +simply the result of the Error() method on that error. + +If the error is an annotated error, a multi-line string is returned where +each line represents one entry in the annotation stack. The full filename +from the call stack is used in the output. + + + first error + github.com/juju/errors/annotation_test.go:193: + github.com/juju/errors/annotation_test.go:194: annotation + github.com/juju/errors/annotation_test.go:195: + github.com/juju/errors/annotation_test.go:196: more context + github.com/juju/errors/annotation_test.go:197: + + +## func Errorf +``` go +func Errorf(format string, args ...interface{}) error +``` +Errorf creates a new annotated error and records the location that the +error is created. This should be a drop in replacement for fmt.Errorf. + +For example: + + + return errors.Errorf("validation failed: %s", message) + + +## func Forbiddenf +``` go +func Forbiddenf(format string, args ...interface{}) error +``` +Forbiddenf returns an error which satistifes IsForbidden() + + +## func IsAlreadyExists +``` go +func IsAlreadyExists(err error) bool +``` +IsAlreadyExists reports whether the error was created with +AlreadyExistsf() or NewAlreadyExists(). + + +## func IsBadRequest +``` go +func IsBadRequest(err error) bool +``` +IsBadRequest reports whether err was created with BadRequestf() or +NewBadRequest(). + + +## func IsForbidden +``` go +func IsForbidden(err error) bool +``` +IsForbidden reports whether err was created with Forbiddenf() or +NewForbidden(). + + +## func IsMethodNotAllowed +``` go +func IsMethodNotAllowed(err error) bool +``` +IsMethodNotAllowed reports whether err was created with MethodNotAllowedf() or +NewMethodNotAllowed(). + + +## func IsNotAssigned +``` go +func IsNotAssigned(err error) bool +``` +IsNotAssigned reports whether err was created with NotAssignedf() or +NewNotAssigned(). + + +## func IsNotFound +``` go +func IsNotFound(err error) bool +``` +IsNotFound reports whether err was created with NotFoundf() or +NewNotFound(). + + +## func IsNotImplemented +``` go +func IsNotImplemented(err error) bool +``` +IsNotImplemented reports whether err was created with +NotImplementedf() or NewNotImplemented(). + + +## func IsNotProvisioned +``` go +func IsNotProvisioned(err error) bool +``` +IsNotProvisioned reports whether err was created with NotProvisionedf() or +NewNotProvisioned(). + + +## func IsNotSupported +``` go +func IsNotSupported(err error) bool +``` +IsNotSupported reports whether the error was created with +NotSupportedf() or NewNotSupported(). + + +## func IsNotValid +``` go +func IsNotValid(err error) bool +``` +IsNotValid reports whether the error was created with NotValidf() or +NewNotValid(). + + +## func IsUnauthorized +``` go +func IsUnauthorized(err error) bool +``` +IsUnauthorized reports whether err was created with Unauthorizedf() or +NewUnauthorized(). + + +## func IsUserNotFound +``` go +func IsUserNotFound(err error) bool +``` +IsUserNotFound reports whether err was created with UserNotFoundf() or +NewUserNotFound(). + + +## func Mask +``` go +func Mask(other error) error +``` +Mask hides the underlying error type, and records the location of the masking. + + +## func Maskf +``` go +func Maskf(other error, format string, args ...interface{}) error +``` +Mask masks the given error with the given format string and arguments (like +fmt.Sprintf), returning a new error that maintains the error stack, but +hides the underlying error type. The error string still contains the full +annotations. If you want to hide the annotations, call Wrap. + + +## func MethodNotAllowedf +``` go +func MethodNotAllowedf(format string, args ...interface{}) error +``` +MethodNotAllowedf returns an error which satisfies IsMethodNotAllowed(). + + +## func New +``` go +func New(message string) error +``` +New is a drop in replacement for the standard library errors module that records +the location that the error is created. + +For example: + + + return errors.New("validation failed") + + +## func NewAlreadyExists +``` go +func NewAlreadyExists(err error, msg string) error +``` +NewAlreadyExists returns an error which wraps err and satisfies +IsAlreadyExists(). + + +## func NewBadRequest +``` go +func NewBadRequest(err error, msg string) error +``` +NewBadRequest returns an error which wraps err that satisfies +IsBadRequest(). + + +## func NewForbidden +``` go +func NewForbidden(err error, msg string) error +``` +NewForbidden returns an error which wraps err that satisfies +IsForbidden(). + + +## func NewMethodNotAllowed +``` go +func NewMethodNotAllowed(err error, msg string) error +``` +NewMethodNotAllowed returns an error which wraps err that satisfies +IsMethodNotAllowed(). + + +## func NewNotAssigned +``` go +func NewNotAssigned(err error, msg string) error +``` +NewNotAssigned returns an error which wraps err that satisfies +IsNotAssigned(). + + +## func NewNotFound +``` go +func NewNotFound(err error, msg string) error +``` +NewNotFound returns an error which wraps err that satisfies +IsNotFound(). + + +## func NewNotImplemented +``` go +func NewNotImplemented(err error, msg string) error +``` +NewNotImplemented returns an error which wraps err and satisfies +IsNotImplemented(). + + +## func NewNotProvisioned +``` go +func NewNotProvisioned(err error, msg string) error +``` +NewNotProvisioned returns an error which wraps err that satisfies +IsNotProvisioned(). + + +## func NewNotSupported +``` go +func NewNotSupported(err error, msg string) error +``` +NewNotSupported returns an error which wraps err and satisfies +IsNotSupported(). + + +## func NewNotValid +``` go +func NewNotValid(err error, msg string) error +``` +NewNotValid returns an error which wraps err and satisfies IsNotValid(). + + +## func NewUnauthorized +``` go +func NewUnauthorized(err error, msg string) error +``` +NewUnauthorized returns an error which wraps err and satisfies +IsUnauthorized(). + + +## func NewUserNotFound +``` go +func NewUserNotFound(err error, msg string) error +``` +NewUserNotFound returns an error which wraps err and satisfies +IsUserNotFound(). + + +## func NotAssignedf +``` go +func NotAssignedf(format string, args ...interface{}) error +``` +NotAssignedf returns an error which satisfies IsNotAssigned(). + + +## func NotFoundf +``` go +func NotFoundf(format string, args ...interface{}) error +``` +NotFoundf returns an error which satisfies IsNotFound(). + + +## func NotImplementedf +``` go +func NotImplementedf(format string, args ...interface{}) error +``` +NotImplementedf returns an error which satisfies IsNotImplemented(). + + +## func NotProvisionedf +``` go +func NotProvisionedf(format string, args ...interface{}) error +``` +NotProvisionedf returns an error which satisfies IsNotProvisioned(). + + +## func NotSupportedf +``` go +func NotSupportedf(format string, args ...interface{}) error +``` +NotSupportedf returns an error which satisfies IsNotSupported(). + + +## func NotValidf +``` go +func NotValidf(format string, args ...interface{}) error +``` +NotValidf returns an error which satisfies IsNotValid(). + + +## func Trace +``` go +func Trace(other error) error +``` +Trace adds the location of the Trace call to the stack. The Cause of the +resulting error is the same as the error parameter. If the other error is +nil, the result will be nil. + +For example: + + + if err := SomeFunc(); err != nil { + return errors.Trace(err) + } + + +## func Unauthorizedf +``` go +func Unauthorizedf(format string, args ...interface{}) error +``` +Unauthorizedf returns an error which satisfies IsUnauthorized(). + + +## func UserNotFoundf +``` go +func UserNotFoundf(format string, args ...interface{}) error +``` +UserNotFoundf returns an error which satisfies IsUserNotFound(). + + +## func Wrap +``` go +func Wrap(other, newDescriptive error) error +``` +Wrap changes the Cause of the error. The location of the Wrap call is also +stored in the error stack. + +For example: + + + if err := SomeFunc(); err != nil { + newErr := &packageError{"more context", private_value} + return errors.Wrap(err, newErr) + } + + +## func Wrapf +``` go +func Wrapf(other, newDescriptive error, format string, args ...interface{}) error +``` +Wrapf changes the Cause of the error, and adds an annotation. The location +of the Wrap call is also stored in the error stack. + +For example: + + + if err := SomeFunc(); err != nil { + return errors.Wrapf(err, simpleErrorType, "invalid value %q", value) + } + + + +## type Err +``` go +type Err struct { + // contains filtered or unexported fields +} +``` +Err holds a description of an error along with information about +where the error was created. + +It may be embedded in custom error types to add extra information that +this errors package can understand. + + + + + + + + + +### func NewErr +``` go +func NewErr(format string, args ...interface{}) Err +``` +NewErr is used to return an Err for the purpose of embedding in other +structures. The location is not specified, and needs to be set with a call +to SetLocation. + +For example: + + + type FooError struct { + errors.Err + code int + } + + func NewFooError(code int) error { + err := &FooError{errors.NewErr("foo"), code} + err.SetLocation(1) + return err + } + + +### func NewErrWithCause +``` go +func NewErrWithCause(other error, format string, args ...interface{}) Err +``` +NewErrWithCause is used to return an Err with cause by other error for the purpose of embedding in other +structures. The location is not specified, and needs to be set with a call +to SetLocation. + +For example: + + + type FooError struct { + errors.Err + code int + } + + func (e *FooError) Annotate(format string, args ...interface{}) error { + err := &FooError{errors.NewErrWithCause(e.Err, format, args...), e.code} + err.SetLocation(1) + return err + }) + + + + +### func (\*Err) Cause +``` go +func (e *Err) Cause() error +``` +The Cause of an error is the most recent error in the error stack that +meets one of these criteria: the original error that was raised; the new +error that was passed into the Wrap function; the most recently masked +error; or nil if the error itself is considered the Cause. Normally this +method is not invoked directly, but instead through the Cause stand alone +function. + + + +### func (\*Err) Error +``` go +func (e *Err) Error() string +``` +Error implements error.Error. + + + +### func (\*Err) Format +``` go +func (e *Err) Format(s fmt.State, verb rune) +``` +Format implements fmt.Formatter +When printing errors with %+v it also prints the stack trace. +%#v unsurprisingly will print the real underlying type. + + + +### func (\*Err) Location +``` go +func (e *Err) Location() (filename string, line int) +``` +Location is the file and line of where the error was most recently +created or annotated. + + + +### func (\*Err) Message +``` go +func (e *Err) Message() string +``` +Message returns the message stored with the most recent location. This is +the empty string if the most recent call was Trace, or the message stored +with Annotate or Mask. + + + +### func (\*Err) SetLocation +``` go +func (e *Err) SetLocation(callDepth int) +``` +SetLocation records the source location of the error at callDepth stack +frames above the call. + + + +### func (\*Err) StackTrace +``` go +func (e *Err) StackTrace() []string +``` +StackTrace returns one string for each location recorded in the stack of +errors. The first value is the originating error, with a line for each +other annotation or tracing of the error. + + + +### func (\*Err) Underlying +``` go +func (e *Err) Underlying() error +``` +Underlying returns the previous error in the error stack, if any. A client +should not ever really call this method. It is used to build the error +stack and should not be introspected by client calls. Or more +specifically, clients should not depend on anything but the `Cause` of an +error. + + + + + + + + + +- - - +Generated by [godoc2md](http://godoc.org/github.com/davecheney/godoc2md) \ No newline at end of file diff --git a/vendor/github.com/juju/errors/dependencies.tsv b/vendor/github.com/juju/errors/dependencies.tsv new file mode 100644 index 0000000..e324344 --- /dev/null +++ b/vendor/github.com/juju/errors/dependencies.tsv @@ -0,0 +1,5 @@ +github.com/juju/loggo git 8232ab8918d91c72af1a9fb94d3edbe31d88b790 2017-06-05T01:46:07Z +github.com/juju/testing git 72703b1e95eb8ce4737fd8a3d8496c6b0be280a6 2018-05-17T13:41:05Z +gopkg.in/check.v1 git 4f90aeace3a26ad7021961c297b22c42160c7b25 2016-01-05T16:49:36Z +gopkg.in/mgo.v2 git f2b6f6c918c452ad107eec89615f074e3bd80e33 2016-08-18T01:52:18Z +gopkg.in/yaml.v2 git 1be3d31502d6eabc0dd7ce5b0daab022e14a5538 2017-07-12T05:45:46Z diff --git a/vendor/github.com/juju/errors/doc.go b/vendor/github.com/juju/errors/doc.go new file mode 100644 index 0000000..d440366 --- /dev/null +++ b/vendor/github.com/juju/errors/doc.go @@ -0,0 +1,79 @@ +// Copyright 2013, 2014 Canonical Ltd. +// Licensed under the LGPLv3, see LICENCE file for details. + +/* +Package errors provides an easy way to annotate errors without losing the +original error context. + +The exported `New` and `Errorf` functions are designed to replace the +`errors.New` and `fmt.Errorf` functions respectively. The same underlying +error is there, but the package also records the location at which the error +was created. + +A primary use case for this library is to add extra context any time an +error is returned from a function. + + if err := SomeFunc(); err != nil { + return err + } + +This instead becomes: + + if err := SomeFunc(); err != nil { + return errors.Trace(err) + } + +which just records the file and line number of the Trace call, or + + if err := SomeFunc(); err != nil { + return errors.Annotate(err, "more context") + } + +which also adds an annotation to the error. + +When you want to check to see if an error is of a particular type, a helper +function is normally exported by the package that returned the error, like the +`os` package does. The underlying cause of the error is available using the +`Cause` function. + + os.IsNotExist(errors.Cause(err)) + +The result of the `Error()` call on an annotated error is the annotations joined +with colons, then the result of the `Error()` method for the underlying error +that was the cause. + + err := errors.Errorf("original") + err = errors.Annotatef(err, "context") + err = errors.Annotatef(err, "more context") + err.Error() -> "more context: context: original" + +Obviously recording the file, line and functions is not very useful if you +cannot get them back out again. + + errors.ErrorStack(err) + +will return something like: + + first error + github.com/juju/errors/annotation_test.go:193: + github.com/juju/errors/annotation_test.go:194: annotation + github.com/juju/errors/annotation_test.go:195: + github.com/juju/errors/annotation_test.go:196: more context + github.com/juju/errors/annotation_test.go:197: + +The first error was generated by an external system, so there was no location +associated. The second, fourth, and last lines were generated with Trace calls, +and the other two through Annotate. + +Sometimes when responding to an error you want to return a more specific error +for the situation. + + if err := FindField(field); err != nil { + return errors.Wrap(err, errors.NotFoundf(field)) + } + +This returns an error where the complete error stack is still available, and +`errors.Cause()` will return the `NotFound` error. + +*/ +package errors diff --git a/vendor/github.com/juju/errors/error.go b/vendor/github.com/juju/errors/error.go new file mode 100644 index 0000000..decc968 --- /dev/null +++ b/vendor/github.com/juju/errors/error.go @@ -0,0 +1,176 @@ +// Copyright 2014 Canonical Ltd. +// Licensed under the LGPLv3, see LICENCE file for details. + +package errors + +import ( + "fmt" + "reflect" + "runtime" +) + +// Err holds a description of an error along with information about +// where the error was created. +// +// It may be embedded in custom error types to add extra information that +// this errors package can understand. +type Err struct { + // message holds an annotation of the error. + message string + + // cause holds the cause of the error as returned + // by the Cause method. + cause error + + // previous holds the previous error in the error stack, if any. + previous error + + // file and line hold the source code location where the error was + // created. + file string + line int +} + +// NewErr is used to return an Err for the purpose of embedding in other +// structures. The location is not specified, and needs to be set with a call +// to SetLocation. +// +// For example: +// type FooError struct { +// errors.Err +// code int +// } +// +// func NewFooError(code int) error { +// err := &FooError{errors.NewErr("foo"), code} +// err.SetLocation(1) +// return err +// } +func NewErr(format string, args ...interface{}) Err { + return Err{ + message: fmt.Sprintf(format, args...), + } +} + +// NewErrWithCause is used to return an Err with cause by other error for the purpose of embedding in other +// structures. The location is not specified, and needs to be set with a call +// to SetLocation. +// +// For example: +// type FooError struct { +// errors.Err +// code int +// } +// +// func (e *FooError) Annotate(format string, args ...interface{}) error { +// err := &FooError{errors.NewErrWithCause(e.Err, format, args...), e.code} +// err.SetLocation(1) +// return err +// }) +func NewErrWithCause(other error, format string, args ...interface{}) Err { + return Err{ + message: fmt.Sprintf(format, args...), + cause: Cause(other), + previous: other, + } +} + +// Location is the file and line of where the error was most recently +// created or annotated. +func (e *Err) Location() (filename string, line int) { + return e.file, e.line +} + +// Underlying returns the previous error in the error stack, if any. A client +// should not ever really call this method. It is used to build the error +// stack and should not be introspected by client calls. Or more +// specifically, clients should not depend on anything but the `Cause` of an +// error. +func (e *Err) Underlying() error { + return e.previous +} + +// Cause returns the most recent error in the error stack that +// meets one of these criteria: the original error that was raised; the new +// error that was passed into the Wrap function; the most recently masked +// error; or nil if the error itself is considered the Cause. Normally this +// method is not invoked directly, but instead through the Cause stand alone +// function. +func (e *Err) Cause() error { + return e.cause +} + +// Message returns the message stored with the most recent location. This is +// the empty string if the most recent call was Trace, or the message stored +// with Annotate or Mask. +func (e *Err) Message() string { + return e.message +} + +// Error implements error.Error. +func (e *Err) Error() string { + // We want to walk up the stack of errors showing the annotations + // as long as the cause is the same. + err := e.previous + if !sameError(Cause(err), e.cause) && e.cause != nil { + err = e.cause + } + switch { + case err == nil: + return e.message + case e.message == "": + return err.Error() + } + return fmt.Sprintf("%s: %v", e.message, err) +} + +// Format implements fmt.Formatter +// When printing errors with %+v it also prints the stack trace. +// %#v unsurprisingly will print the real underlying type. +func (e *Err) Format(s fmt.State, verb rune) { + switch verb { + case 'v': + switch { + case s.Flag('+'): + fmt.Fprintf(s, "%s", ErrorStack(e)) + return + case s.Flag('#'): + // avoid infinite recursion by wrapping e into a type + // that doesn't implement Formatter. + fmt.Fprintf(s, "%#v", (*unformatter)(e)) + return + } + fallthrough + case 's': + fmt.Fprintf(s, "%s", e.Error()) + case 'q': + fmt.Fprintf(s, "%q", e.Error()) + default: + fmt.Fprintf(s, "%%!%c(%T=%s)", verb, e, e.Error()) + } +} + +// helper for Format +type unformatter Err + +func (unformatter) Format() { /* break the fmt.Formatter interface */ } + +// SetLocation records the source location of the error at callDepth stack +// frames above the call. +func (e *Err) SetLocation(callDepth int) { + _, file, line, _ := runtime.Caller(callDepth + 1) + e.file = trimGoPath(file) + e.line = line +} + +// StackTrace returns one string for each location recorded in the stack of +// errors. The first value is the originating error, with a line for each +// other annotation or tracing of the error. +func (e *Err) StackTrace() []string { + return errorStack(e) +} + +// Ideally we'd have a way to check identity, but deep equals will do. +func sameError(e1, e2 error) bool { + return reflect.DeepEqual(e1, e2) +} diff --git a/vendor/github.com/juju/errors/errortypes.go b/vendor/github.com/juju/errors/errortypes.go new file mode 100644 index 0000000..5faf1e2 --- /dev/null +++ b/vendor/github.com/juju/errors/errortypes.go @@ -0,0 +1,333 @@ +// Copyright 2014 Canonical Ltd. +// Licensed under the LGPLv3, see LICENCE file for details. + +package errors + +import ( + "fmt" +) + +// wrap is a helper to construct an *wrapper. +func wrap(err error, format, suffix string, args ...interface{}) Err { + newErr := Err{ + message: fmt.Sprintf(format+suffix, args...), + previous: err, + } + newErr.SetLocation(2) + return newErr +} + +// timeout represents an error on timeout. +type timeout struct { + Err +} + +// Timeoutf returns an error which satisfies IsTimeout(). +func Timeoutf(format string, args ...interface{}) error { + return &timeout{wrap(nil, format, " timeout", args...)} +} + +// NewTimeout returns an error which wraps err that satisfies +// IsTimeout(). +func NewTimeout(err error, msg string) error { + return &timeout{wrap(err, msg, "")} +} + +// IsTimeout reports whether err was created with Timeoutf() or +// NewTimeout(). +func IsTimeout(err error) bool { + err = Cause(err) + _, ok := err.(*timeout) + return ok +} + +// notFound represents an error when something has not been found. +type notFound struct { + Err +} + +// NotFoundf returns an error which satisfies IsNotFound(). +func NotFoundf(format string, args ...interface{}) error { + return ¬Found{wrap(nil, format, " not found", args...)} +} + +// NewNotFound returns an error which wraps err that satisfies +// IsNotFound(). +func NewNotFound(err error, msg string) error { + return ¬Found{wrap(err, msg, "")} +} + +// IsNotFound reports whether err was created with NotFoundf() or +// NewNotFound(). +func IsNotFound(err error) bool { + err = Cause(err) + _, ok := err.(*notFound) + return ok +} + +// userNotFound represents an error when an inexistent user is looked up. +type userNotFound struct { + Err +} + +// UserNotFoundf returns an error which satisfies IsUserNotFound(). +func UserNotFoundf(format string, args ...interface{}) error { + return &userNotFound{wrap(nil, format, " user not found", args...)} +} + +// NewUserNotFound returns an error which wraps err and satisfies +// IsUserNotFound(). +func NewUserNotFound(err error, msg string) error { + return &userNotFound{wrap(err, msg, "")} +} + +// IsUserNotFound reports whether err was created with UserNotFoundf() or +// NewUserNotFound(). +func IsUserNotFound(err error) bool { + err = Cause(err) + _, ok := err.(*userNotFound) + return ok +} + +// unauthorized represents an error when an operation is unauthorized. +type unauthorized struct { + Err +} + +// Unauthorizedf returns an error which satisfies IsUnauthorized(). +func Unauthorizedf(format string, args ...interface{}) error { + return &unauthorized{wrap(nil, format, "", args...)} +} + +// NewUnauthorized returns an error which wraps err and satisfies +// IsUnauthorized(). +func NewUnauthorized(err error, msg string) error { + return &unauthorized{wrap(err, msg, "")} +} + +// IsUnauthorized reports whether err was created with Unauthorizedf() or +// NewUnauthorized(). +func IsUnauthorized(err error) bool { + err = Cause(err) + _, ok := err.(*unauthorized) + return ok +} + +// notImplemented represents an error when something is not +// implemented. +type notImplemented struct { + Err +} + +// NotImplementedf returns an error which satisfies IsNotImplemented(). +func NotImplementedf(format string, args ...interface{}) error { + return ¬Implemented{wrap(nil, format, " not implemented", args...)} +} + +// NewNotImplemented returns an error which wraps err and satisfies +// IsNotImplemented(). +func NewNotImplemented(err error, msg string) error { + return ¬Implemented{wrap(err, msg, "")} +} + +// IsNotImplemented reports whether err was created with +// NotImplementedf() or NewNotImplemented(). +func IsNotImplemented(err error) bool { + err = Cause(err) + _, ok := err.(*notImplemented) + return ok +} + +// alreadyExists represents and error when something already exists. +type alreadyExists struct { + Err +} + +// AlreadyExistsf returns an error which satisfies IsAlreadyExists(). +func AlreadyExistsf(format string, args ...interface{}) error { + return &alreadyExists{wrap(nil, format, " already exists", args...)} +} + +// NewAlreadyExists returns an error which wraps err and satisfies +// IsAlreadyExists(). +func NewAlreadyExists(err error, msg string) error { + return &alreadyExists{wrap(err, msg, "")} +} + +// IsAlreadyExists reports whether the error was created with +// AlreadyExistsf() or NewAlreadyExists(). +func IsAlreadyExists(err error) bool { + err = Cause(err) + _, ok := err.(*alreadyExists) + return ok +} + +// notSupported represents an error when something is not supported. +type notSupported struct { + Err +} + +// NotSupportedf returns an error which satisfies IsNotSupported(). +func NotSupportedf(format string, args ...interface{}) error { + return ¬Supported{wrap(nil, format, " not supported", args...)} +} + +// NewNotSupported returns an error which wraps err and satisfies +// IsNotSupported(). +func NewNotSupported(err error, msg string) error { + return ¬Supported{wrap(err, msg, "")} +} + +// IsNotSupported reports whether the error was created with +// NotSupportedf() or NewNotSupported(). +func IsNotSupported(err error) bool { + err = Cause(err) + _, ok := err.(*notSupported) + return ok +} + +// notValid represents an error when something is not valid. +type notValid struct { + Err +} + +// NotValidf returns an error which satisfies IsNotValid(). +func NotValidf(format string, args ...interface{}) error { + return ¬Valid{wrap(nil, format, " not valid", args...)} +} + +// NewNotValid returns an error which wraps err and satisfies IsNotValid(). +func NewNotValid(err error, msg string) error { + return ¬Valid{wrap(err, msg, "")} +} + +// IsNotValid reports whether the error was created with NotValidf() or +// NewNotValid(). +func IsNotValid(err error) bool { + err = Cause(err) + _, ok := err.(*notValid) + return ok +} + +// notProvisioned represents an error when something is not yet provisioned. +type notProvisioned struct { + Err +} + +// NotProvisionedf returns an error which satisfies IsNotProvisioned(). +func NotProvisionedf(format string, args ...interface{}) error { + return ¬Provisioned{wrap(nil, format, " not provisioned", args...)} +} + +// NewNotProvisioned returns an error which wraps err that satisfies +// IsNotProvisioned(). +func NewNotProvisioned(err error, msg string) error { + return ¬Provisioned{wrap(err, msg, "")} +} + +// IsNotProvisioned reports whether err was created with NotProvisionedf() or +// NewNotProvisioned(). +func IsNotProvisioned(err error) bool { + err = Cause(err) + _, ok := err.(*notProvisioned) + return ok +} + +// notAssigned represents an error when something is not yet assigned to +// something else. +type notAssigned struct { + Err +} + +// NotAssignedf returns an error which satisfies IsNotAssigned(). +func NotAssignedf(format string, args ...interface{}) error { + return ¬Assigned{wrap(nil, format, " not assigned", args...)} +} + +// NewNotAssigned returns an error which wraps err that satisfies +// IsNotAssigned(). +func NewNotAssigned(err error, msg string) error { + return ¬Assigned{wrap(err, msg, "")} +} + +// IsNotAssigned reports whether err was created with NotAssignedf() or +// NewNotAssigned(). +func IsNotAssigned(err error) bool { + err = Cause(err) + _, ok := err.(*notAssigned) + return ok +} + +// badRequest represents an error when a request has bad parameters. +type badRequest struct { + Err +} + +// BadRequestf returns an error which satisfies IsBadRequest(). +func BadRequestf(format string, args ...interface{}) error { + return &badRequest{wrap(nil, format, "", args...)} +} + +// NewBadRequest returns an error which wraps err that satisfies +// IsBadRequest(). +func NewBadRequest(err error, msg string) error { + return &badRequest{wrap(err, msg, "")} +} + +// IsBadRequest reports whether err was created with BadRequestf() or +// NewBadRequest(). +func IsBadRequest(err error) bool { + err = Cause(err) + _, ok := err.(*badRequest) + return ok +} + +// methodNotAllowed represents an error when an HTTP request +// is made with an inappropriate method. +type methodNotAllowed struct { + Err +} + +// MethodNotAllowedf returns an error which satisfies IsMethodNotAllowed(). +func MethodNotAllowedf(format string, args ...interface{}) error { + return &methodNotAllowed{wrap(nil, format, "", args...)} +} + +// NewMethodNotAllowed returns an error which wraps err that satisfies +// IsMethodNotAllowed(). +func NewMethodNotAllowed(err error, msg string) error { + return &methodNotAllowed{wrap(err, msg, "")} +} + +// IsMethodNotAllowed reports whether err was created with MethodNotAllowedf() or +// NewMethodNotAllowed(). +func IsMethodNotAllowed(err error) bool { + err = Cause(err) + _, ok := err.(*methodNotAllowed) + return ok +} + +// forbidden represents an error when a request cannot be completed because of +// missing privileges +type forbidden struct { + Err +} + +// Forbiddenf returns an error which satistifes IsForbidden() +func Forbiddenf(format string, args ...interface{}) error { + return &forbidden{wrap(nil, format, "", args...)} +} + +// NewForbidden returns an error which wraps err that satisfies +// IsForbidden(). +func NewForbidden(err error, msg string) error { + return &forbidden{wrap(err, msg, "")} +} + +// IsForbidden reports whether err was created with Forbiddenf() or +// NewForbidden(). +func IsForbidden(err error) bool { + err = Cause(err) + _, ok := err.(*forbidden) + return ok +} diff --git a/vendor/github.com/juju/errors/functions.go b/vendor/github.com/juju/errors/functions.go new file mode 100644 index 0000000..d0e021f --- /dev/null +++ b/vendor/github.com/juju/errors/functions.go @@ -0,0 +1,330 @@ +// Copyright 2014 Canonical Ltd. +// Licensed under the LGPLv3, see LICENCE file for details. + +package errors + +import ( + "fmt" + "strings" +) + +// New is a drop in replacement for the standard library errors module that records +// the location that the error is created. +// +// For example: +// return errors.New("validation failed") +// +func New(message string) error { + err := &Err{message: message} + err.SetLocation(1) + return err +} + +// Errorf creates a new annotated error and records the location that the +// error is created. This should be a drop in replacement for fmt.Errorf. +// +// For example: +// return errors.Errorf("validation failed: %s", message) +// +func Errorf(format string, args ...interface{}) error { + err := &Err{message: fmt.Sprintf(format, args...)} + err.SetLocation(1) + return err +} + +// Trace adds the location of the Trace call to the stack. The Cause of the +// resulting error is the same as the error parameter. If the other error is +// nil, the result will be nil. +// +// For example: +// if err := SomeFunc(); err != nil { +// return errors.Trace(err) +// } +// +func Trace(other error) error { + if other == nil { + return nil + } + err := &Err{previous: other, cause: Cause(other)} + err.SetLocation(1) + return err +} + +// Annotate is used to add extra context to an existing error. The location of +// the Annotate call is recorded with the annotations. The file, line and +// function are also recorded. +// +// For example: +// if err := SomeFunc(); err != nil { +// return errors.Annotate(err, "failed to frombulate") +// } +// +func Annotate(other error, message string) error { + if other == nil { + return nil + } + err := &Err{ + previous: other, + cause: Cause(other), + message: message, + } + err.SetLocation(1) + return err +} + +// Annotatef is used to add extra context to an existing error. The location of +// the Annotate call is recorded with the annotations. The file, line and +// function are also recorded. +// +// For example: +// if err := SomeFunc(); err != nil { +// return errors.Annotatef(err, "failed to frombulate the %s", arg) +// } +// +func Annotatef(other error, format string, args ...interface{}) error { + if other == nil { + return nil + } + err := &Err{ + previous: other, + cause: Cause(other), + message: fmt.Sprintf(format, args...), + } + err.SetLocation(1) + return err +} + +// DeferredAnnotatef annotates the given error (when it is not nil) with the given +// format string and arguments (like fmt.Sprintf). If *err is nil, DeferredAnnotatef +// does nothing. This method is used in a defer statement in order to annotate any +// resulting error with the same message. +// +// For example: +// +// defer DeferredAnnotatef(&err, "failed to frombulate the %s", arg) +// +func DeferredAnnotatef(err *error, format string, args ...interface{}) { + if *err == nil { + return + } + newErr := &Err{ + message: fmt.Sprintf(format, args...), + cause: Cause(*err), + previous: *err, + } + newErr.SetLocation(1) + *err = newErr +} + +// Wrap changes the Cause of the error. The location of the Wrap call is also +// stored in the error stack. +// +// For example: +// if err := SomeFunc(); err != nil { +// newErr := &packageError{"more context", private_value} +// return errors.Wrap(err, newErr) +// } +// +func Wrap(other, newDescriptive error) error { + err := &Err{ + previous: other, + cause: newDescriptive, + } + err.SetLocation(1) + return err +} + +// Wrapf changes the Cause of the error, and adds an annotation. The location +// of the Wrap call is also stored in the error stack. +// +// For example: +// if err := SomeFunc(); err != nil { +// return errors.Wrapf(err, simpleErrorType, "invalid value %q", value) +// } +// +func Wrapf(other, newDescriptive error, format string, args ...interface{}) error { + err := &Err{ + message: fmt.Sprintf(format, args...), + previous: other, + cause: newDescriptive, + } + err.SetLocation(1) + return err +} + +// Maskf masks the given error with the given format string and arguments (like +// fmt.Sprintf), returning a new error that maintains the error stack, but +// hides the underlying error type. The error string still contains the full +// annotations. If you want to hide the annotations, call Wrap. +func Maskf(other error, format string, args ...interface{}) error { + if other == nil { + return nil + } + err := &Err{ + message: fmt.Sprintf(format, args...), + previous: other, + } + err.SetLocation(1) + return err +} + +// Mask hides the underlying error type, and records the location of the masking. +func Mask(other error) error { + if other == nil { + return nil + } + err := &Err{ + previous: other, + } + err.SetLocation(1) + return err +} + +// Cause returns the cause of the given error. This will be either the +// original error, or the result of a Wrap or Mask call. +// +// Cause is the usual way to diagnose errors that may have been wrapped by +// the other errors functions. +func Cause(err error) error { + var diag error + if err, ok := err.(causer); ok { + diag = err.Cause() + } + if diag != nil { + return diag + } + return err +} + +type causer interface { + Cause() error +} + +type wrapper interface { + // Message returns the top level error message, + // not including the message from the Previous + // error. + Message() string + + // Underlying returns the Previous error, or nil + // if there is none. + Underlying() error +} + +type locationer interface { + Location() (string, int) +} + +var ( + _ wrapper = (*Err)(nil) + _ locationer = (*Err)(nil) + _ causer = (*Err)(nil) +) + +// Details returns information about the stack of errors wrapped by err, in +// the format: +// +// [{filename:99: error one} {otherfile:55: cause of error one}] +// +// This is a terse alternative to ErrorStack as it returns a single line. +func Details(err error) string { + if err == nil { + return "[]" + } + var s []byte + s = append(s, '[') + for { + s = append(s, '{') + if err, ok := err.(locationer); ok { + file, line := err.Location() + if file != "" { + s = append(s, fmt.Sprintf("%s:%d", file, line)...) + s = append(s, ": "...) + } + } + if cerr, ok := err.(wrapper); ok { + s = append(s, cerr.Message()...) + err = cerr.Underlying() + } else { + s = append(s, err.Error()...) + err = nil + } + s = append(s, '}') + if err == nil { + break + } + s = append(s, ' ') + } + s = append(s, ']') + return string(s) +} + +// ErrorStack returns a string representation of the annotated error. If the +// error passed as the parameter is not an annotated error, the result is +// simply the result of the Error() method on that error. +// +// If the error is an annotated error, a multi-line string is returned where +// each line represents one entry in the annotation stack. The full filename +// from the call stack is used in the output. +// +// first error +// github.com/juju/errors/annotation_test.go:193: +// github.com/juju/errors/annotation_test.go:194: annotation +// github.com/juju/errors/annotation_test.go:195: +// github.com/juju/errors/annotation_test.go:196: more context +// github.com/juju/errors/annotation_test.go:197: +func ErrorStack(err error) string { + return strings.Join(errorStack(err), "\n") +} + +func errorStack(err error) []string { + if err == nil { + return nil + } + + // We want the first error first + var lines []string + for { + var buff []byte + if err, ok := err.(locationer); ok { + file, line := err.Location() + // Strip off the leading GOPATH/src path elements. + file = trimGoPath(file) + if file != "" { + buff = append(buff, fmt.Sprintf("%s:%d", file, line)...) + buff = append(buff, ": "...) + } + } + if cerr, ok := err.(wrapper); ok { + message := cerr.Message() + buff = append(buff, message...) + // If there is a cause for this error, and it is different to the cause + // of the underlying error, then output the error string in the stack trace. + var cause error + if err1, ok := err.(causer); ok { + cause = err1.Cause() + } + err = cerr.Underlying() + if cause != nil && !sameError(Cause(err), cause) { + if message != "" { + buff = append(buff, ": "...) + } + buff = append(buff, cause.Error()...) + } + } else { + buff = append(buff, err.Error()...) + err = nil + } + lines = append(lines, string(buff)) + if err == nil { + break + } + } + // reverse the lines to get the original error, which was at the end of + // the list, back to the start. + var result []string + for i := len(lines); i > 0; i-- { + result = append(result, lines[i-1]) + } + return result +} diff --git a/vendor/github.com/juju/errors/path.go b/vendor/github.com/juju/errors/path.go new file mode 100644 index 0000000..e216eb8 --- /dev/null +++ b/vendor/github.com/juju/errors/path.go @@ -0,0 +1,19 @@ +// Copyright 2013, 2014 Canonical Ltd. +// Licensed under the LGPLv3, see LICENCE file for details. + +package errors + +import ( + "fmt" + "go/build" + "os" + "path/filepath" + "strings" +) + +var goPath = build.Default.GOPATH +var srcDir = filepath.Join(goPath, "src") + +func trimGoPath(filename string) string { + return strings.TrimPrefix(filename, fmt.Sprintf("%s%s", srcDir, string(os.PathSeparator))) +} diff --git a/vendor/github.com/konsorten/go-windows-terminal-sequences/LICENSE b/vendor/github.com/konsorten/go-windows-terminal-sequences/LICENSE new file mode 100644 index 0000000..14127cd --- /dev/null +++ b/vendor/github.com/konsorten/go-windows-terminal-sequences/LICENSE @@ -0,0 +1,9 @@ +(The MIT License) + +Copyright (c) 2017 marvin + konsorten GmbH (open-source@konsorten.de) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/github.com/konsorten/go-windows-terminal-sequences/README.md b/vendor/github.com/konsorten/go-windows-terminal-sequences/README.md new file mode 100644 index 0000000..195333e --- /dev/null +++ b/vendor/github.com/konsorten/go-windows-terminal-sequences/README.md @@ -0,0 +1,41 @@ +# Windows Terminal Sequences + +This library allow for enabling Windows terminal color support for Go. + +See [Console Virtual Terminal Sequences](https://docs.microsoft.com/en-us/windows/console/console-virtual-terminal-sequences) for details. + +## Usage + +```go +import ( + "syscall" + + sequences "github.com/konsorten/go-windows-terminal-sequences" +) + +func main() { + sequences.EnableVirtualTerminalProcessing(syscall.Stdout, true) +} + +``` + +## Authors + +The tool is sponsored by the [marvin + konsorten GmbH](http://www.konsorten.de). + +We thank all the authors who provided code to this library: + +* Felix Kollmann +* Nicolas Perraut + +## License + +(The MIT License) + +Copyright (c) 2018 marvin + konsorten GmbH (open-source@konsorten.de) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/github.com/konsorten/go-windows-terminal-sequences/go.mod b/vendor/github.com/konsorten/go-windows-terminal-sequences/go.mod new file mode 100644 index 0000000..716c613 --- /dev/null +++ b/vendor/github.com/konsorten/go-windows-terminal-sequences/go.mod @@ -0,0 +1 @@ +module github.com/konsorten/go-windows-terminal-sequences diff --git a/vendor/github.com/konsorten/go-windows-terminal-sequences/sequences.go b/vendor/github.com/konsorten/go-windows-terminal-sequences/sequences.go new file mode 100644 index 0000000..ef18d8f --- /dev/null +++ b/vendor/github.com/konsorten/go-windows-terminal-sequences/sequences.go @@ -0,0 +1,36 @@ +// +build windows + +package sequences + +import ( + "syscall" + "unsafe" +) + +var ( + kernel32Dll *syscall.LazyDLL = syscall.NewLazyDLL("Kernel32.dll") + setConsoleMode *syscall.LazyProc = kernel32Dll.NewProc("SetConsoleMode") +) + +func EnableVirtualTerminalProcessing(stream syscall.Handle, enable bool) error { + const ENABLE_VIRTUAL_TERMINAL_PROCESSING uint32 = 0x4 + + var mode uint32 + err := syscall.GetConsoleMode(syscall.Stdout, &mode) + if err != nil { + return err + } + + if enable { + mode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING + } else { + mode &^= ENABLE_VIRTUAL_TERMINAL_PROCESSING + } + + ret, _, err := setConsoleMode.Call(uintptr(unsafe.Pointer(stream)), uintptr(mode)) + if ret == 0 { + return err + } + + return nil +} diff --git a/vendor/github.com/konsorten/go-windows-terminal-sequences/sequences_dummy.go b/vendor/github.com/konsorten/go-windows-terminal-sequences/sequences_dummy.go new file mode 100644 index 0000000..df61a6f --- /dev/null +++ b/vendor/github.com/konsorten/go-windows-terminal-sequences/sequences_dummy.go @@ -0,0 +1,11 @@ +// +build linux darwin + +package sequences + +import ( + "fmt" +) + +func EnableVirtualTerminalProcessing(stream uintptr, enable bool) error { + return fmt.Errorf("windows only package") +} diff --git a/vendor/github.com/kr/pretty/License b/vendor/github.com/kr/pretty/License new file mode 100644 index 0000000..05c783c --- /dev/null +++ b/vendor/github.com/kr/pretty/License @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright 2012 Keith Rarick + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/github.com/kr/pretty/Readme b/vendor/github.com/kr/pretty/Readme new file mode 100644 index 0000000..c589fc6 --- /dev/null +++ b/vendor/github.com/kr/pretty/Readme @@ -0,0 +1,9 @@ +package pretty + + import "github.com/kr/pretty" + + Package pretty provides pretty-printing for Go values. + +Documentation + + http://godoc.org/github.com/kr/pretty diff --git a/vendor/github.com/kr/pretty/diff.go b/vendor/github.com/kr/pretty/diff.go new file mode 100644 index 0000000..6aa7f74 --- /dev/null +++ b/vendor/github.com/kr/pretty/diff.go @@ -0,0 +1,265 @@ +package pretty + +import ( + "fmt" + "io" + "reflect" +) + +type sbuf []string + +func (p *sbuf) Printf(format string, a ...interface{}) { + s := fmt.Sprintf(format, a...) + *p = append(*p, s) +} + +// Diff returns a slice where each element describes +// a difference between a and b. +func Diff(a, b interface{}) (desc []string) { + Pdiff((*sbuf)(&desc), a, b) + return desc +} + +// wprintfer calls Fprintf on w for each Printf call +// with a trailing newline. +type wprintfer struct{ w io.Writer } + +func (p *wprintfer) Printf(format string, a ...interface{}) { + fmt.Fprintf(p.w, format+"\n", a...) +} + +// Fdiff writes to w a description of the differences between a and b. +func Fdiff(w io.Writer, a, b interface{}) { + Pdiff(&wprintfer{w}, a, b) +} + +type Printfer interface { + Printf(format string, a ...interface{}) +} + +// Pdiff prints to p a description of the differences between a and b. +// It calls Printf once for each difference, with no trailing newline. +// The standard library log.Logger is a Printfer. +func Pdiff(p Printfer, a, b interface{}) { + diffPrinter{w: p}.diff(reflect.ValueOf(a), reflect.ValueOf(b)) +} + +type Logfer interface { + Logf(format string, a ...interface{}) +} + +// logprintfer calls Fprintf on w for each Printf call +// with a trailing newline. +type logprintfer struct{ l Logfer } + +func (p *logprintfer) Printf(format string, a ...interface{}) { + p.l.Logf(format, a...) +} + +// Ldiff prints to l a description of the differences between a and b. +// It calls Logf once for each difference, with no trailing newline. +// The standard library testing.T and testing.B are Logfers. +func Ldiff(l Logfer, a, b interface{}) { + Pdiff(&logprintfer{l}, a, b) +} + +type diffPrinter struct { + w Printfer + l string // label +} + +func (w diffPrinter) printf(f string, a ...interface{}) { + var l string + if w.l != "" { + l = w.l + ": " + } + w.w.Printf(l+f, a...) +} + +func (w diffPrinter) diff(av, bv reflect.Value) { + if !av.IsValid() && bv.IsValid() { + w.printf("nil != %# v", formatter{v: bv, quote: true}) + return + } + if av.IsValid() && !bv.IsValid() { + w.printf("%# v != nil", formatter{v: av, quote: true}) + return + } + if !av.IsValid() && !bv.IsValid() { + return + } + + at := av.Type() + bt := bv.Type() + if at != bt { + w.printf("%v != %v", at, bt) + return + } + + switch kind := at.Kind(); kind { + case reflect.Bool: + if a, b := av.Bool(), bv.Bool(); a != b { + w.printf("%v != %v", a, b) + } + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + if a, b := av.Int(), bv.Int(); a != b { + w.printf("%d != %d", a, b) + } + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + if a, b := av.Uint(), bv.Uint(); a != b { + w.printf("%d != %d", a, b) + } + case reflect.Float32, reflect.Float64: + if a, b := av.Float(), bv.Float(); a != b { + w.printf("%v != %v", a, b) + } + case reflect.Complex64, reflect.Complex128: + if a, b := av.Complex(), bv.Complex(); a != b { + w.printf("%v != %v", a, b) + } + case reflect.Array: + n := av.Len() + for i := 0; i < n; i++ { + w.relabel(fmt.Sprintf("[%d]", i)).diff(av.Index(i), bv.Index(i)) + } + case reflect.Chan, reflect.Func, reflect.UnsafePointer: + if a, b := av.Pointer(), bv.Pointer(); a != b { + w.printf("%#x != %#x", a, b) + } + case reflect.Interface: + w.diff(av.Elem(), bv.Elem()) + case reflect.Map: + ak, both, bk := keyDiff(av.MapKeys(), bv.MapKeys()) + for _, k := range ak { + w := w.relabel(fmt.Sprintf("[%#v]", k)) + w.printf("%q != (missing)", av.MapIndex(k)) + } + for _, k := range both { + w := w.relabel(fmt.Sprintf("[%#v]", k)) + w.diff(av.MapIndex(k), bv.MapIndex(k)) + } + for _, k := range bk { + w := w.relabel(fmt.Sprintf("[%#v]", k)) + w.printf("(missing) != %q", bv.MapIndex(k)) + } + case reflect.Ptr: + switch { + case av.IsNil() && !bv.IsNil(): + w.printf("nil != %# v", formatter{v: bv, quote: true}) + case !av.IsNil() && bv.IsNil(): + w.printf("%# v != nil", formatter{v: av, quote: true}) + case !av.IsNil() && !bv.IsNil(): + w.diff(av.Elem(), bv.Elem()) + } + case reflect.Slice: + lenA := av.Len() + lenB := bv.Len() + if lenA != lenB { + w.printf("%s[%d] != %s[%d]", av.Type(), lenA, bv.Type(), lenB) + break + } + for i := 0; i < lenA; i++ { + w.relabel(fmt.Sprintf("[%d]", i)).diff(av.Index(i), bv.Index(i)) + } + case reflect.String: + if a, b := av.String(), bv.String(); a != b { + w.printf("%q != %q", a, b) + } + case reflect.Struct: + for i := 0; i < av.NumField(); i++ { + w.relabel(at.Field(i).Name).diff(av.Field(i), bv.Field(i)) + } + default: + panic("unknown reflect Kind: " + kind.String()) + } +} + +func (d diffPrinter) relabel(name string) (d1 diffPrinter) { + d1 = d + if d.l != "" && name[0] != '[' { + d1.l += "." + } + d1.l += name + return d1 +} + +// keyEqual compares a and b for equality. +// Both a and b must be valid map keys. +func keyEqual(av, bv reflect.Value) bool { + if !av.IsValid() && !bv.IsValid() { + return true + } + if !av.IsValid() || !bv.IsValid() || av.Type() != bv.Type() { + return false + } + switch kind := av.Kind(); kind { + case reflect.Bool: + a, b := av.Bool(), bv.Bool() + return a == b + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + a, b := av.Int(), bv.Int() + return a == b + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + a, b := av.Uint(), bv.Uint() + return a == b + case reflect.Float32, reflect.Float64: + a, b := av.Float(), bv.Float() + return a == b + case reflect.Complex64, reflect.Complex128: + a, b := av.Complex(), bv.Complex() + return a == b + case reflect.Array: + for i := 0; i < av.Len(); i++ { + if !keyEqual(av.Index(i), bv.Index(i)) { + return false + } + } + return true + case reflect.Chan, reflect.UnsafePointer, reflect.Ptr: + a, b := av.Pointer(), bv.Pointer() + return a == b + case reflect.Interface: + return keyEqual(av.Elem(), bv.Elem()) + case reflect.String: + a, b := av.String(), bv.String() + return a == b + case reflect.Struct: + for i := 0; i < av.NumField(); i++ { + if !keyEqual(av.Field(i), bv.Field(i)) { + return false + } + } + return true + default: + panic("invalid map key type " + av.Type().String()) + } +} + +func keyDiff(a, b []reflect.Value) (ak, both, bk []reflect.Value) { + for _, av := range a { + inBoth := false + for _, bv := range b { + if keyEqual(av, bv) { + inBoth = true + both = append(both, av) + break + } + } + if !inBoth { + ak = append(ak, av) + } + } + for _, bv := range b { + inBoth := false + for _, av := range a { + if keyEqual(av, bv) { + inBoth = true + break + } + } + if !inBoth { + bk = append(bk, bv) + } + } + return +} diff --git a/vendor/github.com/kr/pretty/formatter.go b/vendor/github.com/kr/pretty/formatter.go new file mode 100644 index 0000000..a317d7b --- /dev/null +++ b/vendor/github.com/kr/pretty/formatter.go @@ -0,0 +1,328 @@ +package pretty + +import ( + "fmt" + "io" + "reflect" + "strconv" + "text/tabwriter" + + "github.com/kr/text" +) + +type formatter struct { + v reflect.Value + force bool + quote bool +} + +// Formatter makes a wrapper, f, that will format x as go source with line +// breaks and tabs. Object f responds to the "%v" formatting verb when both the +// "#" and " " (space) flags are set, for example: +// +// fmt.Sprintf("%# v", Formatter(x)) +// +// If one of these two flags is not set, or any other verb is used, f will +// format x according to the usual rules of package fmt. +// In particular, if x satisfies fmt.Formatter, then x.Format will be called. +func Formatter(x interface{}) (f fmt.Formatter) { + return formatter{v: reflect.ValueOf(x), quote: true} +} + +func (fo formatter) String() string { + return fmt.Sprint(fo.v.Interface()) // unwrap it +} + +func (fo formatter) passThrough(f fmt.State, c rune) { + s := "%" + for i := 0; i < 128; i++ { + if f.Flag(i) { + s += string(i) + } + } + if w, ok := f.Width(); ok { + s += fmt.Sprintf("%d", w) + } + if p, ok := f.Precision(); ok { + s += fmt.Sprintf(".%d", p) + } + s += string(c) + fmt.Fprintf(f, s, fo.v.Interface()) +} + +func (fo formatter) Format(f fmt.State, c rune) { + if fo.force || c == 'v' && f.Flag('#') && f.Flag(' ') { + w := tabwriter.NewWriter(f, 4, 4, 1, ' ', 0) + p := &printer{tw: w, Writer: w, visited: make(map[visit]int)} + p.printValue(fo.v, true, fo.quote) + w.Flush() + return + } + fo.passThrough(f, c) +} + +type printer struct { + io.Writer + tw *tabwriter.Writer + visited map[visit]int + depth int +} + +func (p *printer) indent() *printer { + q := *p + q.tw = tabwriter.NewWriter(p.Writer, 4, 4, 1, ' ', 0) + q.Writer = text.NewIndentWriter(q.tw, []byte{'\t'}) + return &q +} + +func (p *printer) printInline(v reflect.Value, x interface{}, showType bool) { + if showType { + io.WriteString(p, v.Type().String()) + fmt.Fprintf(p, "(%#v)", x) + } else { + fmt.Fprintf(p, "%#v", x) + } +} + +// printValue must keep track of already-printed pointer values to avoid +// infinite recursion. +type visit struct { + v uintptr + typ reflect.Type +} + +func (p *printer) printValue(v reflect.Value, showType, quote bool) { + if p.depth > 10 { + io.WriteString(p, "!%v(DEPTH EXCEEDED)") + return + } + + switch v.Kind() { + case reflect.Bool: + p.printInline(v, v.Bool(), showType) + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + p.printInline(v, v.Int(), showType) + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + p.printInline(v, v.Uint(), showType) + case reflect.Float32, reflect.Float64: + p.printInline(v, v.Float(), showType) + case reflect.Complex64, reflect.Complex128: + fmt.Fprintf(p, "%#v", v.Complex()) + case reflect.String: + p.fmtString(v.String(), quote) + case reflect.Map: + t := v.Type() + if showType { + io.WriteString(p, t.String()) + } + writeByte(p, '{') + if nonzero(v) { + expand := !canInline(v.Type()) + pp := p + if expand { + writeByte(p, '\n') + pp = p.indent() + } + keys := v.MapKeys() + for i := 0; i < v.Len(); i++ { + showTypeInStruct := true + k := keys[i] + mv := v.MapIndex(k) + pp.printValue(k, false, true) + writeByte(pp, ':') + if expand { + writeByte(pp, '\t') + } + showTypeInStruct = t.Elem().Kind() == reflect.Interface + pp.printValue(mv, showTypeInStruct, true) + if expand { + io.WriteString(pp, ",\n") + } else if i < v.Len()-1 { + io.WriteString(pp, ", ") + } + } + if expand { + pp.tw.Flush() + } + } + writeByte(p, '}') + case reflect.Struct: + t := v.Type() + if v.CanAddr() { + addr := v.UnsafeAddr() + vis := visit{addr, t} + if vd, ok := p.visited[vis]; ok && vd < p.depth { + p.fmtString(t.String()+"{(CYCLIC REFERENCE)}", false) + break // don't print v again + } + p.visited[vis] = p.depth + } + + if showType { + io.WriteString(p, t.String()) + } + writeByte(p, '{') + if nonzero(v) { + expand := !canInline(v.Type()) + pp := p + if expand { + writeByte(p, '\n') + pp = p.indent() + } + for i := 0; i < v.NumField(); i++ { + showTypeInStruct := true + if f := t.Field(i); f.Name != "" { + io.WriteString(pp, f.Name) + writeByte(pp, ':') + if expand { + writeByte(pp, '\t') + } + showTypeInStruct = labelType(f.Type) + } + pp.printValue(getField(v, i), showTypeInStruct, true) + if expand { + io.WriteString(pp, ",\n") + } else if i < v.NumField()-1 { + io.WriteString(pp, ", ") + } + } + if expand { + pp.tw.Flush() + } + } + writeByte(p, '}') + case reflect.Interface: + switch e := v.Elem(); { + case e.Kind() == reflect.Invalid: + io.WriteString(p, "nil") + case e.IsValid(): + pp := *p + pp.depth++ + pp.printValue(e, showType, true) + default: + io.WriteString(p, v.Type().String()) + io.WriteString(p, "(nil)") + } + case reflect.Array, reflect.Slice: + t := v.Type() + if showType { + io.WriteString(p, t.String()) + } + if v.Kind() == reflect.Slice && v.IsNil() && showType { + io.WriteString(p, "(nil)") + break + } + if v.Kind() == reflect.Slice && v.IsNil() { + io.WriteString(p, "nil") + break + } + writeByte(p, '{') + expand := !canInline(v.Type()) + pp := p + if expand { + writeByte(p, '\n') + pp = p.indent() + } + for i := 0; i < v.Len(); i++ { + showTypeInSlice := t.Elem().Kind() == reflect.Interface + pp.printValue(v.Index(i), showTypeInSlice, true) + if expand { + io.WriteString(pp, ",\n") + } else if i < v.Len()-1 { + io.WriteString(pp, ", ") + } + } + if expand { + pp.tw.Flush() + } + writeByte(p, '}') + case reflect.Ptr: + e := v.Elem() + if !e.IsValid() { + writeByte(p, '(') + io.WriteString(p, v.Type().String()) + io.WriteString(p, ")(nil)") + } else { + pp := *p + pp.depth++ + writeByte(pp, '&') + pp.printValue(e, true, true) + } + case reflect.Chan: + x := v.Pointer() + if showType { + writeByte(p, '(') + io.WriteString(p, v.Type().String()) + fmt.Fprintf(p, ")(%#v)", x) + } else { + fmt.Fprintf(p, "%#v", x) + } + case reflect.Func: + io.WriteString(p, v.Type().String()) + io.WriteString(p, " {...}") + case reflect.UnsafePointer: + p.printInline(v, v.Pointer(), showType) + case reflect.Invalid: + io.WriteString(p, "nil") + } +} + +func canInline(t reflect.Type) bool { + switch t.Kind() { + case reflect.Map: + return !canExpand(t.Elem()) + case reflect.Struct: + for i := 0; i < t.NumField(); i++ { + if canExpand(t.Field(i).Type) { + return false + } + } + return true + case reflect.Interface: + return false + case reflect.Array, reflect.Slice: + return !canExpand(t.Elem()) + case reflect.Ptr: + return false + case reflect.Chan, reflect.Func, reflect.UnsafePointer: + return false + } + return true +} + +func canExpand(t reflect.Type) bool { + switch t.Kind() { + case reflect.Map, reflect.Struct, + reflect.Interface, reflect.Array, reflect.Slice, + reflect.Ptr: + return true + } + return false +} + +func labelType(t reflect.Type) bool { + switch t.Kind() { + case reflect.Interface, reflect.Struct: + return true + } + return false +} + +func (p *printer) fmtString(s string, quote bool) { + if quote { + s = strconv.Quote(s) + } + io.WriteString(p, s) +} + +func writeByte(w io.Writer, b byte) { + w.Write([]byte{b}) +} + +func getField(v reflect.Value, i int) reflect.Value { + val := v.Field(i) + if val.Kind() == reflect.Interface && !val.IsNil() { + val = val.Elem() + } + return val +} diff --git a/vendor/github.com/kr/pretty/go.mod b/vendor/github.com/kr/pretty/go.mod new file mode 100644 index 0000000..1e29533 --- /dev/null +++ b/vendor/github.com/kr/pretty/go.mod @@ -0,0 +1,3 @@ +module "github.com/kr/pretty" + +require "github.com/kr/text" v0.1.0 diff --git a/vendor/github.com/kr/pretty/pretty.go b/vendor/github.com/kr/pretty/pretty.go new file mode 100644 index 0000000..49423ec --- /dev/null +++ b/vendor/github.com/kr/pretty/pretty.go @@ -0,0 +1,108 @@ +// Package pretty provides pretty-printing for Go values. This is +// useful during debugging, to avoid wrapping long output lines in +// the terminal. +// +// It provides a function, Formatter, that can be used with any +// function that accepts a format string. It also provides +// convenience wrappers for functions in packages fmt and log. +package pretty + +import ( + "fmt" + "io" + "log" + "reflect" +) + +// Errorf is a convenience wrapper for fmt.Errorf. +// +// Calling Errorf(f, x, y) is equivalent to +// fmt.Errorf(f, Formatter(x), Formatter(y)). +func Errorf(format string, a ...interface{}) error { + return fmt.Errorf(format, wrap(a, false)...) +} + +// Fprintf is a convenience wrapper for fmt.Fprintf. +// +// Calling Fprintf(w, f, x, y) is equivalent to +// fmt.Fprintf(w, f, Formatter(x), Formatter(y)). +func Fprintf(w io.Writer, format string, a ...interface{}) (n int, error error) { + return fmt.Fprintf(w, format, wrap(a, false)...) +} + +// Log is a convenience wrapper for log.Printf. +// +// Calling Log(x, y) is equivalent to +// log.Print(Formatter(x), Formatter(y)), but each operand is +// formatted with "%# v". +func Log(a ...interface{}) { + log.Print(wrap(a, true)...) +} + +// Logf is a convenience wrapper for log.Printf. +// +// Calling Logf(f, x, y) is equivalent to +// log.Printf(f, Formatter(x), Formatter(y)). +func Logf(format string, a ...interface{}) { + log.Printf(format, wrap(a, false)...) +} + +// Logln is a convenience wrapper for log.Printf. +// +// Calling Logln(x, y) is equivalent to +// log.Println(Formatter(x), Formatter(y)), but each operand is +// formatted with "%# v". +func Logln(a ...interface{}) { + log.Println(wrap(a, true)...) +} + +// Print pretty-prints its operands and writes to standard output. +// +// Calling Print(x, y) is equivalent to +// fmt.Print(Formatter(x), Formatter(y)), but each operand is +// formatted with "%# v". +func Print(a ...interface{}) (n int, errno error) { + return fmt.Print(wrap(a, true)...) +} + +// Printf is a convenience wrapper for fmt.Printf. +// +// Calling Printf(f, x, y) is equivalent to +// fmt.Printf(f, Formatter(x), Formatter(y)). +func Printf(format string, a ...interface{}) (n int, errno error) { + return fmt.Printf(format, wrap(a, false)...) +} + +// Println pretty-prints its operands and writes to standard output. +// +// Calling Print(x, y) is equivalent to +// fmt.Println(Formatter(x), Formatter(y)), but each operand is +// formatted with "%# v". +func Println(a ...interface{}) (n int, errno error) { + return fmt.Println(wrap(a, true)...) +} + +// Sprint is a convenience wrapper for fmt.Sprintf. +// +// Calling Sprint(x, y) is equivalent to +// fmt.Sprint(Formatter(x), Formatter(y)), but each operand is +// formatted with "%# v". +func Sprint(a ...interface{}) string { + return fmt.Sprint(wrap(a, true)...) +} + +// Sprintf is a convenience wrapper for fmt.Sprintf. +// +// Calling Sprintf(f, x, y) is equivalent to +// fmt.Sprintf(f, Formatter(x), Formatter(y)). +func Sprintf(format string, a ...interface{}) string { + return fmt.Sprintf(format, wrap(a, false)...) +} + +func wrap(a []interface{}, force bool) []interface{} { + w := make([]interface{}, len(a)) + for i, x := range a { + w[i] = formatter{v: reflect.ValueOf(x), force: force} + } + return w +} diff --git a/vendor/github.com/kr/pretty/zero.go b/vendor/github.com/kr/pretty/zero.go new file mode 100644 index 0000000..abb5b6f --- /dev/null +++ b/vendor/github.com/kr/pretty/zero.go @@ -0,0 +1,41 @@ +package pretty + +import ( + "reflect" +) + +func nonzero(v reflect.Value) bool { + switch v.Kind() { + case reflect.Bool: + return v.Bool() + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + return v.Int() != 0 + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + return v.Uint() != 0 + case reflect.Float32, reflect.Float64: + return v.Float() != 0 + case reflect.Complex64, reflect.Complex128: + return v.Complex() != complex(0, 0) + case reflect.String: + return v.String() != "" + case reflect.Struct: + for i := 0; i < v.NumField(); i++ { + if nonzero(getField(v, i)) { + return true + } + } + return false + case reflect.Array: + for i := 0; i < v.Len(); i++ { + if nonzero(v.Index(i)) { + return true + } + } + return false + case reflect.Map, reflect.Interface, reflect.Slice, reflect.Ptr, reflect.Chan, reflect.Func: + return !v.IsNil() + case reflect.UnsafePointer: + return v.Pointer() != 0 + } + return true +} diff --git a/vendor/github.com/kr/text/License b/vendor/github.com/kr/text/License new file mode 100644 index 0000000..480a328 --- /dev/null +++ b/vendor/github.com/kr/text/License @@ -0,0 +1,19 @@ +Copyright 2012 Keith Rarick + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/github.com/kr/text/Readme b/vendor/github.com/kr/text/Readme new file mode 100644 index 0000000..7e6e7c0 --- /dev/null +++ b/vendor/github.com/kr/text/Readme @@ -0,0 +1,3 @@ +This is a Go package for manipulating paragraphs of text. + +See http://go.pkgdoc.org/github.com/kr/text for full documentation. diff --git a/vendor/github.com/kr/text/doc.go b/vendor/github.com/kr/text/doc.go new file mode 100644 index 0000000..cf4c198 --- /dev/null +++ b/vendor/github.com/kr/text/doc.go @@ -0,0 +1,3 @@ +// Package text provides rudimentary functions for manipulating text in +// paragraphs. +package text diff --git a/vendor/github.com/kr/text/go.mod b/vendor/github.com/kr/text/go.mod new file mode 100644 index 0000000..fa0528b --- /dev/null +++ b/vendor/github.com/kr/text/go.mod @@ -0,0 +1,3 @@ +module "github.com/kr/text" + +require "github.com/kr/pty" v1.1.1 diff --git a/vendor/github.com/kr/text/indent.go b/vendor/github.com/kr/text/indent.go new file mode 100644 index 0000000..4ebac45 --- /dev/null +++ b/vendor/github.com/kr/text/indent.go @@ -0,0 +1,74 @@ +package text + +import ( + "io" +) + +// Indent inserts prefix at the beginning of each non-empty line of s. The +// end-of-line marker is NL. +func Indent(s, prefix string) string { + return string(IndentBytes([]byte(s), []byte(prefix))) +} + +// IndentBytes inserts prefix at the beginning of each non-empty line of b. +// The end-of-line marker is NL. +func IndentBytes(b, prefix []byte) []byte { + var res []byte + bol := true + for _, c := range b { + if bol && c != '\n' { + res = append(res, prefix...) + } + res = append(res, c) + bol = c == '\n' + } + return res +} + +// Writer indents each line of its input. +type indentWriter struct { + w io.Writer + bol bool + pre [][]byte + sel int + off int +} + +// NewIndentWriter makes a new write filter that indents the input +// lines. Each line is prefixed in order with the corresponding +// element of pre. If there are more lines than elements, the last +// element of pre is repeated for each subsequent line. +func NewIndentWriter(w io.Writer, pre ...[]byte) io.Writer { + return &indentWriter{ + w: w, + pre: pre, + bol: true, + } +} + +// The only errors returned are from the underlying indentWriter. +func (w *indentWriter) Write(p []byte) (n int, err error) { + for _, c := range p { + if w.bol { + var i int + i, err = w.w.Write(w.pre[w.sel][w.off:]) + w.off += i + if err != nil { + return n, err + } + } + _, err = w.w.Write([]byte{c}) + if err != nil { + return n, err + } + n++ + w.bol = c == '\n' + if w.bol { + w.off = 0 + if w.sel < len(w.pre)-1 { + w.sel++ + } + } + } + return n, nil +} diff --git a/vendor/github.com/kr/text/wrap.go b/vendor/github.com/kr/text/wrap.go new file mode 100644 index 0000000..b09bb03 --- /dev/null +++ b/vendor/github.com/kr/text/wrap.go @@ -0,0 +1,86 @@ +package text + +import ( + "bytes" + "math" +) + +var ( + nl = []byte{'\n'} + sp = []byte{' '} +) + +const defaultPenalty = 1e5 + +// Wrap wraps s into a paragraph of lines of length lim, with minimal +// raggedness. +func Wrap(s string, lim int) string { + return string(WrapBytes([]byte(s), lim)) +} + +// WrapBytes wraps b into a paragraph of lines of length lim, with minimal +// raggedness. +func WrapBytes(b []byte, lim int) []byte { + words := bytes.Split(bytes.Replace(bytes.TrimSpace(b), nl, sp, -1), sp) + var lines [][]byte + for _, line := range WrapWords(words, 1, lim, defaultPenalty) { + lines = append(lines, bytes.Join(line, sp)) + } + return bytes.Join(lines, nl) +} + +// WrapWords is the low-level line-breaking algorithm, useful if you need more +// control over the details of the text wrapping process. For most uses, either +// Wrap or WrapBytes will be sufficient and more convenient. +// +// WrapWords splits a list of words into lines with minimal "raggedness", +// treating each byte as one unit, accounting for spc units between adjacent +// words on each line, and attempting to limit lines to lim units. Raggedness +// is the total error over all lines, where error is the square of the +// difference of the length of the line and lim. Too-long lines (which only +// happen when a single word is longer than lim units) have pen penalty units +// added to the error. +func WrapWords(words [][]byte, spc, lim, pen int) [][][]byte { + n := len(words) + + length := make([][]int, n) + for i := 0; i < n; i++ { + length[i] = make([]int, n) + length[i][i] = len(words[i]) + for j := i + 1; j < n; j++ { + length[i][j] = length[i][j-1] + spc + len(words[j]) + } + } + + nbrk := make([]int, n) + cost := make([]int, n) + for i := range cost { + cost[i] = math.MaxInt32 + } + for i := n - 1; i >= 0; i-- { + if length[i][n-1] <= lim || i == n-1 { + cost[i] = 0 + nbrk[i] = n + } else { + for j := i + 1; j < n; j++ { + d := lim - length[i][j-1] + c := d*d + cost[j] + if length[i][j-1] > lim { + c += pen // too-long lines get a worse penalty + } + if c < cost[i] { + cost[i] = c + nbrk[i] = j + } + } + } + } + + var lines [][][]byte + i := 0 + for i < n { + lines = append(lines, words[i:nbrk[i]]) + i = nbrk[i] + } + return lines +} diff --git a/vendor/github.com/montanaflynn/stats/CHANGELOG.md b/vendor/github.com/montanaflynn/stats/CHANGELOG.md new file mode 100644 index 0000000..532f6ed --- /dev/null +++ b/vendor/github.com/montanaflynn/stats/CHANGELOG.md @@ -0,0 +1,64 @@ +# Change Log + +## [0.2.0](https://github.com/montanaflynn/stats/tree/0.2.0) + +### Merged pull requests: + +- Fixed typographical error, changed accomdate to accommodate in README. [\#5](https://github.com/montanaflynn/stats/pull/5) ([saromanov](https://github.com/orthographic-pedant)) + +### Package changes: + +- Add `Correlation` function +- Add `Covariance` function +- Add `StandardDeviation` function to be the same as `StandardDeviationPopulation` +- Change `Variance` function to be the same as `PopulationVariation` +- Add helper methods to `Float64Data` +- Add `Float64Data` type to use instead of `[]float64` +- Add `Series` type which references to `[]Coordinate` + +## [0.1.0](https://github.com/montanaflynn/stats/tree/0.1.0) + +Several functions were renamed in this release. They will still function but may be deprecated in the future. + +### Package changes: + +- Rename `VarP` to `PopulationVariance` +- Rename `VarS` to `SampleVariance` +- Rename `LinReg` to `LinearRegression` +- Rename `ExpReg` to `ExponentialRegression` +- Rename `LogReg` to `LogarithmicRegression` +- Rename `StdDevP` to `StandardDeviationPopulation` +- Rename `StdDevS` to `StandardDeviationSample` + +## [0.0.9](https://github.com/montanaflynn/stats/tree/0.0.9) + +### Closed issues: + +- Functions have unexpected side effects [\#3](https://github.com/montanaflynn/stats/issues/3) +- Percentile is not calculated correctly [\#2](https://github.com/montanaflynn/stats/issues/2) + +### Merged pull requests: + +- Sample [\#4](https://github.com/montanaflynn/stats/pull/4) ([saromanov](https://github.com/saromanov)) + +### Package changes: + +- Add HarmonicMean func +- Add GeometricMean func +- Add Outliers stuct and QuantileOutliers func +- Add Interquartile Range, Midhinge and Trimean examples +- Add Trimean +- Add Midhinge +- Add Inter Quartile Range +- Add Quantiles struct and Quantile func +- Add Nearest Rank method of calculating percentiles +- Add errors for all functions +- Add sample +- Add Linear, Exponential and Logarithmic Regression +- Add sample and population variance and deviation +- Add Percentile and Float64ToInt +- Add Round +- Add Standard deviation +- Add Sum +- Add Min and Ma- x +- Add Mean, Median and Mode diff --git a/vendor/github.com/montanaflynn/stats/LICENSE b/vendor/github.com/montanaflynn/stats/LICENSE new file mode 100644 index 0000000..6648181 --- /dev/null +++ b/vendor/github.com/montanaflynn/stats/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014-2015 Montana Flynn (https://anonfunction.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/vendor/github.com/montanaflynn/stats/Makefile b/vendor/github.com/montanaflynn/stats/Makefile new file mode 100644 index 0000000..87844f4 --- /dev/null +++ b/vendor/github.com/montanaflynn/stats/Makefile @@ -0,0 +1,29 @@ +.PHONY: all + +doc: + godoc `pwd` + +webdoc: + godoc -http=:44444 + +format: + go fmt + +test: + go test -race + +check: format test + +benchmark: + go test -bench=. -benchmem + +coverage: + go test -coverprofile=coverage.out + go tool cover -html="coverage.out" + +lint: format + go get github.com/alecthomas/gometalinter + gometalinter --install + gometalinter + +default: lint test diff --git a/vendor/github.com/montanaflynn/stats/README.md b/vendor/github.com/montanaflynn/stats/README.md new file mode 100644 index 0000000..a30c949 --- /dev/null +++ b/vendor/github.com/montanaflynn/stats/README.md @@ -0,0 +1,178 @@ +# Stats [![][travis-svg]][travis-url] [![][coveralls-svg]][coveralls-url] [![][goreport-svg]][goreport-url] [![][godoc-svg]][godoc-url] [![][license-svg]][license-url] + +A well tested and comprehensive Golang statistics library package with no dependencies. + +If you have any suggestions, problems or bug reports please [create an issue](https://github.com/montanaflynn/stats/issues) and I'll do my best to accommodate you. In addition simply starring the repo would show your support for the project and be very much appreciated! + +## Installation + +``` +go get github.com/montanaflynn/stats +``` + +## Example Usage + +All the functions can be seen in [examples/main.go](examples/main.go) but here's a little taste: + +```go +// start with some source data to use +data := []float64{1.0, 2.1, 3.2, 4.823, 4.1, 5.8} + +// you could also use different types like this +// data := stats.LoadRawData([]int{1, 2, 3, 4, 5}) +// data := stats.LoadRawData([]interface{}{1.1, "2", 3}) +// etc... + +median, _ := stats.Median(data) +fmt.Println(median) // 3.65 + +roundedMedian, _ := stats.Round(median, 0) +fmt.Println(roundedMedian) // 4 +``` + +## Documentation + +The [entire API documentation](http://godoc.org/github.com/montanaflynn/stats) is available on GoDoc.org + +You can view docs offline with the following commands: + +``` +# Command line +godoc . # show all exported apis +godoc . Median # show a single function +godoc -ex . Round # show function with example +godoc . Float64Data # show the type and methods + +# Local website +godoc -http=:4444 # start the godoc server on port 4444 +open http://localhost:4444/pkg/github.com/montanaflynn/stats/ +``` + +The exported API is as follows: + +```go +var ( + ErrEmptyInput = statsError{"Input must not be empty."} + ErrNaN = statsError{"Not a number."} + ErrNegative = statsError{"Must not contain negative values."} + ErrZero = statsError{"Must not contain zero values."} + ErrBounds = statsError{"Input is outside of range."} + ErrSize = statsError{"Must be the same length."} + ErrInfValue = statsError{"Value is infinite."} + ErrYCoord = statsError{"Y Value must be greater than zero."} +) + +func Round(input float64, places int) (rounded float64, err error) {} + +type Float64Data []float64 + +func LoadRawData(raw interface{}) (f Float64Data) {} + +func AutoCorrelation(data Float64Data, lags int) (float64, error) {} +func ChebyshevDistance(dataPointX, dataPointY Float64Data) (distance float64, err error) {} +func Correlation(data1, data2 Float64Data) (float64, error) {} +func Covariance(data1, data2 Float64Data) (float64, error) {} +func CovariancePopulation(data1, data2 Float64Data) (float64, error) {} +func CumulativeSum(input Float64Data) ([]float64, error) {} +func Entropy(input Float64Data) (float64, error) {} +func EuclideanDistance(dataPointX, dataPointY Float64Data) (distance float64, err error) {} +func GeometricMean(input Float64Data) (float64, error) {} +func HarmonicMean(input Float64Data) (float64, error) {} +func InterQuartileRange(input Float64Data) (float64, error) {} +func ManhattanDistance(dataPointX, dataPointY Float64Data) (distance float64, err error) {} +func Max(input Float64Data) (max float64, err error) {} +func Mean(input Float64Data) (float64, error) {} +func Median(input Float64Data) (median float64, err error) {} +func MedianAbsoluteDeviation(input Float64Data) (mad float64, err error) {} +func MedianAbsoluteDeviationPopulation(input Float64Data) (mad float64, err error) {} +func Midhinge(input Float64Data) (float64, error) {} +func Min(input Float64Data) (min float64, err error) {} +func MinkowskiDistance(dataPointX, dataPointY Float64Data, lambda float64) (distance float64, err error) {} +func Mode(input Float64Data) (mode []float64, err error) {} +func Pearson(data1, data2 Float64Data) (float64, error) {} +func Percentile(input Float64Data, percent float64) (percentile float64, err error) {} +func PercentileNearestRank(input Float64Data, percent float64) (percentile float64, err error) {} +func PopulationVariance(input Float64Data) (pvar float64, err error) {} +func Sample(input Float64Data, takenum int, replacement bool) ([]float64, error) {} +func SampleVariance(input Float64Data) (svar float64, err error) {} +func Sigmoid(input Float64Data) ([]float64, error) {} +func SoftMax(input Float64Data) ([]float64, error) {} +func StandardDeviation(input Float64Data) (sdev float64, err error) {} +func StandardDeviationPopulation(input Float64Data) (sdev float64, err error) {} +func StandardDeviationSample(input Float64Data) (sdev float64, err error) {} +func StdDevP(input Float64Data) (sdev float64, err error) {} +func StdDevS(input Float64Data) (sdev float64, err error) {} +func Sum(input Float64Data) (sum float64, err error) {} +func Trimean(input Float64Data) (float64, error) {} +func VarP(input Float64Data) (sdev float64, err error) {} +func VarS(input Float64Data) (sdev float64, err error) {} +func Variance(input Float64Data) (sdev float64, err error) {} + +type Coordinate struct { + X, Y float64 +} + +type Series []Coordinate + +func ExponentialRegression(s Series) (regressions Series, err error) {} +func LinearRegression(s Series) (regressions Series, err error) {} +func LogarithmicRegression(s Series) (regressions Series, err error) {} + +type Outliers struct { + Mild Float64Data + Extreme Float64Data +} + +type Quartiles struct { + Q1 float64 + Q2 float64 + Q3 float64 +} + +func Quartile(input Float64Data) (Quartiles, error) {} +func QuartileOutliers(input Float64Data) (Outliers, error) {} +``` + +## Contributing + +Pull request are always welcome no matter how big or small. I've included a [Makefile](https://github.com/montanaflynn/stats/blob/master/Makefile) that has a lot of helper targets for common actions such as linting, testing, code coverage reporting and more. + +1. Fork the repo and clone your fork +2. Create new branch (`git checkout -b some-thing`) +3. Make the desired changes +4. Ensure tests pass (`go test -cover` or `make test`) +5. Commit changes (`git commit -am 'Did something'`) +6. Push branch (`git push origin some-thing`) +7. Submit pull request + +To make things as seamless as possible please also consider the following steps: + +- Update `examples/main.go` with a simple example of the new feature +- Update `README.md` documentation section with any new exported API +- Keep 100% code coverage (you can check with `make coverage`) +- Squash commits into single units of work with `git rebase -i new-feature` + +## MIT License + +Copyright (c) 2014-2019 Montana Flynn + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORpublicS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +[travis-url]: https://travis-ci.org/montanaflynn/stats +[travis-svg]: https://img.shields.io/travis/montanaflynn/stats.svg + +[coveralls-url]: https://coveralls.io/r/montanaflynn/stats?branch=master +[coveralls-svg]: https://img.shields.io/coveralls/montanaflynn/stats.svg + +[goreport-url]: https://goreportcard.com/report/github.com/montanaflynn/stats +[goreport-svg]: https://goreportcard.com/badge/github.com/montanaflynn/stats + +[godoc-url]: https://godoc.org/github.com/montanaflynn/stats +[godoc-svg]: https://godoc.org/github.com/montanaflynn/stats?status.svg + +[license-url]: https://github.com/montanaflynn/stats/blob/master/LICENSE +[license-svg]: https://img.shields.io/badge/license-MIT-blue.svg diff --git a/vendor/github.com/montanaflynn/stats/correlation.go b/vendor/github.com/montanaflynn/stats/correlation.go new file mode 100644 index 0000000..4acab94 --- /dev/null +++ b/vendor/github.com/montanaflynn/stats/correlation.go @@ -0,0 +1,60 @@ +package stats + +import ( + "math" +) + +// Correlation describes the degree of relationship between two sets of data +func Correlation(data1, data2 Float64Data) (float64, error) { + + l1 := data1.Len() + l2 := data2.Len() + + if l1 == 0 || l2 == 0 { + return math.NaN(), EmptyInputErr + } + + if l1 != l2 { + return math.NaN(), SizeErr + } + + sdev1, _ := StandardDeviationPopulation(data1) + sdev2, _ := StandardDeviationPopulation(data2) + + if sdev1 == 0 || sdev2 == 0 { + return 0, nil + } + + covp, _ := CovariancePopulation(data1, data2) + return covp / (sdev1 * sdev2), nil +} + +// Pearson calculates the Pearson product-moment correlation coefficient between two variables +func Pearson(data1, data2 Float64Data) (float64, error) { + return Correlation(data1, data2) +} + +// AutoCorrelation is the correlation of a signal with a delayed copy of itself as a function of delay +func AutoCorrelation(data Float64Data, lags int) (float64, error) { + if len(data) < 1 { + return 0, EmptyInputErr + } + + mean, _ := Mean(data) + + var result, q float64 + + for i := 0; i < lags; i++ { + v := (data[0] - mean) * (data[0] - mean) + for i := 1; i < len(data); i++ { + delta0 := data[i-1] - mean + delta1 := data[i] - mean + q += (delta0*delta1 - q) / float64(i+1) + v += (delta1*delta1 - v) / float64(i+1) + } + + result = q / v + } + + return result, nil +} diff --git a/vendor/github.com/montanaflynn/stats/cumulative_sum.go b/vendor/github.com/montanaflynn/stats/cumulative_sum.go new file mode 100644 index 0000000..e5305da --- /dev/null +++ b/vendor/github.com/montanaflynn/stats/cumulative_sum.go @@ -0,0 +1,21 @@ +package stats + +// CumulativeSum calculates the cumulative sum of the input slice +func CumulativeSum(input Float64Data) ([]float64, error) { + + if input.Len() == 0 { + return Float64Data{}, EmptyInput + } + + cumSum := make([]float64, input.Len()) + + for i, val := range input { + if i == 0 { + cumSum[i] = val + } else { + cumSum[i] = cumSum[i-1] + val + } + } + + return cumSum, nil +} diff --git a/vendor/github.com/montanaflynn/stats/data.go b/vendor/github.com/montanaflynn/stats/data.go new file mode 100644 index 0000000..229ff5f --- /dev/null +++ b/vendor/github.com/montanaflynn/stats/data.go @@ -0,0 +1,164 @@ +package stats + +// Float64Data is a named type for []float64 with helper methods +type Float64Data []float64 + +// Get item in slice +func (f Float64Data) Get(i int) float64 { return f[i] } + +// Len returns length of slice +func (f Float64Data) Len() int { return len(f) } + +// Less returns if one number is less than another +func (f Float64Data) Less(i, j int) bool { return f[i] < f[j] } + +// Swap switches out two numbers in slice +func (f Float64Data) Swap(i, j int) { f[i], f[j] = f[j], f[i] } + +// Min returns the minimum number in the data +func (f Float64Data) Min() (float64, error) { return Min(f) } + +// Max returns the maximum number in the data +func (f Float64Data) Max() (float64, error) { return Max(f) } + +// Sum returns the total of all the numbers in the data +func (f Float64Data) Sum() (float64, error) { return Sum(f) } + +// CumulativeSum returns the cumulative sum of the data +func (f Float64Data) CumulativeSum() ([]float64, error) { return CumulativeSum(f) } + +// Mean returns the mean of the data +func (f Float64Data) Mean() (float64, error) { return Mean(f) } + +// Median returns the median of the data +func (f Float64Data) Median() (float64, error) { return Median(f) } + +// Mode returns the mode of the data +func (f Float64Data) Mode() ([]float64, error) { return Mode(f) } + +// GeometricMean returns the median of the data +func (f Float64Data) GeometricMean() (float64, error) { return GeometricMean(f) } + +// HarmonicMean returns the mode of the data +func (f Float64Data) HarmonicMean() (float64, error) { return HarmonicMean(f) } + +// MedianAbsoluteDeviation the median of the absolute deviations from the dataset median +func (f Float64Data) MedianAbsoluteDeviation() (float64, error) { + return MedianAbsoluteDeviation(f) +} + +// MedianAbsoluteDeviationPopulation finds the median of the absolute deviations from the population median +func (f Float64Data) MedianAbsoluteDeviationPopulation() (float64, error) { + return MedianAbsoluteDeviationPopulation(f) +} + +// StandardDeviation the amount of variation in the dataset +func (f Float64Data) StandardDeviation() (float64, error) { + return StandardDeviation(f) +} + +// StandardDeviationPopulation finds the amount of variation from the population +func (f Float64Data) StandardDeviationPopulation() (float64, error) { + return StandardDeviationPopulation(f) +} + +// StandardDeviationSample finds the amount of variation from a sample +func (f Float64Data) StandardDeviationSample() (float64, error) { + return StandardDeviationSample(f) +} + +// QuartileOutliers finds the mild and extreme outliers +func (f Float64Data) QuartileOutliers() (Outliers, error) { + return QuartileOutliers(f) +} + +// Percentile finds the relative standing in a slice of floats +func (f Float64Data) Percentile(p float64) (float64, error) { + return Percentile(f, p) +} + +// PercentileNearestRank finds the relative standing using the Nearest Rank method +func (f Float64Data) PercentileNearestRank(p float64) (float64, error) { + return PercentileNearestRank(f, p) +} + +// Correlation describes the degree of relationship between two sets of data +func (f Float64Data) Correlation(d Float64Data) (float64, error) { + return Correlation(f, d) +} + +// AutoCorrelation is the correlation of a signal with a delayed copy of itself as a function of delay +func (f Float64Data) AutoCorrelation(lags int) (float64, error) { + return AutoCorrelation(f, lags) +} + +// Pearson calculates the Pearson product-moment correlation coefficient between two variables. +func (f Float64Data) Pearson(d Float64Data) (float64, error) { + return Pearson(f, d) +} + +// Quartile returns the three quartile points from a slice of data +func (f Float64Data) Quartile(d Float64Data) (Quartiles, error) { + return Quartile(d) +} + +// InterQuartileRange finds the range between Q1 and Q3 +func (f Float64Data) InterQuartileRange() (float64, error) { + return InterQuartileRange(f) +} + +// Midhinge finds the average of the first and third quartiles +func (f Float64Data) Midhinge(d Float64Data) (float64, error) { + return Midhinge(d) +} + +// Trimean finds the average of the median and the midhinge +func (f Float64Data) Trimean(d Float64Data) (float64, error) { + return Trimean(d) +} + +// Sample returns sample from input with replacement or without +func (f Float64Data) Sample(n int, r bool) ([]float64, error) { + return Sample(f, n, r) +} + +// Variance the amount of variation in the dataset +func (f Float64Data) Variance() (float64, error) { + return Variance(f) +} + +// PopulationVariance finds the amount of variance within a population +func (f Float64Data) PopulationVariance() (float64, error) { + return PopulationVariance(f) +} + +// SampleVariance finds the amount of variance within a sample +func (f Float64Data) SampleVariance() (float64, error) { + return SampleVariance(f) +} + +// Covariance is a measure of how much two sets of data change +func (f Float64Data) Covariance(d Float64Data) (float64, error) { + return Covariance(f, d) +} + +// CovariancePopulation computes covariance for entire population between two variables +func (f Float64Data) CovariancePopulation(d Float64Data) (float64, error) { + return CovariancePopulation(f, d) +} + +// Sigmoid returns the input values along the sigmoid or s-shaped curve +func (f Float64Data) Sigmoid() ([]float64, error) { + return Sigmoid(f) +} + +// SoftMax returns the input values in the range of 0 to 1 +// with sum of all the probabilities being equal to one. +func (f Float64Data) SoftMax() ([]float64, error) { + return SoftMax(f) +} + +// Entropy provides calculation of the entropy +func (f Float64Data) Entropy() (float64, error) { + return Entropy(f) +} diff --git a/vendor/github.com/montanaflynn/stats/deviation.go b/vendor/github.com/montanaflynn/stats/deviation.go new file mode 100644 index 0000000..73ff2cb --- /dev/null +++ b/vendor/github.com/montanaflynn/stats/deviation.go @@ -0,0 +1,57 @@ +package stats + +import "math" + +// MedianAbsoluteDeviation finds the median of the absolute deviations from the dataset median +func MedianAbsoluteDeviation(input Float64Data) (mad float64, err error) { + return MedianAbsoluteDeviationPopulation(input) +} + +// MedianAbsoluteDeviationPopulation finds the median of the absolute deviations from the population median +func MedianAbsoluteDeviationPopulation(input Float64Data) (mad float64, err error) { + if input.Len() == 0 { + return math.NaN(), EmptyInputErr + } + + i := copyslice(input) + m, _ := Median(i) + + for key, value := range i { + i[key] = math.Abs(value - m) + } + + return Median(i) +} + +// StandardDeviation the amount of variation in the dataset +func StandardDeviation(input Float64Data) (sdev float64, err error) { + return StandardDeviationPopulation(input) +} + +// StandardDeviationPopulation finds the amount of variation from the population +func StandardDeviationPopulation(input Float64Data) (sdev float64, err error) { + + if input.Len() == 0 { + return math.NaN(), EmptyInputErr + } + + // Get the population variance + vp, _ := PopulationVariance(input) + + // Return the population standard deviation + return math.Pow(vp, 0.5), nil +} + +// StandardDeviationSample finds the amount of variation from a sample +func StandardDeviationSample(input Float64Data) (sdev float64, err error) { + + if input.Len() == 0 { + return math.NaN(), EmptyInputErr + } + + // Get the sample variance + vs, _ := SampleVariance(input) + + // Return the sample standard deviation + return math.Pow(vs, 0.5), nil +} diff --git a/vendor/github.com/montanaflynn/stats/distances.go b/vendor/github.com/montanaflynn/stats/distances.go new file mode 100644 index 0000000..c2b7d8f --- /dev/null +++ b/vendor/github.com/montanaflynn/stats/distances.go @@ -0,0 +1,88 @@ +package stats + +import ( + "math" +) + +// Validate data for distance calculation +func validateData(dataPointX, dataPointY Float64Data) error { + if len(dataPointX) == 0 || len(dataPointY) == 0 { + return EmptyInputErr + } + + if len(dataPointX) != len(dataPointY) { + return SizeErr + } + return nil +} + +// ChebyshevDistance computes the Chebyshev distance between two data sets +func ChebyshevDistance(dataPointX, dataPointY Float64Data) (distance float64, err error) { + err = validateData(dataPointX, dataPointY) + if err != nil { + return math.NaN(), err + } + var tempDistance float64 + for i := 0; i < len(dataPointY); i++ { + tempDistance = math.Abs(dataPointX[i] - dataPointY[i]) + if distance < tempDistance { + distance = tempDistance + } + } + return distance, nil +} + +// EuclideanDistance computes the Euclidean distance between two data sets +func EuclideanDistance(dataPointX, dataPointY Float64Data) (distance float64, err error) { + + err = validateData(dataPointX, dataPointY) + if err != nil { + return math.NaN(), err + } + distance = 0 + for i := 0; i < len(dataPointX); i++ { + distance = distance + ((dataPointX[i] - dataPointY[i]) * (dataPointX[i] - dataPointY[i])) + } + return math.Sqrt(distance), nil +} + +// ManhattanDistance computes the Manhattan distance between two data sets +func ManhattanDistance(dataPointX, dataPointY Float64Data) (distance float64, err error) { + err = validateData(dataPointX, dataPointY) + if err != nil { + return math.NaN(), err + } + distance = 0 + for i := 0; i < len(dataPointX); i++ { + distance = distance + math.Abs(dataPointX[i]-dataPointY[i]) + } + return distance, nil +} + +// MinkowskiDistance computes the Minkowski distance between two data sets +// +// Arguments: +// dataPointX: First set of data points +// dataPointY: Second set of data points. Length of both data +// sets must be equal. +// lambda: aka p or city blocks; With lambda = 1 +// returned distance is manhattan distance and +// lambda = 2; it is euclidean distance. Lambda +// reaching to infinite - distance would be chebysev +// distance. +// Return: +// Distance or error +func MinkowskiDistance(dataPointX, dataPointY Float64Data, lambda float64) (distance float64, err error) { + err = validateData(dataPointX, dataPointY) + if err != nil { + return math.NaN(), err + } + for i := 0; i < len(dataPointY); i++ { + distance = distance + math.Pow(math.Abs(dataPointX[i]-dataPointY[i]), lambda) + } + distance = math.Pow(distance, 1/lambda) + if math.IsInf(distance, 1) { + return math.NaN(), InfValue + } + return distance, nil +} diff --git a/vendor/github.com/montanaflynn/stats/doc.go b/vendor/github.com/montanaflynn/stats/doc.go new file mode 100644 index 0000000..711f51f --- /dev/null +++ b/vendor/github.com/montanaflynn/stats/doc.go @@ -0,0 +1,23 @@ +/* +Package stats is a well tested and comprehensive +statistics library package with no dependencies. + +Example Usage: + + // start with some source data to use + data := []float64{1.0, 2.1, 3.2, 4.823, 4.1, 5.8} + + // you could also use different types like this + // data := stats.LoadRawData([]int{1, 2, 3, 4, 5}) + // data := stats.LoadRawData([]interface{}{1.1, "2", 3}) + // etc... + + median, _ := stats.Median(data) + fmt.Println(median) // 3.65 + + roundedMedian, _ := stats.Round(median, 0) + fmt.Println(roundedMedian) // 4 + +MIT License Copyright (c) 2014-2019 Montana Flynn +*/ +package stats diff --git a/vendor/github.com/montanaflynn/stats/entropy.go b/vendor/github.com/montanaflynn/stats/entropy.go new file mode 100644 index 0000000..95263b0 --- /dev/null +++ b/vendor/github.com/montanaflynn/stats/entropy.go @@ -0,0 +1,31 @@ +package stats + +import "math" + +// Entropy provides calculation of the entropy +func Entropy(input Float64Data) (float64, error) { + input, err := normalize(input) + if err != nil { + return math.NaN(), err + } + var result float64 + for i := 0; i < input.Len(); i++ { + v := input.Get(i) + if v == 0 { + continue + } + result += (v * math.Log(v)) + } + return -result, nil +} + +func normalize(input Float64Data) (Float64Data, error) { + sum, err := input.Sum() + if err != nil { + return Float64Data{}, err + } + for i := 0; i < input.Len(); i++ { + input[i] = input[i] / sum + } + return input, nil +} diff --git a/vendor/github.com/montanaflynn/stats/errors.go b/vendor/github.com/montanaflynn/stats/errors.go new file mode 100644 index 0000000..95f82ff --- /dev/null +++ b/vendor/github.com/montanaflynn/stats/errors.go @@ -0,0 +1,35 @@ +package stats + +type statsError struct { + err string +} + +func (s statsError) Error() string { + return s.err +} + +func (s statsError) String() string { + return s.err +} + +// These are the package-wide error values. +// All error identification should use these values. +// https://github.com/golang/go/wiki/Errors#naming +var ( + // ErrEmptyInput Input must not be empty + ErrEmptyInput = statsError{"Input must not be empty."} + // ErrNaN Not a number + ErrNaN = statsError{"Not a number."} + // ErrNegative Must not contain negative values + ErrNegative = statsError{"Must not contain negative values."} + // ErrZero Must not contain zero values + ErrZero = statsError{"Must not contain zero values."} + // ErrBounds Input is outside of range + ErrBounds = statsError{"Input is outside of range."} + // ErrSize Must be the same length + ErrSize = statsError{"Must be the same length."} + // ErrInfValue Value is infinite + ErrInfValue = statsError{"Value is infinite."} + // ErrYCoord Y Value must be greater than zero + ErrYCoord = statsError{"Y Value must be greater than zero."} +) diff --git a/vendor/github.com/montanaflynn/stats/go.mod b/vendor/github.com/montanaflynn/stats/go.mod new file mode 100644 index 0000000..5dfe6a1 --- /dev/null +++ b/vendor/github.com/montanaflynn/stats/go.mod @@ -0,0 +1 @@ +module github.com/montanaflynn/stats diff --git a/vendor/github.com/montanaflynn/stats/legacy.go b/vendor/github.com/montanaflynn/stats/legacy.go new file mode 100644 index 0000000..0f3d1e8 --- /dev/null +++ b/vendor/github.com/montanaflynn/stats/legacy.go @@ -0,0 +1,49 @@ +package stats + +// VarP is a shortcut to PopulationVariance +func VarP(input Float64Data) (sdev float64, err error) { + return PopulationVariance(input) +} + +// VarS is a shortcut to SampleVariance +func VarS(input Float64Data) (sdev float64, err error) { + return SampleVariance(input) +} + +// StdDevP is a shortcut to StandardDeviationPopulation +func StdDevP(input Float64Data) (sdev float64, err error) { + return StandardDeviationPopulation(input) +} + +// StdDevS is a shortcut to StandardDeviationSample +func StdDevS(input Float64Data) (sdev float64, err error) { + return StandardDeviationSample(input) +} + +// LinReg is a shortcut to LinearRegression +func LinReg(s []Coordinate) (regressions []Coordinate, err error) { + return LinearRegression(s) +} + +// ExpReg is a shortcut to ExponentialRegression +func ExpReg(s []Coordinate) (regressions []Coordinate, err error) { + return ExponentialRegression(s) +} + +// LogReg is a shortcut to LogarithmicRegression +func LogReg(s []Coordinate) (regressions []Coordinate, err error) { + return LogarithmicRegression(s) +} + +// Legacy error names that didn't start with Err +var ( + EmptyInputErr = ErrEmptyInput + NaNErr = ErrNaN + NegativeErr = ErrNegative + ZeroErr = ErrZero + BoundsErr = ErrBounds + SizeErr = ErrSize + InfValue = ErrInfValue + YCoordErr = ErrYCoord + EmptyInput = ErrEmptyInput +) diff --git a/vendor/github.com/montanaflynn/stats/load.go b/vendor/github.com/montanaflynn/stats/load.go new file mode 100644 index 0000000..b5789e5 --- /dev/null +++ b/vendor/github.com/montanaflynn/stats/load.go @@ -0,0 +1,184 @@ +package stats + +import ( + "strconv" + "time" +) + +// LoadRawData parses and converts a slice of mixed data types to floats +func LoadRawData(raw interface{}) (f Float64Data) { + var r []interface{} + var s Float64Data + + switch t := raw.(type) { + case []interface{}: + r = t + case []uint: + for _, v := range t { + s = append(s, float64(v)) + } + return s + case []uint8: + for _, v := range t { + s = append(s, float64(v)) + } + return s + case []uint16: + for _, v := range t { + s = append(s, float64(v)) + } + return s + case []uint32: + for _, v := range t { + s = append(s, float64(v)) + } + return s + case []uint64: + for _, v := range t { + s = append(s, float64(v)) + } + return s + case []bool: + for _, v := range t { + if v { + s = append(s, 1.0) + } else { + s = append(s, 0.0) + } + } + return s + case []float64: + return Float64Data(t) + case []int: + for _, v := range t { + s = append(s, float64(v)) + } + return s + case []int8: + for _, v := range t { + s = append(s, float64(v)) + } + return s + case []int16: + for _, v := range t { + s = append(s, float64(v)) + } + return s + case []int32: + for _, v := range t { + s = append(s, float64(v)) + } + return s + case []int64: + for _, v := range t { + s = append(s, float64(v)) + } + return s + case []string: + for _, v := range t { + r = append(r, v) + } + case []time.Duration: + for _, v := range t { + r = append(r, v) + } + case map[int]int: + for i := 0; i < len(t); i++ { + s = append(s, float64(t[i])) + } + return s + case map[int]int8: + for i := 0; i < len(t); i++ { + s = append(s, float64(t[i])) + } + return s + case map[int]int16: + for i := 0; i < len(t); i++ { + s = append(s, float64(t[i])) + } + return s + case map[int]int32: + for i := 0; i < len(t); i++ { + s = append(s, float64(t[i])) + } + return s + case map[int]int64: + for i := 0; i < len(t); i++ { + s = append(s, float64(t[i])) + } + return s + case map[int]string: + for i := 0; i < len(t); i++ { + r = append(r, t[i]) + } + case map[int]uint: + for i := 0; i < len(t); i++ { + s = append(s, float64(t[i])) + } + return s + case map[int]uint8: + for i := 0; i < len(t); i++ { + s = append(s, float64(t[i])) + } + return s + case map[int]uint16: + for i := 0; i < len(t); i++ { + s = append(s, float64(t[i])) + } + return s + case map[int]uint32: + for i := 0; i < len(t); i++ { + s = append(s, float64(t[i])) + } + return s + case map[int]uint64: + for i := 0; i < len(t); i++ { + s = append(s, float64(t[i])) + } + return s + case map[int]bool: + for i := 0; i < len(t); i++ { + if t[i] { + s = append(s, 1.0) + } else { + s = append(s, 0.0) + } + } + return s + case map[int]float64: + for i := 0; i < len(t); i++ { + s = append(s, t[i]) + } + return s + case map[int]time.Duration: + for i := 0; i < len(t); i++ { + r = append(r, t[i]) + } + } + + for _, v := range r { + switch t := v.(type) { + case int: + a := float64(t) + f = append(f, a) + case uint: + f = append(f, float64(t)) + case float64: + f = append(f, t) + case string: + fl, err := strconv.ParseFloat(t, 64) + if err == nil { + f = append(f, fl) + } + case bool: + if t { + f = append(f, 1.0) + } else { + f = append(f, 0.0) + } + case time.Duration: + f = append(f, float64(t)) + } + } + return f +} diff --git a/vendor/github.com/montanaflynn/stats/max.go b/vendor/github.com/montanaflynn/stats/max.go new file mode 100644 index 0000000..bb8c83c --- /dev/null +++ b/vendor/github.com/montanaflynn/stats/max.go @@ -0,0 +1,26 @@ +package stats + +import ( + "math" +) + +// Max finds the highest number in a slice +func Max(input Float64Data) (max float64, err error) { + + // Return an error if there are no numbers + if input.Len() == 0 { + return math.NaN(), EmptyInputErr + } + + // Get the first value as the starting point + max = input.Get(0) + + // Loop and replace higher values + for i := 1; i < input.Len(); i++ { + if input.Get(i) > max { + max = input.Get(i) + } + } + + return max, nil +} diff --git a/vendor/github.com/montanaflynn/stats/mean.go b/vendor/github.com/montanaflynn/stats/mean.go new file mode 100644 index 0000000..a78d299 --- /dev/null +++ b/vendor/github.com/montanaflynn/stats/mean.go @@ -0,0 +1,60 @@ +package stats + +import "math" + +// Mean gets the average of a slice of numbers +func Mean(input Float64Data) (float64, error) { + + if input.Len() == 0 { + return math.NaN(), EmptyInputErr + } + + sum, _ := input.Sum() + + return sum / float64(input.Len()), nil +} + +// GeometricMean gets the geometric mean for a slice of numbers +func GeometricMean(input Float64Data) (float64, error) { + + l := input.Len() + if l == 0 { + return math.NaN(), EmptyInputErr + } + + // Get the product of all the numbers + var p float64 + for _, n := range input { + if p == 0 { + p = n + } else { + p *= n + } + } + + // Calculate the geometric mean + return math.Pow(p, 1/float64(l)), nil +} + +// HarmonicMean gets the harmonic mean for a slice of numbers +func HarmonicMean(input Float64Data) (float64, error) { + + l := input.Len() + if l == 0 { + return math.NaN(), EmptyInputErr + } + + // Get the sum of all the numbers reciprocals and return an + // error for values that cannot be included in harmonic mean + var p float64 + for _, n := range input { + if n < 0 { + return math.NaN(), NegativeErr + } else if n == 0 { + return math.NaN(), ZeroErr + } + p += (1 / n) + } + + return float64(l) / p, nil +} diff --git a/vendor/github.com/montanaflynn/stats/median.go b/vendor/github.com/montanaflynn/stats/median.go new file mode 100644 index 0000000..a678c36 --- /dev/null +++ b/vendor/github.com/montanaflynn/stats/median.go @@ -0,0 +1,25 @@ +package stats + +import "math" + +// Median gets the median number in a slice of numbers +func Median(input Float64Data) (median float64, err error) { + + // Start by sorting a copy of the slice + c := sortedCopy(input) + + // No math is needed if there are no numbers + // For even numbers we add the two middle numbers + // and divide by two using the mean function above + // For odd numbers we just use the middle number + l := len(c) + if l == 0 { + return math.NaN(), EmptyInputErr + } else if l%2 == 0 { + median, _ = Mean(c[l/2-1 : l/2+1]) + } else { + median = c[l/2] + } + + return median, nil +} diff --git a/vendor/github.com/montanaflynn/stats/min.go b/vendor/github.com/montanaflynn/stats/min.go new file mode 100644 index 0000000..bf7e70a --- /dev/null +++ b/vendor/github.com/montanaflynn/stats/min.go @@ -0,0 +1,26 @@ +package stats + +import "math" + +// Min finds the lowest number in a set of data +func Min(input Float64Data) (min float64, err error) { + + // Get the count of numbers in the slice + l := input.Len() + + // Return an error if there are no numbers + if l == 0 { + return math.NaN(), EmptyInputErr + } + + // Get the first value as the starting point + min = input.Get(0) + + // Iterate until done checking for a lower value + for i := 1; i < l; i++ { + if input.Get(i) < min { + min = input.Get(i) + } + } + return min, nil +} diff --git a/vendor/github.com/montanaflynn/stats/mode.go b/vendor/github.com/montanaflynn/stats/mode.go new file mode 100644 index 0000000..058bbf3 --- /dev/null +++ b/vendor/github.com/montanaflynn/stats/mode.go @@ -0,0 +1,47 @@ +package stats + +// Mode gets the mode [most frequent value(s)] of a slice of float64s +func Mode(input Float64Data) (mode []float64, err error) { + // Return the input if there's only one number + l := input.Len() + if l == 1 { + return input, nil + } else if l == 0 { + return nil, EmptyInputErr + } + + c := sortedCopyDif(input) + // Traverse sorted array, + // tracking the longest repeating sequence + mode = make([]float64, 5) + cnt, maxCnt := 1, 1 + for i := 1; i < l; i++ { + switch { + case c[i] == c[i-1]: + cnt++ + case cnt == maxCnt && maxCnt != 1: + mode = append(mode, c[i-1]) + cnt = 1 + case cnt > maxCnt: + mode = append(mode[:0], c[i-1]) + maxCnt, cnt = cnt, 1 + default: + cnt = 1 + } + } + switch { + case cnt == maxCnt: + mode = append(mode, c[l-1]) + case cnt > maxCnt: + mode = append(mode[:0], c[l-1]) + maxCnt = cnt + } + + // Since length must be greater than 1, + // check for slices of distinct values + if maxCnt == 1 { + return Float64Data{}, nil + } + + return mode, nil +} diff --git a/vendor/github.com/montanaflynn/stats/outlier.go b/vendor/github.com/montanaflynn/stats/outlier.go new file mode 100644 index 0000000..7c9795b --- /dev/null +++ b/vendor/github.com/montanaflynn/stats/outlier.go @@ -0,0 +1,44 @@ +package stats + +// Outliers holds mild and extreme outliers found in data +type Outliers struct { + Mild Float64Data + Extreme Float64Data +} + +// QuartileOutliers finds the mild and extreme outliers +func QuartileOutliers(input Float64Data) (Outliers, error) { + if input.Len() == 0 { + return Outliers{}, EmptyInputErr + } + + // Start by sorting a copy of the slice + copy := sortedCopy(input) + + // Calculate the quartiles and interquartile range + qs, _ := Quartile(copy) + iqr, _ := InterQuartileRange(copy) + + // Calculate the lower and upper inner and outer fences + lif := qs.Q1 - (1.5 * iqr) + uif := qs.Q3 + (1.5 * iqr) + lof := qs.Q1 - (3 * iqr) + uof := qs.Q3 + (3 * iqr) + + // Find the data points that are outside of the + // inner and upper fences and add them to mild + // and extreme outlier slices + var mild Float64Data + var extreme Float64Data + for _, v := range copy { + + if v < lof || v > uof { + extreme = append(extreme, v) + } else if v < lif || v > uif { + mild = append(mild, v) + } + } + + // Wrap them into our struct + return Outliers{mild, extreme}, nil +} diff --git a/vendor/github.com/montanaflynn/stats/percentile.go b/vendor/github.com/montanaflynn/stats/percentile.go new file mode 100644 index 0000000..2f8c64d --- /dev/null +++ b/vendor/github.com/montanaflynn/stats/percentile.go @@ -0,0 +1,82 @@ +package stats + +import ( + "math" +) + +// Percentile finds the relative standing in a slice of floats +func Percentile(input Float64Data, percent float64) (percentile float64, err error) { + + if input.Len() == 0 { + return math.NaN(), EmptyInputErr + } + + if percent <= 0 || percent > 100 { + return math.NaN(), BoundsErr + } + + // Start by sorting a copy of the slice + c := sortedCopy(input) + + // Multiply percent by length of input + index := (percent / 100) * float64(len(c)) + + // Check if the index is a whole number + if index == float64(int64(index)) { + + // Convert float to int + i := int(index) + + // Find the value at the index + percentile = c[i-1] + + } else if index > 1 { + + // Convert float to int via truncation + i := int(index) + + // Find the average of the index and following values + percentile, _ = Mean(Float64Data{c[i-1], c[i]}) + + } else { + return math.NaN(), BoundsErr + } + + return percentile, nil + +} + +// PercentileNearestRank finds the relative standing in a slice of floats using the Nearest Rank method +func PercentileNearestRank(input Float64Data, percent float64) (percentile float64, err error) { + + // Find the length of items in the slice + il := input.Len() + + // Return an error for empty slices + if il == 0 { + return math.NaN(), EmptyInputErr + } + + // Return error for less than 0 or greater than 100 percentages + if percent < 0 || percent > 100 { + return math.NaN(), BoundsErr + } + + // Start by sorting a copy of the slice + c := sortedCopy(input) + + // Return the last item + if percent == 100.0 { + return c[il-1], nil + } + + // Find ordinal ranking + or := int(math.Ceil(float64(il) * percent / 100)) + + // Return the item that is in the place of the ordinal rank + if or == 0 { + return c[0], nil + } + return c[or-1], nil + +} diff --git a/vendor/github.com/montanaflynn/stats/quartile.go b/vendor/github.com/montanaflynn/stats/quartile.go new file mode 100644 index 0000000..40bbf6e --- /dev/null +++ b/vendor/github.com/montanaflynn/stats/quartile.go @@ -0,0 +1,74 @@ +package stats + +import "math" + +// Quartiles holds the three quartile points +type Quartiles struct { + Q1 float64 + Q2 float64 + Q3 float64 +} + +// Quartile returns the three quartile points from a slice of data +func Quartile(input Float64Data) (Quartiles, error) { + + il := input.Len() + if il == 0 { + return Quartiles{}, EmptyInputErr + } + + // Start by sorting a copy of the slice + copy := sortedCopy(input) + + // Find the cutoff places depeding on if + // the input slice length is even or odd + var c1 int + var c2 int + if il%2 == 0 { + c1 = il / 2 + c2 = il / 2 + } else { + c1 = (il - 1) / 2 + c2 = c1 + 1 + } + + // Find the Medians with the cutoff points + Q1, _ := Median(copy[:c1]) + Q2, _ := Median(copy) + Q3, _ := Median(copy[c2:]) + + return Quartiles{Q1, Q2, Q3}, nil + +} + +// InterQuartileRange finds the range between Q1 and Q3 +func InterQuartileRange(input Float64Data) (float64, error) { + if input.Len() == 0 { + return math.NaN(), EmptyInputErr + } + qs, _ := Quartile(input) + iqr := qs.Q3 - qs.Q1 + return iqr, nil +} + +// Midhinge finds the average of the first and third quartiles +func Midhinge(input Float64Data) (float64, error) { + if input.Len() == 0 { + return math.NaN(), EmptyInputErr + } + qs, _ := Quartile(input) + mh := (qs.Q1 + qs.Q3) / 2 + return mh, nil +} + +// Trimean finds the average of the median and the midhinge +func Trimean(input Float64Data) (float64, error) { + if input.Len() == 0 { + return math.NaN(), EmptyInputErr + } + + c := sortedCopy(input) + q, _ := Quartile(c) + + return (q.Q1 + (q.Q2 * 2) + q.Q3) / 4, nil +} diff --git a/vendor/github.com/montanaflynn/stats/regression.go b/vendor/github.com/montanaflynn/stats/regression.go new file mode 100644 index 0000000..401d951 --- /dev/null +++ b/vendor/github.com/montanaflynn/stats/regression.go @@ -0,0 +1,113 @@ +package stats + +import "math" + +// Series is a container for a series of data +type Series []Coordinate + +// Coordinate holds the data in a series +type Coordinate struct { + X, Y float64 +} + +// LinearRegression finds the least squares linear regression on data series +func LinearRegression(s Series) (regressions Series, err error) { + + if len(s) == 0 { + return nil, EmptyInputErr + } + + // Placeholder for the math to be done + var sum [5]float64 + + // Loop over data keeping index in place + i := 0 + for ; i < len(s); i++ { + sum[0] += s[i].X + sum[1] += s[i].Y + sum[2] += s[i].X * s[i].X + sum[3] += s[i].X * s[i].Y + sum[4] += s[i].Y * s[i].Y + } + + // Find gradient and intercept + f := float64(i) + gradient := (f*sum[3] - sum[0]*sum[1]) / (f*sum[2] - sum[0]*sum[0]) + intercept := (sum[1] / f) - (gradient * sum[0] / f) + + // Create the new regression series + for j := 0; j < len(s); j++ { + regressions = append(regressions, Coordinate{ + X: s[j].X, + Y: s[j].X*gradient + intercept, + }) + } + + return regressions, nil +} + +// ExponentialRegression returns an exponential regression on data series +func ExponentialRegression(s Series) (regressions Series, err error) { + + if len(s) == 0 { + return nil, EmptyInputErr + } + + var sum [6]float64 + + for i := 0; i < len(s); i++ { + if s[i].Y < 0 { + return nil, YCoordErr + } + sum[0] += s[i].X + sum[1] += s[i].Y + sum[2] += s[i].X * s[i].X * s[i].Y + sum[3] += s[i].Y * math.Log(s[i].Y) + sum[4] += s[i].X * s[i].Y * math.Log(s[i].Y) + sum[5] += s[i].X * s[i].Y + } + + denominator := (sum[1]*sum[2] - sum[5]*sum[5]) + a := math.Pow(math.E, (sum[2]*sum[3]-sum[5]*sum[4])/denominator) + b := (sum[1]*sum[4] - sum[5]*sum[3]) / denominator + + for j := 0; j < len(s); j++ { + regressions = append(regressions, Coordinate{ + X: s[j].X, + Y: a * math.Exp(b*s[j].X), + }) + } + + return regressions, nil +} + +// LogarithmicRegression returns an logarithmic regression on data series +func LogarithmicRegression(s Series) (regressions Series, err error) { + + if len(s) == 0 { + return nil, EmptyInputErr + } + + var sum [4]float64 + + i := 0 + for ; i < len(s); i++ { + sum[0] += math.Log(s[i].X) + sum[1] += s[i].Y * math.Log(s[i].X) + sum[2] += s[i].Y + sum[3] += math.Pow(math.Log(s[i].X), 2) + } + + f := float64(i) + a := (f*sum[1] - sum[2]*sum[0]) / (f*sum[3] - sum[0]*sum[0]) + b := (sum[2] - a*sum[0]) / f + + for j := 0; j < len(s); j++ { + regressions = append(regressions, Coordinate{ + X: s[j].X, + Y: b + a*math.Log(s[j].X), + }) + } + + return regressions, nil +} diff --git a/vendor/github.com/montanaflynn/stats/round.go b/vendor/github.com/montanaflynn/stats/round.go new file mode 100644 index 0000000..b66779c --- /dev/null +++ b/vendor/github.com/montanaflynn/stats/round.go @@ -0,0 +1,38 @@ +package stats + +import "math" + +// Round a float to a specific decimal place or precision +func Round(input float64, places int) (rounded float64, err error) { + + // If the float is not a number + if math.IsNaN(input) { + return math.NaN(), NaNErr + } + + // Find out the actual sign and correct the input for later + sign := 1.0 + if input < 0 { + sign = -1 + input *= -1 + } + + // Use the places arg to get the amount of precision wanted + precision := math.Pow(10, float64(places)) + + // Find the decimal place we are looking to round + digit := input * precision + + // Get the actual decimal number as a fraction to be compared + _, decimal := math.Modf(digit) + + // If the decimal is less than .5 we round down otherwise up + if decimal >= 0.5 { + rounded = math.Ceil(digit) + } else { + rounded = math.Floor(digit) + } + + // Finally we do the math to actually create a rounded number + return rounded / precision * sign, nil +} diff --git a/vendor/github.com/montanaflynn/stats/sample.go b/vendor/github.com/montanaflynn/stats/sample.go new file mode 100644 index 0000000..7562801 --- /dev/null +++ b/vendor/github.com/montanaflynn/stats/sample.go @@ -0,0 +1,44 @@ +package stats + +import "math/rand" + +// Sample returns sample from input with replacement or without +func Sample(input Float64Data, takenum int, replacement bool) ([]float64, error) { + + if input.Len() == 0 { + return nil, EmptyInputErr + } + + length := input.Len() + if replacement { + + result := Float64Data{} + rand.Seed(unixnano()) + + // In every step, randomly take the num for + for i := 0; i < takenum; i++ { + idx := rand.Intn(length) + result = append(result, input[idx]) + } + + return result, nil + + } else if !replacement && takenum <= length { + + rand.Seed(unixnano()) + + // Get permutation of number of indexies + perm := rand.Perm(length) + result := Float64Data{} + + // Get element of input by permutated index + for _, idx := range perm[0:takenum] { + result = append(result, input[idx]) + } + + return result, nil + + } + + return nil, BoundsErr +} diff --git a/vendor/github.com/montanaflynn/stats/sigmoid.go b/vendor/github.com/montanaflynn/stats/sigmoid.go new file mode 100644 index 0000000..5f2559d --- /dev/null +++ b/vendor/github.com/montanaflynn/stats/sigmoid.go @@ -0,0 +1,18 @@ +package stats + +import "math" + +// Sigmoid returns the input values in the range of -1 to 1 +// along the sigmoid or s-shaped curve, commonly used in +// machine learning while training neural networks as an +// activation function. +func Sigmoid(input Float64Data) ([]float64, error) { + if input.Len() == 0 { + return Float64Data{}, EmptyInput + } + s := make([]float64, len(input)) + for i, v := range input { + s[i] = 1 / (1 + math.Exp(-v)) + } + return s, nil +} diff --git a/vendor/github.com/montanaflynn/stats/softmax.go b/vendor/github.com/montanaflynn/stats/softmax.go new file mode 100644 index 0000000..8507264 --- /dev/null +++ b/vendor/github.com/montanaflynn/stats/softmax.go @@ -0,0 +1,25 @@ +package stats + +import "math" + +// SoftMax returns the input values in the range of 0 to 1 +// with sum of all the probabilities being equal to one. It +// is commonly used in machine learning neural networks. +func SoftMax(input Float64Data) ([]float64, error) { + if input.Len() == 0 { + return Float64Data{}, EmptyInput + } + + s := 0.0 + c, _ := Max(input) + for _, e := range input { + s += math.Exp(e - c) + } + + sm := make([]float64, len(input)) + for i, v := range input { + sm[i] = math.Exp(v-c) / s + } + + return sm, nil +} diff --git a/vendor/github.com/montanaflynn/stats/sum.go b/vendor/github.com/montanaflynn/stats/sum.go new file mode 100644 index 0000000..15b611d --- /dev/null +++ b/vendor/github.com/montanaflynn/stats/sum.go @@ -0,0 +1,18 @@ +package stats + +import "math" + +// Sum adds all the numbers of a slice together +func Sum(input Float64Data) (sum float64, err error) { + + if input.Len() == 0 { + return math.NaN(), EmptyInputErr + } + + // Add em up + for _, n := range input { + sum += n + } + + return sum, nil +} diff --git a/vendor/github.com/montanaflynn/stats/util.go b/vendor/github.com/montanaflynn/stats/util.go new file mode 100644 index 0000000..8819976 --- /dev/null +++ b/vendor/github.com/montanaflynn/stats/util.go @@ -0,0 +1,43 @@ +package stats + +import ( + "sort" + "time" +) + +// float64ToInt rounds a float64 to an int +func float64ToInt(input float64) (output int) { + r, _ := Round(input, 0) + return int(r) +} + +// unixnano returns nanoseconds from UTC epoch +func unixnano() int64 { + return time.Now().UTC().UnixNano() +} + +// copyslice copies a slice of float64s +func copyslice(input Float64Data) Float64Data { + s := make(Float64Data, input.Len()) + copy(s, input) + return s +} + +// sortedCopy returns a sorted copy of float64s +func sortedCopy(input Float64Data) (copy Float64Data) { + copy = copyslice(input) + sort.Float64s(copy) + return +} + +// sortedCopyDif returns a sorted copy of float64s +// only if the original data isn't sorted. +// Only use this if returned slice won't be manipulated! +func sortedCopyDif(input Float64Data) (copy Float64Data) { + if sort.Float64sAreSorted(input) { + return input + } + copy = copyslice(input) + sort.Float64s(copy) + return +} diff --git a/vendor/github.com/montanaflynn/stats/variance.go b/vendor/github.com/montanaflynn/stats/variance.go new file mode 100644 index 0000000..a644569 --- /dev/null +++ b/vendor/github.com/montanaflynn/stats/variance.go @@ -0,0 +1,105 @@ +package stats + +import "math" + +// _variance finds the variance for both population and sample data +func _variance(input Float64Data, sample int) (variance float64, err error) { + + if input.Len() == 0 { + return math.NaN(), EmptyInputErr + } + + // Sum the square of the mean subtracted from each number + m, _ := Mean(input) + + for _, n := range input { + variance += (n - m) * (n - m) + } + + // When getting the mean of the squared differences + // "sample" will allow us to know if it's a sample + // or population and wether to subtract by one or not + return variance / float64((input.Len() - (1 * sample))), nil +} + +// Variance the amount of variation in the dataset +func Variance(input Float64Data) (sdev float64, err error) { + return PopulationVariance(input) +} + +// PopulationVariance finds the amount of variance within a population +func PopulationVariance(input Float64Data) (pvar float64, err error) { + + v, err := _variance(input, 0) + if err != nil { + return math.NaN(), err + } + + return v, nil +} + +// SampleVariance finds the amount of variance within a sample +func SampleVariance(input Float64Data) (svar float64, err error) { + + v, err := _variance(input, 1) + if err != nil { + return math.NaN(), err + } + + return v, nil +} + +// Covariance is a measure of how much two sets of data change +func Covariance(data1, data2 Float64Data) (float64, error) { + + l1 := data1.Len() + l2 := data2.Len() + + if l1 == 0 || l2 == 0 { + return math.NaN(), EmptyInputErr + } + + if l1 != l2 { + return math.NaN(), SizeErr + } + + m1, _ := Mean(data1) + m2, _ := Mean(data2) + + // Calculate sum of squares + var ss float64 + for i := 0; i < l1; i++ { + delta1 := (data1.Get(i) - m1) + delta2 := (data2.Get(i) - m2) + ss += (delta1*delta2 - ss) / float64(i+1) + } + + return ss * float64(l1) / float64(l1-1), nil +} + +// CovariancePopulation computes covariance for entire population between two variables. +func CovariancePopulation(data1, data2 Float64Data) (float64, error) { + + l1 := data1.Len() + l2 := data2.Len() + + if l1 == 0 || l2 == 0 { + return math.NaN(), EmptyInputErr + } + + if l1 != l2 { + return math.NaN(), SizeErr + } + + m1, _ := Mean(data1) + m2, _ := Mean(data2) + + var s float64 + for i := 0; i < l1; i++ { + delta1 := (data1.Get(i) - m1) + delta2 := (data2.Get(i) - m2) + s += delta1 * delta2 + } + + return s / float64(l1), nil +} diff --git a/vendor/github.com/opentracing/opentracing-go/CHANGELOG.md b/vendor/github.com/opentracing/opentracing-go/CHANGELOG.md new file mode 100644 index 0000000..7c14feb --- /dev/null +++ b/vendor/github.com/opentracing/opentracing-go/CHANGELOG.md @@ -0,0 +1,46 @@ +Changes by Version +================== + +1.1.0 (2019-03-23) +------------------- + +Notable changes: +- The library is now released under Apache 2.0 license +- Use Set() instead of Add() in HTTPHeadersCarrier is functionally a breaking change (fixes issue [#159](https://github.com/opentracing/opentracing-go/issues/159)) +- 'golang.org/x/net/context' is replaced with 'context' from the standard library + +List of all changes: + +- Export StartSpanFromContextWithTracer (#214) +- Add IsGlobalTracerRegistered() to indicate if a tracer has been registered (#201) +- Use Set() instead of Add() in HTTPHeadersCarrier (#191) +- Update license to Apache 2.0 (#181) +- Replace 'golang.org/x/net/context' with 'context' (#176) +- Port of Python opentracing/harness/api_check.py to Go (#146) +- Fix race condition in MockSpan.Context() (#170) +- Add PeerHostIPv4.SetString() (#155) +- Add a Noop log field type to log to allow for optional fields (#150) + + +1.0.2 (2017-04-26) +------------------- + +- Add more semantic tags (#139) + + +1.0.1 (2017-02-06) +------------------- + +- Correct spelling in comments +- Address race in nextMockID() (#123) +- log: avoid panic marshaling nil error (#131) +- Deprecate InitGlobalTracer in favor of SetGlobalTracer (#128) +- Drop Go 1.5 that fails in Travis (#129) +- Add convenience methods Key() and Value() to log.Field +- Add convenience methods to log.Field (2 years, 6 months ago) + +1.0.0 (2016-09-26) +------------------- + +- This release implements OpenTracing Specification 1.0 (https://opentracing.io/spec) + diff --git a/vendor/github.com/opentracing/opentracing-go/LICENSE b/vendor/github.com/opentracing/opentracing-go/LICENSE new file mode 100644 index 0000000..f002734 --- /dev/null +++ b/vendor/github.com/opentracing/opentracing-go/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2016 The OpenTracing Authors + + 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. diff --git a/vendor/github.com/opentracing/opentracing-go/Makefile b/vendor/github.com/opentracing/opentracing-go/Makefile new file mode 100644 index 0000000..62abb63 --- /dev/null +++ b/vendor/github.com/opentracing/opentracing-go/Makefile @@ -0,0 +1,20 @@ +.DEFAULT_GOAL := test-and-lint + +.PHONY: test-and-lint +test-and-lint: test lint + +.PHONY: test +test: + go test -v -cover -race ./... + +.PHONY: cover +cover: + go test -v -coverprofile=coverage.txt -covermode=atomic -race ./... + +.PHONY: lint +lint: + go fmt ./... + golint ./... + @# Run again with magic to exit non-zero if golint outputs anything. + @! (golint ./... | read dummy) + go vet ./... diff --git a/vendor/github.com/opentracing/opentracing-go/README.md b/vendor/github.com/opentracing/opentracing-go/README.md new file mode 100644 index 0000000..6ef1d7c --- /dev/null +++ b/vendor/github.com/opentracing/opentracing-go/README.md @@ -0,0 +1,171 @@ +[![Gitter chat](http://img.shields.io/badge/gitter-join%20chat%20%E2%86%92-brightgreen.svg)](https://gitter.im/opentracing/public) [![Build Status](https://travis-ci.org/opentracing/opentracing-go.svg?branch=master)](https://travis-ci.org/opentracing/opentracing-go) [![GoDoc](https://godoc.org/github.com/opentracing/opentracing-go?status.svg)](http://godoc.org/github.com/opentracing/opentracing-go) +[![Sourcegraph Badge](https://sourcegraph.com/github.com/opentracing/opentracing-go/-/badge.svg)](https://sourcegraph.com/github.com/opentracing/opentracing-go?badge) + +# OpenTracing API for Go + +This package is a Go platform API for OpenTracing. + +## Required Reading + +In order to understand the Go platform API, one must first be familiar with the +[OpenTracing project](https://opentracing.io) and +[terminology](https://opentracing.io/specification/) more specifically. + +## API overview for those adding instrumentation + +Everyday consumers of this `opentracing` package really only need to worry +about a couple of key abstractions: the `StartSpan` function, the `Span` +interface, and binding a `Tracer` at `main()`-time. Here are code snippets +demonstrating some important use cases. + +#### Singleton initialization + +The simplest starting point is `./default_tracer.go`. As early as possible, call + +```go + import "github.com/opentracing/opentracing-go" + import ".../some_tracing_impl" + + func main() { + opentracing.SetGlobalTracer( + // tracing impl specific: + some_tracing_impl.New(...), + ) + ... + } +``` + +#### Non-Singleton initialization + +If you prefer direct control to singletons, manage ownership of the +`opentracing.Tracer` implementation explicitly. + +#### Creating a Span given an existing Go `context.Context` + +If you use `context.Context` in your application, OpenTracing's Go library will +happily rely on it for `Span` propagation. To start a new (blocking child) +`Span`, you can use `StartSpanFromContext`. + +```go + func xyz(ctx context.Context, ...) { + ... + span, ctx := opentracing.StartSpanFromContext(ctx, "operation_name") + defer span.Finish() + span.LogFields( + log.String("event", "soft error"), + log.String("type", "cache timeout"), + log.Int("waited.millis", 1500)) + ... + } +``` + +#### Starting an empty trace by creating a "root span" + +It's always possible to create a "root" `Span` with no parent or other causal +reference. + +```go + func xyz() { + ... + sp := opentracing.StartSpan("operation_name") + defer sp.Finish() + ... + } +``` + +#### Creating a (child) Span given an existing (parent) Span + +```go + func xyz(parentSpan opentracing.Span, ...) { + ... + sp := opentracing.StartSpan( + "operation_name", + opentracing.ChildOf(parentSpan.Context())) + defer sp.Finish() + ... + } +``` + +#### Serializing to the wire + +```go + func makeSomeRequest(ctx context.Context) ... { + if span := opentracing.SpanFromContext(ctx); span != nil { + httpClient := &http.Client{} + httpReq, _ := http.NewRequest("GET", "http://myservice/", nil) + + // Transmit the span's TraceContext as HTTP headers on our + // outbound request. + opentracing.GlobalTracer().Inject( + span.Context(), + opentracing.HTTPHeaders, + opentracing.HTTPHeadersCarrier(httpReq.Header)) + + resp, err := httpClient.Do(httpReq) + ... + } + ... + } +``` + +#### Deserializing from the wire + +```go + http.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) { + var serverSpan opentracing.Span + appSpecificOperationName := ... + wireContext, err := opentracing.GlobalTracer().Extract( + opentracing.HTTPHeaders, + opentracing.HTTPHeadersCarrier(req.Header)) + if err != nil { + // Optionally record something about err here + } + + // Create the span referring to the RPC client if available. + // If wireContext == nil, a root span will be created. + serverSpan = opentracing.StartSpan( + appSpecificOperationName, + ext.RPCServerOption(wireContext)) + + defer serverSpan.Finish() + + ctx := opentracing.ContextWithSpan(context.Background(), serverSpan) + ... + } +``` + +#### Conditionally capture a field using `log.Noop` + +In some situations, you may want to dynamically decide whether or not +to log a field. For example, you may want to capture additional data, +such as a customer ID, in non-production environments: + +```go + func Customer(order *Order) log.Field { + if os.Getenv("ENVIRONMENT") == "dev" { + return log.String("customer", order.Customer.ID) + } + return log.Noop() + } +``` + +#### Goroutine-safety + +The entire public API is goroutine-safe and does not require external +synchronization. + +## API pointers for those implementing a tracing system + +Tracing system implementors may be able to reuse or copy-paste-modify the `basictracer` package, found [here](https://github.com/opentracing/basictracer-go). In particular, see `basictracer.New(...)`. + +## API compatibility + +For the time being, "mild" backwards-incompatible changes may be made without changing the major version number. As OpenTracing and `opentracing-go` mature, backwards compatibility will become more of a priority. + +## Tracer test suite + +A test suite is available in the [harness](https://godoc.org/github.com/opentracing/opentracing-go/harness) package that can assist Tracer implementors to assert that their Tracer is working correctly. + +## Licensing + +[Apache 2.0 License](./LICENSE). diff --git a/vendor/github.com/opentracing/opentracing-go/globaltracer.go b/vendor/github.com/opentracing/opentracing-go/globaltracer.go new file mode 100644 index 0000000..4f7066a --- /dev/null +++ b/vendor/github.com/opentracing/opentracing-go/globaltracer.go @@ -0,0 +1,42 @@ +package opentracing + +type registeredTracer struct { + tracer Tracer + isRegistered bool +} + +var ( + globalTracer = registeredTracer{NoopTracer{}, false} +) + +// SetGlobalTracer sets the [singleton] opentracing.Tracer returned by +// GlobalTracer(). Those who use GlobalTracer (rather than directly manage an +// opentracing.Tracer instance) should call SetGlobalTracer as early as +// possible in main(), prior to calling the `StartSpan` global func below. +// Prior to calling `SetGlobalTracer`, any Spans started via the `StartSpan` +// (etc) globals are noops. +func SetGlobalTracer(tracer Tracer) { + globalTracer = registeredTracer{tracer, true} +} + +// GlobalTracer returns the global singleton `Tracer` implementation. +// Before `SetGlobalTracer()` is called, the `GlobalTracer()` is a noop +// implementation that drops all data handed to it. +func GlobalTracer() Tracer { + return globalTracer.tracer +} + +// StartSpan defers to `Tracer.StartSpan`. See `GlobalTracer()`. +func StartSpan(operationName string, opts ...StartSpanOption) Span { + return globalTracer.tracer.StartSpan(operationName, opts...) +} + +// InitGlobalTracer is deprecated. Please use SetGlobalTracer. +func InitGlobalTracer(tracer Tracer) { + SetGlobalTracer(tracer) +} + +// IsGlobalTracerRegistered returns a `bool` to indicate if a tracer has been globally registered +func IsGlobalTracerRegistered() bool { + return globalTracer.isRegistered +} diff --git a/vendor/github.com/opentracing/opentracing-go/gocontext.go b/vendor/github.com/opentracing/opentracing-go/gocontext.go new file mode 100644 index 0000000..08c00c0 --- /dev/null +++ b/vendor/github.com/opentracing/opentracing-go/gocontext.go @@ -0,0 +1,60 @@ +package opentracing + +import "context" + +type contextKey struct{} + +var activeSpanKey = contextKey{} + +// ContextWithSpan returns a new `context.Context` that holds a reference to +// `span`'s SpanContext. +func ContextWithSpan(ctx context.Context, span Span) context.Context { + return context.WithValue(ctx, activeSpanKey, span) +} + +// SpanFromContext returns the `Span` previously associated with `ctx`, or +// `nil` if no such `Span` could be found. +// +// NOTE: context.Context != SpanContext: the former is Go's intra-process +// context propagation mechanism, and the latter houses OpenTracing's per-Span +// identity and baggage information. +func SpanFromContext(ctx context.Context) Span { + val := ctx.Value(activeSpanKey) + if sp, ok := val.(Span); ok { + return sp + } + return nil +} + +// StartSpanFromContext starts and returns a Span with `operationName`, using +// any Span found within `ctx` as a ChildOfRef. If no such parent could be +// found, StartSpanFromContext creates a root (parentless) Span. +// +// The second return value is a context.Context object built around the +// returned Span. +// +// Example usage: +// +// SomeFunction(ctx context.Context, ...) { +// sp, ctx := opentracing.StartSpanFromContext(ctx, "SomeFunction") +// defer sp.Finish() +// ... +// } +func StartSpanFromContext(ctx context.Context, operationName string, opts ...StartSpanOption) (Span, context.Context) { + return StartSpanFromContextWithTracer(ctx, GlobalTracer(), operationName, opts...) +} + +// StartSpanFromContextWithTracer starts and returns a span with `operationName` +// using a span found within the context as a ChildOfRef. If that doesn't exist +// it creates a root span. It also returns a context.Context object built +// around the returned span. +// +// It's behavior is identical to StartSpanFromContext except that it takes an explicit +// tracer as opposed to using the global tracer. +func StartSpanFromContextWithTracer(ctx context.Context, tracer Tracer, operationName string, opts ...StartSpanOption) (Span, context.Context) { + if parentSpan := SpanFromContext(ctx); parentSpan != nil { + opts = append(opts, ChildOf(parentSpan.Context())) + } + span := tracer.StartSpan(operationName, opts...) + return span, ContextWithSpan(ctx, span) +} diff --git a/vendor/github.com/opentracing/opentracing-go/log/field.go b/vendor/github.com/opentracing/opentracing-go/log/field.go new file mode 100644 index 0000000..22c835f --- /dev/null +++ b/vendor/github.com/opentracing/opentracing-go/log/field.go @@ -0,0 +1,272 @@ +package log + +import ( + "fmt" + "math" +) + +type fieldType int + +const ( + stringType fieldType = iota + boolType + intType + int32Type + uint32Type + int64Type + uint64Type + float32Type + float64Type + errorType + objectType + lazyLoggerType + noopType +) + +// Field instances are constructed via LogBool, LogString, and so on. +// Tracing implementations may then handle them via the Field.Marshal +// method. +// +// "heavily influenced by" (i.e., partially stolen from) +// https://github.com/uber-go/zap +type Field struct { + key string + fieldType fieldType + numericVal int64 + stringVal string + interfaceVal interface{} +} + +// String adds a string-valued key:value pair to a Span.LogFields() record +func String(key, val string) Field { + return Field{ + key: key, + fieldType: stringType, + stringVal: val, + } +} + +// Bool adds a bool-valued key:value pair to a Span.LogFields() record +func Bool(key string, val bool) Field { + var numericVal int64 + if val { + numericVal = 1 + } + return Field{ + key: key, + fieldType: boolType, + numericVal: numericVal, + } +} + +// Int adds an int-valued key:value pair to a Span.LogFields() record +func Int(key string, val int) Field { + return Field{ + key: key, + fieldType: intType, + numericVal: int64(val), + } +} + +// Int32 adds an int32-valued key:value pair to a Span.LogFields() record +func Int32(key string, val int32) Field { + return Field{ + key: key, + fieldType: int32Type, + numericVal: int64(val), + } +} + +// Int64 adds an int64-valued key:value pair to a Span.LogFields() record +func Int64(key string, val int64) Field { + return Field{ + key: key, + fieldType: int64Type, + numericVal: val, + } +} + +// Uint32 adds a uint32-valued key:value pair to a Span.LogFields() record +func Uint32(key string, val uint32) Field { + return Field{ + key: key, + fieldType: uint32Type, + numericVal: int64(val), + } +} + +// Uint64 adds a uint64-valued key:value pair to a Span.LogFields() record +func Uint64(key string, val uint64) Field { + return Field{ + key: key, + fieldType: uint64Type, + numericVal: int64(val), + } +} + +// Float32 adds a float32-valued key:value pair to a Span.LogFields() record +func Float32(key string, val float32) Field { + return Field{ + key: key, + fieldType: float32Type, + numericVal: int64(math.Float32bits(val)), + } +} + +// Float64 adds a float64-valued key:value pair to a Span.LogFields() record +func Float64(key string, val float64) Field { + return Field{ + key: key, + fieldType: float64Type, + numericVal: int64(math.Float64bits(val)), + } +} + +// Error adds an error with the key "error" to a Span.LogFields() record +func Error(err error) Field { + return Field{ + key: "error", + fieldType: errorType, + interfaceVal: err, + } +} + +// Object adds an object-valued key:value pair to a Span.LogFields() record +// Please pass in an immutable object, otherwise there may be concurrency issues. +// Such as passing in the map, log.Object may result in "fatal error: concurrent map iteration and map write". +// Because span is sent asynchronously, it is possible that this map will also be modified. +func Object(key string, obj interface{}) Field { + return Field{ + key: key, + fieldType: objectType, + interfaceVal: obj, + } +} + +// LazyLogger allows for user-defined, late-bound logging of arbitrary data +type LazyLogger func(fv Encoder) + +// Lazy adds a LazyLogger to a Span.LogFields() record; the tracing +// implementation will call the LazyLogger function at an indefinite time in +// the future (after Lazy() returns). +func Lazy(ll LazyLogger) Field { + return Field{ + fieldType: lazyLoggerType, + interfaceVal: ll, + } +} + +// Noop creates a no-op log field that should be ignored by the tracer. +// It can be used to capture optional fields, for example those that should +// only be logged in non-production environment: +// +// func customerField(order *Order) log.Field { +// if os.Getenv("ENVIRONMENT") == "dev" { +// return log.String("customer", order.Customer.ID) +// } +// return log.Noop() +// } +// +// span.LogFields(log.String("event", "purchase"), customerField(order)) +// +func Noop() Field { + return Field{ + fieldType: noopType, + } +} + +// Encoder allows access to the contents of a Field (via a call to +// Field.Marshal). +// +// Tracer implementations typically provide an implementation of Encoder; +// OpenTracing callers typically do not need to concern themselves with it. +type Encoder interface { + EmitString(key, value string) + EmitBool(key string, value bool) + EmitInt(key string, value int) + EmitInt32(key string, value int32) + EmitInt64(key string, value int64) + EmitUint32(key string, value uint32) + EmitUint64(key string, value uint64) + EmitFloat32(key string, value float32) + EmitFloat64(key string, value float64) + EmitObject(key string, value interface{}) + EmitLazyLogger(value LazyLogger) +} + +// Marshal passes a Field instance through to the appropriate +// field-type-specific method of an Encoder. +func (lf Field) Marshal(visitor Encoder) { + switch lf.fieldType { + case stringType: + visitor.EmitString(lf.key, lf.stringVal) + case boolType: + visitor.EmitBool(lf.key, lf.numericVal != 0) + case intType: + visitor.EmitInt(lf.key, int(lf.numericVal)) + case int32Type: + visitor.EmitInt32(lf.key, int32(lf.numericVal)) + case int64Type: + visitor.EmitInt64(lf.key, int64(lf.numericVal)) + case uint32Type: + visitor.EmitUint32(lf.key, uint32(lf.numericVal)) + case uint64Type: + visitor.EmitUint64(lf.key, uint64(lf.numericVal)) + case float32Type: + visitor.EmitFloat32(lf.key, math.Float32frombits(uint32(lf.numericVal))) + case float64Type: + visitor.EmitFloat64(lf.key, math.Float64frombits(uint64(lf.numericVal))) + case errorType: + if err, ok := lf.interfaceVal.(error); ok { + visitor.EmitString(lf.key, err.Error()) + } else { + visitor.EmitString(lf.key, "") + } + case objectType: + visitor.EmitObject(lf.key, lf.interfaceVal) + case lazyLoggerType: + visitor.EmitLazyLogger(lf.interfaceVal.(LazyLogger)) + case noopType: + // intentionally left blank + } +} + +// Key returns the field's key. +func (lf Field) Key() string { + return lf.key +} + +// Value returns the field's value as interface{}. +func (lf Field) Value() interface{} { + switch lf.fieldType { + case stringType: + return lf.stringVal + case boolType: + return lf.numericVal != 0 + case intType: + return int(lf.numericVal) + case int32Type: + return int32(lf.numericVal) + case int64Type: + return int64(lf.numericVal) + case uint32Type: + return uint32(lf.numericVal) + case uint64Type: + return uint64(lf.numericVal) + case float32Type: + return math.Float32frombits(uint32(lf.numericVal)) + case float64Type: + return math.Float64frombits(uint64(lf.numericVal)) + case errorType, objectType, lazyLoggerType: + return lf.interfaceVal + case noopType: + return nil + default: + return nil + } +} + +// String returns a string representation of the key and value. +func (lf Field) String() string { + return fmt.Sprint(lf.key, ":", lf.Value()) +} diff --git a/vendor/github.com/opentracing/opentracing-go/log/util.go b/vendor/github.com/opentracing/opentracing-go/log/util.go new file mode 100644 index 0000000..3832feb --- /dev/null +++ b/vendor/github.com/opentracing/opentracing-go/log/util.go @@ -0,0 +1,54 @@ +package log + +import "fmt" + +// InterleavedKVToFields converts keyValues a la Span.LogKV() to a Field slice +// a la Span.LogFields(). +func InterleavedKVToFields(keyValues ...interface{}) ([]Field, error) { + if len(keyValues)%2 != 0 { + return nil, fmt.Errorf("non-even keyValues len: %d", len(keyValues)) + } + fields := make([]Field, len(keyValues)/2) + for i := 0; i*2 < len(keyValues); i++ { + key, ok := keyValues[i*2].(string) + if !ok { + return nil, fmt.Errorf( + "non-string key (pair #%d): %T", + i, keyValues[i*2]) + } + switch typedVal := keyValues[i*2+1].(type) { + case bool: + fields[i] = Bool(key, typedVal) + case string: + fields[i] = String(key, typedVal) + case int: + fields[i] = Int(key, typedVal) + case int8: + fields[i] = Int32(key, int32(typedVal)) + case int16: + fields[i] = Int32(key, int32(typedVal)) + case int32: + fields[i] = Int32(key, typedVal) + case int64: + fields[i] = Int64(key, typedVal) + case uint: + fields[i] = Uint64(key, uint64(typedVal)) + case uint64: + fields[i] = Uint64(key, typedVal) + case uint8: + fields[i] = Uint32(key, uint32(typedVal)) + case uint16: + fields[i] = Uint32(key, uint32(typedVal)) + case uint32: + fields[i] = Uint32(key, typedVal) + case float32: + fields[i] = Float32(key, typedVal) + case float64: + fields[i] = Float64(key, typedVal) + default: + // When in doubt, coerce to a string + fields[i] = String(key, fmt.Sprint(typedVal)) + } + } + return fields, nil +} diff --git a/vendor/github.com/opentracing/opentracing-go/noop.go b/vendor/github.com/opentracing/opentracing-go/noop.go new file mode 100644 index 0000000..0d32f69 --- /dev/null +++ b/vendor/github.com/opentracing/opentracing-go/noop.go @@ -0,0 +1,64 @@ +package opentracing + +import "github.com/opentracing/opentracing-go/log" + +// A NoopTracer is a trivial, minimum overhead implementation of Tracer +// for which all operations are no-ops. +// +// The primary use of this implementation is in libraries, such as RPC +// frameworks, that make tracing an optional feature controlled by the +// end user. A no-op implementation allows said libraries to use it +// as the default Tracer and to write instrumentation that does +// not need to keep checking if the tracer instance is nil. +// +// For the same reason, the NoopTracer is the default "global" tracer +// (see GlobalTracer and SetGlobalTracer functions). +// +// WARNING: NoopTracer does not support baggage propagation. +type NoopTracer struct{} + +type noopSpan struct{} +type noopSpanContext struct{} + +var ( + defaultNoopSpanContext = noopSpanContext{} + defaultNoopSpan = noopSpan{} + defaultNoopTracer = NoopTracer{} +) + +const ( + emptyString = "" +) + +// noopSpanContext: +func (n noopSpanContext) ForeachBaggageItem(handler func(k, v string) bool) {} + +// noopSpan: +func (n noopSpan) Context() SpanContext { return defaultNoopSpanContext } +func (n noopSpan) SetBaggageItem(key, val string) Span { return defaultNoopSpan } +func (n noopSpan) BaggageItem(key string) string { return emptyString } +func (n noopSpan) SetTag(key string, value interface{}) Span { return n } +func (n noopSpan) LogFields(fields ...log.Field) {} +func (n noopSpan) LogKV(keyVals ...interface{}) {} +func (n noopSpan) Finish() {} +func (n noopSpan) FinishWithOptions(opts FinishOptions) {} +func (n noopSpan) SetOperationName(operationName string) Span { return n } +func (n noopSpan) Tracer() Tracer { return defaultNoopTracer } +func (n noopSpan) LogEvent(event string) {} +func (n noopSpan) LogEventWithPayload(event string, payload interface{}) {} +func (n noopSpan) Log(data LogData) {} + +// StartSpan belongs to the Tracer interface. +func (n NoopTracer) StartSpan(operationName string, opts ...StartSpanOption) Span { + return defaultNoopSpan +} + +// Inject belongs to the Tracer interface. +func (n NoopTracer) Inject(sp SpanContext, format interface{}, carrier interface{}) error { + return nil +} + +// Extract belongs to the Tracer interface. +func (n NoopTracer) Extract(format interface{}, carrier interface{}) (SpanContext, error) { + return nil, ErrSpanContextNotFound +} diff --git a/vendor/github.com/opentracing/opentracing-go/propagation.go b/vendor/github.com/opentracing/opentracing-go/propagation.go new file mode 100644 index 0000000..b0c275e --- /dev/null +++ b/vendor/github.com/opentracing/opentracing-go/propagation.go @@ -0,0 +1,176 @@ +package opentracing + +import ( + "errors" + "net/http" +) + +/////////////////////////////////////////////////////////////////////////////// +// CORE PROPAGATION INTERFACES: +/////////////////////////////////////////////////////////////////////////////// + +var ( + // ErrUnsupportedFormat occurs when the `format` passed to Tracer.Inject() or + // Tracer.Extract() is not recognized by the Tracer implementation. + ErrUnsupportedFormat = errors.New("opentracing: Unknown or unsupported Inject/Extract format") + + // ErrSpanContextNotFound occurs when the `carrier` passed to + // Tracer.Extract() is valid and uncorrupted but has insufficient + // information to extract a SpanContext. + ErrSpanContextNotFound = errors.New("opentracing: SpanContext not found in Extract carrier") + + // ErrInvalidSpanContext errors occur when Tracer.Inject() is asked to + // operate on a SpanContext which it is not prepared to handle (for + // example, since it was created by a different tracer implementation). + ErrInvalidSpanContext = errors.New("opentracing: SpanContext type incompatible with tracer") + + // ErrInvalidCarrier errors occur when Tracer.Inject() or Tracer.Extract() + // implementations expect a different type of `carrier` than they are + // given. + ErrInvalidCarrier = errors.New("opentracing: Invalid Inject/Extract carrier") + + // ErrSpanContextCorrupted occurs when the `carrier` passed to + // Tracer.Extract() is of the expected type but is corrupted. + ErrSpanContextCorrupted = errors.New("opentracing: SpanContext data corrupted in Extract carrier") +) + +/////////////////////////////////////////////////////////////////////////////// +// BUILTIN PROPAGATION FORMATS: +/////////////////////////////////////////////////////////////////////////////// + +// BuiltinFormat is used to demarcate the values within package `opentracing` +// that are intended for use with the Tracer.Inject() and Tracer.Extract() +// methods. +type BuiltinFormat byte + +const ( + // Binary represents SpanContexts as opaque binary data. + // + // For Tracer.Inject(): the carrier must be an `io.Writer`. + // + // For Tracer.Extract(): the carrier must be an `io.Reader`. + Binary BuiltinFormat = iota + + // TextMap represents SpanContexts as key:value string pairs. + // + // Unlike HTTPHeaders, the TextMap format does not restrict the key or + // value character sets in any way. + // + // For Tracer.Inject(): the carrier must be a `TextMapWriter`. + // + // For Tracer.Extract(): the carrier must be a `TextMapReader`. + TextMap + + // HTTPHeaders represents SpanContexts as HTTP header string pairs. + // + // Unlike TextMap, the HTTPHeaders format requires that the keys and values + // be valid as HTTP headers as-is (i.e., character casing may be unstable + // and special characters are disallowed in keys, values should be + // URL-escaped, etc). + // + // For Tracer.Inject(): the carrier must be a `TextMapWriter`. + // + // For Tracer.Extract(): the carrier must be a `TextMapReader`. + // + // See HTTPHeadersCarrier for an implementation of both TextMapWriter + // and TextMapReader that defers to an http.Header instance for storage. + // For example, Inject(): + // + // carrier := opentracing.HTTPHeadersCarrier(httpReq.Header) + // err := span.Tracer().Inject( + // span.Context(), opentracing.HTTPHeaders, carrier) + // + // Or Extract(): + // + // carrier := opentracing.HTTPHeadersCarrier(httpReq.Header) + // clientContext, err := tracer.Extract( + // opentracing.HTTPHeaders, carrier) + // + HTTPHeaders +) + +// TextMapWriter is the Inject() carrier for the TextMap builtin format. With +// it, the caller can encode a SpanContext for propagation as entries in a map +// of unicode strings. +type TextMapWriter interface { + // Set a key:value pair to the carrier. Multiple calls to Set() for the + // same key leads to undefined behavior. + // + // NOTE: The backing store for the TextMapWriter may contain data unrelated + // to SpanContext. As such, Inject() and Extract() implementations that + // call the TextMapWriter and TextMapReader interfaces must agree on a + // prefix or other convention to distinguish their own key:value pairs. + Set(key, val string) +} + +// TextMapReader is the Extract() carrier for the TextMap builtin format. With it, +// the caller can decode a propagated SpanContext as entries in a map of +// unicode strings. +type TextMapReader interface { + // ForeachKey returns TextMap contents via repeated calls to the `handler` + // function. If any call to `handler` returns a non-nil error, ForeachKey + // terminates and returns that error. + // + // NOTE: The backing store for the TextMapReader may contain data unrelated + // to SpanContext. As such, Inject() and Extract() implementations that + // call the TextMapWriter and TextMapReader interfaces must agree on a + // prefix or other convention to distinguish their own key:value pairs. + // + // The "foreach" callback pattern reduces unnecessary copying in some cases + // and also allows implementations to hold locks while the map is read. + ForeachKey(handler func(key, val string) error) error +} + +// TextMapCarrier allows the use of regular map[string]string +// as both TextMapWriter and TextMapReader. +type TextMapCarrier map[string]string + +// ForeachKey conforms to the TextMapReader interface. +func (c TextMapCarrier) ForeachKey(handler func(key, val string) error) error { + for k, v := range c { + if err := handler(k, v); err != nil { + return err + } + } + return nil +} + +// Set implements Set() of opentracing.TextMapWriter +func (c TextMapCarrier) Set(key, val string) { + c[key] = val +} + +// HTTPHeadersCarrier satisfies both TextMapWriter and TextMapReader. +// +// Example usage for server side: +// +// carrier := opentracing.HTTPHeadersCarrier(httpReq.Header) +// clientContext, err := tracer.Extract(opentracing.HTTPHeaders, carrier) +// +// Example usage for client side: +// +// carrier := opentracing.HTTPHeadersCarrier(httpReq.Header) +// err := tracer.Inject( +// span.Context(), +// opentracing.HTTPHeaders, +// carrier) +// +type HTTPHeadersCarrier http.Header + +// Set conforms to the TextMapWriter interface. +func (c HTTPHeadersCarrier) Set(key, val string) { + h := http.Header(c) + h.Set(key, val) +} + +// ForeachKey conforms to the TextMapReader interface. +func (c HTTPHeadersCarrier) ForeachKey(handler func(key, val string) error) error { + for k, vals := range c { + for _, v := range vals { + if err := handler(k, v); err != nil { + return err + } + } + } + return nil +} diff --git a/vendor/github.com/opentracing/opentracing-go/span.go b/vendor/github.com/opentracing/opentracing-go/span.go new file mode 100644 index 0000000..0d3fb53 --- /dev/null +++ b/vendor/github.com/opentracing/opentracing-go/span.go @@ -0,0 +1,189 @@ +package opentracing + +import ( + "time" + + "github.com/opentracing/opentracing-go/log" +) + +// SpanContext represents Span state that must propagate to descendant Spans and across process +// boundaries (e.g., a tuple). +type SpanContext interface { + // ForeachBaggageItem grants access to all baggage items stored in the + // SpanContext. + // The handler function will be called for each baggage key/value pair. + // The ordering of items is not guaranteed. + // + // The bool return value indicates if the handler wants to continue iterating + // through the rest of the baggage items; for example if the handler is trying to + // find some baggage item by pattern matching the name, it can return false + // as soon as the item is found to stop further iterations. + ForeachBaggageItem(handler func(k, v string) bool) +} + +// Span represents an active, un-finished span in the OpenTracing system. +// +// Spans are created by the Tracer interface. +type Span interface { + // Sets the end timestamp and finalizes Span state. + // + // With the exception of calls to Context() (which are always allowed), + // Finish() must be the last call made to any span instance, and to do + // otherwise leads to undefined behavior. + Finish() + // FinishWithOptions is like Finish() but with explicit control over + // timestamps and log data. + FinishWithOptions(opts FinishOptions) + + // Context() yields the SpanContext for this Span. Note that the return + // value of Context() is still valid after a call to Span.Finish(), as is + // a call to Span.Context() after a call to Span.Finish(). + Context() SpanContext + + // Sets or changes the operation name. + // + // Returns a reference to this Span for chaining. + SetOperationName(operationName string) Span + + // Adds a tag to the span. + // + // If there is a pre-existing tag set for `key`, it is overwritten. + // + // Tag values can be numeric types, strings, or bools. The behavior of + // other tag value types is undefined at the OpenTracing level. If a + // tracing system does not know how to handle a particular value type, it + // may ignore the tag, but shall not panic. + // + // Returns a reference to this Span for chaining. + SetTag(key string, value interface{}) Span + + // LogFields is an efficient and type-checked way to record key:value + // logging data about a Span, though the programming interface is a little + // more verbose than LogKV(). Here's an example: + // + // span.LogFields( + // log.String("event", "soft error"), + // log.String("type", "cache timeout"), + // log.Int("waited.millis", 1500)) + // + // Also see Span.FinishWithOptions() and FinishOptions.BulkLogData. + LogFields(fields ...log.Field) + + // LogKV is a concise, readable way to record key:value logging data about + // a Span, though unfortunately this also makes it less efficient and less + // type-safe than LogFields(). Here's an example: + // + // span.LogKV( + // "event", "soft error", + // "type", "cache timeout", + // "waited.millis", 1500) + // + // For LogKV (as opposed to LogFields()), the parameters must appear as + // key-value pairs, like + // + // span.LogKV(key1, val1, key2, val2, key3, val3, ...) + // + // The keys must all be strings. The values may be strings, numeric types, + // bools, Go error instances, or arbitrary structs. + // + // (Note to implementors: consider the log.InterleavedKVToFields() helper) + LogKV(alternatingKeyValues ...interface{}) + + // SetBaggageItem sets a key:value pair on this Span and its SpanContext + // that also propagates to descendants of this Span. + // + // SetBaggageItem() enables powerful functionality given a full-stack + // opentracing integration (e.g., arbitrary application data from a mobile + // app can make it, transparently, all the way into the depths of a storage + // system), and with it some powerful costs: use this feature with care. + // + // IMPORTANT NOTE #1: SetBaggageItem() will only propagate baggage items to + // *future* causal descendants of the associated Span. + // + // IMPORTANT NOTE #2: Use this thoughtfully and with care. Every key and + // value is copied into every local *and remote* child of the associated + // Span, and that can add up to a lot of network and cpu overhead. + // + // Returns a reference to this Span for chaining. + SetBaggageItem(restrictedKey, value string) Span + + // Gets the value for a baggage item given its key. Returns the empty string + // if the value isn't found in this Span. + BaggageItem(restrictedKey string) string + + // Provides access to the Tracer that created this Span. + Tracer() Tracer + + // Deprecated: use LogFields or LogKV + LogEvent(event string) + // Deprecated: use LogFields or LogKV + LogEventWithPayload(event string, payload interface{}) + // Deprecated: use LogFields or LogKV + Log(data LogData) +} + +// LogRecord is data associated with a single Span log. Every LogRecord +// instance must specify at least one Field. +type LogRecord struct { + Timestamp time.Time + Fields []log.Field +} + +// FinishOptions allows Span.FinishWithOptions callers to override the finish +// timestamp and provide log data via a bulk interface. +type FinishOptions struct { + // FinishTime overrides the Span's finish time, or implicitly becomes + // time.Now() if FinishTime.IsZero(). + // + // FinishTime must resolve to a timestamp that's >= the Span's StartTime + // (per StartSpanOptions). + FinishTime time.Time + + // LogRecords allows the caller to specify the contents of many LogFields() + // calls with a single slice. May be nil. + // + // None of the LogRecord.Timestamp values may be .IsZero() (i.e., they must + // be set explicitly). Also, they must be >= the Span's start timestamp and + // <= the FinishTime (or time.Now() if FinishTime.IsZero()). Otherwise the + // behavior of FinishWithOptions() is undefined. + // + // If specified, the caller hands off ownership of LogRecords at + // FinishWithOptions() invocation time. + // + // If specified, the (deprecated) BulkLogData must be nil or empty. + LogRecords []LogRecord + + // BulkLogData is DEPRECATED. + BulkLogData []LogData +} + +// LogData is DEPRECATED +type LogData struct { + Timestamp time.Time + Event string + Payload interface{} +} + +// ToLogRecord converts a deprecated LogData to a non-deprecated LogRecord +func (ld *LogData) ToLogRecord() LogRecord { + var literalTimestamp time.Time + if ld.Timestamp.IsZero() { + literalTimestamp = time.Now() + } else { + literalTimestamp = ld.Timestamp + } + rval := LogRecord{ + Timestamp: literalTimestamp, + } + if ld.Payload == nil { + rval.Fields = []log.Field{ + log.String("event", ld.Event), + } + } else { + rval.Fields = []log.Field{ + log.String("event", ld.Event), + log.Object("payload", ld.Payload), + } + } + return rval +} diff --git a/vendor/github.com/opentracing/opentracing-go/tracer.go b/vendor/github.com/opentracing/opentracing-go/tracer.go new file mode 100644 index 0000000..715f0ce --- /dev/null +++ b/vendor/github.com/opentracing/opentracing-go/tracer.go @@ -0,0 +1,304 @@ +package opentracing + +import "time" + +// Tracer is a simple, thin interface for Span creation and SpanContext +// propagation. +type Tracer interface { + + // Create, start, and return a new Span with the given `operationName` and + // incorporate the given StartSpanOption `opts`. (Note that `opts` borrows + // from the "functional options" pattern, per + // http://dave.cheney.net/2014/10/17/functional-options-for-friendly-apis) + // + // A Span with no SpanReference options (e.g., opentracing.ChildOf() or + // opentracing.FollowsFrom()) becomes the root of its own trace. + // + // Examples: + // + // var tracer opentracing.Tracer = ... + // + // // The root-span case: + // sp := tracer.StartSpan("GetFeed") + // + // // The vanilla child span case: + // sp := tracer.StartSpan( + // "GetFeed", + // opentracing.ChildOf(parentSpan.Context())) + // + // // All the bells and whistles: + // sp := tracer.StartSpan( + // "GetFeed", + // opentracing.ChildOf(parentSpan.Context()), + // opentracing.Tag{"user_agent", loggedReq.UserAgent}, + // opentracing.StartTime(loggedReq.Timestamp), + // ) + // + StartSpan(operationName string, opts ...StartSpanOption) Span + + // Inject() takes the `sm` SpanContext instance and injects it for + // propagation within `carrier`. The actual type of `carrier` depends on + // the value of `format`. + // + // OpenTracing defines a common set of `format` values (see BuiltinFormat), + // and each has an expected carrier type. + // + // Other packages may declare their own `format` values, much like the keys + // used by `context.Context` (see https://godoc.org/context#WithValue). + // + // Example usage (sans error handling): + // + // carrier := opentracing.HTTPHeadersCarrier(httpReq.Header) + // err := tracer.Inject( + // span.Context(), + // opentracing.HTTPHeaders, + // carrier) + // + // NOTE: All opentracing.Tracer implementations MUST support all + // BuiltinFormats. + // + // Implementations may return opentracing.ErrUnsupportedFormat if `format` + // is not supported by (or not known by) the implementation. + // + // Implementations may return opentracing.ErrInvalidCarrier or any other + // implementation-specific error if the format is supported but injection + // fails anyway. + // + // See Tracer.Extract(). + Inject(sm SpanContext, format interface{}, carrier interface{}) error + + // Extract() returns a SpanContext instance given `format` and `carrier`. + // + // OpenTracing defines a common set of `format` values (see BuiltinFormat), + // and each has an expected carrier type. + // + // Other packages may declare their own `format` values, much like the keys + // used by `context.Context` (see + // https://godoc.org/golang.org/x/net/context#WithValue). + // + // Example usage (with StartSpan): + // + // + // carrier := opentracing.HTTPHeadersCarrier(httpReq.Header) + // clientContext, err := tracer.Extract(opentracing.HTTPHeaders, carrier) + // + // // ... assuming the ultimate goal here is to resume the trace with a + // // server-side Span: + // var serverSpan opentracing.Span + // if err == nil { + // span = tracer.StartSpan( + // rpcMethodName, ext.RPCServerOption(clientContext)) + // } else { + // span = tracer.StartSpan(rpcMethodName) + // } + // + // + // NOTE: All opentracing.Tracer implementations MUST support all + // BuiltinFormats. + // + // Return values: + // - A successful Extract returns a SpanContext instance and a nil error + // - If there was simply no SpanContext to extract in `carrier`, Extract() + // returns (nil, opentracing.ErrSpanContextNotFound) + // - If `format` is unsupported or unrecognized, Extract() returns (nil, + // opentracing.ErrUnsupportedFormat) + // - If there are more fundamental problems with the `carrier` object, + // Extract() may return opentracing.ErrInvalidCarrier, + // opentracing.ErrSpanContextCorrupted, or implementation-specific + // errors. + // + // See Tracer.Inject(). + Extract(format interface{}, carrier interface{}) (SpanContext, error) +} + +// StartSpanOptions allows Tracer.StartSpan() callers and implementors a +// mechanism to override the start timestamp, specify Span References, and make +// a single Tag or multiple Tags available at Span start time. +// +// StartSpan() callers should look at the StartSpanOption interface and +// implementations available in this package. +// +// Tracer implementations can convert a slice of `StartSpanOption` instances +// into a `StartSpanOptions` struct like so: +// +// func StartSpan(opName string, opts ...opentracing.StartSpanOption) { +// sso := opentracing.StartSpanOptions{} +// for _, o := range opts { +// o.Apply(&sso) +// } +// ... +// } +// +type StartSpanOptions struct { + // Zero or more causal references to other Spans (via their SpanContext). + // If empty, start a "root" Span (i.e., start a new trace). + References []SpanReference + + // StartTime overrides the Span's start time, or implicitly becomes + // time.Now() if StartTime.IsZero(). + StartTime time.Time + + // Tags may have zero or more entries; the restrictions on map values are + // identical to those for Span.SetTag(). May be nil. + // + // If specified, the caller hands off ownership of Tags at + // StartSpan() invocation time. + Tags map[string]interface{} +} + +// StartSpanOption instances (zero or more) may be passed to Tracer.StartSpan. +// +// StartSpanOption borrows from the "functional options" pattern, per +// http://dave.cheney.net/2014/10/17/functional-options-for-friendly-apis +type StartSpanOption interface { + Apply(*StartSpanOptions) +} + +// SpanReferenceType is an enum type describing different categories of +// relationships between two Spans. If Span-2 refers to Span-1, the +// SpanReferenceType describes Span-1 from Span-2's perspective. For example, +// ChildOfRef means that Span-1 created Span-2. +// +// NOTE: Span-1 and Span-2 do *not* necessarily depend on each other for +// completion; e.g., Span-2 may be part of a background job enqueued by Span-1, +// or Span-2 may be sitting in a distributed queue behind Span-1. +type SpanReferenceType int + +const ( + // ChildOfRef refers to a parent Span that caused *and* somehow depends + // upon the new child Span. Often (but not always), the parent Span cannot + // finish until the child Span does. + // + // An timing diagram for a ChildOfRef that's blocked on the new Span: + // + // [-Parent Span---------] + // [-Child Span----] + // + // See http://opentracing.io/spec/ + // + // See opentracing.ChildOf() + ChildOfRef SpanReferenceType = iota + + // FollowsFromRef refers to a parent Span that does not depend in any way + // on the result of the new child Span. For instance, one might use + // FollowsFromRefs to describe pipeline stages separated by queues, + // or a fire-and-forget cache insert at the tail end of a web request. + // + // A FollowsFromRef Span is part of the same logical trace as the new Span: + // i.e., the new Span is somehow caused by the work of its FollowsFromRef. + // + // All of the following could be valid timing diagrams for children that + // "FollowFrom" a parent. + // + // [-Parent Span-] [-Child Span-] + // + // + // [-Parent Span--] + // [-Child Span-] + // + // + // [-Parent Span-] + // [-Child Span-] + // + // See http://opentracing.io/spec/ + // + // See opentracing.FollowsFrom() + FollowsFromRef +) + +// SpanReference is a StartSpanOption that pairs a SpanReferenceType and a +// referenced SpanContext. See the SpanReferenceType documentation for +// supported relationships. If SpanReference is created with +// ReferencedContext==nil, it has no effect. Thus it allows for a more concise +// syntax for starting spans: +// +// sc, _ := tracer.Extract(someFormat, someCarrier) +// span := tracer.StartSpan("operation", opentracing.ChildOf(sc)) +// +// The `ChildOf(sc)` option above will not panic if sc == nil, it will just +// not add the parent span reference to the options. +type SpanReference struct { + Type SpanReferenceType + ReferencedContext SpanContext +} + +// Apply satisfies the StartSpanOption interface. +func (r SpanReference) Apply(o *StartSpanOptions) { + if r.ReferencedContext != nil { + o.References = append(o.References, r) + } +} + +// ChildOf returns a StartSpanOption pointing to a dependent parent span. +// If sc == nil, the option has no effect. +// +// See ChildOfRef, SpanReference +func ChildOf(sc SpanContext) SpanReference { + return SpanReference{ + Type: ChildOfRef, + ReferencedContext: sc, + } +} + +// FollowsFrom returns a StartSpanOption pointing to a parent Span that caused +// the child Span but does not directly depend on its result in any way. +// If sc == nil, the option has no effect. +// +// See FollowsFromRef, SpanReference +func FollowsFrom(sc SpanContext) SpanReference { + return SpanReference{ + Type: FollowsFromRef, + ReferencedContext: sc, + } +} + +// StartTime is a StartSpanOption that sets an explicit start timestamp for the +// new Span. +type StartTime time.Time + +// Apply satisfies the StartSpanOption interface. +func (t StartTime) Apply(o *StartSpanOptions) { + o.StartTime = time.Time(t) +} + +// Tags are a generic map from an arbitrary string key to an opaque value type. +// The underlying tracing system is responsible for interpreting and +// serializing the values. +type Tags map[string]interface{} + +// Apply satisfies the StartSpanOption interface. +func (t Tags) Apply(o *StartSpanOptions) { + if o.Tags == nil { + o.Tags = make(map[string]interface{}) + } + for k, v := range t { + o.Tags[k] = v + } +} + +// Tag may be passed as a StartSpanOption to add a tag to new spans, +// or its Set method may be used to apply the tag to an existing Span, +// for example: +// +// tracer.StartSpan("opName", Tag{"Key", value}) +// +// or +// +// Tag{"key", value}.Set(span) +type Tag struct { + Key string + Value interface{} +} + +// Apply satisfies the StartSpanOption interface. +func (t Tag) Apply(o *StartSpanOptions) { + if o.Tags == nil { + o.Tags = make(map[string]interface{}) + } + o.Tags[t.Key] = t.Value +} + +// Set applies the tag to an existing Span. +func (t Tag) Set(s Span) { + s.SetTag(t.Key, t.Value) +} diff --git a/vendor/github.com/pingcap/errors/LICENSE b/vendor/github.com/pingcap/errors/LICENSE new file mode 100644 index 0000000..835ba3e --- /dev/null +++ b/vendor/github.com/pingcap/errors/LICENSE @@ -0,0 +1,23 @@ +Copyright (c) 2015, Dave Cheney +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/pingcap/errors/README.md b/vendor/github.com/pingcap/errors/README.md new file mode 100644 index 0000000..6483ba2 --- /dev/null +++ b/vendor/github.com/pingcap/errors/README.md @@ -0,0 +1,52 @@ +# errors [![Travis-CI](https://travis-ci.org/pkg/errors.svg)](https://travis-ci.org/pkg/errors) [![AppVeyor](https://ci.appveyor.com/api/projects/status/b98mptawhudj53ep/branch/master?svg=true)](https://ci.appveyor.com/project/davecheney/errors/branch/master) [![GoDoc](https://godoc.org/github.com/pkg/errors?status.svg)](http://godoc.org/github.com/pkg/errors) [![Report card](https://goreportcard.com/badge/github.com/pkg/errors)](https://goreportcard.com/report/github.com/pkg/errors) [![Sourcegraph](https://sourcegraph.com/github.com/pkg/errors/-/badge.svg)](https://sourcegraph.com/github.com/pkg/errors?badge) + +Package errors provides simple error handling primitives. + +`go get github.com/pkg/errors` + +The traditional error handling idiom in Go is roughly akin to +```go +if err != nil { + return err +} +``` +which applied recursively up the call stack results in error reports without context or debugging information. The errors package allows programmers to add context to the failure path in their code in a way that does not destroy the original value of the error. + +## Adding context to an error + +The errors.Wrap function returns a new error that adds context to the original error. For example +```go +_, err := ioutil.ReadAll(r) +if err != nil { + return errors.Wrap(err, "read failed") +} +``` +## Retrieving the cause of an error + +Using `errors.Wrap` constructs a stack of errors, adding context to the preceding error. Depending on the nature of the error it may be necessary to reverse the operation of errors.Wrap to retrieve the original error for inspection. Any error value which implements this interface can be inspected by `errors.Cause`. +```go +type causer interface { + Cause() error +} +``` +`errors.Cause` will recursively retrieve the topmost error which does not implement `causer`, which is assumed to be the original cause. For example: +```go +switch err := errors.Cause(err).(type) { +case *MyError: + // handle specifically +default: + // unknown error +} +``` + +[Read the package documentation for more information](https://godoc.org/github.com/pkg/errors). + +## Contributing + +We welcome pull requests, bug fixes and issue reports. With that said, the bar for adding new symbols to this package is intentionally set high. + +Before proposing a change, please discuss your change by raising an issue. + +## License + +BSD-2-Clause diff --git a/vendor/github.com/pingcap/errors/appveyor.yml b/vendor/github.com/pingcap/errors/appveyor.yml new file mode 100644 index 0000000..a932ead --- /dev/null +++ b/vendor/github.com/pingcap/errors/appveyor.yml @@ -0,0 +1,32 @@ +version: build-{build}.{branch} + +clone_folder: C:\gopath\src\github.com\pkg\errors +shallow_clone: true # for startup speed + +environment: + GOPATH: C:\gopath + +platform: + - x64 + +# http://www.appveyor.com/docs/installed-software +install: + # some helpful output for debugging builds + - go version + - go env + # pre-installed MinGW at C:\MinGW is 32bit only + # but MSYS2 at C:\msys64 has mingw64 + - set PATH=C:\msys64\mingw64\bin;%PATH% + - gcc --version + - g++ --version + +build_script: + - go install -v ./... + +test_script: + - set PATH=C:\gopath\bin;%PATH% + - go test -v ./... + +#artifacts: +# - path: '%GOPATH%\bin\*.exe' +deploy: off diff --git a/vendor/github.com/pingcap/errors/errors.go b/vendor/github.com/pingcap/errors/errors.go new file mode 100644 index 0000000..2e1d3f6 --- /dev/null +++ b/vendor/github.com/pingcap/errors/errors.go @@ -0,0 +1,324 @@ +// Package errors provides simple error handling primitives. +// +// The traditional error handling idiom in Go is roughly akin to +// +// if err != nil { +// return err +// } +// +// which applied recursively up the call stack results in error reports +// without context or debugging information. The errors package allows +// programmers to add context to the failure path in their code in a way +// that does not destroy the original value of the error. +// +// Adding context to an error +// +// The errors.Annotate function returns a new error that adds context to the +// original error by recording a stack trace at the point Annotate is called, +// and the supplied message. For example +// +// _, err := ioutil.ReadAll(r) +// if err != nil { +// return errors.Annotate(err, "read failed") +// } +// +// If additional control is required the errors.AddStack and errors.WithMessage +// functions destructure errors.Annotate into its component operations of annotating +// an error with a stack trace and an a message, respectively. +// +// Retrieving the cause of an error +// +// Using errors.Annotate constructs a stack of errors, adding context to the +// preceding error. Depending on the nature of the error it may be necessary +// to reverse the operation of errors.Annotate to retrieve the original error +// for inspection. Any error value which implements this interface +// +// type causer interface { +// Cause() error +// } +// +// can be inspected by errors.Cause. errors.Cause will recursively retrieve +// the topmost error which does not implement causer, which is assumed to be +// the original cause. For example: +// +// switch err := errors.Cause(err).(type) { +// case *MyError: +// // handle specifically +// default: +// // unknown error +// } +// +// causer interface is not exported by this package, but is considered a part +// of stable public API. +// errors.Unwrap is also available: this will retrieve the next error in the chain. +// +// Formatted printing of errors +// +// All error values returned from this package implement fmt.Formatter and can +// be formatted by the fmt package. The following verbs are supported +// +// %s print the error. If the error has a Cause it will be +// printed recursively +// %v see %s +// %+v extended format. Each Frame of the error's StackTrace will +// be printed in detail. +// +// Retrieving the stack trace of an error or wrapper +// +// New, Errorf, Annotate, and Annotatef record a stack trace at the point they are invoked. +// This information can be retrieved with the StackTracer interface that returns +// a StackTrace. Where errors.StackTrace is defined as +// +// type StackTrace []Frame +// +// The Frame type represents a call site in the stack trace. Frame supports +// the fmt.Formatter interface that can be used for printing information about +// the stack trace of this error. For example: +// +// if stacked := errors.GetStackTracer(err); stacked != nil { +// for _, f := range stacked.StackTrace() { +// fmt.Printf("%+s:%d", f) +// } +// } +// +// See the documentation for Frame.Format for more details. +// +// errors.Find can be used to search for an error in the error chain. +package errors + +import ( + "fmt" + "io" +) + +// New returns an error with the supplied message. +// New also records the stack trace at the point it was called. +func New(message string) error { + return &fundamental{ + msg: message, + stack: callers(), + } +} + +// Errorf formats according to a format specifier and returns the string +// as a value that satisfies error. +// Errorf also records the stack trace at the point it was called. +func Errorf(format string, args ...interface{}) error { + return &fundamental{ + msg: fmt.Sprintf(format, args...), + stack: callers(), + } +} + +// StackTraceAware is an optimization to avoid repetitive traversals of an error chain. +// HasStack checks for this marker first. +// Annotate/Wrap and Annotatef/Wrapf will produce this marker. +type StackTraceAware interface { + HasStack() bool +} + +// HasStack tells whether a StackTracer exists in the error chain +func HasStack(err error) bool { + if errWithStack, ok := err.(StackTraceAware); ok { + return errWithStack.HasStack() + } + return GetStackTracer(err) != nil +} + +// fundamental is an error that has a message and a stack, but no caller. +type fundamental struct { + msg string + *stack +} + +func (f *fundamental) Error() string { return f.msg } + +func (f *fundamental) Format(s fmt.State, verb rune) { + switch verb { + case 'v': + if s.Flag('+') { + io.WriteString(s, f.msg) + f.stack.Format(s, verb) + return + } + fallthrough + case 's': + io.WriteString(s, f.msg) + case 'q': + fmt.Fprintf(s, "%q", f.msg) + } +} + +// WithStack annotates err with a stack trace at the point WithStack was called. +// If err is nil, WithStack returns nil. +// +// For most use cases this is deprecated and AddStack should be used (which will ensure just one stack trace). +// However, one may want to use this in some situations, for example to create a 2nd trace across a goroutine. +func WithStack(err error) error { + if err == nil { + return nil + } + + return &withStack{ + err, + callers(), + } +} + +// AddStack is similar to WithStack. +// However, it will first check with HasStack to see if a stack trace already exists in the causer chain before creating another one. +func AddStack(err error) error { + if HasStack(err) { + return err + } + return WithStack(err) +} + +type withStack struct { + error + *stack +} + +func (w *withStack) Cause() error { return w.error } + +func (w *withStack) Format(s fmt.State, verb rune) { + switch verb { + case 'v': + if s.Flag('+') { + fmt.Fprintf(s, "%+v", w.Cause()) + w.stack.Format(s, verb) + return + } + fallthrough + case 's': + io.WriteString(s, w.Error()) + case 'q': + fmt.Fprintf(s, "%q", w.Error()) + } +} + +// Wrap returns an error annotating err with a stack trace +// at the point Wrap is called, and the supplied message. +// If err is nil, Wrap returns nil. +// +// For most use cases this is deprecated in favor of Annotate. +// Annotate avoids creating duplicate stack traces. +func Wrap(err error, message string) error { + if err == nil { + return nil + } + hasStack := HasStack(err) + err = &withMessage{ + cause: err, + msg: message, + causeHasStack: hasStack, + } + return &withStack{ + err, + callers(), + } +} + +// Wrapf returns an error annotating err with a stack trace +// at the point Wrapf is call, and the format specifier. +// If err is nil, Wrapf returns nil. +// +// For most use cases this is deprecated in favor of Annotatef. +// Annotatef avoids creating duplicate stack traces. +func Wrapf(err error, format string, args ...interface{}) error { + if err == nil { + return nil + } + hasStack := HasStack(err) + err = &withMessage{ + cause: err, + msg: fmt.Sprintf(format, args...), + causeHasStack: hasStack, + } + return &withStack{ + err, + callers(), + } +} + +// WithMessage annotates err with a new message. +// If err is nil, WithMessage returns nil. +func WithMessage(err error, message string) error { + if err == nil { + return nil + } + return &withMessage{ + cause: err, + msg: message, + causeHasStack: HasStack(err), + } +} + +type withMessage struct { + cause error + msg string + causeHasStack bool +} + +func (w *withMessage) Error() string { return w.msg + ": " + w.cause.Error() } +func (w *withMessage) Cause() error { return w.cause } +func (w *withMessage) HasStack() bool { return w.causeHasStack } + +func (w *withMessage) Format(s fmt.State, verb rune) { + switch verb { + case 'v': + if s.Flag('+') { + fmt.Fprintf(s, "%+v\n", w.Cause()) + io.WriteString(s, w.msg) + return + } + fallthrough + case 's', 'q': + io.WriteString(s, w.Error()) + } +} + +// Cause returns the underlying cause of the error, if possible. +// An error value has a cause if it implements the following +// interface: +// +// type causer interface { +// Cause() error +// } +// +// If the error does not implement Cause, the original error will +// be returned. If the error is nil, nil will be returned without further +// investigation. +func Cause(err error) error { + cause := Unwrap(err) + if cause == nil { + return err + } + return Cause(cause) +} + +// Unwrap uses causer to return the next error in the chain or nil. +// This goes one-level deeper, whereas Cause goes as far as possible +func Unwrap(err error) error { + type causer interface { + Cause() error + } + if unErr, ok := err.(causer); ok { + return unErr.Cause() + } + return nil +} + +// Find an error in the chain that matches a test function. +// returns nil if no error is found. +func Find(origErr error, test func(error) bool) error { + var foundErr error + WalkDeep(origErr, func(err error) bool { + if test(err) { + foundErr = err + return true + } + return false + }) + return foundErr +} diff --git a/vendor/github.com/pingcap/errors/group.go b/vendor/github.com/pingcap/errors/group.go new file mode 100644 index 0000000..e5a969a --- /dev/null +++ b/vendor/github.com/pingcap/errors/group.go @@ -0,0 +1,42 @@ +package errors + +// ErrorGroup is an interface for multiple errors that are not a chain. +// This happens for example when executing multiple operations in parallel. +type ErrorGroup interface { + Errors() []error +} + +// Errors uses the ErrorGroup interface to return a slice of errors. +// If the ErrorGroup interface is not implemented it returns an array containing just the given error. +func Errors(err error) []error { + if eg, ok := err.(ErrorGroup); ok { + return eg.Errors() + } + return []error{err} +} + +// WalkDeep does a depth-first traversal of all errors. +// Any ErrorGroup is traversed (after going deep). +// The visitor function can return true to end the traversal early +// In that case, WalkDeep will return true, otherwise false. +func WalkDeep(err error, visitor func(err error) bool) bool { + // Go deep + unErr := err + for unErr != nil { + if done := visitor(unErr); done { + return true + } + unErr = Unwrap(unErr) + } + + // Go wide + if group, ok := err.(ErrorGroup); ok { + for _, err := range group.Errors() { + if early := WalkDeep(err, visitor); early { + return true + } + } + } + + return false +} diff --git a/vendor/github.com/pingcap/errors/juju_adaptor.go b/vendor/github.com/pingcap/errors/juju_adaptor.go new file mode 100644 index 0000000..ece86cd --- /dev/null +++ b/vendor/github.com/pingcap/errors/juju_adaptor.go @@ -0,0 +1,145 @@ +package errors + +import ( + "fmt" + "strings" +) + +// ==================== juju adaptor start ======================== + +// Trace just calls AddStack. +func Trace(err error) error { + if err == nil { + return nil + } + return AddStack(err) +} + +// Annotate adds a message and ensures there is a stack trace. +func Annotate(err error, message string) error { + if err == nil { + return nil + } + hasStack := HasStack(err) + err = &withMessage{ + cause: err, + msg: message, + causeHasStack: hasStack, + } + if hasStack { + return err + } + return &withStack{ + err, + callers(), + } +} + +// Annotatef adds a message and ensures there is a stack trace. +func Annotatef(err error, format string, args ...interface{}) error { + if err == nil { + return nil + } + hasStack := HasStack(err) + err = &withMessage{ + cause: err, + msg: fmt.Sprintf(format, args...), + causeHasStack: hasStack, + } + if hasStack { + return err + } + return &withStack{ + err, + callers(), + } +} + +var emptyStack stack + +// NewNoStackError creates error without error stack +// later duplicate trace will no longer generate Stack too. +func NewNoStackError(msg string) error { + return &fundamental{ + msg: msg, + stack: &emptyStack, + } +} + +// SuspendStack suspends stack generate for error. +func SuspendStack(err error) error { + if err == nil { + return err + } + cleared := clearStack(err) + if cleared { + return err + } + return &withStack{ + err, + &emptyStack, + } +} + +func clearStack(err error) (cleared bool) { + switch typedErr := err.(type) { + case *withMessage: + return clearStack(typedErr.Cause()) + case *fundamental: + typedErr.stack = &emptyStack + return true + case *withStack: + typedErr.stack = &emptyStack + clearStack(typedErr.Cause()) + return true + default: + return false + } +} + +// ErrorStack will format a stack trace if it is available, otherwise it will be Error() +// If the error is nil, the empty string is returned +// Note that this just calls fmt.Sprintf("%+v", err) +func ErrorStack(err error) string { + if err == nil { + return "" + } + return fmt.Sprintf("%+v", err) +} + +// IsNotFound reports whether err was not found error. +func IsNotFound(err error) bool { + return strings.Contains(err.Error(), "not found") +} + +// NotFoundf represents an error with not found message. +func NotFoundf(format string, args ...interface{}) error { + return Errorf(format+" not found", args...) +} + +// BadRequestf represents an error with bad request message. +func BadRequestf(format string, args ...interface{}) error { + return Errorf(format+" bad request", args...) +} + +// NotSupportedf represents an error with not supported message. +func NotSupportedf(format string, args ...interface{}) error { + return Errorf(format+" not supported", args...) +} + +// NotValidf represents an error with not valid message. +func NotValidf(format string, args ...interface{}) error { + return Errorf(format+" not valid", args...) +} + +// IsAlreadyExists reports whether err was already exists error. +func IsAlreadyExists(err error) bool { + return strings.Contains(err.Error(), "already exists") +} + +// AlreadyExistsf represents an error with already exists message. +func AlreadyExistsf(format string, args ...interface{}) error { + return Errorf(format+" already exists", args...) +} + +// ==================== juju adaptor end ======================== diff --git a/vendor/github.com/pingcap/errors/stack.go b/vendor/github.com/pingcap/errors/stack.go new file mode 100644 index 0000000..bb1e6a8 --- /dev/null +++ b/vendor/github.com/pingcap/errors/stack.go @@ -0,0 +1,226 @@ +package errors + +import ( + "bytes" + "fmt" + "io" + "path" + "runtime" + "strconv" + "strings" +) + +// StackTracer retrieves the StackTrace +// Generally you would want to use the GetStackTracer function to do that. +type StackTracer interface { + StackTrace() StackTrace +} + +// GetStackTracer will return the first StackTracer in the causer chain. +// This function is used by AddStack to avoid creating redundant stack traces. +// +// You can also use the StackTracer interface on the returned error to get the stack trace. +func GetStackTracer(origErr error) StackTracer { + var stacked StackTracer + WalkDeep(origErr, func(err error) bool { + if stackTracer, ok := err.(StackTracer); ok { + stacked = stackTracer + return true + } + return false + }) + return stacked +} + +// Frame represents a program counter inside a stack frame. +type Frame uintptr + +// pc returns the program counter for this frame; +// multiple frames may have the same PC value. +func (f Frame) pc() uintptr { return uintptr(f) - 1 } + +// file returns the full path to the file that contains the +// function for this Frame's pc. +func (f Frame) file() string { + fn := runtime.FuncForPC(f.pc()) + if fn == nil { + return "unknown" + } + file, _ := fn.FileLine(f.pc()) + return file +} + +// line returns the line number of source code of the +// function for this Frame's pc. +func (f Frame) line() int { + fn := runtime.FuncForPC(f.pc()) + if fn == nil { + return 0 + } + _, line := fn.FileLine(f.pc()) + return line +} + +// Format formats the frame according to the fmt.Formatter interface. +// +// %s source file +// %d source line +// %n function name +// %v equivalent to %s:%d +// +// Format accepts flags that alter the printing of some verbs, as follows: +// +// %+s function name and path of source file relative to the compile time +// GOPATH separated by \n\t (\n\t) +// %+v equivalent to %+s:%d +func (f Frame) Format(s fmt.State, verb rune) { + f.format(s, s, verb) +} + +// format allows stack trace printing calls to be made with a bytes.Buffer. +func (f Frame) format(w io.Writer, s fmt.State, verb rune) { + switch verb { + case 's': + switch { + case s.Flag('+'): + pc := f.pc() + fn := runtime.FuncForPC(pc) + if fn == nil { + io.WriteString(w, "unknown") + } else { + file, _ := fn.FileLine(pc) + io.WriteString(w, fn.Name()) + io.WriteString(w, "\n\t") + io.WriteString(w, file) + } + default: + io.WriteString(w, path.Base(f.file())) + } + case 'd': + io.WriteString(w, strconv.Itoa(f.line())) + case 'n': + name := runtime.FuncForPC(f.pc()).Name() + io.WriteString(w, funcname(name)) + case 'v': + f.format(w, s, 's') + io.WriteString(w, ":") + f.format(w, s, 'd') + } +} + +// StackTrace is stack of Frames from innermost (newest) to outermost (oldest). +type StackTrace []Frame + +// Format formats the stack of Frames according to the fmt.Formatter interface. +// +// %s lists source files for each Frame in the stack +// %v lists the source file and line number for each Frame in the stack +// +// Format accepts flags that alter the printing of some verbs, as follows: +// +// %+v Prints filename, function, and line number for each Frame in the stack. +func (st StackTrace) Format(s fmt.State, verb rune) { + var b bytes.Buffer + switch verb { + case 'v': + switch { + case s.Flag('+'): + b.Grow(len(st) * stackMinLen) + for _, fr := range st { + b.WriteByte('\n') + fr.format(&b, s, verb) + } + case s.Flag('#'): + fmt.Fprintf(&b, "%#v", []Frame(st)) + default: + st.formatSlice(&b, s, verb) + } + case 's': + st.formatSlice(&b, s, verb) + } + io.Copy(s, &b) +} + +// formatSlice will format this StackTrace into the given buffer as a slice of +// Frame, only valid when called with '%s' or '%v'. +func (st StackTrace) formatSlice(b *bytes.Buffer, s fmt.State, verb rune) { + b.WriteByte('[') + if len(st) == 0 { + b.WriteByte(']') + return + } + + b.Grow(len(st) * (stackMinLen / 4)) + st[0].format(b, s, verb) + for _, fr := range st[1:] { + b.WriteByte(' ') + fr.format(b, s, verb) + } + b.WriteByte(']') +} + +// stackMinLen is a best-guess at the minimum length of a stack trace. It +// doesn't need to be exact, just give a good enough head start for the buffer +// to avoid the expensive early growth. +const stackMinLen = 96 + +// stack represents a stack of program counters. +type stack []uintptr + +func (s *stack) Format(st fmt.State, verb rune) { + switch verb { + case 'v': + switch { + case st.Flag('+'): + var b bytes.Buffer + b.Grow(len(*s) * stackMinLen) + for _, pc := range *s { + f := Frame(pc) + b.WriteByte('\n') + f.format(&b, st, 'v') + } + io.Copy(st, &b) + } + } +} + +func (s *stack) StackTrace() StackTrace { + f := make([]Frame, len(*s)) + for i := 0; i < len(f); i++ { + f[i] = Frame((*s)[i]) + } + return f +} + +func callers() *stack { + return callersSkip(4) +} + +func callersSkip(skip int) *stack { + const depth = 32 + var pcs [depth]uintptr + n := runtime.Callers(skip, pcs[:]) + var st stack = pcs[0:n] + return &st +} + +// funcname removes the path prefix component of a function's name reported by func.Name(). +func funcname(name string) string { + i := strings.LastIndex(name, "/") + name = name[i+1:] + i = strings.Index(name, ".") + return name[i+1:] +} + +// NewStack is for library implementers that want to generate a stack trace. +// Normally you should insted use AddStack to get an error with a stack trace. +// +// The result of this function can be turned into a stack trace by calling .StackTrace() +// +// This function takes an argument for the number of stack frames to skip. +// This avoids putting stack generation function calls like this one in the stack trace. +// A value of 0 will give you the line that called NewStack(0) +// A library author wrapping this in their own function will want to use a value of at least 1. +func NewStack(skip int) StackTracer { + return callersSkip(skip + 3) +} diff --git a/vendor/github.com/pingcap/log/LICENSE b/vendor/github.com/pingcap/log/LICENSE new file mode 100644 index 0000000..261eeb9 --- /dev/null +++ b/vendor/github.com/pingcap/log/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + 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. diff --git a/vendor/github.com/pingcap/log/config.go b/vendor/github.com/pingcap/log/config.go new file mode 100644 index 0000000..b568973 --- /dev/null +++ b/vendor/github.com/pingcap/log/config.go @@ -0,0 +1,122 @@ +// Copyright 2019 PingCAP, Inc. +// +// 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package log + +import ( + "time" + + "go.uber.org/zap" + "go.uber.org/zap/zapcore" +) + +const ( + defaultLogMaxSize = 300 // MB +) + +// FileLogConfig serializes file log related config in toml/json. +type FileLogConfig struct { + // Log filename, leave empty to disable file log. + Filename string `toml:"filename" json:"filename"` + // Is log rotate enabled. + LogRotate bool `toml:"log-rotate" json:"log-rotate"` + // Max size for a single file, in MB. + MaxSize int `toml:"max-size" json:"max-size"` + // Max log keep days, default is never deleting. + MaxDays int `toml:"max-days" json:"max-days"` + // Maximum number of old log files to retain. + MaxBackups int `toml:"max-backups" json:"max-backups"` +} + +// Config serializes log related config in toml/json. +type Config struct { + // Log level. + Level string `toml:"level" json:"level"` + // Log format. one of json, text, or console. + Format string `toml:"format" json:"format"` + // Disable automatic timestamps in output. + DisableTimestamp bool `toml:"disable-timestamp" json:"disable-timestamp"` + // File log config. + File FileLogConfig `toml:"file" json:"file"` + // Development puts the logger in development mode, which changes the + // behavior of DPanicLevel and takes stacktraces more liberally. + Development bool `toml:"development" json:"development"` + // DisableCaller stops annotating logs with the calling function's file + // name and line number. By default, all logs are annotated. + DisableCaller bool `toml:"disable-caller" json:"disable-caller"` + // DisableStacktrace completely disables automatic stacktrace capturing. By + // default, stacktraces are captured for WarnLevel and above logs in + // development and ErrorLevel and above in production. + DisableStacktrace bool `toml:"disable-stacktrace" json:"disable-stacktrace"` + // SamplingConfig sets a sampling strategy for the logger. Sampling caps the + // global CPU and I/O load that logging puts on your process while attempting + // to preserve a representative subset of your logs. + // + // Values configured here are per-second. See zapcore.NewSampler for details. + Sampling *zap.SamplingConfig `toml:"sampling" json:"sampling"` +} + +// ZapProperties records some information about zap. +type ZapProperties struct { + Core zapcore.Core + Syncer zapcore.WriteSyncer + Level zap.AtomicLevel +} + +func newZapTextEncoder(cfg *Config) zapcore.Encoder { + cc := zapcore.EncoderConfig{ + // Keys can be anything except the empty string. + TimeKey: "time", + LevelKey: "level", + NameKey: "name", + CallerKey: "caller", + MessageKey: "message", + StacktraceKey: "stack", + LineEnding: zapcore.DefaultLineEnding, + EncodeLevel: zapcore.CapitalLevelEncoder, + EncodeTime: DefaultTimeEncoder, + EncodeDuration: zapcore.StringDurationEncoder, + EncodeCaller: ShortCallerEncoder, + } + if cfg.DisableTimestamp { + cc.TimeKey = "" + } + return NewTextEncoder(cc) +} + +func (cfg *Config) buildOptions(errSink zapcore.WriteSyncer) []zap.Option { + opts := []zap.Option{zap.ErrorOutput(errSink)} + + if cfg.Development { + opts = append(opts, zap.Development()) + } + + if !cfg.DisableCaller { + opts = append(opts, zap.AddCaller()) + } + + stackLevel := zap.ErrorLevel + if cfg.Development { + stackLevel = zap.WarnLevel + } + if !cfg.DisableStacktrace { + opts = append(opts, zap.AddStacktrace(stackLevel)) + } + + if cfg.Sampling != nil { + opts = append(opts, zap.WrapCore(func(core zapcore.Core) zapcore.Core { + return zapcore.NewSampler(core, time.Second, int(cfg.Sampling.Initial), int(cfg.Sampling.Thereafter)) + })) + } + return opts +} diff --git a/vendor/github.com/pingcap/log/global.go b/vendor/github.com/pingcap/log/global.go new file mode 100644 index 0000000..5d00254 --- /dev/null +++ b/vendor/github.com/pingcap/log/global.go @@ -0,0 +1,70 @@ +// Copyright 2019 PingCAP, Inc. +// +// 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package log + +import ( + "go.uber.org/zap" + "go.uber.org/zap/zapcore" +) + +// Debug logs a message at DebugLevel. The message includes any fields passed +// at the log site, as well as any fields accumulated on the logger. +func Debug(msg string, fields ...zap.Field) { + L().WithOptions(zap.AddCallerSkip(1)).Debug(msg, fields...) +} + +// Info logs a message at InfoLevel. The message includes any fields passed +// at the log site, as well as any fields accumulated on the logger. +func Info(msg string, fields ...zap.Field) { + L().WithOptions(zap.AddCallerSkip(1)).Info(msg, fields...) +} + +// Warn logs a message at WarnLevel. The message includes any fields passed +// at the log site, as well as any fields accumulated on the logger. +func Warn(msg string, fields ...zap.Field) { + L().WithOptions(zap.AddCallerSkip(1)).Warn(msg, fields...) +} + +// Error logs a message at ErrorLevel. The message includes any fields passed +// at the log site, as well as any fields accumulated on the logger. +func Error(msg string, fields ...zap.Field) { + L().WithOptions(zap.AddCallerSkip(1)).Error(msg, fields...) +} + +// Panic logs a message at PanicLevel. The message includes any fields passed +// at the log site, as well as any fields accumulated on the logger. +// +// The logger then panics, even if logging at PanicLevel is disabled. +func Panic(msg string, fields ...zap.Field) { + L().WithOptions(zap.AddCallerSkip(1)).Panic(msg, fields...) +} + +// Fatal logs a message at FatalLevel. The message includes any fields passed +// at the log site, as well as any fields accumulated on the logger. +// +// The logger then calls os.Exit(1), even if logging at FatalLevel is +// disabled. +func Fatal(msg string, fields ...zap.Field) { + L().WithOptions(zap.AddCallerSkip(1)).Fatal(msg, fields...) +} + +// SetLevel alters the logging level. +func SetLevel(l zapcore.Level) { + _globalP.Level.SetLevel(l) +} + +// GetLevel gets the logging level. +func GetLevel() zapcore.Level { + return _globalP.Level.Level() +} diff --git a/vendor/github.com/pingcap/log/go.mod b/vendor/github.com/pingcap/log/go.mod new file mode 100644 index 0000000..0894f77 --- /dev/null +++ b/vendor/github.com/pingcap/log/go.mod @@ -0,0 +1,14 @@ +module github.com/pingcap/log + +require ( + github.com/BurntSushi/toml v0.3.1 // indirect + github.com/pingcap/check v0.0.0-20190102082844-67f458068fc8 + github.com/pingcap/errors v0.11.0 + github.com/pkg/errors v0.8.1 // indirect + github.com/stretchr/testify v1.3.0 // indirect + go.uber.org/atomic v1.3.2 // indirect + go.uber.org/multierr v1.1.0 // indirect + go.uber.org/zap v1.9.1 + gopkg.in/natefinch/lumberjack.v2 v2.0.0 + gopkg.in/yaml.v2 v2.2.2 // indirect +) diff --git a/vendor/github.com/pingcap/log/go.sum b/vendor/github.com/pingcap/log/go.sum new file mode 100644 index 0000000..fa72478 --- /dev/null +++ b/vendor/github.com/pingcap/log/go.sum @@ -0,0 +1,26 @@ +github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/pingcap/check v0.0.0-20190102082844-67f458068fc8 h1:USx2/E1bX46VG32FIw034Au6seQ2fY9NEILmNh/UlQg= +github.com/pingcap/check v0.0.0-20190102082844-67f458068fc8/go.mod h1:B1+S9LNcuMyLH/4HMTViQOJevkGiik3wW2AN9zb2fNQ= +github.com/pingcap/errors v0.11.0/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= +github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +go.uber.org/atomic v1.3.2 h1:2Oa65PReHzfn29GpvgsYwloV9AVFHPDk8tYxt2c2tr4= +go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/multierr v1.1.0 h1:HoEmRHQPVSqub6w2z2d2EOVs2fjyFRGyofhKuyDq0QI= +go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/zap v1.9.1 h1:XCJQEf3W6eZaVwhRBof6ImoYGJSITeKWsyeh3HFu/5o= +go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8= +gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= +gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/vendor/github.com/pingcap/log/log.go b/vendor/github.com/pingcap/log/log.go new file mode 100644 index 0000000..571fb45 --- /dev/null +++ b/vendor/github.com/pingcap/log/log.go @@ -0,0 +1,117 @@ +// Copyright 2019 PingCAP, Inc. +// +// 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package log + +import ( + "errors" + "os" + + "go.uber.org/zap" + "go.uber.org/zap/zapcore" + lumberjack "gopkg.in/natefinch/lumberjack.v2" +) + +// InitLogger initializes a zap logger. +func InitLogger(cfg *Config, opts ...zap.Option) (*zap.Logger, *ZapProperties, error) { + var output zapcore.WriteSyncer + if len(cfg.File.Filename) > 0 { + lg, err := initFileLog(&cfg.File) + if err != nil { + return nil, nil, err + } + output = zapcore.AddSync(lg) + } else { + stdOut, close, err := zap.Open([]string{"stdout"}...) + if err != nil { + close() + return nil, nil, err + } + output = stdOut + } + level := zap.NewAtomicLevel() + err := level.UnmarshalText([]byte(cfg.Level)) + if err != nil { + return nil, nil, err + } + core := NewTextCore(newZapTextEncoder(cfg).(*textEncoder), output, level) + opts = append(opts, cfg.buildOptions(output)...) + lg := zap.New(core, opts...) + r := &ZapProperties{ + Core: core, + Syncer: output, + Level: level, + } + return lg, r, nil +} + +// initFileLog initializes file based logging options. +func initFileLog(cfg *FileLogConfig) (*lumberjack.Logger, error) { + if st, err := os.Stat(cfg.Filename); err == nil { + if st.IsDir() { + return nil, errors.New("can't use directory as log file name") + } + } + if cfg.MaxSize == 0 { + cfg.MaxSize = defaultLogMaxSize + } + + // use lumberjack to logrotate + return &lumberjack.Logger{ + Filename: cfg.Filename, + MaxSize: cfg.MaxSize, + MaxBackups: cfg.MaxBackups, + MaxAge: cfg.MaxDays, + LocalTime: true, + }, nil +} + +func newStdLogger() (*zap.Logger, *ZapProperties) { + conf := &Config{Level: "info", File: FileLogConfig{}} + lg, r, _ := InitLogger(conf) + return lg, r +} + +var ( + _globalL, _globalP = newStdLogger() + _globalS = _globalL.Sugar() +) + +// L returns the global Logger, which can be reconfigured with ReplaceGlobals. +// It's safe for concurrent use. +func L() *zap.Logger { + return _globalL +} + +// S returns the global SugaredLogger, which can be reconfigured with +// ReplaceGlobals. It's safe for concurrent use. +func S() *zap.SugaredLogger { + return _globalS +} + +// ReplaceGlobals replaces the global Logger and SugaredLogger. +// It's unsafe for concurrent use. +func ReplaceGlobals(logger *zap.Logger, props *ZapProperties) { + _globalL = logger + _globalS = logger.Sugar() + _globalP = props +} + +// Sync flushes any buffered log entries. +func Sync() error { + err := L().Sync() + if err != nil { + return err + } + return S().Sync() +} diff --git a/vendor/github.com/pingcap/log/zap_text_core.go b/vendor/github.com/pingcap/log/zap_text_core.go new file mode 100644 index 0000000..34e7b9a --- /dev/null +++ b/vendor/github.com/pingcap/log/zap_text_core.go @@ -0,0 +1,77 @@ +// Copyright 2019 PingCAP, Inc. +// +// 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package log + +import "go.uber.org/zap/zapcore" + +// NewTextCore creates a Core that writes logs to a WriteSyncer. +func NewTextCore(enc *textEncoder, ws zapcore.WriteSyncer, enab zapcore.LevelEnabler) zapcore.Core { + return &textIOCore{ + LevelEnabler: enab, + enc: enc, + out: ws, + } +} + +// textIOCore is a copy of zapcore.ioCore that only accept *textEncoder +// it can be removed after https://github.com/uber-go/zap/pull/685 be merged +type textIOCore struct { + zapcore.LevelEnabler + enc *textEncoder + out zapcore.WriteSyncer +} + +func (c *textIOCore) With(fields []zapcore.Field) zapcore.Core { + clone := c.clone() + // it's different to ioCore, here call textEncoder#addFields to fix https://github.com/pingcap/log/issues/3 + clone.enc.addFields(fields) + return clone +} + +func (c *textIOCore) Check(ent zapcore.Entry, ce *zapcore.CheckedEntry) *zapcore.CheckedEntry { + if c.Enabled(ent.Level) { + return ce.AddCore(ent, c) + } + return ce +} + +func (c *textIOCore) Write(ent zapcore.Entry, fields []zapcore.Field) error { + buf, err := c.enc.EncodeEntry(ent, fields) + if err != nil { + return err + } + _, err = c.out.Write(buf.Bytes()) + buf.Free() + if err != nil { + return err + } + if ent.Level > zapcore.ErrorLevel { + // Since we may be crashing the program, sync the output. Ignore Sync + // errors, pending a clean solution to issue https://github.com/uber-go/zap/issues/370. + c.Sync() + } + return nil +} + +func (c *textIOCore) Sync() error { + return c.out.Sync() +} + +func (c *textIOCore) clone() *textIOCore { + return &textIOCore{ + LevelEnabler: c.LevelEnabler, + enc: c.enc.Clone().(*textEncoder), + out: c.out, + } +} diff --git a/vendor/github.com/pingcap/log/zap_text_encoder.go b/vendor/github.com/pingcap/log/zap_text_encoder.go new file mode 100644 index 0000000..a959598 --- /dev/null +++ b/vendor/github.com/pingcap/log/zap_text_encoder.go @@ -0,0 +1,633 @@ +// Copyright 2019 PingCAP, Inc. +// +// 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +// Copyright (c) 2016 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package log + +import ( + "encoding/base64" + "encoding/json" + "fmt" + "math" + "strings" + "sync" + "time" + "unicode/utf8" + + "go.uber.org/zap/buffer" + "go.uber.org/zap/zapcore" +) + +// DefaultTimeEncoder serializes time.Time to a human-readable formatted string +func DefaultTimeEncoder(t time.Time, enc zapcore.PrimitiveArrayEncoder) { + s := t.Format("2006/01/02 15:04:05.000 -07:00") + if e, ok := enc.(*textEncoder); ok { + for _, c := range []byte(s) { + e.buf.AppendByte(c) + } + return + } + enc.AppendString(s) +} + +// ShortCallerEncoder serializes a caller in file:line format. +func ShortCallerEncoder(caller zapcore.EntryCaller, enc zapcore.PrimitiveArrayEncoder) { + enc.AppendString(getCallerString(caller)) +} + +func getCallerString(ec zapcore.EntryCaller) string { + if !ec.Defined { + return "" + } + + idx := strings.LastIndexByte(ec.File, '/') + buf := _pool.Get() + for i := idx + 1; i < len(ec.File); i++ { + b := ec.File[i] + switch { + case b >= 'A' && b <= 'Z': + buf.AppendByte(b) + case b >= 'a' && b <= 'z': + buf.AppendByte(b) + case b >= '0' && b <= '9': + buf.AppendByte(b) + case b == '.' || b == '-' || b == '_': + buf.AppendByte(b) + default: + } + } + buf.AppendByte(':') + buf.AppendInt(int64(ec.Line)) + caller := buf.String() + buf.Free() + return caller +} + +// For JSON-escaping; see textEncoder.safeAddString below. +const _hex = "0123456789abcdef" + +var _textPool = sync.Pool{New: func() interface{} { + return &textEncoder{} +}} + +var ( + _pool = buffer.NewPool() + // Get retrieves a buffer from the pool, creating one if necessary. + Get = _pool.Get +) + +func getTextEncoder() *textEncoder { + return _textPool.Get().(*textEncoder) +} + +func putTextEncoder(enc *textEncoder) { + if enc.reflectBuf != nil { + enc.reflectBuf.Free() + } + enc.EncoderConfig = nil + enc.buf = nil + enc.spaced = false + enc.openNamespaces = 0 + enc.reflectBuf = nil + enc.reflectEnc = nil + _textPool.Put(enc) +} + +type textEncoder struct { + *zapcore.EncoderConfig + buf *buffer.Buffer + spaced bool // include spaces after colons and commas + openNamespaces int + + // for encoding generic values by reflection + reflectBuf *buffer.Buffer + reflectEnc *json.Encoder +} + +// NewTextEncoder creates a fast, low-allocation Text encoder. The encoder +// appropriately escapes all field keys and values. +func NewTextEncoder(cfg zapcore.EncoderConfig) zapcore.Encoder { + return &textEncoder{ + EncoderConfig: &cfg, + buf: _pool.Get(), + spaced: false, + } +} + +func (enc *textEncoder) AddArray(key string, arr zapcore.ArrayMarshaler) error { + enc.addKey(key) + return enc.AppendArray(arr) +} + +func (enc *textEncoder) AddObject(key string, obj zapcore.ObjectMarshaler) error { + enc.addKey(key) + return enc.AppendObject(obj) +} + +func (enc *textEncoder) AddBinary(key string, val []byte) { + enc.AddString(key, base64.StdEncoding.EncodeToString(val)) +} + +func (enc *textEncoder) AddByteString(key string, val []byte) { + enc.addKey(key) + enc.AppendByteString(val) +} + +func (enc *textEncoder) AddBool(key string, val bool) { + enc.addKey(key) + enc.AppendBool(val) +} + +func (enc *textEncoder) AddComplex128(key string, val complex128) { + enc.addKey(key) + enc.AppendComplex128(val) +} + +func (enc *textEncoder) AddDuration(key string, val time.Duration) { + enc.addKey(key) + enc.AppendDuration(val) +} + +func (enc *textEncoder) AddFloat64(key string, val float64) { + enc.addKey(key) + enc.AppendFloat64(val) +} + +func (enc *textEncoder) AddInt64(key string, val int64) { + enc.addKey(key) + enc.AppendInt64(val) +} + +func (enc *textEncoder) resetReflectBuf() { + if enc.reflectBuf == nil { + enc.reflectBuf = _pool.Get() + enc.reflectEnc = json.NewEncoder(enc.reflectBuf) + } else { + enc.reflectBuf.Reset() + } +} + +func (enc *textEncoder) AddReflected(key string, obj interface{}) error { + enc.resetReflectBuf() + err := enc.reflectEnc.Encode(obj) + if err != nil { + return err + } + enc.reflectBuf.TrimNewline() + enc.addKey(key) + enc.AppendByteString(enc.reflectBuf.Bytes()) + return nil +} + +func (enc *textEncoder) OpenNamespace(key string) { + enc.addKey(key) + enc.buf.AppendByte('{') + enc.openNamespaces++ +} + +func (enc *textEncoder) AddString(key, val string) { + enc.addKey(key) + enc.AppendString(val) +} + +func (enc *textEncoder) AddTime(key string, val time.Time) { + enc.addKey(key) + enc.AppendTime(val) +} + +func (enc *textEncoder) AddUint64(key string, val uint64) { + enc.addKey(key) + enc.AppendUint64(val) +} + +func (enc *textEncoder) AppendArray(arr zapcore.ArrayMarshaler) error { + enc.addElementSeparator() + ne := enc.cloned() + ne.buf.AppendByte('[') + err := arr.MarshalLogArray(ne) + ne.buf.AppendByte(']') + enc.AppendByteString(ne.buf.Bytes()) + ne.buf.Free() + putTextEncoder(ne) + return err +} + +func (enc *textEncoder) AppendObject(obj zapcore.ObjectMarshaler) error { + enc.addElementSeparator() + ne := enc.cloned() + ne.buf.AppendByte('{') + err := obj.MarshalLogObject(ne) + ne.buf.AppendByte('}') + enc.AppendByteString(ne.buf.Bytes()) + ne.buf.Free() + putTextEncoder(ne) + return err +} + +func (enc *textEncoder) AppendBool(val bool) { + enc.addElementSeparator() + enc.buf.AppendBool(val) +} + +func (enc *textEncoder) AppendByteString(val []byte) { + enc.addElementSeparator() + if !enc.needDoubleQuotes(string(val)) { + enc.safeAddByteString(val) + return + } + enc.buf.AppendByte('"') + enc.safeAddByteString(val) + enc.buf.AppendByte('"') +} + +func (enc *textEncoder) AppendComplex128(val complex128) { + enc.addElementSeparator() + // Cast to a platform-independent, fixed-size type. + r, i := float64(real(val)), float64(imag(val)) + enc.buf.AppendFloat(r, 64) + enc.buf.AppendByte('+') + enc.buf.AppendFloat(i, 64) + enc.buf.AppendByte('i') +} + +func (enc *textEncoder) AppendDuration(val time.Duration) { + cur := enc.buf.Len() + enc.EncodeDuration(val, enc) + if cur == enc.buf.Len() { + // User-supplied EncodeDuration is a no-op. Fall back to nanoseconds to keep + // JSON valid. + enc.AppendInt64(int64(val)) + } +} + +func (enc *textEncoder) AppendInt64(val int64) { + enc.addElementSeparator() + enc.buf.AppendInt(val) +} + +func (enc *textEncoder) AppendReflected(val interface{}) error { + enc.resetReflectBuf() + err := enc.reflectEnc.Encode(val) + if err != nil { + return err + } + enc.reflectBuf.TrimNewline() + enc.AppendByteString(enc.reflectBuf.Bytes()) + return nil +} + +func (enc *textEncoder) AppendString(val string) { + enc.addElementSeparator() + enc.safeAddStringWithQuote(val) +} + +func (enc *textEncoder) AppendTime(val time.Time) { + cur := enc.buf.Len() + enc.EncodeTime(val, enc) + if cur == enc.buf.Len() { + // User-supplied EncodeTime is a no-op. Fall back to nanos since epoch to keep + // output JSON valid. + enc.AppendInt64(val.UnixNano()) + } +} + +func (enc *textEncoder) beginQuoteFiled() { + if enc.buf.Len() > 0 { + enc.buf.AppendByte(' ') + } + enc.buf.AppendByte('[') +} + +func (enc *textEncoder) endQuoteFiled() { + enc.buf.AppendByte(']') +} + +func (enc *textEncoder) AppendUint64(val uint64) { + enc.addElementSeparator() + enc.buf.AppendUint(val) +} + +func (enc *textEncoder) AddComplex64(k string, v complex64) { enc.AddComplex128(k, complex128(v)) } +func (enc *textEncoder) AddFloat32(k string, v float32) { enc.AddFloat64(k, float64(v)) } +func (enc *textEncoder) AddInt(k string, v int) { enc.AddInt64(k, int64(v)) } +func (enc *textEncoder) AddInt32(k string, v int32) { enc.AddInt64(k, int64(v)) } +func (enc *textEncoder) AddInt16(k string, v int16) { enc.AddInt64(k, int64(v)) } +func (enc *textEncoder) AddInt8(k string, v int8) { enc.AddInt64(k, int64(v)) } +func (enc *textEncoder) AddUint(k string, v uint) { enc.AddUint64(k, uint64(v)) } +func (enc *textEncoder) AddUint32(k string, v uint32) { enc.AddUint64(k, uint64(v)) } +func (enc *textEncoder) AddUint16(k string, v uint16) { enc.AddUint64(k, uint64(v)) } +func (enc *textEncoder) AddUint8(k string, v uint8) { enc.AddUint64(k, uint64(v)) } +func (enc *textEncoder) AddUintptr(k string, v uintptr) { enc.AddUint64(k, uint64(v)) } +func (enc *textEncoder) AppendComplex64(v complex64) { enc.AppendComplex128(complex128(v)) } +func (enc *textEncoder) AppendFloat64(v float64) { enc.appendFloat(v, 64) } +func (enc *textEncoder) AppendFloat32(v float32) { enc.appendFloat(float64(v), 32) } +func (enc *textEncoder) AppendInt(v int) { enc.AppendInt64(int64(v)) } +func (enc *textEncoder) AppendInt32(v int32) { enc.AppendInt64(int64(v)) } +func (enc *textEncoder) AppendInt16(v int16) { enc.AppendInt64(int64(v)) } +func (enc *textEncoder) AppendInt8(v int8) { enc.AppendInt64(int64(v)) } +func (enc *textEncoder) AppendUint(v uint) { enc.AppendUint64(uint64(v)) } +func (enc *textEncoder) AppendUint32(v uint32) { enc.AppendUint64(uint64(v)) } +func (enc *textEncoder) AppendUint16(v uint16) { enc.AppendUint64(uint64(v)) } +func (enc *textEncoder) AppendUint8(v uint8) { enc.AppendUint64(uint64(v)) } +func (enc *textEncoder) AppendUintptr(v uintptr) { enc.AppendUint64(uint64(v)) } + +func (enc *textEncoder) Clone() zapcore.Encoder { + clone := enc.cloned() + clone.buf.Write(enc.buf.Bytes()) + return clone +} + +func (enc *textEncoder) cloned() *textEncoder { + clone := getTextEncoder() + clone.EncoderConfig = enc.EncoderConfig + clone.spaced = enc.spaced + clone.openNamespaces = enc.openNamespaces + clone.buf = _pool.Get() + return clone +} + +func (enc *textEncoder) EncodeEntry(ent zapcore.Entry, fields []zapcore.Field) (*buffer.Buffer, error) { + final := enc.cloned() + if final.TimeKey != "" { + final.beginQuoteFiled() + final.AppendTime(ent.Time) + final.endQuoteFiled() + } + + if final.LevelKey != "" { + final.beginQuoteFiled() + cur := final.buf.Len() + final.EncodeLevel(ent.Level, final) + if cur == final.buf.Len() { + // User-supplied EncodeLevel was a no-op. Fall back to strings to keep + // output JSON valid. + final.AppendString(ent.Level.String()) + } + final.endQuoteFiled() + } + + if ent.LoggerName != "" && final.NameKey != "" { + final.beginQuoteFiled() + cur := final.buf.Len() + nameEncoder := final.EncodeName + + // if no name encoder provided, fall back to FullNameEncoder for backwards + // compatibility + if nameEncoder == nil { + nameEncoder = zapcore.FullNameEncoder + } + + nameEncoder(ent.LoggerName, final) + if cur == final.buf.Len() { + // User-supplied EncodeName was a no-op. Fall back to strings to + // keep output JSON valid. + final.AppendString(ent.LoggerName) + } + final.endQuoteFiled() + } + if ent.Caller.Defined && final.CallerKey != "" { + final.beginQuoteFiled() + cur := final.buf.Len() + final.EncodeCaller(ent.Caller, final) + if cur == final.buf.Len() { + // User-supplied EncodeCaller was a no-op. Fall back to strings to + // keep output JSON valid. + final.AppendString(ent.Caller.String()) + } + final.endQuoteFiled() + } + // add Message + if len(ent.Message) > 0 { + final.beginQuoteFiled() + final.AppendString(ent.Message) + final.endQuoteFiled() + } + if enc.buf.Len() > 0 { + final.buf.AppendByte(' ') + final.buf.Write(enc.buf.Bytes()) + } + final.addFields(fields) + final.closeOpenNamespaces() + if ent.Stack != "" && final.StacktraceKey != "" { + final.beginQuoteFiled() + final.AddString(final.StacktraceKey, ent.Stack) + final.endQuoteFiled() + } + + if final.LineEnding != "" { + final.buf.AppendString(final.LineEnding) + } else { + final.buf.AppendString(zapcore.DefaultLineEnding) + } + + ret := final.buf + putTextEncoder(final) + return ret, nil +} + +func (enc *textEncoder) truncate() { + enc.buf.Reset() +} + +func (enc *textEncoder) closeOpenNamespaces() { + for i := 0; i < enc.openNamespaces; i++ { + enc.buf.AppendByte('}') + } +} + +func (enc *textEncoder) addKey(key string) { + enc.addElementSeparator() + enc.safeAddStringWithQuote(key) + enc.buf.AppendByte('=') +} + +func (enc *textEncoder) addElementSeparator() { + last := enc.buf.Len() - 1 + if last < 0 { + return + } + switch enc.buf.Bytes()[last] { + case '{', '[', ':', ',', ' ', '=': + return + default: + enc.buf.AppendByte(',') + } +} + +func (enc *textEncoder) appendFloat(val float64, bitSize int) { + enc.addElementSeparator() + switch { + case math.IsNaN(val): + enc.buf.AppendString("NaN") + case math.IsInf(val, 1): + enc.buf.AppendString("+Inf") + case math.IsInf(val, -1): + enc.buf.AppendString("-Inf") + default: + enc.buf.AppendFloat(val, bitSize) + } +} + +// safeAddString JSON-escapes a string and appends it to the internal buffer. +// Unlike the standard library's encoder, it doesn't attempt to protect the +// user from browser vulnerabilities or JSONP-related problems. +func (enc *textEncoder) safeAddString(s string) { + for i := 0; i < len(s); { + if enc.tryAddRuneSelf(s[i]) { + i++ + continue + } + r, size := utf8.DecodeRuneInString(s[i:]) + if enc.tryAddRuneError(r, size) { + i++ + continue + } + enc.buf.AppendString(s[i : i+size]) + i += size + } +} + +// safeAddStringWithQuote will automatically add quotoes. +func (enc *textEncoder) safeAddStringWithQuote(s string) { + if !enc.needDoubleQuotes(s) { + enc.safeAddString(s) + return + } + enc.buf.AppendByte('"') + enc.safeAddString(s) + enc.buf.AppendByte('"') +} + +// safeAddByteString is no-alloc equivalent of safeAddString(string(s)) for s []byte. +func (enc *textEncoder) safeAddByteString(s []byte) { + for i := 0; i < len(s); { + if enc.tryAddRuneSelf(s[i]) { + i++ + continue + } + r, size := utf8.DecodeRune(s[i:]) + if enc.tryAddRuneError(r, size) { + i++ + continue + } + enc.buf.Write(s[i : i+size]) + i += size + } +} + +// See [log-fileds](https://github.com/tikv/rfcs/blob/master/text/2018-12-19-unified-log-format.md#log-fields-section). +func (enc *textEncoder) needDoubleQuotes(s string) bool { + for i := 0; i < len(s); { + b := s[i] + if b <= 0x20 { + return true + } + switch b { + case '\\', '"', '[', ']', '=': + return true + } + i++ + } + return false +} + +// tryAddRuneSelf appends b if it is valid UTF-8 character represented in a single byte. +func (enc *textEncoder) tryAddRuneSelf(b byte) bool { + if b >= utf8.RuneSelf { + return false + } + if 0x20 <= b && b != '\\' && b != '"' { + enc.buf.AppendByte(b) + return true + } + switch b { + case '\\', '"': + enc.buf.AppendByte('\\') + enc.buf.AppendByte(b) + case '\n': + enc.buf.AppendByte('\\') + enc.buf.AppendByte('n') + case '\r': + enc.buf.AppendByte('\\') + enc.buf.AppendByte('r') + case '\t': + enc.buf.AppendByte('\\') + enc.buf.AppendByte('t') + + default: + // Encode bytes < 0x20, except for the escape sequences above. + enc.buf.AppendString(`\u00`) + enc.buf.AppendByte(_hex[b>>4]) + enc.buf.AppendByte(_hex[b&0xF]) + } + return true +} + +func (enc *textEncoder) tryAddRuneError(r rune, size int) bool { + if r == utf8.RuneError && size == 1 { + enc.buf.AppendString(`\ufffd`) + return true + } + return false +} + +func (enc *textEncoder) addFields(fields []zapcore.Field) { + for _, f := range fields { + if f.Type == zapcore.ErrorType { + // handle ErrorType in pingcap/log to fix "[key=?,keyVerbose=?]" problem. + // see more detail at https://github.com/pingcap/log/pull/5 + enc.encodeError(f) + continue + } + enc.beginQuoteFiled() + f.AddTo(enc) + enc.endQuoteFiled() + } +} + +func (enc *textEncoder) encodeError(f zapcore.Field) { + err := f.Interface.(error) + basic := err.Error() + enc.beginQuoteFiled() + enc.AddString(f.Key, basic) + enc.endQuoteFiled() + if e, isFormatter := err.(fmt.Formatter); isFormatter { + verbose := fmt.Sprintf("%+v", e) + if verbose != basic { + // This is a rich error type, like those produced by + // github.com/pkg/errors. + enc.beginQuoteFiled() + enc.AddString(f.Key+"Verbose", verbose) + enc.endQuoteFiled() + } + } +} diff --git a/vendor/github.com/pingcap/parser/LICENSE b/vendor/github.com/pingcap/parser/LICENSE new file mode 100644 index 0000000..261eeb9 --- /dev/null +++ b/vendor/github.com/pingcap/parser/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + 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. diff --git a/vendor/github.com/pingcap/parser/Makefile b/vendor/github.com/pingcap/parser/Makefile new file mode 100644 index 0000000..591f827 --- /dev/null +++ b/vendor/github.com/pingcap/parser/Makefile @@ -0,0 +1,41 @@ +.PHONY: all parser clean + +ARCH:="`uname -s`" +MAC:="Darwin" +LINUX:="Linux" + +all: parser.go fmt + +test: parser.go fmt + sh test.sh + +parser.go: parser.y + make parser + +parser: bin/goyacc + bin/goyacc -o /dev/null parser.y + bin/goyacc -o parser.go parser.y 2>&1 | egrep "(shift|reduce)/reduce" | awk '{print} END {if (NR > 0) {print "Find conflict in parser.y. Please check y.output for more information."; exit 1;}}' + rm -f y.output + + @if [ $(ARCH) = $(LINUX) ]; \ + then \ + sed -i -e 's|//line.*||' -e 's/yyEofCode/yyEOFCode/' parser.go; \ + elif [ $(ARCH) = $(MAC) ]; \ + then \ + /usr/bin/sed -i "" 's|//line.*||' parser.go; \ + /usr/bin/sed -i "" 's/yyEofCode/yyEOFCode/' parser.go; \ + fi + + @awk 'BEGIN{print "// Code generated by goyacc DO NOT EDIT."} {print $0}' parser.go > tmp_parser.go && mv tmp_parser.go parser.go; + +bin/goyacc: goyacc/main.go + GO111MODULE=on go build -o bin/goyacc goyacc/main.go + +fmt: + @echo "gofmt (simplify)" + @gofmt -s -l -w . 2>&1 | awk '{print} END{if(NR>0) {exit 1}}' + +clean: + go clean -i ./... + rm -rf *.out + rm parser.go diff --git a/vendor/github.com/pingcap/parser/README.md b/vendor/github.com/pingcap/parser/README.md new file mode 100644 index 0000000..e89b3a5 --- /dev/null +++ b/vendor/github.com/pingcap/parser/README.md @@ -0,0 +1,53 @@ +# Parser + +[![Go Report Card](https://goreportcard.com/badge/github.com/pingcap/parser)](https://goreportcard.com/report/github.com/pingcap/parser) [![CircleCI Status](https://circleci.com/gh/pingcap/parser.svg?style=shield)](https://circleci.com/gh/pingcap/parser) [![GoDoc](https://godoc.org/github.com/pingcap/parser?status.svg)](https://godoc.org/github.com/pingcap/parser) +[![codecov](https://codecov.io/gh/pingcap/parser/branch/master/graph/badge.svg)](https://codecov.io/gh/pingcap/parser) + +TiDB SQL Parser + +## How to use it + +See [https://godoc.org/github.com/pingcap/parser](https://godoc.org/github.com/pingcap/parser) + +## How to update parser for TiDB + +Assuming that you want to file a PR (pull request) to TiDB, and your PR includes a change in the parser, follow these steps to update the parser in TiDB. + +### Step 1: Make changes in your parser repository + +Fork this repository to your own account and commit the changes to your repository. + +> **Note:** +> +> - Don't forget to run `make test` before you commit! +> - Make sure `parser.go` is updated. + +Suppose the forked repository is `https://github.com/your-repo/parser`. + +### Step 2: Make your parser changes take effect in TiDB and run CI + +1. In your TiDB repository, execute the `replace` instruction to make your parser changes take effect: + + ``` + GO111MODULE=on go mod edit -replace github.com/pingcap/parser=github.com/your-repo/parser@your-branch + ``` + +2. `make dev` to run CI in TiDB. + +3. File a PR to TiDB. + +### Step 3: Merge the PR about the parser to this repository + +File a PR to this repository. **Link the related PR in TiDB in your PR description or comment.** + +This PR will be reviewed, and if everything goes well, it will be merged. + +### Step 4: Update TiDB to use the latest parser + +In your TiDB pull request, modify the `go.mod` file manually or use this command: + +``` +GO111MODULE=on go get -u github.com/pingcap/parser@master +``` + +Make sure the `replace` instruction is changed back to the `require` instruction and the version is the latest. diff --git a/vendor/github.com/pingcap/parser/ast/ast.go b/vendor/github.com/pingcap/parser/ast/ast.go new file mode 100755 index 0000000..6c3c05b --- /dev/null +++ b/vendor/github.com/pingcap/parser/ast/ast.go @@ -0,0 +1,160 @@ +// Copyright 2015 PingCAP, Inc. +// +// 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package ast is the abstract syntax tree parsed from a SQL statement by parser. +// It can be analysed and transformed by optimizer. +package ast + +import ( + "io" + + . "github.com/pingcap/parser/format" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/types" +) + +// Node is the basic element of the AST. +// Interfaces embed Node should have 'Node' name suffix. +type Node interface { + // Restore returns the sql text from ast tree + Restore(ctx *RestoreCtx) error + // Accept accepts Visitor to visit itself. + // The returned node should replace original node. + // ok returns false to stop visiting. + // + // Implementation of this method should first call visitor.Enter, + // assign the returned node to its method receiver, if skipChildren returns true, + // children should be skipped. Otherwise, call its children in particular order that + // later elements depends on former elements. Finally, return visitor.Leave. + Accept(v Visitor) (node Node, ok bool) + // Text returns the original text of the element. + Text() string + // SetText sets original text to the Node. + SetText(text string) +} + +// Flags indicates whether an expression contains certain types of expression. +const ( + FlagConstant uint64 = 0 + FlagHasParamMarker uint64 = 1 << iota + FlagHasFunc + FlagHasReference + FlagHasAggregateFunc + FlagHasSubquery + FlagHasVariable + FlagHasDefault + FlagPreEvaluated + FlagHasWindowFunc +) + +// ExprNode is a node that can be evaluated. +// Name of implementations should have 'Expr' suffix. +type ExprNode interface { + // Node is embedded in ExprNode. + Node + // SetType sets evaluation type to the expression. + SetType(tp *types.FieldType) + // GetType gets the evaluation type of the expression. + GetType() *types.FieldType + // SetFlag sets flag to the expression. + // Flag indicates whether the expression contains + // parameter marker, reference, aggregate function... + SetFlag(flag uint64) + // GetFlag returns the flag of the expression. + GetFlag() uint64 + + // Format formats the AST into a writer. + Format(w io.Writer) +} + +// OptBinary is used for parser. +type OptBinary struct { + IsBinary bool + Charset string +} + +// FuncNode represents function call expression node. +type FuncNode interface { + ExprNode + functionExpression() +} + +// StmtNode represents statement node. +// Name of implementations should have 'Stmt' suffix. +type StmtNode interface { + Node + statement() +} + +// DDLNode represents DDL statement node. +type DDLNode interface { + StmtNode + ddlStatement() +} + +// DMLNode represents DML statement node. +type DMLNode interface { + StmtNode + dmlStatement() +} + +// ResultField represents a result field which can be a column from a table, +// or an expression in select field. It is a generated property during +// binding process. ResultField is the key element to evaluate a ColumnNameExpr. +// After resolving process, every ColumnNameExpr will be resolved to a ResultField. +// During execution, every row retrieved from table will set the row value to +// ResultFields of that table, so ColumnNameExpr resolved to that ResultField can be +// easily evaluated. +type ResultField struct { + Column *model.ColumnInfo + ColumnAsName model.CIStr + Table *model.TableInfo + TableAsName model.CIStr + DBName model.CIStr + + // Expr represents the expression for the result field. If it is generated from a select field, it would + // be the expression of that select field, otherwise the type would be ValueExpr and value + // will be set for every retrieved row. + Expr ExprNode + TableName *TableName + // Referenced indicates the result field has been referenced or not. + // If not, we don't need to get the values. + Referenced bool +} + +// ResultSetNode interface has a ResultFields property, represents a Node that returns result set. +// Implementations include SelectStmt, SubqueryExpr, TableSource, TableName and Join. +type ResultSetNode interface { + Node +} + +// SensitiveStmtNode overloads StmtNode and provides a SecureText method. +type SensitiveStmtNode interface { + StmtNode + // SecureText is different from Text that it hide password information. + SecureText() string +} + +// Visitor visits a Node. +type Visitor interface { + // Enter is called before children nodes are visited. + // The returned node must be the same type as the input node n. + // skipChildren returns true means children nodes should be skipped, + // this is useful when work is done in Enter and there is no need to visit children. + Enter(n Node) (node Node, skipChildren bool) + // Leave is called after children nodes have been visited. + // The returned node's type can be different from the input node if it is a ExprNode, + // Non-expression node must be the same type as the input node n. + // ok returns false to stop visiting. + Leave(n Node) (node Node, ok bool) +} diff --git a/vendor/github.com/pingcap/parser/ast/base.go b/vendor/github.com/pingcap/parser/ast/base.go new file mode 100644 index 0000000..984d8e4 --- /dev/null +++ b/vendor/github.com/pingcap/parser/ast/base.go @@ -0,0 +1,101 @@ +// Copyright 2015 PingCAP, Inc. +// +// 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package ast + +import "github.com/pingcap/parser/types" + +// node is the struct implements node interface except for Accept method. +// Node implementations should embed it in. +type node struct { + text string +} + +// SetText implements Node interface. +func (n *node) SetText(text string) { + n.text = text +} + +// Text implements Node interface. +func (n *node) Text() string { + return n.text +} + +// stmtNode implements StmtNode interface. +// Statement implementations should embed it in. +type stmtNode struct { + node +} + +// statement implements StmtNode interface. +func (sn *stmtNode) statement() {} + +// ddlNode implements DDLNode interface. +// DDL implementations should embed it in. +type ddlNode struct { + stmtNode +} + +// ddlStatement implements DDLNode interface. +func (dn *ddlNode) ddlStatement() {} + +// dmlNode is the struct implements DMLNode interface. +// DML implementations should embed it in. +type dmlNode struct { + stmtNode +} + +// dmlStatement implements DMLNode interface. +func (dn *dmlNode) dmlStatement() {} + +// exprNode is the struct implements Expression interface. +// Expression implementations should embed it in. +type exprNode struct { + node + Type types.FieldType + flag uint64 +} + +// TexprNode is exported for parser driver. +type TexprNode = exprNode + +// SetType implements ExprNode interface. +func (en *exprNode) SetType(tp *types.FieldType) { + en.Type = *tp +} + +// GetType implements ExprNode interface. +func (en *exprNode) GetType() *types.FieldType { + return &en.Type +} + +// SetFlag implements ExprNode interface. +func (en *exprNode) SetFlag(flag uint64) { + en.flag = flag +} + +// GetFlag implements ExprNode interface. +func (en *exprNode) GetFlag() uint64 { + return en.flag +} + +type funcNode struct { + exprNode +} + +// functionExpression implements FunctionNode interface. +func (fn *funcNode) functionExpression() {} + +type resultSetNode struct { + resultFields []*ResultField +} diff --git a/vendor/github.com/pingcap/parser/ast/ddl.go b/vendor/github.com/pingcap/parser/ast/ddl.go new file mode 100644 index 0000000..f541247 --- /dev/null +++ b/vendor/github.com/pingcap/parser/ast/ddl.go @@ -0,0 +1,3081 @@ +// Copyright 2015 PingCAP, Inc. +// +// 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package ast + +import ( + "github.com/pingcap/errors" + "github.com/pingcap/parser/auth" + . "github.com/pingcap/parser/format" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/terror" + "github.com/pingcap/parser/types" +) + +var ( + _ DDLNode = &AlterTableStmt{} + _ DDLNode = &CreateDatabaseStmt{} + _ DDLNode = &CreateIndexStmt{} + _ DDLNode = &CreateTableStmt{} + _ DDLNode = &CreateViewStmt{} + _ DDLNode = &DropDatabaseStmt{} + _ DDLNode = &DropIndexStmt{} + _ DDLNode = &DropTableStmt{} + _ DDLNode = &RenameTableStmt{} + _ DDLNode = &TruncateTableStmt{} + + _ Node = &AlterTableSpec{} + _ Node = &ColumnDef{} + _ Node = &ColumnOption{} + _ Node = &ColumnPosition{} + _ Node = &Constraint{} + _ Node = &IndexColName{} + _ Node = &ReferenceDef{} +) + +// CharsetOpt is used for parsing charset option from SQL. +type CharsetOpt struct { + Chs string + Col string +} + +// DatabaseOptionType is the type for database options. +type DatabaseOptionType int + +// Database option types. +const ( + DatabaseOptionNone DatabaseOptionType = iota + DatabaseOptionCharset + DatabaseOptionCollate + DatabaseOptionEncryption +) + +// DatabaseOption represents database option. +type DatabaseOption struct { + Tp DatabaseOptionType + Value string +} + +// Restore implements Node interface. +func (n *DatabaseOption) Restore(ctx *RestoreCtx) error { + switch n.Tp { + case DatabaseOptionCharset: + ctx.WriteKeyWord("CHARACTER SET") + ctx.WritePlain(" = ") + ctx.WritePlain(n.Value) + case DatabaseOptionCollate: + ctx.WriteKeyWord("COLLATE") + ctx.WritePlain(" = ") + ctx.WritePlain(n.Value) + case DatabaseOptionEncryption: + ctx.WriteKeyWord("ENCRYPTION") + ctx.WritePlain(" = ") + ctx.WriteString(n.Value) + default: + return errors.Errorf("invalid DatabaseOptionType: %d", n.Tp) + } + return nil +} + +// CreateDatabaseStmt is a statement to create a database. +// See https://dev.mysql.com/doc/refman/5.7/en/create-database.html +type CreateDatabaseStmt struct { + ddlNode + + IfNotExists bool + Name string + Options []*DatabaseOption +} + +// Restore implements Node interface. +func (n *CreateDatabaseStmt) Restore(ctx *RestoreCtx) error { + ctx.WriteKeyWord("CREATE DATABASE ") + if n.IfNotExists { + ctx.WriteKeyWord("IF NOT EXISTS ") + } + ctx.WriteName(n.Name) + for i, option := range n.Options { + ctx.WritePlain(" ") + err := option.Restore(ctx) + if err != nil { + return errors.Annotatef(err, "An error occurred while splicing CreateDatabaseStmt DatabaseOption: [%v]", i) + } + } + return nil +} + +// Accept implements Node Accept interface. +func (n *CreateDatabaseStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*CreateDatabaseStmt) + return v.Leave(n) +} + +// AlterDatabaseStmt is a statement to change the structure of a database. +// See https://dev.mysql.com/doc/refman/5.7/en/alter-database.html +type AlterDatabaseStmt struct { + ddlNode + + Name string + AlterDefaultDatabase bool + Options []*DatabaseOption +} + +// Restore implements Node interface. +func (n *AlterDatabaseStmt) Restore(ctx *RestoreCtx) error { + ctx.WriteKeyWord("ALTER DATABASE") + if !n.AlterDefaultDatabase { + ctx.WritePlain(" ") + ctx.WriteName(n.Name) + } + for i, option := range n.Options { + ctx.WritePlain(" ") + err := option.Restore(ctx) + if err != nil { + return errors.Annotatef(err, "An error occurred while splicing AlterDatabaseStmt DatabaseOption: [%v]", i) + } + } + return nil +} + +// Accept implements Node Accept interface. +func (n *AlterDatabaseStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*AlterDatabaseStmt) + return v.Leave(n) +} + +// DropDatabaseStmt is a statement to drop a database and all tables in the database. +// See https://dev.mysql.com/doc/refman/5.7/en/drop-database.html +type DropDatabaseStmt struct { + ddlNode + + IfExists bool + Name string +} + +// Restore implements Node interface. +func (n *DropDatabaseStmt) Restore(ctx *RestoreCtx) error { + ctx.WriteKeyWord("DROP DATABASE ") + if n.IfExists { + ctx.WriteKeyWord("IF EXISTS ") + } + ctx.WriteName(n.Name) + return nil +} + +// Accept implements Node Accept interface. +func (n *DropDatabaseStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*DropDatabaseStmt) + return v.Leave(n) +} + +// IndexColName is used for parsing index column name from SQL. +type IndexColName struct { + node + + Column *ColumnName + Length int +} + +// Restore implements Node interface. +func (n *IndexColName) Restore(ctx *RestoreCtx) error { + if err := n.Column.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while splicing IndexColName") + } + if n.Length > 0 { + ctx.WritePlainf("(%d)", n.Length) + } + return nil +} + +// Accept implements Node Accept interface. +func (n *IndexColName) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*IndexColName) + node, ok := n.Column.Accept(v) + if !ok { + return n, false + } + n.Column = node.(*ColumnName) + return v.Leave(n) +} + +// MatchType is the type for reference match type. +type MatchType int + +// match type +const ( + MatchNone MatchType = iota + MatchFull + MatchPartial + MatchSimple +) + +// ReferenceDef is used for parsing foreign key reference option from SQL. +// See http://dev.mysql.com/doc/refman/5.7/en/create-table-foreign-keys.html +type ReferenceDef struct { + node + + Table *TableName + IndexColNames []*IndexColName + OnDelete *OnDeleteOpt + OnUpdate *OnUpdateOpt + Match MatchType +} + +// Restore implements Node interface. +func (n *ReferenceDef) Restore(ctx *RestoreCtx) error { + if n.Table != nil { + ctx.WriteKeyWord("REFERENCES ") + if err := n.Table.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while splicing ReferenceDef") + } + } + + if n.IndexColNames != nil { + ctx.WritePlain("(") + for i, indexColNames := range n.IndexColNames { + if i > 0 { + ctx.WritePlain(", ") + } + if err := indexColNames.Restore(ctx); err != nil { + return errors.Annotatef(err, "An error occurred while splicing IndexColNames: [%v]", i) + } + } + ctx.WritePlain(")") + } + + if n.Match != MatchNone { + ctx.WriteKeyWord(" MATCH ") + switch n.Match { + case MatchFull: + ctx.WriteKeyWord("FULL") + case MatchPartial: + ctx.WriteKeyWord("PARTIAL") + case MatchSimple: + ctx.WriteKeyWord("SIMPLE") + } + } + if n.OnDelete.ReferOpt != ReferOptionNoOption { + ctx.WritePlain(" ") + if err := n.OnDelete.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while splicing OnDelete") + } + } + if n.OnUpdate.ReferOpt != ReferOptionNoOption { + ctx.WritePlain(" ") + if err := n.OnUpdate.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while splicing OnUpdate") + } + } + return nil +} + +// Accept implements Node Accept interface. +func (n *ReferenceDef) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*ReferenceDef) + node, ok := n.Table.Accept(v) + if !ok { + return n, false + } + n.Table = node.(*TableName) + for i, val := range n.IndexColNames { + node, ok = val.Accept(v) + if !ok { + return n, false + } + n.IndexColNames[i] = node.(*IndexColName) + } + onDelete, ok := n.OnDelete.Accept(v) + if !ok { + return n, false + } + n.OnDelete = onDelete.(*OnDeleteOpt) + onUpdate, ok := n.OnUpdate.Accept(v) + if !ok { + return n, false + } + n.OnUpdate = onUpdate.(*OnUpdateOpt) + return v.Leave(n) +} + +// ReferOptionType is the type for refer options. +type ReferOptionType int + +// Refer option types. +const ( + ReferOptionNoOption ReferOptionType = iota + ReferOptionRestrict + ReferOptionCascade + ReferOptionSetNull + ReferOptionNoAction + ReferOptionSetDefault +) + +// String implements fmt.Stringer interface. +func (r ReferOptionType) String() string { + switch r { + case ReferOptionRestrict: + return "RESTRICT" + case ReferOptionCascade: + return "CASCADE" + case ReferOptionSetNull: + return "SET NULL" + case ReferOptionNoAction: + return "NO ACTION" + case ReferOptionSetDefault: + return "SET DEFAULT" + } + return "" +} + +// OnDeleteOpt is used for optional on delete clause. +type OnDeleteOpt struct { + node + ReferOpt ReferOptionType +} + +// Restore implements Node interface. +func (n *OnDeleteOpt) Restore(ctx *RestoreCtx) error { + if n.ReferOpt != ReferOptionNoOption { + ctx.WriteKeyWord("ON DELETE ") + ctx.WriteKeyWord(n.ReferOpt.String()) + } + return nil +} + +// Accept implements Node Accept interface. +func (n *OnDeleteOpt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*OnDeleteOpt) + return v.Leave(n) +} + +// OnUpdateOpt is used for optional on update clause. +type OnUpdateOpt struct { + node + ReferOpt ReferOptionType +} + +// Restore implements Node interface. +func (n *OnUpdateOpt) Restore(ctx *RestoreCtx) error { + if n.ReferOpt != ReferOptionNoOption { + ctx.WriteKeyWord("ON UPDATE ") + ctx.WriteKeyWord(n.ReferOpt.String()) + } + return nil +} + +// Accept implements Node Accept interface. +func (n *OnUpdateOpt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*OnUpdateOpt) + return v.Leave(n) +} + +// ColumnOptionType is the type for ColumnOption. +type ColumnOptionType int + +// ColumnOption types. +const ( + ColumnOptionNoOption ColumnOptionType = iota + ColumnOptionPrimaryKey + ColumnOptionNotNull + ColumnOptionAutoIncrement + ColumnOptionDefaultValue + ColumnOptionUniqKey + ColumnOptionNull + ColumnOptionOnUpdate // For Timestamp and Datetime only. + ColumnOptionFulltext + ColumnOptionComment + ColumnOptionGenerated + ColumnOptionReference + ColumnOptionCollate + ColumnOptionCheck + ColumnOptionColumnFormat +) + +var ( + invalidOptionForGeneratedColumn = map[ColumnOptionType]struct{}{ + ColumnOptionAutoIncrement: {}, + ColumnOptionOnUpdate: {}, + ColumnOptionDefaultValue: {}, + } +) + +// ColumnOption is used for parsing column constraint info from SQL. +type ColumnOption struct { + node + + Tp ColumnOptionType + // Expr is used for ColumnOptionDefaultValue/ColumnOptionOnUpdateColumnOptionGenerated. + // For ColumnOptionDefaultValue or ColumnOptionOnUpdate, it's the target value. + // For ColumnOptionGenerated, it's the target expression. + Expr ExprNode + // Stored is only for ColumnOptionGenerated, default is false. + Stored bool + // Refer is used for foreign key. + Refer *ReferenceDef + StrValue string + // Enforced is only for Check, default is true. + Enforced bool +} + +// Restore implements Node interface. +func (n *ColumnOption) Restore(ctx *RestoreCtx) error { + switch n.Tp { + case ColumnOptionNoOption: + return nil + case ColumnOptionPrimaryKey: + ctx.WriteKeyWord("PRIMARY KEY") + case ColumnOptionNotNull: + ctx.WriteKeyWord("NOT NULL") + case ColumnOptionAutoIncrement: + ctx.WriteKeyWord("AUTO_INCREMENT") + case ColumnOptionDefaultValue: + ctx.WriteKeyWord("DEFAULT ") + if err := n.Expr.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while splicing ColumnOption DefaultValue Expr") + } + case ColumnOptionUniqKey: + ctx.WriteKeyWord("UNIQUE KEY") + case ColumnOptionNull: + ctx.WriteKeyWord("NULL") + case ColumnOptionOnUpdate: + ctx.WriteKeyWord("ON UPDATE ") + if err := n.Expr.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while splicing ColumnOption ON UPDATE Expr") + } + case ColumnOptionFulltext: + return errors.New("TiDB Parser ignore the `ColumnOptionFulltext` type now") + case ColumnOptionComment: + ctx.WriteKeyWord("COMMENT ") + if err := n.Expr.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while splicing ColumnOption COMMENT Expr") + } + case ColumnOptionGenerated: + ctx.WriteKeyWord("GENERATED ALWAYS AS") + ctx.WritePlain("(") + if err := n.Expr.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while splicing ColumnOption GENERATED ALWAYS Expr") + } + ctx.WritePlain(")") + if n.Stored { + ctx.WriteKeyWord(" STORED") + } else { + ctx.WriteKeyWord(" VIRTUAL") + } + case ColumnOptionReference: + if err := n.Refer.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while splicing ColumnOption ReferenceDef") + } + case ColumnOptionCollate: + if n.StrValue == "" { + return errors.New("Empty ColumnOption COLLATE") + } + ctx.WriteKeyWord("COLLATE ") + ctx.WritePlain(n.StrValue) + case ColumnOptionCheck: + ctx.WriteKeyWord("CHECK") + ctx.WritePlain("(") + if err := n.Expr.Restore(ctx); err != nil { + return errors.Trace(err) + } + ctx.WritePlain(")") + if n.Enforced { + ctx.WriteKeyWord(" ENFORCED") + } else { + ctx.WriteKeyWord(" NOT ENFORCED") + } + case ColumnOptionColumnFormat: + ctx.WriteKeyWord("COLUMN_FORMAT ") + ctx.WriteKeyWord(n.StrValue) + default: + return errors.New("An error occurred while splicing ColumnOption") + } + return nil +} + +// Accept implements Node Accept interface. +func (n *ColumnOption) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*ColumnOption) + if n.Expr != nil { + node, ok := n.Expr.Accept(v) + if !ok { + return n, false + } + n.Expr = node.(ExprNode) + } + return v.Leave(n) +} + +// IndexVisibility is the option for index visibility. +type IndexVisibility int + +// IndexVisibility options. +const ( + IndexVisibilityDefault IndexVisibility = iota + IndexVisibilityVisible + IndexVisibilityInvisible +) + +// IndexOption is the index options. +// KEY_BLOCK_SIZE [=] value +// | index_type +// | WITH PARSER parser_name +// | COMMENT 'string' +// See http://dev.mysql.com/doc/refman/5.7/en/create-table.html +type IndexOption struct { + node + + KeyBlockSize uint64 + Tp model.IndexType + Comment string + ParserName model.CIStr + Visibility IndexVisibility +} + +// Restore implements Node interface. +func (n *IndexOption) Restore(ctx *RestoreCtx) error { + hasPrevOption := false + if n.KeyBlockSize > 0 { + ctx.WriteKeyWord("KEY_BLOCK_SIZE") + ctx.WritePlainf("=%d", n.KeyBlockSize) + hasPrevOption = true + } + + if n.Tp != model.IndexTypeInvalid { + if hasPrevOption { + ctx.WritePlain(" ") + } + ctx.WriteKeyWord("USING ") + ctx.WritePlain(n.Tp.String()) + hasPrevOption = true + } + + if len(n.ParserName.O) > 0 { + if hasPrevOption { + ctx.WritePlain(" ") + } + ctx.WriteKeyWord("WITH PARSER ") + ctx.WriteName(n.ParserName.O) + hasPrevOption = true + } + + if n.Comment != "" { + if hasPrevOption { + ctx.WritePlain(" ") + } + ctx.WriteKeyWord("COMMENT ") + ctx.WriteString(n.Comment) + hasPrevOption = true + } + + if n.Visibility != IndexVisibilityDefault { + if hasPrevOption { + ctx.WritePlain(" ") + } + switch n.Visibility { + case IndexVisibilityVisible: + ctx.WriteKeyWord("VISIBLE") + case IndexVisibilityInvisible: + ctx.WriteKeyWord("INVISIBLE") + } + } + return nil +} + +// Accept implements Node Accept interface. +func (n *IndexOption) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*IndexOption) + return v.Leave(n) +} + +// ConstraintType is the type for Constraint. +type ConstraintType int + +// ConstraintTypes +const ( + ConstraintNoConstraint ConstraintType = iota + ConstraintPrimaryKey + ConstraintKey + ConstraintIndex + ConstraintUniq + ConstraintUniqKey + ConstraintUniqIndex + ConstraintForeignKey + ConstraintFulltext + ConstraintCheck +) + +// Constraint is constraint for table definition. +type Constraint struct { + node + + // only supported by MariaDB 10.0.2+ (ADD {INDEX|KEY}, ADD FOREIGN KEY), + // see https://mariadb.com/kb/en/library/alter-table/ + IfNotExists bool + + Tp ConstraintType + Name string + + Keys []*IndexColName // Used for PRIMARY KEY, UNIQUE, ...... + + Refer *ReferenceDef // Used for foreign key. + + Option *IndexOption // Index Options + + Expr ExprNode // Used for Check + + Enforced bool // Used for Check +} + +// Restore implements Node interface. +func (n *Constraint) Restore(ctx *RestoreCtx) error { + switch n.Tp { + case ConstraintNoConstraint: + return nil + case ConstraintPrimaryKey: + ctx.WriteKeyWord("PRIMARY KEY") + case ConstraintKey: + ctx.WriteKeyWord("KEY") + if n.IfNotExists { + ctx.WriteKeyWord(" IF NOT EXISTS") + } + case ConstraintIndex: + ctx.WriteKeyWord("INDEX") + if n.IfNotExists { + ctx.WriteKeyWord(" IF NOT EXISTS") + } + case ConstraintUniq: + ctx.WriteKeyWord("UNIQUE") + case ConstraintUniqKey: + ctx.WriteKeyWord("UNIQUE KEY") + case ConstraintUniqIndex: + ctx.WriteKeyWord("UNIQUE INDEX") + case ConstraintFulltext: + ctx.WriteKeyWord("FULLTEXT") + case ConstraintCheck: + if n.Name != "" { + ctx.WriteKeyWord("CONSTRAINT ") + ctx.WriteName(n.Name) + ctx.WritePlain(" ") + } + ctx.WriteKeyWord("CHECK") + ctx.WritePlain("(") + if err := n.Expr.Restore(ctx); err != nil { + return errors.Trace(err) + } + ctx.WritePlain(") ") + if n.Enforced { + ctx.WriteKeyWord("ENFORCED") + } else { + ctx.WriteKeyWord("NOT ENFORCED") + } + return nil + } + + if n.Tp == ConstraintForeignKey { + ctx.WriteKeyWord("CONSTRAINT ") + if n.Name != "" { + ctx.WriteName(n.Name) + ctx.WritePlain(" ") + } + ctx.WriteKeyWord("FOREIGN KEY ") + if n.IfNotExists { + ctx.WriteKeyWord("IF NOT EXISTS ") + } + } else if n.Name != "" { + ctx.WritePlain(" ") + ctx.WriteName(n.Name) + } + + ctx.WritePlain("(") + for i, keys := range n.Keys { + if i > 0 { + ctx.WritePlain(", ") + } + if err := keys.Restore(ctx); err != nil { + return errors.Annotatef(err, "An error occurred while splicing Constraint Keys: [%v]", i) + } + } + ctx.WritePlain(")") + + if n.Refer != nil { + ctx.WritePlain(" ") + if err := n.Refer.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while splicing Constraint Refer") + } + } + + if n.Option != nil { + ctx.WritePlain(" ") + if err := n.Option.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while splicing Constraint Option") + } + } + + return nil +} + +// Accept implements Node Accept interface. +func (n *Constraint) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*Constraint) + for i, val := range n.Keys { + node, ok := val.Accept(v) + if !ok { + return n, false + } + n.Keys[i] = node.(*IndexColName) + } + if n.Refer != nil { + node, ok := n.Refer.Accept(v) + if !ok { + return n, false + } + n.Refer = node.(*ReferenceDef) + } + if n.Option != nil { + node, ok := n.Option.Accept(v) + if !ok { + return n, false + } + n.Option = node.(*IndexOption) + } + return v.Leave(n) +} + +// ColumnDef is used for parsing column definition from SQL. +type ColumnDef struct { + node + + Name *ColumnName + Tp *types.FieldType + Options []*ColumnOption +} + +// Restore implements Node interface. +func (n *ColumnDef) Restore(ctx *RestoreCtx) error { + if err := n.Name.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while splicing ColumnDef Name") + } + if n.Tp != nil { + ctx.WritePlain(" ") + if err := n.Tp.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while splicing ColumnDef Type") + } + } + for i, options := range n.Options { + ctx.WritePlain(" ") + if err := options.Restore(ctx); err != nil { + return errors.Annotatef(err, "An error occurred while splicing ColumnDef ColumnOption: [%v]", i) + } + } + return nil +} + +// Accept implements Node Accept interface. +func (n *ColumnDef) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*ColumnDef) + node, ok := n.Name.Accept(v) + if !ok { + return n, false + } + n.Name = node.(*ColumnName) + for i, val := range n.Options { + node, ok := val.Accept(v) + if !ok { + return n, false + } + n.Options[i] = node.(*ColumnOption) + } + return v.Leave(n) +} + +// Validate checks if a column definition is legal. +// For example, generated column definitions that contain such +// column options as `ON UPDATE`, `AUTO_INCREMENT`, `DEFAULT` +// are illegal. +func (n *ColumnDef) Validate() bool { + generatedCol := false + illegalOpt4gc := false + for _, opt := range n.Options { + if opt.Tp == ColumnOptionGenerated { + generatedCol = true + } + _, found := invalidOptionForGeneratedColumn[opt.Tp] + illegalOpt4gc = illegalOpt4gc || found + } + return !(generatedCol && illegalOpt4gc) +} + +// CreateTableStmt is a statement to create a table. +// See https://dev.mysql.com/doc/refman/5.7/en/create-table.html +type CreateTableStmt struct { + ddlNode + + IfNotExists bool + IsTemporary bool + Table *TableName + ReferTable *TableName + Cols []*ColumnDef + Constraints []*Constraint + Options []*TableOption + Partition *PartitionOptions + OnDuplicate OnDuplicateKeyHandlingType + Select ResultSetNode +} + +// Restore implements Node interface. +func (n *CreateTableStmt) Restore(ctx *RestoreCtx) error { + if n.IsTemporary { + ctx.WriteKeyWord("CREATE TEMPORARY TABLE ") + } else { + ctx.WriteKeyWord("CREATE TABLE ") + } + if n.IfNotExists { + ctx.WriteKeyWord("IF NOT EXISTS ") + } + + if err := n.Table.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while splicing CreateTableStmt Table") + } + ctx.WritePlain(" ") + if n.ReferTable != nil { + ctx.WriteKeyWord("LIKE ") + if err := n.ReferTable.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while splicing CreateTableStmt ReferTable") + } + } + lenCols := len(n.Cols) + lenConstraints := len(n.Constraints) + if lenCols+lenConstraints > 0 { + ctx.WritePlain("(") + for i, col := range n.Cols { + if i > 0 { + ctx.WritePlain(",") + } + if err := col.Restore(ctx); err != nil { + return errors.Annotatef(err, "An error occurred while splicing CreateTableStmt ColumnDef: [%v]", i) + } + } + for i, constraint := range n.Constraints { + if i > 0 || lenCols >= 1 { + ctx.WritePlain(",") + } + if err := constraint.Restore(ctx); err != nil { + return errors.Annotatef(err, "An error occurred while splicing CreateTableStmt Constraints: [%v]", i) + } + } + ctx.WritePlain(")") + } + + for i, option := range n.Options { + ctx.WritePlain(" ") + if err := option.Restore(ctx); err != nil { + return errors.Annotatef(err, "An error occurred while splicing CreateTableStmt TableOption: [%v]", i) + } + } + + if n.Partition != nil { + ctx.WritePlain(" ") + if err := n.Partition.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while splicing CreateTableStmt Partition") + } + } + + if n.Select != nil { + switch n.OnDuplicate { + case OnDuplicateKeyHandlingError: + ctx.WriteKeyWord(" AS ") + case OnDuplicateKeyHandlingIgnore: + ctx.WriteKeyWord(" IGNORE AS ") + case OnDuplicateKeyHandlingReplace: + ctx.WriteKeyWord(" REPLACE AS ") + } + + if err := n.Select.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while splicing CreateTableStmt Select") + } + } + + return nil +} + +// Accept implements Node Accept interface. +func (n *CreateTableStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*CreateTableStmt) + node, ok := n.Table.Accept(v) + if !ok { + return n, false + } + n.Table = node.(*TableName) + if n.ReferTable != nil { + node, ok = n.ReferTable.Accept(v) + if !ok { + return n, false + } + n.ReferTable = node.(*TableName) + } + for i, val := range n.Cols { + node, ok = val.Accept(v) + if !ok { + return n, false + } + n.Cols[i] = node.(*ColumnDef) + } + for i, val := range n.Constraints { + node, ok = val.Accept(v) + if !ok { + return n, false + } + n.Constraints[i] = node.(*Constraint) + } + if n.Select != nil { + node, ok := n.Select.Accept(v) + if !ok { + return n, false + } + n.Select = node.(ResultSetNode) + } + if n.Partition != nil { + node, ok := n.Partition.Accept(v) + if !ok { + return n, false + } + n.Partition = node.(*PartitionOptions) + } + + return v.Leave(n) +} + +// DropTableStmt is a statement to drop one or more tables. +// See https://dev.mysql.com/doc/refman/5.7/en/drop-table.html +type DropTableStmt struct { + ddlNode + + IfExists bool + Tables []*TableName + IsView bool + IsTemporary bool // make sense ONLY if/when IsView == false +} + +// Restore implements Node interface. +func (n *DropTableStmt) Restore(ctx *RestoreCtx) error { + if n.IsView { + ctx.WriteKeyWord("DROP VIEW ") + } else { + if n.IsTemporary { + ctx.WriteKeyWord("DROP TEMPORARY TABLE ") + } else { + ctx.WriteKeyWord("DROP TABLE ") + } + } + if n.IfExists { + ctx.WriteKeyWord("IF EXISTS ") + } + + for index, table := range n.Tables { + if index != 0 { + ctx.WritePlain(", ") + } + if err := table.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore DropTableStmt.Tables "+string(index)) + } + } + + return nil +} + +// Accept implements Node Accept interface. +func (n *DropTableStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*DropTableStmt) + for i, val := range n.Tables { + node, ok := val.Accept(v) + if !ok { + return n, false + } + n.Tables[i] = node.(*TableName) + } + return v.Leave(n) +} + +// RenameTableStmt is a statement to rename a table. +// See http://dev.mysql.com/doc/refman/5.7/en/rename-table.html +type RenameTableStmt struct { + ddlNode + + OldTable *TableName + NewTable *TableName + + // TableToTables is only useful for syncer which depends heavily on tidb parser to do some dirty work for now. + // TODO: Refactor this when you are going to add full support for multiple schema changes. + TableToTables []*TableToTable +} + +// Restore implements Node interface. +func (n *RenameTableStmt) Restore(ctx *RestoreCtx) error { + ctx.WriteKeyWord("RENAME TABLE ") + for index, table2table := range n.TableToTables { + if index != 0 { + ctx.WritePlain(", ") + } + if err := table2table.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore RenameTableStmt.TableToTables") + } + } + return nil +} + +// Accept implements Node Accept interface. +func (n *RenameTableStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*RenameTableStmt) + node, ok := n.OldTable.Accept(v) + if !ok { + return n, false + } + n.OldTable = node.(*TableName) + node, ok = n.NewTable.Accept(v) + if !ok { + return n, false + } + n.NewTable = node.(*TableName) + + for i, t := range n.TableToTables { + node, ok := t.Accept(v) + if !ok { + return n, false + } + n.TableToTables[i] = node.(*TableToTable) + } + + return v.Leave(n) +} + +// TableToTable represents renaming old table to new table used in RenameTableStmt. +type TableToTable struct { + node + OldTable *TableName + NewTable *TableName +} + +// Restore implements Node interface. +func (n *TableToTable) Restore(ctx *RestoreCtx) error { + if err := n.OldTable.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore TableToTable.OldTable") + } + ctx.WriteKeyWord(" TO ") + if err := n.NewTable.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore TableToTable.NewTable") + } + return nil +} + +// Accept implements Node Accept interface. +func (n *TableToTable) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*TableToTable) + node, ok := n.OldTable.Accept(v) + if !ok { + return n, false + } + n.OldTable = node.(*TableName) + node, ok = n.NewTable.Accept(v) + if !ok { + return n, false + } + n.NewTable = node.(*TableName) + return v.Leave(n) +} + +// CreateViewStmt is a statement to create a View. +// See https://dev.mysql.com/doc/refman/5.7/en/create-view.html +type CreateViewStmt struct { + ddlNode + + OrReplace bool + ViewName *TableName + Cols []model.CIStr + Select StmtNode + SchemaCols []model.CIStr + Algorithm model.ViewAlgorithm + Definer *auth.UserIdentity + Security model.ViewSecurity + CheckOption model.ViewCheckOption +} + +// Restore implements Node interface. +func (n *CreateViewStmt) Restore(ctx *RestoreCtx) error { + ctx.WriteKeyWord("CREATE ") + if n.OrReplace { + ctx.WriteKeyWord("OR REPLACE ") + } + ctx.WriteKeyWord("ALGORITHM") + ctx.WritePlain(" = ") + ctx.WriteKeyWord(n.Algorithm.String()) + ctx.WriteKeyWord(" DEFINER") + ctx.WritePlain(" = ") + + // todo Use n.Definer.Restore(ctx) to replace this part + if n.Definer.CurrentUser { + ctx.WriteKeyWord("current_user") + } else { + ctx.WriteName(n.Definer.Username) + if n.Definer.Hostname != "" { + ctx.WritePlain("@") + ctx.WriteName(n.Definer.Hostname) + } + } + + ctx.WriteKeyWord(" SQL SECURITY ") + ctx.WriteKeyWord(n.Security.String()) + ctx.WriteKeyWord(" VIEW ") + + if err := n.ViewName.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while create CreateViewStmt.ViewName") + } + + for i, col := range n.Cols { + if i == 0 { + ctx.WritePlain(" (") + } else { + ctx.WritePlain(",") + } + ctx.WriteName(col.O) + if i == len(n.Cols)-1 { + ctx.WritePlain(")") + } + } + + ctx.WriteKeyWord(" AS ") + + if err := n.Select.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while create CreateViewStmt.Select") + } + + if n.CheckOption != model.CheckOptionCascaded { + ctx.WriteKeyWord(" WITH ") + ctx.WriteKeyWord(n.CheckOption.String()) + ctx.WriteKeyWord(" CHECK OPTION") + } + return nil +} + +// Accept implements Node Accept interface. +func (n *CreateViewStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*CreateViewStmt) + node, ok := n.ViewName.Accept(v) + if !ok { + return n, false + } + n.ViewName = node.(*TableName) + selnode, ok := n.Select.Accept(v) + if !ok { + return n, false + } + n.Select = selnode.(*SelectStmt) + return v.Leave(n) +} + +// IndexLockAndAlgorithm stores the algorithm option and the lock option. +type IndexLockAndAlgorithm struct { + node + + LockTp LockType + AlgorithmTp AlgorithmType +} + +// Restore implements Node interface. +func (n *IndexLockAndAlgorithm) Restore(ctx *RestoreCtx) error { + hasPrevOption := false + if n.AlgorithmTp != AlgorithmTypeDefault { + ctx.WriteKeyWord("ALGORITHM") + ctx.WritePlain(" = ") + ctx.WriteKeyWord(n.AlgorithmTp.String()) + hasPrevOption = true + } + + if n.LockTp != LockTypeDefault { + if hasPrevOption { + ctx.WritePlain(" ") + } + ctx.WriteKeyWord("LOCK") + ctx.WritePlain(" = ") + ctx.WriteKeyWord(n.LockTp.String()) + } + return nil +} + +// Accept implements Node Accept interface. +func (n *IndexLockAndAlgorithm) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*IndexLockAndAlgorithm) + return v.Leave(n) +} + +// IndexKeyType is the type for index key. +type IndexKeyType int + +// Index key types. +const ( + IndexKeyTypeNone IndexKeyType = iota + IndexKeyTypeUnique + IndexKeyTypeSpatial + IndexKeyTypeFullText +) + +// CreateIndexStmt is a statement to create an index. +// See https://dev.mysql.com/doc/refman/5.7/en/create-index.html +type CreateIndexStmt struct { + ddlNode + + // only supported by MariaDB 10.0.2+, + // see https://mariadb.com/kb/en/library/create-index/ + IfNotExists bool + + IndexName string + Table *TableName + IndexColNames []*IndexColName + IndexOption *IndexOption + KeyType IndexKeyType + LockAlg *IndexLockAndAlgorithm +} + +// Restore implements Node interface. +func (n *CreateIndexStmt) Restore(ctx *RestoreCtx) error { + ctx.WriteKeyWord("CREATE ") + switch n.KeyType { + case IndexKeyTypeUnique: + ctx.WriteKeyWord("UNIQUE ") + case IndexKeyTypeSpatial: + ctx.WriteKeyWord("SPATIAL ") + case IndexKeyTypeFullText: + ctx.WriteKeyWord("FULLTEXT ") + } + ctx.WriteKeyWord("INDEX ") + if n.IfNotExists { + ctx.WriteKeyWord("IF NOT EXISTS ") + } + ctx.WriteName(n.IndexName) + ctx.WriteKeyWord(" ON ") + if err := n.Table.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore CreateIndexStmt.Table") + } + + ctx.WritePlain(" (") + for i, indexColName := range n.IndexColNames { + if i != 0 { + ctx.WritePlain(", ") + } + if err := indexColName.Restore(ctx); err != nil { + return errors.Annotatef(err, "An error occurred while restore CreateIndexStmt.IndexColNames: [%v]", i) + } + } + ctx.WritePlain(")") + + if n.IndexOption.Tp != model.IndexTypeInvalid || n.IndexOption.KeyBlockSize > 0 || n.IndexOption.Comment != "" || len(n.IndexOption.ParserName.O) > 0 || n.IndexOption.Visibility != IndexVisibilityDefault { + ctx.WritePlain(" ") + if err := n.IndexOption.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore CreateIndexStmt.IndexOption") + } + } + + if n.LockAlg != nil { + ctx.WritePlain(" ") + if err := n.LockAlg.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore CreateIndexStmt.LockAlg") + } + } + + return nil +} + +// Accept implements Node Accept interface. +func (n *CreateIndexStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*CreateIndexStmt) + node, ok := n.Table.Accept(v) + if !ok { + return n, false + } + n.Table = node.(*TableName) + for i, val := range n.IndexColNames { + node, ok = val.Accept(v) + if !ok { + return n, false + } + n.IndexColNames[i] = node.(*IndexColName) + } + if n.IndexOption != nil { + node, ok := n.IndexOption.Accept(v) + if !ok { + return n, false + } + n.IndexOption = node.(*IndexOption) + } + if n.LockAlg != nil { + node, ok := n.LockAlg.Accept(v) + if !ok { + return n, false + } + n.LockAlg = node.(*IndexLockAndAlgorithm) + } + return v.Leave(n) +} + +// DropIndexStmt is a statement to drop the index. +// See https://dev.mysql.com/doc/refman/5.7/en/drop-index.html +type DropIndexStmt struct { + ddlNode + + IfExists bool + IndexName string + Table *TableName + LockAlg *IndexLockAndAlgorithm +} + +// Restore implements Node interface. +func (n *DropIndexStmt) Restore(ctx *RestoreCtx) error { + ctx.WriteKeyWord("DROP INDEX ") + if n.IfExists { + ctx.WriteKeyWord("IF EXISTS ") + } + ctx.WriteName(n.IndexName) + ctx.WriteKeyWord(" ON ") + + if err := n.Table.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while add index") + } + + if n.LockAlg != nil { + ctx.WritePlain(" ") + if err := n.LockAlg.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore CreateIndexStmt.LockAlg") + } + } + + return nil +} + +// Accept implements Node Accept interface. +func (n *DropIndexStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*DropIndexStmt) + node, ok := n.Table.Accept(v) + if !ok { + return n, false + } + n.Table = node.(*TableName) + if n.LockAlg != nil { + node, ok := n.LockAlg.Accept(v) + if !ok { + return n, false + } + n.LockAlg = node.(*IndexLockAndAlgorithm) + } + return v.Leave(n) +} + +// LockTablesStmt is a statement to lock tables. +type LockTablesStmt struct { + ddlNode + + TableLocks []TableLock +} + +// TableLock contains the table name and lock type. +type TableLock struct { + Table *TableName + Type model.TableLockType +} + +// Accept implements Node Accept interface. +func (n *LockTablesStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*LockTablesStmt) + for i := range n.TableLocks { + node, ok := n.TableLocks[i].Table.Accept(v) + if !ok { + return n, false + } + n.TableLocks[i].Table = node.(*TableName) + } + return v.Leave(n) +} + +// Restore implements Node interface. +func (n *LockTablesStmt) Restore(ctx *RestoreCtx) error { + ctx.WriteKeyWord("LOCK TABLES ") + for i, tl := range n.TableLocks { + if i != 0 { + ctx.WritePlain(", ") + } + if err := tl.Table.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while add index") + } + ctx.WriteKeyWord(" " + tl.Type.String()) + } + return nil +} + +// UnlockTablesStmt is a statement to unlock tables. +type UnlockTablesStmt struct { + ddlNode +} + +// Accept implements Node Accept interface. +func (n *UnlockTablesStmt) Accept(v Visitor) (Node, bool) { + _, _ = v.Enter(n) + return v.Leave(n) +} + +// Restore implements Node interface. +func (n *UnlockTablesStmt) Restore(ctx *RestoreCtx) error { + ctx.WriteKeyWord("UNLOCK TABLES") + return nil +} + +// CleanupTableLockStmt is a statement to cleanup table lock. +type CleanupTableLockStmt struct { + ddlNode + + Tables []*TableName +} + +// Accept implements Node Accept interface. +func (n *CleanupTableLockStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*CleanupTableLockStmt) + for i := range n.Tables { + node, ok := n.Tables[i].Accept(v) + if !ok { + return n, false + } + n.Tables[i] = node.(*TableName) + } + return v.Leave(n) +} + +// Restore implements Node interface. +func (n *CleanupTableLockStmt) Restore(ctx *RestoreCtx) error { + ctx.WriteKeyWord("ADMIN CLEANUP TABLE LOCK ") + for i, v := range n.Tables { + if i != 0 { + ctx.WritePlain(", ") + } + if err := v.Restore(ctx); err != nil { + return errors.Annotatef(err, "An error occurred while restore CleanupTableLockStmt.Tables[%d]", i) + } + } + return nil +} + +// TableOptionType is the type for TableOption +type TableOptionType int + +// TableOption types. +const ( + TableOptionNone TableOptionType = iota + TableOptionEngine + TableOptionCharset + TableOptionCollate + TableOptionAutoIncrement + TableOptionComment + TableOptionAvgRowLength + TableOptionCheckSum + TableOptionCompression + TableOptionConnection + TableOptionPassword + TableOptionKeyBlockSize + TableOptionMaxRows + TableOptionMinRows + TableOptionDelayKeyWrite + TableOptionRowFormat + TableOptionStatsPersistent + TableOptionStatsAutoRecalc + TableOptionShardRowID + TableOptionPreSplitRegion + TableOptionPackKeys + TableOptionTablespace + TableOptionNodegroup + TableOptionDataDirectory + TableOptionIndexDirectory + TableOptionStorageMedia + TableOptionStatsSamplePages + TableOptionSecondaryEngine + TableOptionSecondaryEngineNull + TableOptionInsertMethod + TableOptionTableCheckSum + TableOptionUnion + TableOptionEncryption +) + +// RowFormat types +const ( + RowFormatDefault uint64 = iota + 1 + RowFormatDynamic + RowFormatFixed + RowFormatCompressed + RowFormatRedundant + RowFormatCompact + TokuDBRowFormatDefault + TokuDBRowFormatFast + TokuDBRowFormatSmall + TokuDBRowFormatZlib + TokuDBRowFormatQuickLZ + TokuDBRowFormatLzma + TokuDBRowFormatSnappy + TokuDBRowFormatUncompressed +) + +// OnDuplicateKeyHandlingType is the option that handle unique key values in 'CREATE TABLE ... SELECT' or `LOAD DATA`. +// See https://dev.mysql.com/doc/refman/5.7/en/create-table-select.html +// See https://dev.mysql.com/doc/refman/5.7/en/load-data.html +type OnDuplicateKeyHandlingType int + +// OnDuplicateKeyHandling types +const ( + OnDuplicateKeyHandlingError OnDuplicateKeyHandlingType = iota + OnDuplicateKeyHandlingIgnore + OnDuplicateKeyHandlingReplace +) + +// TableOption is used for parsing table option from SQL. +type TableOption struct { + Tp TableOptionType + Default bool + StrValue string + UintValue uint64 + TableNames []*TableName +} + +func (n *TableOption) Restore(ctx *RestoreCtx) error { + switch n.Tp { + case TableOptionEngine: + ctx.WriteKeyWord("ENGINE ") + ctx.WritePlain("= ") + if n.StrValue != "" { + ctx.WritePlain(n.StrValue) + } else { + ctx.WritePlain("''") + } + case TableOptionCharset: + ctx.WriteKeyWord("DEFAULT CHARACTER SET ") + ctx.WritePlain("= ") + ctx.WriteKeyWord(n.StrValue) + case TableOptionCollate: + ctx.WriteKeyWord("DEFAULT COLLATE ") + ctx.WritePlain("= ") + ctx.WriteKeyWord(n.StrValue) + case TableOptionAutoIncrement: + ctx.WriteKeyWord("AUTO_INCREMENT ") + ctx.WritePlain("= ") + ctx.WritePlainf("%d", n.UintValue) + case TableOptionComment: + ctx.WriteKeyWord("COMMENT ") + ctx.WritePlain("= ") + ctx.WriteString(n.StrValue) + case TableOptionAvgRowLength: + ctx.WriteKeyWord("AVG_ROW_LENGTH ") + ctx.WritePlain("= ") + ctx.WritePlainf("%d", n.UintValue) + case TableOptionCheckSum: + ctx.WriteKeyWord("CHECKSUM ") + ctx.WritePlain("= ") + ctx.WritePlainf("%d", n.UintValue) + case TableOptionCompression: + ctx.WriteKeyWord("COMPRESSION ") + ctx.WritePlain("= ") + ctx.WriteString(n.StrValue) + case TableOptionConnection: + ctx.WriteKeyWord("CONNECTION ") + ctx.WritePlain("= ") + ctx.WriteString(n.StrValue) + case TableOptionPassword: + ctx.WriteKeyWord("PASSWORD ") + ctx.WritePlain("= ") + ctx.WriteString(n.StrValue) + case TableOptionKeyBlockSize: + ctx.WriteKeyWord("KEY_BLOCK_SIZE ") + ctx.WritePlain("= ") + ctx.WritePlainf("%d", n.UintValue) + case TableOptionMaxRows: + ctx.WriteKeyWord("MAX_ROWS ") + ctx.WritePlain("= ") + ctx.WritePlainf("%d", n.UintValue) + case TableOptionMinRows: + ctx.WriteKeyWord("MIN_ROWS ") + ctx.WritePlain("= ") + ctx.WritePlainf("%d", n.UintValue) + case TableOptionDelayKeyWrite: + ctx.WriteKeyWord("DELAY_KEY_WRITE ") + ctx.WritePlain("= ") + ctx.WritePlainf("%d", n.UintValue) + case TableOptionRowFormat: + ctx.WriteKeyWord("ROW_FORMAT ") + ctx.WritePlain("= ") + switch n.UintValue { + case RowFormatDefault: + ctx.WriteKeyWord("DEFAULT") + case RowFormatDynamic: + ctx.WriteKeyWord("DYNAMIC") + case RowFormatFixed: + ctx.WriteKeyWord("FIXED") + case RowFormatCompressed: + ctx.WriteKeyWord("COMPRESSED") + case RowFormatRedundant: + ctx.WriteKeyWord("REDUNDANT") + case RowFormatCompact: + ctx.WriteKeyWord("COMPACT") + case TokuDBRowFormatDefault: + ctx.WriteKeyWord("TOKUDB_DEFAULT") + case TokuDBRowFormatFast: + ctx.WriteKeyWord("TOKUDB_FAST") + case TokuDBRowFormatSmall: + ctx.WriteKeyWord("TOKUDB_SMALL") + case TokuDBRowFormatZlib: + ctx.WriteKeyWord("TOKUDB_ZLIB") + case TokuDBRowFormatQuickLZ: + ctx.WriteKeyWord("TOKUDB_QUICKLZ") + case TokuDBRowFormatLzma: + ctx.WriteKeyWord("TOKUDB_LZMA") + case TokuDBRowFormatSnappy: + ctx.WriteKeyWord("TOKUDB_SNAPPY") + case TokuDBRowFormatUncompressed: + ctx.WriteKeyWord("TOKUDB_UNCOMPRESSED") + default: + return errors.Errorf("invalid TableOption: TableOptionRowFormat: %d", n.UintValue) + } + case TableOptionStatsPersistent: + // TODO: not support + ctx.WriteKeyWord("STATS_PERSISTENT ") + ctx.WritePlain("= ") + ctx.WriteKeyWord("DEFAULT") + ctx.WritePlain(" /* TableOptionStatsPersistent is not supported */ ") + case TableOptionStatsAutoRecalc: + ctx.WriteKeyWord("STATS_AUTO_RECALC ") + ctx.WritePlain("= ") + if n.Default { + ctx.WriteKeyWord("DEFAULT") + } else { + ctx.WritePlainf("%d", n.UintValue) + } + case TableOptionShardRowID: + ctx.WriteKeyWord("SHARD_ROW_ID_BITS ") + ctx.WritePlainf("= %d", n.UintValue) + case TableOptionPreSplitRegion: + ctx.WriteKeyWord("PRE_SPLIT_REGIONS ") + ctx.WritePlainf("= %d", n.UintValue) + case TableOptionPackKeys: + // TODO: not support + ctx.WriteKeyWord("PACK_KEYS ") + ctx.WritePlain("= ") + ctx.WriteKeyWord("DEFAULT") + ctx.WritePlain(" /* TableOptionPackKeys is not supported */ ") + case TableOptionTablespace: + ctx.WriteKeyWord("TABLESPACE ") + ctx.WritePlain("= ") + ctx.WriteName(n.StrValue) + case TableOptionNodegroup: + ctx.WriteKeyWord("NODEGROUP ") + ctx.WritePlainf("= %d", n.UintValue) + case TableOptionDataDirectory: + ctx.WriteKeyWord("DATA DIRECTORY ") + ctx.WritePlain("= ") + ctx.WriteString(n.StrValue) + case TableOptionIndexDirectory: + ctx.WriteKeyWord("INDEX DIRECTORY ") + ctx.WritePlain("= ") + ctx.WriteString(n.StrValue) + case TableOptionStorageMedia: + ctx.WriteKeyWord("STORAGE ") + ctx.WriteKeyWord(n.StrValue) + case TableOptionStatsSamplePages: + ctx.WriteKeyWord("STATS_SAMPLE_PAGES ") + ctx.WritePlain("= ") + if n.Default { + ctx.WriteKeyWord("DEFAULT") + } else { + ctx.WritePlainf("%d", n.UintValue) + } + case TableOptionSecondaryEngine: + ctx.WriteKeyWord("SECONDARY_ENGINE ") + ctx.WritePlain("= ") + ctx.WriteString(n.StrValue) + case TableOptionSecondaryEngineNull: + ctx.WriteKeyWord("SECONDARY_ENGINE ") + ctx.WritePlain("= ") + ctx.WriteKeyWord("NULL") + case TableOptionInsertMethod: + ctx.WriteKeyWord("INSERT_METHOD ") + ctx.WritePlain("= ") + ctx.WriteString(n.StrValue) + case TableOptionTableCheckSum: + ctx.WriteKeyWord("TABLE_CHECKSUM ") + ctx.WritePlain("= ") + ctx.WritePlainf("%d", n.UintValue) + case TableOptionUnion: + ctx.WriteKeyWord("UNION ") + ctx.WritePlain("= (") + for i, tableName := range n.TableNames { + if i != 0 { + ctx.WritePlain(",") + } + tableName.Restore(ctx) + } + ctx.WritePlain(")") + case TableOptionEncryption: + ctx.WriteKeyWord("ENCRYPTION ") + ctx.WritePlain("= ") + ctx.WriteString(n.StrValue) + default: + return errors.Errorf("invalid TableOption: %d", n.Tp) + } + return nil +} + +// ColumnPositionType is the type for ColumnPosition. +type ColumnPositionType int + +// ColumnPosition Types +const ( + ColumnPositionNone ColumnPositionType = iota + ColumnPositionFirst + ColumnPositionAfter +) + +// ColumnPosition represent the position of the newly added column +type ColumnPosition struct { + node + // Tp is either ColumnPositionNone, ColumnPositionFirst or ColumnPositionAfter. + Tp ColumnPositionType + // RelativeColumn is the column the newly added column after if type is ColumnPositionAfter + RelativeColumn *ColumnName +} + +// Restore implements Node interface. +func (n *ColumnPosition) Restore(ctx *RestoreCtx) error { + switch n.Tp { + case ColumnPositionNone: + // do nothing + case ColumnPositionFirst: + ctx.WriteKeyWord("FIRST") + case ColumnPositionAfter: + ctx.WriteKeyWord("AFTER ") + if err := n.RelativeColumn.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore ColumnPosition.RelativeColumn") + } + default: + return errors.Errorf("invalid ColumnPositionType: %d", n.Tp) + } + return nil +} + +// Accept implements Node Accept interface. +func (n *ColumnPosition) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*ColumnPosition) + if n.RelativeColumn != nil { + node, ok := n.RelativeColumn.Accept(v) + if !ok { + return n, false + } + n.RelativeColumn = node.(*ColumnName) + } + return v.Leave(n) +} + +// AlterTableType is the type for AlterTableSpec. +type AlterTableType int + +// AlterTable types. +const ( + AlterTableOption AlterTableType = iota + 1 + AlterTableAddColumns + AlterTableAddConstraint + AlterTableDropColumn + AlterTableDropPrimaryKey + AlterTableDropIndex + AlterTableDropForeignKey + AlterTableModifyColumn + AlterTableChangeColumn + AlterTableRenameColumn + AlterTableRenameTable + AlterTableAlterColumn + AlterTableLock + AlterTableAlgorithm + AlterTableRenameIndex + AlterTableForce + AlterTableAddPartitions + AlterTableCoalescePartitions + AlterTableDropPartition + AlterTableTruncatePartition + AlterTablePartition + AlterTableEnableKeys + AlterTableDisableKeys + AlterTableRemovePartitioning + AlterTableWithValidation + AlterTableWithoutValidation + AlterTableSecondaryLoad + AlterTableSecondaryUnload + AlterTableRebuildPartition + AlterTableReorganizePartition + AlterTableCheckPartitions + AlterTableExchangePartition + AlterTableOptimizePartition + AlterTableRepairPartition + AlterTableImportPartitionTablespace + AlterTableDiscardPartitionTablespace + AlterTableAlterCheck + AlterTableDropCheck + AlterTableImportTablespace + AlterTableDiscardTablespace + AlterTableIndexInvisible + // TODO: Add more actions + AlterTableOrderByColumns +) + +// LockType is the type for AlterTableSpec. +// See https://dev.mysql.com/doc/refman/5.7/en/alter-table.html#alter-table-concurrency +type LockType byte + +func (n LockType) String() string { + switch n { + case LockTypeNone: + return "NONE" + case LockTypeDefault: + return "DEFAULT" + case LockTypeShared: + return "SHARED" + case LockTypeExclusive: + return "EXCLUSIVE" + } + return "" +} + +// Lock Types. +const ( + LockTypeNone LockType = iota + 1 + LockTypeDefault + LockTypeShared + LockTypeExclusive +) + +// AlgorithmType is the algorithm of the DDL operations. +// See https://dev.mysql.com/doc/refman/8.0/en/alter-table.html#alter-table-performance. +type AlgorithmType byte + +// DDL algorithms. +// For now, TiDB only supported inplace and instance algorithms. If the user specify `copy`, +// will get an error. +const ( + AlgorithmTypeDefault AlgorithmType = iota + AlgorithmTypeCopy + AlgorithmTypeInplace + AlgorithmTypeInstant +) + +func (a AlgorithmType) String() string { + switch a { + case AlgorithmTypeDefault: + return "DEFAULT" + case AlgorithmTypeCopy: + return "COPY" + case AlgorithmTypeInplace: + return "INPLACE" + case AlgorithmTypeInstant: + return "INSTANT" + default: + return "DEFAULT" + } +} + +// AlterTableSpec represents alter table specification. +type AlterTableSpec struct { + node + + // only supported by MariaDB 10.0.2+ (DROP COLUMN, CHANGE COLUMN, MODIFY COLUMN, DROP INDEX, DROP FOREIGN KEY, DROP PARTITION) + // see https://mariadb.com/kb/en/library/alter-table/ + IfExists bool + + // only supported by MariaDB 10.0.2+ (ADD COLUMN, ADD PARTITION) + // see https://mariadb.com/kb/en/library/alter-table/ + IfNotExists bool + + NoWriteToBinlog bool + OnAllPartitions bool + + Tp AlterTableType + Name string + Constraint *Constraint + Options []*TableOption + OrderByList []*AlterOrderItem + NewTable *TableName + NewColumns []*ColumnDef + OldColumnName *ColumnName + NewColumnName *ColumnName + Position *ColumnPosition + LockType LockType + Algorithm AlgorithmType + Comment string + FromKey model.CIStr + ToKey model.CIStr + Partition *PartitionOptions + PartitionNames []model.CIStr + PartDefinitions []*PartitionDefinition + WithValidation bool + Num uint64 + Visibility IndexVisibility +} + +// AlterOrderItem represents an item in order by at alter table stmt. +type AlterOrderItem struct { + node + Column *ColumnName + Desc bool +} + +// Restore implements Node interface. +func (n *AlterOrderItem) Restore(ctx *RestoreCtx) error { + if err := n.Column.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore AlterOrderItem.Column") + } + if n.Desc { + ctx.WriteKeyWord(" DESC") + } + return nil +} + +// Restore implements Node interface. +func (n *AlterTableSpec) Restore(ctx *RestoreCtx) error { + switch n.Tp { + case AlterTableOption: + switch { + case len(n.Options) == 2 && + n.Options[0].Tp == TableOptionCharset && + n.Options[1].Tp == TableOptionCollate: + ctx.WriteKeyWord("CONVERT TO CHARACTER SET ") + ctx.WriteKeyWord(n.Options[0].StrValue) + ctx.WriteKeyWord(" COLLATE ") + ctx.WriteKeyWord(n.Options[1].StrValue) + default: + for i, opt := range n.Options { + if i != 0 { + ctx.WritePlain(", ") + } + if err := opt.Restore(ctx); err != nil { + return errors.Annotatef(err, "An error occurred while restore AlterTableSpec.Options[%d]", i) + } + } + } + case AlterTableAddColumns: + ctx.WriteKeyWord("ADD COLUMN ") + if n.IfNotExists { + ctx.WriteKeyWord("IF NOT EXISTS ") + } + if n.Position != nil && len(n.NewColumns) == 1 { + if err := n.NewColumns[0].Restore(ctx); err != nil { + return errors.Annotatef(err, "An error occurred while restore AlterTableSpec.NewColumns[%d]", 0) + } + if n.Position.Tp != ColumnPositionNone { + ctx.WritePlain(" ") + } + if err := n.Position.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore AlterTableSpec.Position") + } + } else { + ctx.WritePlain("(") + for i, col := range n.NewColumns { + if i != 0 { + ctx.WritePlain(", ") + } + if err := col.Restore(ctx); err != nil { + return errors.Annotatef(err, "An error occurred while restore AlterTableSpec.NewColumns[%d]", i) + } + } + ctx.WritePlain(")") + } + case AlterTableAddConstraint: + ctx.WriteKeyWord("ADD ") + if err := n.Constraint.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore AlterTableSpec.Constraint") + } + case AlterTableDropColumn: + ctx.WriteKeyWord("DROP COLUMN ") + if n.IfExists { + ctx.WriteKeyWord("IF EXISTS ") + } + if err := n.OldColumnName.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore AlterTableSpec.OldColumnName") + } + // TODO: RestrictOrCascadeOpt not support + case AlterTableDropPrimaryKey: + ctx.WriteKeyWord("DROP PRIMARY KEY") + case AlterTableDropIndex: + ctx.WriteKeyWord("DROP INDEX ") + if n.IfExists { + ctx.WriteKeyWord("IF EXISTS ") + } + ctx.WriteName(n.Name) + case AlterTableDropForeignKey: + ctx.WriteKeyWord("DROP FOREIGN KEY ") + if n.IfExists { + ctx.WriteKeyWord("IF EXISTS ") + } + ctx.WriteName(n.Name) + case AlterTableModifyColumn: + ctx.WriteKeyWord("MODIFY COLUMN ") + if n.IfExists { + ctx.WriteKeyWord("IF EXISTS ") + } + if err := n.NewColumns[0].Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore AlterTableSpec.NewColumns[0]") + } + if n.Position.Tp != ColumnPositionNone { + ctx.WritePlain(" ") + } + if err := n.Position.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore AlterTableSpec.Position") + } + case AlterTableChangeColumn: + ctx.WriteKeyWord("CHANGE COLUMN ") + if n.IfExists { + ctx.WriteKeyWord("IF EXISTS ") + } + if err := n.OldColumnName.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore AlterTableSpec.OldColumnName") + } + ctx.WritePlain(" ") + if err := n.NewColumns[0].Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore AlterTableSpec.NewColumns[0]") + } + if n.Position.Tp != ColumnPositionNone { + ctx.WritePlain(" ") + } + if err := n.Position.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore AlterTableSpec.Position") + } + case AlterTableRenameColumn: + ctx.WriteKeyWord("RENAME COLUMN ") + if err := n.OldColumnName.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore AlterTableSpec.OldColumnName") + } + ctx.WriteKeyWord(" TO ") + if err := n.NewColumnName.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore AlterTableSpec.NewColumnName") + } + case AlterTableRenameTable: + ctx.WriteKeyWord("RENAME AS ") + if err := n.NewTable.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore AlterTableSpec.NewTable") + } + case AlterTableAlterColumn: + ctx.WriteKeyWord("ALTER COLUMN ") + if err := n.NewColumns[0].Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore AlterTableSpec.NewColumns[0]") + } + if len(n.NewColumns[0].Options) == 1 { + ctx.WriteKeyWord("SET DEFAULT ") + expr := n.NewColumns[0].Options[0].Expr + if valueExpr, ok := expr.(ValueExpr); ok { + if err := valueExpr.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore AlterTableSpec.NewColumns[0].Options[0].Expr") + } + } else { + ctx.WritePlain("(") + if err := expr.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore AlterTableSpec.NewColumns[0].Options[0].Expr") + } + ctx.WritePlain(")") + } + } else { + ctx.WriteKeyWord(" DROP DEFAULT") + } + case AlterTableLock: + ctx.WriteKeyWord("LOCK ") + ctx.WritePlain("= ") + ctx.WriteKeyWord(n.LockType.String()) + case AlterTableOrderByColumns: + ctx.WriteKeyWord("ORDER BY ") + for i, alterOrderItem := range n.OrderByList { + if i != 0 { + ctx.WritePlain(",") + } + if err := alterOrderItem.Restore(ctx); err != nil { + return errors.Annotatef(err, "An error occurred while restore AlterTableSpec.OrderByList[%d]", i) + } + } + case AlterTableAlgorithm: + ctx.WriteKeyWord("ALGORITHM ") + ctx.WritePlain("= ") + ctx.WriteKeyWord(n.Algorithm.String()) + case AlterTableRenameIndex: + ctx.WriteKeyWord("RENAME INDEX ") + ctx.WriteName(n.FromKey.O) + ctx.WriteKeyWord(" TO ") + ctx.WriteName(n.ToKey.O) + case AlterTableForce: + // TODO: not support + ctx.WriteKeyWord("FORCE") + ctx.WritePlain(" /* AlterTableForce is not supported */ ") + case AlterTableAddPartitions: + ctx.WriteKeyWord("ADD PARTITION") + if n.IfNotExists { + ctx.WriteKeyWord(" IF NOT EXISTS") + } + if n.NoWriteToBinlog { + ctx.WriteKeyWord(" NO_WRITE_TO_BINLOG") + } + if n.PartDefinitions != nil { + ctx.WritePlain(" (") + for i, def := range n.PartDefinitions { + if i != 0 { + ctx.WritePlain(", ") + } + if err := def.Restore(ctx); err != nil { + return errors.Annotatef(err, "An error occurred while restore AlterTableSpec.PartDefinitions[%d]", i) + } + } + ctx.WritePlain(")") + } else if n.Num != 0 { + ctx.WriteKeyWord(" PARTITIONS ") + ctx.WritePlainf("%d", n.Num) + } + case AlterTableCoalescePartitions: + ctx.WriteKeyWord("COALESCE PARTITION ") + if n.NoWriteToBinlog { + ctx.WriteKeyWord("NO_WRITE_TO_BINLOG ") + } + ctx.WritePlainf("%d", n.Num) + case AlterTableDropPartition: + ctx.WriteKeyWord("DROP PARTITION ") + if n.IfExists { + ctx.WriteKeyWord("IF EXISTS ") + } + for i, name := range n.PartitionNames { + if i != 0 { + ctx.WritePlain(",") + } + ctx.WriteName(name.O) + } + case AlterTableTruncatePartition: + ctx.WriteKeyWord("TRUNCATE PARTITION ") + if n.OnAllPartitions { + ctx.WriteKeyWord("ALL") + return nil + } + for i, name := range n.PartitionNames { + if i != 0 { + ctx.WritePlain(",") + } + ctx.WriteName(name.O) + } + case AlterTableCheckPartitions: + ctx.WriteKeyWord("CHECK PARTITION ") + if n.OnAllPartitions { + ctx.WriteKeyWord("ALL") + return nil + } + for i, name := range n.PartitionNames { + if i != 0 { + ctx.WritePlain(",") + } + ctx.WriteName(name.O) + } + case AlterTableOptimizePartition: + ctx.WriteKeyWord("OPTIMIZE PARTITION ") + if n.NoWriteToBinlog { + ctx.WriteKeyWord("NO_WRITE_TO_BINLOG ") + } + if n.OnAllPartitions { + ctx.WriteKeyWord("ALL") + return nil + } + for i, name := range n.PartitionNames { + if i != 0 { + ctx.WritePlain(",") + } + ctx.WriteName(name.O) + } + case AlterTableRepairPartition: + ctx.WriteKeyWord("REPAIR PARTITION ") + if n.NoWriteToBinlog { + ctx.WriteKeyWord("NO_WRITE_TO_BINLOG ") + } + if n.OnAllPartitions { + ctx.WriteKeyWord("ALL") + return nil + } + for i, name := range n.PartitionNames { + if i != 0 { + ctx.WritePlain(",") + } + ctx.WriteName(name.O) + } + case AlterTableImportPartitionTablespace: + ctx.WriteKeyWord("IMPORT PARTITION ") + if n.OnAllPartitions { + ctx.WriteKeyWord("ALL") + } else { + for i, name := range n.PartitionNames { + if i != 0 { + ctx.WritePlain(",") + } + ctx.WriteName(name.O) + } + } + ctx.WriteKeyWord(" TABLESPACE") + case AlterTableDiscardPartitionTablespace: + ctx.WriteKeyWord("DISCARD PARTITION ") + if n.OnAllPartitions { + ctx.WriteKeyWord("ALL") + } else { + for i, name := range n.PartitionNames { + if i != 0 { + ctx.WritePlain(",") + } + ctx.WriteName(name.O) + } + } + ctx.WriteKeyWord(" TABLESPACE") + case AlterTablePartition: + if err := n.Partition.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore AlterTableSpec.Partition") + } + case AlterTableEnableKeys: + ctx.WriteKeyWord("ENABLE KEYS") + case AlterTableDisableKeys: + ctx.WriteKeyWord("DISABLE KEYS") + case AlterTableRemovePartitioning: + ctx.WriteKeyWord("REMOVE PARTITIONING") + case AlterTableWithValidation: + ctx.WriteKeyWord("WITH VALIDATION") + case AlterTableWithoutValidation: + ctx.WriteKeyWord("WITHOUT VALIDATION") + case AlterTableRebuildPartition: + ctx.WriteKeyWord("REBUILD PARTITION ") + if n.NoWriteToBinlog { + ctx.WriteKeyWord("NO_WRITE_TO_BINLOG ") + } + if n.OnAllPartitions { + ctx.WriteKeyWord("ALL") + return nil + } + for i, name := range n.PartitionNames { + if i != 0 { + ctx.WritePlain(",") + } + ctx.WriteName(name.O) + } + case AlterTableReorganizePartition: + ctx.WriteKeyWord("REORGANIZE PARTITION") + if n.NoWriteToBinlog { + ctx.WriteKeyWord(" NO_WRITE_TO_BINLOG") + } + if n.OnAllPartitions { + return nil + } + for i, name := range n.PartitionNames { + if i != 0 { + ctx.WritePlain(",") + } else { + ctx.WritePlain(" ") + } + ctx.WriteName(name.O) + } + ctx.WriteKeyWord(" INTO ") + if n.PartDefinitions != nil { + ctx.WritePlain("(") + for i, def := range n.PartDefinitions { + if i != 0 { + ctx.WritePlain(", ") + } + if err := def.Restore(ctx); err != nil { + return errors.Annotatef(err, "An error occurred while restore AlterTableSpec.PartDefinitions[%d]", i) + } + } + ctx.WritePlain(")") + } + case AlterTableExchangePartition: + ctx.WriteKeyWord("EXCHANGE PARTITION ") + ctx.WriteName(n.PartitionNames[0].O) + ctx.WriteKeyWord(" WITH TABLE ") + n.NewTable.Restore(ctx) + if !n.WithValidation { + ctx.WriteKeyWord(" WITHOUT VALIDATION") + } + case AlterTableSecondaryLoad: + ctx.WriteKeyWord("SECONDARY_LOAD") + case AlterTableSecondaryUnload: + ctx.WriteKeyWord("SECONDARY_UNLOAD") + case AlterTableAlterCheck: + ctx.WriteKeyWord("ALTER CHECK ") + ctx.WriteName(n.Constraint.Name) + if n.Constraint.Enforced == false { + ctx.WriteKeyWord(" NOT") + } + ctx.WriteKeyWord(" ENFORCED") + case AlterTableDropCheck: + ctx.WriteKeyWord("DROP CHECK ") + ctx.WriteName(n.Constraint.Name) + case AlterTableImportTablespace: + ctx.WriteKeyWord("IMPORT TABLESPACE") + case AlterTableDiscardTablespace: + ctx.WriteKeyWord("DISCARD TABLESPACE") + case AlterTableIndexInvisible: + ctx.WriteKeyWord("ALTER INDEX ") + ctx.WriteName(n.Name) + switch n.Visibility { + case IndexVisibilityVisible: + ctx.WriteKeyWord(" VISIBLE") + case IndexVisibilityInvisible: + ctx.WriteKeyWord(" INVISIBLE") + } + default: + // TODO: not support + ctx.WritePlainf(" /* AlterTableType(%d) is not supported */ ", n.Tp) + } + return nil +} + +// Accept implements Node Accept interface. +func (n *AlterTableSpec) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*AlterTableSpec) + if n.Constraint != nil { + node, ok := n.Constraint.Accept(v) + if !ok { + return n, false + } + n.Constraint = node.(*Constraint) + } + if n.NewTable != nil { + node, ok := n.NewTable.Accept(v) + if !ok { + return n, false + } + n.NewTable = node.(*TableName) + } + for _, col := range n.NewColumns { + node, ok := col.Accept(v) + if !ok { + return n, false + } + col = node.(*ColumnDef) + } + if n.OldColumnName != nil { + node, ok := n.OldColumnName.Accept(v) + if !ok { + return n, false + } + n.OldColumnName = node.(*ColumnName) + } + if n.Position != nil { + node, ok := n.Position.Accept(v) + if !ok { + return n, false + } + n.Position = node.(*ColumnPosition) + } + return v.Leave(n) +} + +// AlterTableStmt is a statement to change the structure of a table. +// See https://dev.mysql.com/doc/refman/5.7/en/alter-table.html +type AlterTableStmt struct { + ddlNode + + Table *TableName + Specs []*AlterTableSpec +} + +// Restore implements Node interface. +func (n *AlterTableStmt) Restore(ctx *RestoreCtx) error { + ctx.WriteKeyWord("ALTER TABLE ") + if err := n.Table.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore AlterTableStmt.Table") + } + for i, spec := range n.Specs { + if i == 0 || spec.Tp == AlterTablePartition || spec.Tp == AlterTableRemovePartitioning || spec.Tp == AlterTableImportTablespace || spec.Tp == AlterTableDiscardTablespace { + ctx.WritePlain(" ") + } else { + ctx.WritePlain(", ") + } + if err := spec.Restore(ctx); err != nil { + return errors.Annotatef(err, "An error occurred while restore AlterTableStmt.Specs[%d]", i) + } + } + return nil +} + +// Accept implements Node Accept interface. +func (n *AlterTableStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*AlterTableStmt) + node, ok := n.Table.Accept(v) + if !ok { + return n, false + } + n.Table = node.(*TableName) + for i, val := range n.Specs { + node, ok = val.Accept(v) + if !ok { + return n, false + } + n.Specs[i] = node.(*AlterTableSpec) + } + return v.Leave(n) +} + +// TruncateTableStmt is a statement to empty a table completely. +// See https://dev.mysql.com/doc/refman/5.7/en/truncate-table.html +type TruncateTableStmt struct { + ddlNode + + Table *TableName +} + +// Restore implements Node interface. +func (n *TruncateTableStmt) Restore(ctx *RestoreCtx) error { + ctx.WriteKeyWord("TRUNCATE TABLE ") + if err := n.Table.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore TruncateTableStmt.Table") + } + return nil +} + +// Accept implements Node Accept interface. +func (n *TruncateTableStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*TruncateTableStmt) + node, ok := n.Table.Accept(v) + if !ok { + return n, false + } + n.Table = node.(*TableName) + return v.Leave(n) +} + +var ( + ErrNoParts = terror.ClassDDL.NewStd(mysql.ErrNoParts) + ErrPartitionColumnList = terror.ClassDDL.NewStd(mysql.ErrPartitionColumnList) + ErrPartitionRequiresValues = terror.ClassDDL.NewStd(mysql.ErrPartitionRequiresValues) + ErrPartitionsMustBeDefined = terror.ClassDDL.NewStd(mysql.ErrPartitionsMustBeDefined) + ErrPartitionWrongNoPart = terror.ClassDDL.NewStd(mysql.ErrPartitionWrongNoPart) + ErrPartitionWrongNoSubpart = terror.ClassDDL.NewStd(mysql.ErrPartitionWrongNoSubpart) + ErrPartitionWrongValues = terror.ClassDDL.NewStd(mysql.ErrPartitionWrongValues) + ErrRowSinglePartitionField = terror.ClassDDL.NewStd(mysql.ErrRowSinglePartitionField) + ErrSubpartition = terror.ClassDDL.NewStd(mysql.ErrSubpartition) + ErrSystemVersioningWrongPartitions = terror.ClassDDL.NewStd(mysql.ErrSystemVersioningWrongPartitions) + ErrTooManyValues = terror.ClassDDL.NewStd(mysql.ErrTooManyValues) + ErrWrongPartitionTypeExpectedSystemTime = terror.ClassDDL.NewStd(mysql.ErrWrongPartitionTypeExpectedSystemTime) +) + +type SubPartitionDefinition struct { + Name model.CIStr + Options []*TableOption +} + +func (spd *SubPartitionDefinition) Restore(ctx *RestoreCtx) error { + ctx.WriteKeyWord("SUBPARTITION ") + ctx.WriteName(spd.Name.O) + for i, opt := range spd.Options { + ctx.WritePlain(" ") + if err := opt.Restore(ctx); err != nil { + return errors.Annotatef(err, "An error occurred while restore SubPartitionDefinition.Options[%d]", i) + } + } + return nil +} + +type PartitionDefinitionClause interface { + restore(ctx *RestoreCtx) error + acceptInPlace(v Visitor) bool + // Validate checks if the clause is consistent with the given options. + // `pt` can be 0 and `columns` can be -1 to skip checking the clause against + // the partition type or number of columns in the expression list. + Validate(pt model.PartitionType, columns int) error +} + +type PartitionDefinitionClauseNone struct{} + +func (n *PartitionDefinitionClauseNone) restore(ctx *RestoreCtx) error { + return nil +} + +func (n *PartitionDefinitionClauseNone) acceptInPlace(v Visitor) bool { + return true +} + +func (n *PartitionDefinitionClauseNone) Validate(pt model.PartitionType, columns int) error { + switch pt { + case 0: + case model.PartitionTypeRange: + return ErrPartitionRequiresValues.GenWithStackByArgs("RANGE", "LESS THAN") + case model.PartitionTypeList: + return ErrPartitionRequiresValues.GenWithStackByArgs("LIST", "IN") + case model.PartitionTypeSystemTime: + return ErrSystemVersioningWrongPartitions + } + return nil +} + +type PartitionDefinitionClauseLessThan struct { + Exprs []ExprNode +} + +func (n *PartitionDefinitionClauseLessThan) restore(ctx *RestoreCtx) error { + ctx.WriteKeyWord(" VALUES LESS THAN ") + ctx.WritePlain("(") + for i, expr := range n.Exprs { + if i != 0 { + ctx.WritePlain(", ") + } + if err := expr.Restore(ctx); err != nil { + return errors.Annotatef(err, "An error occurred while restore PartitionDefinitionClauseLessThan.Exprs[%d]", i) + } + } + ctx.WritePlain(")") + return nil +} + +func (n *PartitionDefinitionClauseLessThan) acceptInPlace(v Visitor) bool { + for i, expr := range n.Exprs { + newExpr, ok := expr.Accept(v) + if !ok { + return false + } + n.Exprs[i] = newExpr.(ExprNode) + } + return true +} + +func (n *PartitionDefinitionClauseLessThan) Validate(pt model.PartitionType, columns int) error { + switch pt { + case model.PartitionTypeRange, 0: + default: + return ErrPartitionWrongValues.GenWithStackByArgs("RANGE", "LESS THAN") + } + + switch { + case columns == 0 && len(n.Exprs) != 1: + return ErrTooManyValues.GenWithStackByArgs("RANGE") + case columns > 0 && len(n.Exprs) != columns: + return ErrPartitionColumnList + } + return nil +} + +type PartitionDefinitionClauseIn struct { + Values [][]ExprNode +} + +func (n *PartitionDefinitionClauseIn) restore(ctx *RestoreCtx) error { + // we special-case an empty list of values to mean MariaDB's "DEFAULT" clause. + if len(n.Values) == 0 { + ctx.WriteKeyWord(" DEFAULT") + return nil + } + + ctx.WriteKeyWord(" VALUES IN ") + ctx.WritePlain("(") + for i, valList := range n.Values { + if i != 0 { + ctx.WritePlain(", ") + } + if len(valList) == 1 { + if err := valList[0].Restore(ctx); err != nil { + return errors.Annotatef(err, "An error occurred while restore PartitionDefinitionClauseIn.Values[%d][0]", i) + } + } else { + ctx.WritePlain("(") + for j, val := range valList { + if j != 0 { + ctx.WritePlain(", ") + } + if err := val.Restore(ctx); err != nil { + return errors.Annotatef(err, "An error occurred while restore PartitionDefinitionClauseIn.Values[%d][%d]", i, j) + } + } + ctx.WritePlain(")") + } + } + ctx.WritePlain(")") + return nil +} + +func (n *PartitionDefinitionClauseIn) acceptInPlace(v Visitor) bool { + for _, valList := range n.Values { + for j, val := range valList { + newVal, ok := val.Accept(v) + if !ok { + return false + } + valList[j] = newVal.(ExprNode) + } + } + return true +} + +func (n *PartitionDefinitionClauseIn) Validate(pt model.PartitionType, columns int) error { + switch pt { + case model.PartitionTypeList, 0: + default: + return ErrPartitionWrongValues.GenWithStackByArgs("LIST", "IN") + } + + if len(n.Values) == 0 { + return nil + } + + expectedColCount := len(n.Values[0]) + for _, val := range n.Values[1:] { + if len(val) != expectedColCount { + return ErrPartitionColumnList + } + } + + switch { + case columns == 0 && expectedColCount != 1: + return ErrRowSinglePartitionField + case columns > 0 && expectedColCount != columns: + return ErrPartitionColumnList + } + return nil +} + +type PartitionDefinitionClauseHistory struct { + Current bool +} + +func (n *PartitionDefinitionClauseHistory) restore(ctx *RestoreCtx) error { + if n.Current { + ctx.WriteKeyWord(" CURRENT") + } else { + ctx.WriteKeyWord(" HISTORY") + } + return nil +} + +func (n *PartitionDefinitionClauseHistory) acceptInPlace(v Visitor) bool { + return true +} + +func (n *PartitionDefinitionClauseHistory) Validate(pt model.PartitionType, columns int) error { + switch pt { + case 0, model.PartitionTypeSystemTime: + default: + return ErrWrongPartitionTypeExpectedSystemTime + } + + return nil +} + +// PartitionDefinition defines a single partition. +type PartitionDefinition struct { + Name model.CIStr + Clause PartitionDefinitionClause + Options []*TableOption + Sub []*SubPartitionDefinition +} + +// Comment returns the comment option given to this definition. +// The second return value indicates if the comment option exists. +func (n *PartitionDefinition) Comment() (string, bool) { + for _, opt := range n.Options { + if opt.Tp == TableOptionComment { + return opt.StrValue, true + } + } + return "", false +} + +func (n *PartitionDefinition) acceptInPlace(v Visitor) bool { + return n.Clause.acceptInPlace(v) +} + +// Restore implements Node interface. +func (n *PartitionDefinition) Restore(ctx *RestoreCtx) error { + ctx.WriteKeyWord("PARTITION ") + ctx.WriteName(n.Name.O) + + if err := n.Clause.restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore PartitionDefinition.Clause") + } + + for i, opt := range n.Options { + ctx.WritePlain(" ") + if err := opt.Restore(ctx); err != nil { + return errors.Annotatef(err, "An error occurred while restore PartitionDefinition.Options[%d]", i) + } + } + + if len(n.Sub) > 0 { + ctx.WritePlain(" (") + for i, spd := range n.Sub { + if i != 0 { + ctx.WritePlain(",") + } + if err := spd.Restore(ctx); err != nil { + return errors.Annotatef(err, "An error occurred while restore PartitionDefinition.Sub[%d]", i) + } + } + ctx.WritePlain(")") + } + + return nil +} + +// PartitionMethod describes how partitions or subpartitions are constructed. +type PartitionMethod struct { + // Tp is the type of the partition function + Tp model.PartitionType + // Linear is a modifier to the HASH and KEY type for choosing a different + // algorithm + Linear bool + // Expr is an expression used as argument of HASH, RANGE, LIST and + // SYSTEM_TIME types + Expr ExprNode + // ColumnNames is a list of column names used as argument of KEY, + // RANGE COLUMNS and LIST COLUMNS types + ColumnNames []*ColumnName + // Unit is a time unit used as argument of SYSTEM_TIME type + Unit TimeUnitType + // Limit is a row count used as argument of the SYSTEM_TIME type + Limit uint64 + + // Num is the number of (sub)partitions required by the method. + Num uint64 +} + +// Restore implements the Node interface +func (n *PartitionMethod) Restore(ctx *RestoreCtx) error { + if n.Linear { + ctx.WriteKeyWord("LINEAR ") + } + ctx.WriteKeyWord(n.Tp.String()) + + switch { + case n.Tp == model.PartitionTypeSystemTime: + if n.Expr != nil && n.Unit != TimeUnitInvalid { + ctx.WriteKeyWord(" INTERVAL ") + if err := n.Expr.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore PartitionMethod.Expr") + } + ctx.WritePlain(" ") + ctx.WriteKeyWord(n.Unit.String()) + } + + case n.Expr != nil: + ctx.WritePlain(" (") + if err := n.Expr.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore PartitionMethod.Expr") + } + ctx.WritePlain(")") + + default: + if n.Tp == model.PartitionTypeRange || n.Tp == model.PartitionTypeList { + ctx.WriteKeyWord(" COLUMNS") + } + ctx.WritePlain(" (") + for i, col := range n.ColumnNames { + if i > 0 { + ctx.WritePlain(",") + } + if err := col.Restore(ctx); err != nil { + return errors.Annotatef(err, "An error occurred while splicing PartitionMethod.ColumnName[%d]", i) + } + } + ctx.WritePlain(")") + } + + if n.Limit > 0 { + ctx.WriteKeyWord(" LIMIT ") + ctx.WritePlainf("%d", n.Limit) + } + + return nil +} + +// acceptInPlace is like Node.Accept but does not allow replacing the node itself. +func (n *PartitionMethod) acceptInPlace(v Visitor) bool { + if n.Expr != nil { + expr, ok := n.Expr.Accept(v) + if !ok { + return false + } + n.Expr = expr.(ExprNode) + } + for i, colName := range n.ColumnNames { + newColName, ok := colName.Accept(v) + if !ok { + return false + } + n.ColumnNames[i] = newColName.(*ColumnName) + } + return true +} + +// PartitionOptions specifies the partition options. +type PartitionOptions struct { + node + PartitionMethod + Sub *PartitionMethod + Definitions []*PartitionDefinition +} + +// Validate checks if the partition is well-formed. +func (n *PartitionOptions) Validate() error { + // if both a partition list and the partition numbers are specified, their values must match + if n.Num != 0 && len(n.Definitions) != 0 && n.Num != uint64(len(n.Definitions)) { + return ErrPartitionWrongNoPart + } + // now check the subpartition count + if len(n.Definitions) > 0 { + // ensure the subpartition count for every partitions are the same + // then normalize n.Num and n.Sub.Num so equality comparison works. + n.Num = uint64(len(n.Definitions)) + + subDefCount := len(n.Definitions[0].Sub) + for _, pd := range n.Definitions[1:] { + if len(pd.Sub) != subDefCount { + return ErrPartitionWrongNoSubpart + } + } + if n.Sub != nil { + if n.Sub.Num != 0 && subDefCount != 0 && n.Sub.Num != uint64(subDefCount) { + return ErrPartitionWrongNoSubpart + } + if subDefCount != 0 { + n.Sub.Num = uint64(subDefCount) + } + } else if subDefCount != 0 { + return ErrSubpartition + } + } + + switch n.Tp { + case model.PartitionTypeHash, model.PartitionTypeKey: + if n.Num == 0 { + n.Num = 1 + } + case model.PartitionTypeRange, model.PartitionTypeList: + if len(n.Definitions) == 0 { + return ErrPartitionsMustBeDefined.GenWithStackByArgs(n.Tp) + } + case model.PartitionTypeSystemTime: + if len(n.Definitions) < 2 { + return ErrSystemVersioningWrongPartitions + } + } + + for _, pd := range n.Definitions { + // ensure the partition definition types match the methods, + // e.g. RANGE partitions only allows VALUES LESS THAN + if err := pd.Clause.Validate(n.Tp, len(n.ColumnNames)); err != nil { + return err + } + } + + return nil +} + +func (n *PartitionOptions) Restore(ctx *RestoreCtx) error { + ctx.WriteKeyWord("PARTITION BY ") + if err := n.PartitionMethod.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore PartitionOptions.PartitionMethod") + } + + if n.Num > 0 && len(n.Definitions) == 0 { + ctx.WriteKeyWord(" PARTITIONS ") + ctx.WritePlainf("%d", n.Num) + } + + if n.Sub != nil { + ctx.WriteKeyWord(" SUBPARTITION BY ") + if err := n.Sub.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore PartitionOptions.Sub") + } + if n.Sub.Num > 0 { + ctx.WriteKeyWord(" SUBPARTITIONS ") + ctx.WritePlainf("%d", n.Sub.Num) + } + } + + if len(n.Definitions) > 0 { + ctx.WritePlain(" (") + for i, def := range n.Definitions { + if i > 0 { + ctx.WritePlain(",") + } + if err := def.Restore(ctx); err != nil { + return errors.Annotatef(err, "An error occurred while restore PartitionOptions.Definitions[%d]", i) + } + } + ctx.WritePlain(")") + } + + return nil +} + +func (n *PartitionOptions) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + + n = newNode.(*PartitionOptions) + if !n.PartitionMethod.acceptInPlace(v) { + return n, false + } + if n.Sub != nil && !n.Sub.acceptInPlace(v) { + return n, false + } + for _, def := range n.Definitions { + if !def.acceptInPlace(v) { + return n, false + } + } + return v.Leave(n) +} + +// RecoverTableStmt is a statement to recover dropped table. +type RecoverTableStmt struct { + ddlNode + + JobID int64 + Table *TableName + JobNum int64 +} + +// Restore implements Node interface. +func (n *RecoverTableStmt) Restore(ctx *RestoreCtx) error { + ctx.WriteKeyWord("RECOVER TABLE ") + if n.JobID != 0 { + ctx.WriteKeyWord("BY JOB ") + ctx.WritePlainf("%d", n.JobID) + } else { + if err := n.Table.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while splicing RecoverTableStmt Table") + } + if n.JobNum > 0 { + ctx.WritePlainf(" %d", n.JobNum) + } + } + return nil +} + +// Accept implements Node Accept interface. +func (n *RecoverTableStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + + n = newNode.(*RecoverTableStmt) + if n.Table != nil { + node, ok := n.Table.Accept(v) + if !ok { + return n, false + } + n.Table = node.(*TableName) + } + return v.Leave(n) +} diff --git a/vendor/github.com/pingcap/parser/ast/dml.go b/vendor/github.com/pingcap/parser/ast/dml.go new file mode 100755 index 0000000..9970d80 --- /dev/null +++ b/vendor/github.com/pingcap/parser/ast/dml.go @@ -0,0 +1,2536 @@ +// Copyright 2015 PingCAP, Inc. +// +// 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package ast + +import ( + "github.com/pingcap/errors" + "github.com/pingcap/parser/auth" + . "github.com/pingcap/parser/format" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" +) + +var ( + _ DMLNode = &DeleteStmt{} + _ DMLNode = &InsertStmt{} + _ DMLNode = &UnionStmt{} + _ DMLNode = &UpdateStmt{} + _ DMLNode = &SelectStmt{} + _ DMLNode = &ShowStmt{} + _ DMLNode = &LoadDataStmt{} + _ DMLNode = &SplitRegionStmt{} + + _ Node = &Assignment{} + _ Node = &ByItem{} + _ Node = &FieldList{} + _ Node = &GroupByClause{} + _ Node = &HavingClause{} + _ Node = &Join{} + _ Node = &Limit{} + _ Node = &OnCondition{} + _ Node = &OrderByClause{} + _ Node = &SelectField{} + _ Node = &TableName{} + _ Node = &TableRefsClause{} + _ Node = &TableSource{} + _ Node = &UnionSelectList{} + _ Node = &WildCardField{} + _ Node = &WindowSpec{} + _ Node = &PartitionByClause{} + _ Node = &FrameClause{} + _ Node = &FrameBound{} +) + +// JoinType is join type, including cross/left/right/full. +type JoinType int + +const ( + // CrossJoin is cross join type. + CrossJoin JoinType = iota + 1 + // LeftJoin is left Join type. + LeftJoin + // RightJoin is right Join type. + RightJoin +) + +// Join represents table join. +type Join struct { + node + resultSetNode + + // Left table can be TableSource or JoinNode. + Left ResultSetNode + // Right table can be TableSource or JoinNode or nil. + Right ResultSetNode + // Tp represents join type. + Tp JoinType + // On represents join on condition. + On *OnCondition + // Using represents join using clause. + Using []*ColumnName + // NaturalJoin represents join is natural join. + NaturalJoin bool + // StraightJoin represents a straight join. + StraightJoin bool +} + +// Restore implements Node interface. +func (n *Join) Restore(ctx *RestoreCtx) error { + if ctx.JoinLevel != 0 { + ctx.WritePlain("(") + defer ctx.WritePlain(")") + } + ctx.JoinLevel++ + if err := n.Left.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore Join.Left") + } + ctx.JoinLevel-- + if n.Right == nil { + return nil + } + if n.NaturalJoin { + ctx.WriteKeyWord(" NATURAL") + } + switch n.Tp { + case LeftJoin: + ctx.WriteKeyWord(" LEFT") + case RightJoin: + ctx.WriteKeyWord(" RIGHT") + } + if n.StraightJoin { + ctx.WriteKeyWord(" STRAIGHT_JOIN ") + } else { + ctx.WriteKeyWord(" JOIN ") + } + ctx.JoinLevel++ + if err := n.Right.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore Join.Right") + } + ctx.JoinLevel-- + + if n.On != nil { + ctx.WritePlain(" ") + if err := n.On.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore Join.On") + } + } + if len(n.Using) != 0 { + ctx.WriteKeyWord(" USING ") + ctx.WritePlain("(") + for i, v := range n.Using { + if i != 0 { + ctx.WritePlain(",") + } + if err := v.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore Join.Using") + } + } + ctx.WritePlain(")") + } + + return nil +} + +// Accept implements Node Accept interface. +func (n *Join) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*Join) + node, ok := n.Left.Accept(v) + if !ok { + return n, false + } + n.Left = node.(ResultSetNode) + if n.Right != nil { + node, ok = n.Right.Accept(v) + if !ok { + return n, false + } + n.Right = node.(ResultSetNode) + } + if n.On != nil { + node, ok = n.On.Accept(v) + if !ok { + return n, false + } + n.On = node.(*OnCondition) + } + return v.Leave(n) +} + +// TableName represents a table name. +type TableName struct { + node + resultSetNode + + Schema model.CIStr + Name model.CIStr + + DBInfo *model.DBInfo + TableInfo *model.TableInfo + + IndexHints []*IndexHint + PartitionNames []model.CIStr +} + +// Restore implements Node interface. +func (n *TableName) Restore(ctx *RestoreCtx) error { + if n.Schema.String() != "" { + ctx.WriteName(n.Schema.String()) + ctx.WritePlain(".") + } + ctx.WriteName(n.Name.String()) + if len(n.PartitionNames) > 0 { + ctx.WriteKeyWord(" PARTITION") + ctx.WritePlain("(") + for i, v := range n.PartitionNames { + if i != 0 { + ctx.WritePlain(", ") + } + ctx.WriteName(v.String()) + } + ctx.WritePlain(")") + } + for _, value := range n.IndexHints { + ctx.WritePlain(" ") + if err := value.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while splicing IndexHints") + } + } + + return nil +} + +// IndexHintType is the type for index hint use, ignore or force. +type IndexHintType int + +// IndexHintUseType values. +const ( + HintUse IndexHintType = 1 + HintIgnore IndexHintType = 2 + HintForce IndexHintType = 3 +) + +// IndexHintScope is the type for index hint for join, order by or group by. +type IndexHintScope int + +// Index hint scopes. +const ( + HintForScan IndexHintScope = 1 + HintForJoin IndexHintScope = 2 + HintForOrderBy IndexHintScope = 3 + HintForGroupBy IndexHintScope = 4 +) + +// IndexHint represents a hint for optimizer to use/ignore/force for join/order by/group by. +type IndexHint struct { + IndexNames []model.CIStr + HintType IndexHintType + HintScope IndexHintScope +} + +// IndexHint Restore (The const field uses switch to facilitate understanding) +func (n *IndexHint) Restore(ctx *RestoreCtx) error { + indexHintType := "" + switch n.HintType { + case 1: + indexHintType = "USE INDEX" + case 2: + indexHintType = "IGNORE INDEX" + case 3: + indexHintType = "FORCE INDEX" + default: // Prevent accidents + return errors.New("IndexHintType has an error while matching") + } + + indexHintScope := "" + switch n.HintScope { + case 1: + indexHintScope = "" + case 2: + indexHintScope = " FOR JOIN" + case 3: + indexHintScope = " FOR ORDER BY" + case 4: + indexHintScope = " FOR GROUP BY" + default: // Prevent accidents + return errors.New("IndexHintScope has an error while matching") + } + ctx.WriteKeyWord(indexHintType) + ctx.WriteKeyWord(indexHintScope) + ctx.WritePlain(" (") + for i, value := range n.IndexNames { + if i > 0 { + ctx.WritePlain(", ") + } + ctx.WriteName(value.O) + } + ctx.WritePlain(")") + + return nil +} + +// Accept implements Node Accept interface. +func (n *TableName) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*TableName) + return v.Leave(n) +} + +// DeleteTableList is the tablelist used in delete statement multi-table mode. +type DeleteTableList struct { + node + Tables []*TableName +} + +// Restore implements Node interface. +func (n *DeleteTableList) Restore(ctx *RestoreCtx) error { + for i, t := range n.Tables { + if i != 0 { + ctx.WritePlain(",") + } + if err := t.Restore(ctx); err != nil { + return errors.Annotatef(err, "An error occurred while restore DeleteTableList.Tables[%v]", i) + } + } + return nil +} + +// Accept implements Node Accept interface. +func (n *DeleteTableList) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*DeleteTableList) + if n != nil { + for i, t := range n.Tables { + node, ok := t.Accept(v) + if !ok { + return n, false + } + n.Tables[i] = node.(*TableName) + } + } + return v.Leave(n) +} + +// OnCondition represents JOIN on condition. +type OnCondition struct { + node + + Expr ExprNode +} + +// Restore implements Node interface. +func (n *OnCondition) Restore(ctx *RestoreCtx) error { + ctx.WriteKeyWord("ON ") + if err := n.Expr.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore OnCondition.Expr") + } + return nil +} + +// Accept implements Node Accept interface. +func (n *OnCondition) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*OnCondition) + node, ok := n.Expr.Accept(v) + if !ok { + return n, false + } + n.Expr = node.(ExprNode) + return v.Leave(n) +} + +// TableSource represents table source with a name. +type TableSource struct { + node + + // Source is the source of the data, can be a TableName, + // a SelectStmt, a UnionStmt, or a JoinNode. + Source ResultSetNode + + // AsName is the alias name of the table source. + AsName model.CIStr +} + +// Restore implements Node interface. +func (n *TableSource) Restore(ctx *RestoreCtx) error { + needParen := false + switch n.Source.(type) { + case *SelectStmt, *UnionStmt: + needParen = true + } + if needParen { + ctx.WritePlain("(") + } + if err := n.Source.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore TableSource.Source") + } + if needParen { + ctx.WritePlain(")") + } + if asName := n.AsName.String(); asName != "" { + ctx.WriteKeyWord(" AS ") + ctx.WriteName(asName) + } + + return nil +} + +// Accept implements Node Accept interface. +func (n *TableSource) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*TableSource) + node, ok := n.Source.Accept(v) + if !ok { + return n, false + } + n.Source = node.(ResultSetNode) + return v.Leave(n) +} + +// SelectLockType is the lock type for SelectStmt. +type SelectLockType int + +// Select lock types. +const ( + SelectLockNone SelectLockType = iota + SelectLockForUpdate + SelectLockInShareMode +) + +// String implements fmt.Stringer. +func (slt SelectLockType) String() string { + switch slt { + case SelectLockNone: + return "none" + case SelectLockForUpdate: + return "for update" + case SelectLockInShareMode: + return "in share mode" + } + return "unsupported select lock type" +} + +// WildCardField is a special type of select field content. +type WildCardField struct { + node + + Table model.CIStr + Schema model.CIStr +} + +// Restore implements Node interface. +func (n *WildCardField) Restore(ctx *RestoreCtx) error { + if schema := n.Schema.String(); schema != "" { + ctx.WriteName(schema) + ctx.WritePlain(".") + } + if table := n.Table.String(); table != "" { + ctx.WriteName(table) + ctx.WritePlain(".") + } + ctx.WritePlain("*") + return nil +} + +// Accept implements Node Accept interface. +func (n *WildCardField) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*WildCardField) + return v.Leave(n) +} + +// SelectField represents fields in select statement. +// There are two type of select field: wildcard +// and expression with optional alias name. +type SelectField struct { + node + + // Offset is used to get original text. + Offset int + // WildCard is not nil, Expr will be nil. + WildCard *WildCardField + // Expr is not nil, WildCard will be nil. + Expr ExprNode + // AsName is alias name for Expr. + AsName model.CIStr + // Auxiliary stands for if this field is auxiliary. + // When we add a Field into SelectField list which is used for having/orderby clause but the field is not in select clause, + // we should set its Auxiliary to true. Then the TrimExec will trim the field. + Auxiliary bool +} + +// Restore implements Node interface. +func (n *SelectField) Restore(ctx *RestoreCtx) error { + if n.WildCard != nil { + if err := n.WildCard.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore SelectField.WildCard") + } + } + if n.Expr != nil { + if err := n.Expr.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore SelectField.Expr") + } + } + if asName := n.AsName.String(); asName != "" { + ctx.WriteKeyWord(" AS ") + ctx.WriteName(asName) + } + return nil +} + +// Accept implements Node Accept interface. +func (n *SelectField) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*SelectField) + if n.Expr != nil { + node, ok := n.Expr.Accept(v) + if !ok { + return n, false + } + n.Expr = node.(ExprNode) + } + return v.Leave(n) +} + +// FieldList represents field list in select statement. +type FieldList struct { + node + + Fields []*SelectField +} + +// Restore implements Node interface. +func (n *FieldList) Restore(ctx *RestoreCtx) error { + for i, v := range n.Fields { + if i != 0 { + ctx.WritePlain(", ") + } + if err := v.Restore(ctx); err != nil { + return errors.Annotatef(err, "An error occurred while restore FieldList.Fields[%d]", i) + } + } + return nil +} + +// Accept implements Node Accept interface. +func (n *FieldList) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*FieldList) + for i, val := range n.Fields { + node, ok := val.Accept(v) + if !ok { + return n, false + } + n.Fields[i] = node.(*SelectField) + } + return v.Leave(n) +} + +// TableRefsClause represents table references clause in dml statement. +type TableRefsClause struct { + node + + TableRefs *Join +} + +// Restore implements Node interface. +func (n *TableRefsClause) Restore(ctx *RestoreCtx) error { + if err := n.TableRefs.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore TableRefsClause.TableRefs") + } + return nil +} + +// Accept implements Node Accept interface. +func (n *TableRefsClause) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*TableRefsClause) + node, ok := n.TableRefs.Accept(v) + if !ok { + return n, false + } + n.TableRefs = node.(*Join) + return v.Leave(n) +} + +// ByItem represents an item in order by or group by. +type ByItem struct { + node + + Expr ExprNode + Desc bool +} + +// Restore implements Node interface. +func (n *ByItem) Restore(ctx *RestoreCtx) error { + if err := n.Expr.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore ByItem.Expr") + } + if n.Desc { + ctx.WriteKeyWord(" DESC") + } + return nil +} + +// Accept implements Node Accept interface. +func (n *ByItem) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*ByItem) + node, ok := n.Expr.Accept(v) + if !ok { + return n, false + } + n.Expr = node.(ExprNode) + return v.Leave(n) +} + +// GroupByClause represents group by clause. +type GroupByClause struct { + node + Items []*ByItem +} + +// Restore implements Node interface. +func (n *GroupByClause) Restore(ctx *RestoreCtx) error { + ctx.WriteKeyWord("GROUP BY ") + for i, v := range n.Items { + if i != 0 { + ctx.WritePlain(",") + } + if err := v.Restore(ctx); err != nil { + return errors.Annotatef(err, "An error occurred while restore GroupByClause.Items[%d]", i) + } + } + return nil +} + +// Accept implements Node Accept interface. +func (n *GroupByClause) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*GroupByClause) + for i, val := range n.Items { + node, ok := val.Accept(v) + if !ok { + return n, false + } + n.Items[i] = node.(*ByItem) + } + return v.Leave(n) +} + +// HavingClause represents having clause. +type HavingClause struct { + node + Expr ExprNode +} + +// Restore implements Node interface. +func (n *HavingClause) Restore(ctx *RestoreCtx) error { + ctx.WriteKeyWord("HAVING ") + if err := n.Expr.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore HavingClause.Expr") + } + return nil +} + +// Accept implements Node Accept interface. +func (n *HavingClause) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*HavingClause) + node, ok := n.Expr.Accept(v) + if !ok { + return n, false + } + n.Expr = node.(ExprNode) + return v.Leave(n) +} + +// OrderByClause represents order by clause. +type OrderByClause struct { + node + Items []*ByItem + ForUnion bool +} + +// Restore implements Node interface. +func (n *OrderByClause) Restore(ctx *RestoreCtx) error { + ctx.WriteKeyWord("ORDER BY ") + for i, item := range n.Items { + if i != 0 { + ctx.WritePlain(",") + } + if err := item.Restore(ctx); err != nil { + return errors.Annotatef(err, "An error occurred while restore OrderByClause.Items[%d]", i) + } + } + return nil +} + +// Accept implements Node Accept interface. +func (n *OrderByClause) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*OrderByClause) + for i, val := range n.Items { + node, ok := val.Accept(v) + if !ok { + return n, false + } + n.Items[i] = node.(*ByItem) + } + return v.Leave(n) +} + +// SelectStmt represents the select query node. +// See https://dev.mysql.com/doc/refman/5.7/en/select.html +type SelectStmt struct { + dmlNode + resultSetNode + + // SelectStmtOpts wraps around select hints and switches. + *SelectStmtOpts + // Distinct represents whether the select has distinct option. + Distinct bool + // From is the from clause of the query. + From *TableRefsClause + // Where is the where clause in select statement. + Where ExprNode + // Fields is the select expression list. + Fields *FieldList + // GroupBy is the group by expression list. + GroupBy *GroupByClause + // Having is the having condition. + Having *HavingClause + // WindowSpecs is the window specification list. + WindowSpecs []WindowSpec + // OrderBy is the ordering expression list. + OrderBy *OrderByClause + // Limit is the limit clause. + Limit *Limit + // LockTp is the lock type + LockTp SelectLockType + // TableHints represents the table level Optimizer Hint for join type + TableHints []*TableOptimizerHint + // IsAfterUnionDistinct indicates whether it's a stmt after "union distinct". + IsAfterUnionDistinct bool + // IsInBraces indicates whether it's a stmt in brace. + IsInBraces bool + // QueryBlockOffset indicates the order of this SelectStmt if counted from left to right in the sql text. + QueryBlockOffset int +} + +// Restore implements Node interface. +func (n *SelectStmt) Restore(ctx *RestoreCtx) error { + ctx.WriteKeyWord("SELECT ") + + if n.SelectStmtOpts.Priority > 0 { + ctx.WriteKeyWord(mysql.Priority2Str[n.SelectStmtOpts.Priority]) + ctx.WritePlain(" ") + } + + if n.SelectStmtOpts.SQLSmallResult { + ctx.WriteKeyWord("SQL_SMALL_RESULT ") + } + + if n.SelectStmtOpts.SQLBigResult { + ctx.WriteKeyWord("SQL_BIG_RESULT ") + } + + if n.SelectStmtOpts.SQLBufferResult { + ctx.WriteKeyWord("SQL_BUFFER_RESULT ") + } + + if !n.SelectStmtOpts.SQLCache { + ctx.WriteKeyWord("SQL_NO_CACHE ") + } + + if n.TableHints != nil && len(n.TableHints) != 0 { + ctx.WritePlain("/*+ ") + for i, tableHint := range n.TableHints { + if err := tableHint.Restore(ctx); err != nil { + return errors.Annotatef(err, "An error occurred while restore SelectStmt.TableHints[%d]", i) + } + } + ctx.WritePlain("*/ ") + } + + if n.Distinct { + ctx.WriteKeyWord("DISTINCT ") + } + if n.SelectStmtOpts.StraightJoin { + ctx.WriteKeyWord("STRAIGHT_JOIN ") + } + if n.Fields != nil { + for i, field := range n.Fields.Fields { + if i != 0 { + ctx.WritePlain(",") + } + if err := field.Restore(ctx); err != nil { + return errors.Annotatef(err, "An error occurred while restore SelectStmt.Fields[%d]", i) + } + } + } + + if n.From != nil { + ctx.WriteKeyWord(" FROM ") + if err := n.From.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore SelectStmt.From") + } + } + + if n.From == nil && n.Where != nil { + ctx.WriteKeyWord(" FROM DUAL") + } + if n.Where != nil { + ctx.WriteKeyWord(" WHERE ") + if err := n.Where.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore SelectStmt.Where") + } + } + + if n.GroupBy != nil { + ctx.WritePlain(" ") + if err := n.GroupBy.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore SelectStmt.GroupBy") + } + } + + if n.Having != nil { + ctx.WritePlain(" ") + if err := n.Having.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore SelectStmt.Having") + } + } + + if n.WindowSpecs != nil { + ctx.WriteKeyWord(" WINDOW ") + for i, windowsSpec := range n.WindowSpecs { + if i != 0 { + ctx.WritePlain(",") + } + if err := windowsSpec.Restore(ctx); err != nil { + return errors.Annotatef(err, "An error occurred while restore SelectStmt.WindowSpec[%d]", i) + } + } + } + + if n.OrderBy != nil { + ctx.WritePlain(" ") + if err := n.OrderBy.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore SelectStmt.OrderBy") + } + } + + if n.Limit != nil { + ctx.WritePlain(" ") + if err := n.Limit.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore SelectStmt.Limit") + } + } + + switch n.LockTp { + case SelectLockInShareMode: + ctx.WriteKeyWord(" LOCK ") + ctx.WriteKeyWord(n.LockTp.String()) + case SelectLockForUpdate: + ctx.WritePlain(" ") + ctx.WriteKeyWord(n.LockTp.String()) + } + return nil +} + +// Accept implements Node Accept interface. +func (n *SelectStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + + n = newNode.(*SelectStmt) + if n.TableHints != nil && len(n.TableHints) != 0 { + newHints := make([]*TableOptimizerHint, len(n.TableHints)) + for i, hint := range n.TableHints { + node, ok := hint.Accept(v) + if !ok { + return n, false + } + newHints[i] = node.(*TableOptimizerHint) + } + n.TableHints = newHints + } + + if n.Fields != nil { + node, ok := n.Fields.Accept(v) + if !ok { + return n, false + } + n.Fields = node.(*FieldList) + } + + if n.From != nil { + node, ok := n.From.Accept(v) + if !ok { + return n, false + } + n.From = node.(*TableRefsClause) + } + + if n.Where != nil { + node, ok := n.Where.Accept(v) + if !ok { + return n, false + } + n.Where = node.(ExprNode) + } + + if n.GroupBy != nil { + node, ok := n.GroupBy.Accept(v) + if !ok { + return n, false + } + n.GroupBy = node.(*GroupByClause) + } + + if n.Having != nil { + node, ok := n.Having.Accept(v) + if !ok { + return n, false + } + n.Having = node.(*HavingClause) + } + + for i, spec := range n.WindowSpecs { + node, ok := spec.Accept(v) + if !ok { + return n, false + } + n.WindowSpecs[i] = *node.(*WindowSpec) + } + + if n.OrderBy != nil { + node, ok := n.OrderBy.Accept(v) + if !ok { + return n, false + } + n.OrderBy = node.(*OrderByClause) + } + + if n.Limit != nil { + node, ok := n.Limit.Accept(v) + if !ok { + return n, false + } + n.Limit = node.(*Limit) + } + + return v.Leave(n) +} + +// UnionSelectList represents the select list in a union statement. +type UnionSelectList struct { + node + + Selects []*SelectStmt +} + +// Restore implements Node interface. +func (n *UnionSelectList) Restore(ctx *RestoreCtx) error { + for i, selectStmt := range n.Selects { + if i != 0 { + ctx.WriteKeyWord(" UNION ") + if !selectStmt.IsAfterUnionDistinct { + ctx.WriteKeyWord("ALL ") + } + } + if selectStmt.IsInBraces { + ctx.WritePlain("(") + } + if err := selectStmt.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore UnionSelectList.SelectStmt") + } + if selectStmt.IsInBraces { + ctx.WritePlain(")") + } + } + return nil +} + +// Accept implements Node Accept interface. +func (n *UnionSelectList) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*UnionSelectList) + for i, sel := range n.Selects { + node, ok := sel.Accept(v) + if !ok { + return n, false + } + n.Selects[i] = node.(*SelectStmt) + } + return v.Leave(n) +} + +// UnionStmt represents "union statement" +// See https://dev.mysql.com/doc/refman/5.7/en/union.html +type UnionStmt struct { + dmlNode + resultSetNode + + SelectList *UnionSelectList + OrderBy *OrderByClause + Limit *Limit +} + +// Restore implements Node interface. +func (n *UnionStmt) Restore(ctx *RestoreCtx) error { + if err := n.SelectList.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore UnionStmt.SelectList") + } + + if n.OrderBy != nil { + ctx.WritePlain(" ") + if err := n.OrderBy.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore UnionStmt.OrderBy") + } + } + + if n.Limit != nil { + ctx.WritePlain(" ") + if err := n.Limit.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore UnionStmt.Limit") + } + } + return nil +} + +// Accept implements Node Accept interface. +func (n *UnionStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*UnionStmt) + if n.SelectList != nil { + node, ok := n.SelectList.Accept(v) + if !ok { + return n, false + } + n.SelectList = node.(*UnionSelectList) + } + if n.OrderBy != nil { + node, ok := n.OrderBy.Accept(v) + if !ok { + return n, false + } + n.OrderBy = node.(*OrderByClause) + } + if n.Limit != nil { + node, ok := n.Limit.Accept(v) + if !ok { + return n, false + } + n.Limit = node.(*Limit) + } + return v.Leave(n) +} + +// Assignment is the expression for assignment, like a = 1. +type Assignment struct { + node + // Column is the column name to be assigned. + Column *ColumnName + // Expr is the expression assigning to ColName. + Expr ExprNode +} + +// Restore implements Node interface. +func (n *Assignment) Restore(ctx *RestoreCtx) error { + if err := n.Column.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore Assignment.Column") + } + ctx.WritePlain("=") + if err := n.Expr.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore Assignment.Expr") + } + return nil +} + +// Accept implements Node Accept interface. +func (n *Assignment) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*Assignment) + node, ok := n.Column.Accept(v) + if !ok { + return n, false + } + n.Column = node.(*ColumnName) + node, ok = n.Expr.Accept(v) + if !ok { + return n, false + } + n.Expr = node.(ExprNode) + return v.Leave(n) +} + +type ColumnNameOrUserVar struct { + ColumnName *ColumnName + UserVar *VariableExpr +} + +// LoadDataStmt is a statement to load data from a specified file, then insert this rows into an existing table. +// See https://dev.mysql.com/doc/refman/5.7/en/load-data.html +type LoadDataStmt struct { + dmlNode + + IsLocal bool + Path string + OnDuplicate OnDuplicateKeyHandlingType + Table *TableName + Columns []*ColumnName + FieldsInfo *FieldsClause + LinesInfo *LinesClause + IgnoreLines uint64 + ColumnAssignments []*Assignment + + ColumnsAndUserVars []*ColumnNameOrUserVar +} + +// Restore implements Node interface. +func (n *LoadDataStmt) Restore(ctx *RestoreCtx) error { + ctx.WriteKeyWord("LOAD DATA ") + if n.IsLocal { + ctx.WriteKeyWord("LOCAL ") + } + ctx.WriteKeyWord("INFILE ") + ctx.WriteString(n.Path) + if n.OnDuplicate == OnDuplicateKeyHandlingReplace { + ctx.WriteKeyWord(" REPLACE") + } else if n.OnDuplicate == OnDuplicateKeyHandlingIgnore { + ctx.WriteKeyWord(" IGNORE") + } + ctx.WriteKeyWord(" INTO TABLE ") + if err := n.Table.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore LoadDataStmt.Table") + } + n.FieldsInfo.Restore(ctx) + n.LinesInfo.Restore(ctx) + if n.IgnoreLines != 0 { + ctx.WriteKeyWord(" IGNORE ") + ctx.WritePlainf("%d", n.IgnoreLines) + ctx.WriteKeyWord(" LINES") + } + if len(n.ColumnsAndUserVars) != 0 { + ctx.WritePlain(" (") + for i, c := range n.ColumnsAndUserVars { + if i != 0 { + ctx.WritePlain(",") + } + if c.ColumnName != nil { + if err := c.ColumnName.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore LoadDataStmt.ColumnsAndUserVars") + } + } + if c.UserVar != nil { + if err := c.UserVar.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore LoadDataStmt.ColumnsAndUserVars") + } + } + + } + ctx.WritePlain(")") + } + + if n.ColumnAssignments != nil { + ctx.WriteKeyWord(" SET") + for i, assign := range n.ColumnAssignments { + if i != 0 { + ctx.WritePlain(",") + } + ctx.WritePlain(" ") + if err := assign.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore LoadDataStmt.ColumnAssignments") + } + } + } + return nil +} + +// Accept implements Node Accept interface. +func (n *LoadDataStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*LoadDataStmt) + if n.Table != nil { + node, ok := n.Table.Accept(v) + if !ok { + return n, false + } + n.Table = node.(*TableName) + } + for i, val := range n.Columns { + node, ok := val.Accept(v) + if !ok { + return n, false + } + n.Columns[i] = node.(*ColumnName) + } + + for i, assignment := range n.ColumnAssignments { + node, ok := assignment.Accept(v) + if !ok { + return n, false + } + n.ColumnAssignments[i] = node.(*Assignment) + } + return v.Leave(n) +} + +const ( + Terminated = iota + Enclosed + Escaped +) + +type FieldItem struct { + Type int + Value string +} + +// FieldsClause represents fields references clause in load data statement. +type FieldsClause struct { + Terminated string + Enclosed byte + Escaped byte +} + +// Restore for FieldsClause +func (n *FieldsClause) Restore(ctx *RestoreCtx) error { + if n.Terminated != "\t" || n.Escaped != '\\' { + ctx.WriteKeyWord(" FIELDS") + if n.Terminated != "\t" { + ctx.WriteKeyWord(" TERMINATED BY ") + ctx.WriteString(n.Terminated) + } + if n.Enclosed != 0 { + ctx.WriteKeyWord(" ENCLOSED BY ") + ctx.WriteString(string(n.Enclosed)) + } + if n.Escaped != '\\' { + ctx.WriteKeyWord(" ESCAPED BY ") + if n.Escaped == 0 { + ctx.WritePlain("''") + } else { + ctx.WriteString(string(n.Escaped)) + } + } + } + return nil +} + +// LinesClause represents lines references clause in load data statement. +type LinesClause struct { + Starting string + Terminated string +} + +// Restore for LinesClause +func (n *LinesClause) Restore(ctx *RestoreCtx) error { + if n.Starting != "" || n.Terminated != "\n" { + ctx.WriteKeyWord(" LINES") + if n.Starting != "" { + ctx.WriteKeyWord(" STARTING BY ") + ctx.WriteString(n.Starting) + } + if n.Terminated != "\n" { + ctx.WriteKeyWord(" TERMINATED BY ") + ctx.WriteString(n.Terminated) + } + } + return nil +} + +// InsertStmt is a statement to insert new rows into an existing table. +// See https://dev.mysql.com/doc/refman/5.7/en/insert.html +type InsertStmt struct { + dmlNode + + IsReplace bool + IgnoreErr bool + Table *TableRefsClause + Columns []*ColumnName + Lists [][]ExprNode + Setlist []*Assignment + Priority mysql.PriorityEnum + OnDuplicate []*Assignment + Select ResultSetNode +} + +// Restore implements Node interface. +func (n *InsertStmt) Restore(ctx *RestoreCtx) error { + if n.IsReplace { + ctx.WriteKeyWord("REPLACE ") + } else { + ctx.WriteKeyWord("INSERT ") + } + if err := n.Priority.Restore(ctx); err != nil { + return errors.Trace(err) + } + if n.Priority != mysql.NoPriority { + ctx.WritePlain(" ") + } + if n.IgnoreErr { + ctx.WriteKeyWord("IGNORE ") + } + ctx.WriteKeyWord("INTO ") + if err := n.Table.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore InsertStmt.Table") + } + if n.Columns != nil { + ctx.WritePlain(" (") + for i, v := range n.Columns { + if i != 0 { + ctx.WritePlain(",") + } + if err := v.Restore(ctx); err != nil { + return errors.Annotatef(err, "An error occurred while restore InsertStmt.Columns[%d]", i) + } + } + ctx.WritePlain(")") + } + if n.Lists != nil { + ctx.WriteKeyWord(" VALUES ") + for i, row := range n.Lists { + if i != 0 { + ctx.WritePlain(",") + } + ctx.WritePlain("(") + for j, v := range row { + if j != 0 { + ctx.WritePlain(",") + } + if err := v.Restore(ctx); err != nil { + return errors.Annotatef(err, "An error occurred while restore InsertStmt.Lists[%d][%d]", i, j) + } + } + ctx.WritePlain(")") + } + } + if n.Select != nil { + ctx.WritePlain(" ") + switch v := n.Select.(type) { + case *SelectStmt, *UnionStmt: + if err := v.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore InsertStmt.Select") + } + default: + return errors.Errorf("Incorrect type for InsertStmt.Select: %T", v) + } + } + if n.Setlist != nil { + ctx.WriteKeyWord(" SET ") + for i, v := range n.Setlist { + if i != 0 { + ctx.WritePlain(",") + } + if err := v.Restore(ctx); err != nil { + return errors.Annotatef(err, "An error occurred while restore InsertStmt.Setlist[%d]", i) + } + } + } + if n.OnDuplicate != nil { + ctx.WriteKeyWord(" ON DUPLICATE KEY UPDATE ") + for i, v := range n.OnDuplicate { + if i != 0 { + ctx.WritePlain(",") + } + if err := v.Restore(ctx); err != nil { + return errors.Annotatef(err, "An error occurred while restore InsertStmt.OnDuplicate[%d]", i) + } + } + } + + return nil +} + +// Accept implements Node Accept interface. +func (n *InsertStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + + n = newNode.(*InsertStmt) + if n.Select != nil { + node, ok := n.Select.Accept(v) + if !ok { + return n, false + } + n.Select = node.(ResultSetNode) + } + + node, ok := n.Table.Accept(v) + if !ok { + return n, false + } + n.Table = node.(*TableRefsClause) + + for i, val := range n.Columns { + node, ok := val.Accept(v) + if !ok { + return n, false + } + n.Columns[i] = node.(*ColumnName) + } + for i, list := range n.Lists { + for j, val := range list { + node, ok := val.Accept(v) + if !ok { + return n, false + } + n.Lists[i][j] = node.(ExprNode) + } + } + for i, val := range n.Setlist { + node, ok := val.Accept(v) + if !ok { + return n, false + } + n.Setlist[i] = node.(*Assignment) + } + for i, val := range n.OnDuplicate { + node, ok := val.Accept(v) + if !ok { + return n, false + } + n.OnDuplicate[i] = node.(*Assignment) + } + return v.Leave(n) +} + +// DeleteStmt is a statement to delete rows from table. +// See https://dev.mysql.com/doc/refman/5.7/en/delete.html +type DeleteStmt struct { + dmlNode + + // TableRefs is used in both single table and multiple table delete statement. + TableRefs *TableRefsClause + // Tables is only used in multiple table delete statement. + Tables *DeleteTableList + Where ExprNode + Order *OrderByClause + Limit *Limit + Priority mysql.PriorityEnum + IgnoreErr bool + Quick bool + IsMultiTable bool + BeforeFrom bool + // TableHints represents the table level Optimizer Hint for join type. + TableHints []*TableOptimizerHint +} + +// Restore implements Node interface. +func (n *DeleteStmt) Restore(ctx *RestoreCtx) error { + ctx.WriteKeyWord("DELETE ") + + if n.TableHints != nil && len(n.TableHints) != 0 { + ctx.WritePlain("/*+ ") + for i, tableHint := range n.TableHints { + if err := tableHint.Restore(ctx); err != nil { + return errors.Annotatef(err, "An error occurred while restore UpdateStmt.TableHints[%d]", i) + } + } + ctx.WritePlain("*/ ") + } + + if err := n.Priority.Restore(ctx); err != nil { + return errors.Trace(err) + } + if n.Priority != mysql.NoPriority { + ctx.WritePlain(" ") + } + if n.Quick { + ctx.WriteKeyWord("QUICK ") + } + if n.IgnoreErr { + ctx.WriteKeyWord("IGNORE ") + } + + if n.IsMultiTable { // Multiple-Table Syntax + if n.BeforeFrom { + if err := n.Tables.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore DeleteStmt.Tables") + } + + ctx.WriteKeyWord(" FROM ") + if err := n.TableRefs.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore DeleteStmt.TableRefs") + } + } else { + ctx.WriteKeyWord("FROM ") + if err := n.Tables.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore DeleteStmt.Tables") + } + + ctx.WriteKeyWord(" USING ") + if err := n.TableRefs.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore DeleteStmt.TableRefs") + } + } + } else { // Single-Table Syntax + ctx.WriteKeyWord("FROM ") + + if err := n.TableRefs.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore DeleteStmt.TableRefs") + } + } + + if n.Where != nil { + ctx.WriteKeyWord(" WHERE ") + if err := n.Where.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore DeleteStmt.Where") + } + } + + if n.Order != nil { + ctx.WritePlain(" ") + if err := n.Order.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore DeleteStmt.Order") + } + } + + if n.Limit != nil { + ctx.WritePlain(" ") + if err := n.Limit.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore DeleteStmt.Limit") + } + } + + return nil +} + +// Accept implements Node Accept interface. +func (n *DeleteStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + + n = newNode.(*DeleteStmt) + node, ok := n.TableRefs.Accept(v) + if !ok { + return n, false + } + n.TableRefs = node.(*TableRefsClause) + + if n.Tables != nil { + node, ok = n.Tables.Accept(v) + if !ok { + return n, false + } + n.Tables = node.(*DeleteTableList) + } + + if n.Where != nil { + node, ok = n.Where.Accept(v) + if !ok { + return n, false + } + n.Where = node.(ExprNode) + } + if n.Order != nil { + node, ok = n.Order.Accept(v) + if !ok { + return n, false + } + n.Order = node.(*OrderByClause) + } + if n.Limit != nil { + node, ok = n.Limit.Accept(v) + if !ok { + return n, false + } + n.Limit = node.(*Limit) + } + return v.Leave(n) +} + +// UpdateStmt is a statement to update columns of existing rows in tables with new values. +// See https://dev.mysql.com/doc/refman/5.7/en/update.html +type UpdateStmt struct { + dmlNode + + TableRefs *TableRefsClause + List []*Assignment + Where ExprNode + Order *OrderByClause + Limit *Limit + Priority mysql.PriorityEnum + IgnoreErr bool + MultipleTable bool + TableHints []*TableOptimizerHint +} + +// Restore implements Node interface. +func (n *UpdateStmt) Restore(ctx *RestoreCtx) error { + ctx.WriteKeyWord("UPDATE ") + + if n.TableHints != nil && len(n.TableHints) != 0 { + ctx.WritePlain("/*+ ") + for i, tableHint := range n.TableHints { + if err := tableHint.Restore(ctx); err != nil { + return errors.Annotatef(err, "An error occurred while restore UpdateStmt.TableHints[%d]", i) + } + } + ctx.WritePlain("*/ ") + } + + if err := n.Priority.Restore(ctx); err != nil { + return errors.Trace(err) + } + if n.Priority != mysql.NoPriority { + ctx.WritePlain(" ") + } + if n.IgnoreErr { + ctx.WriteKeyWord("IGNORE ") + } + + if err := n.TableRefs.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occur while restore UpdateStmt.TableRefs") + } + + ctx.WriteKeyWord(" SET ") + for i, assignment := range n.List { + if i != 0 { + ctx.WritePlain(", ") + } + + if err := assignment.Column.Restore(ctx); err != nil { + return errors.Annotatef(err, "An error occur while restore UpdateStmt.List[%d].Column", i) + } + + ctx.WritePlain("=") + + if err := assignment.Expr.Restore(ctx); err != nil { + return errors.Annotatef(err, "An error occur while restore UpdateStmt.List[%d].Expr", i) + } + } + + if n.Where != nil { + ctx.WriteKeyWord(" WHERE ") + if err := n.Where.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occur while restore UpdateStmt.Where") + } + } + + if n.Order != nil { + ctx.WritePlain(" ") + if err := n.Order.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occur while restore UpdateStmt.Order") + } + } + + if n.Limit != nil { + ctx.WritePlain(" ") + if err := n.Limit.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occur while restore UpdateStmt.Limit") + } + } + + return nil +} + +// Accept implements Node Accept interface. +func (n *UpdateStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*UpdateStmt) + node, ok := n.TableRefs.Accept(v) + if !ok { + return n, false + } + n.TableRefs = node.(*TableRefsClause) + for i, val := range n.List { + node, ok = val.Accept(v) + if !ok { + return n, false + } + n.List[i] = node.(*Assignment) + } + if n.Where != nil { + node, ok = n.Where.Accept(v) + if !ok { + return n, false + } + n.Where = node.(ExprNode) + } + if n.Order != nil { + node, ok = n.Order.Accept(v) + if !ok { + return n, false + } + n.Order = node.(*OrderByClause) + } + if n.Limit != nil { + node, ok = n.Limit.Accept(v) + if !ok { + return n, false + } + n.Limit = node.(*Limit) + } + return v.Leave(n) +} + +// Limit is the limit clause. +type Limit struct { + node + + Count ExprNode + Offset ExprNode +} + +// Restore implements Node interface. +func (n *Limit) Restore(ctx *RestoreCtx) error { + ctx.WriteKeyWord("LIMIT ") + if n.Offset != nil { + if err := n.Offset.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore Limit.Offset") + } + ctx.WritePlain(",") + } + if err := n.Count.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore Limit.Count") + } + return nil +} + +// Accept implements Node Accept interface. +func (n *Limit) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + if n.Count != nil { + node, ok := n.Count.Accept(v) + if !ok { + return n, false + } + n.Count = node.(ExprNode) + } + if n.Offset != nil { + node, ok := n.Offset.Accept(v) + if !ok { + return n, false + } + n.Offset = node.(ExprNode) + } + + n = newNode.(*Limit) + return v.Leave(n) +} + +// ShowStmtType is the type for SHOW statement. +type ShowStmtType int + +// Show statement types. +const ( + ShowNone = iota + ShowEngines + ShowDatabases + ShowTables + ShowTableStatus + ShowColumns + ShowWarnings + ShowCharset + ShowVariables + ShowStatus + ShowCollation + ShowCreateTable + ShowCreateView + ShowCreateUser + ShowGrants + ShowTriggers + ShowProcedureStatus + ShowIndex + ShowProcessList + ShowCreateDatabase + ShowEvents + ShowStatsMeta + ShowStatsHistograms + ShowStatsBuckets + ShowStatsHealthy + ShowPlugins + ShowProfile + ShowProfiles + ShowMasterStatus + ShowPrivileges + ShowErrors + ShowBindings + ShowPumpStatus + ShowDrainerStatus + ShowOpenTables + ShowAnalyzeStatus + ShowRegions +) + +const ( + ProfileTypeInvalid = iota + ProfileTypeCPU + ProfileTypeMemory + ProfileTypeBlockIo + ProfileTypeContextSwitch + ProfileTypePageFaults + ProfileTypeIpc + ProfileTypeSwaps + ProfileTypeSource + ProfileTypeAll +) + +// ShowStmt is a statement to provide information about databases, tables, columns and so on. +// See https://dev.mysql.com/doc/refman/5.7/en/show.html +type ShowStmt struct { + dmlNode + resultSetNode + + Tp ShowStmtType // Databases/Tables/Columns/.... + DBName string + Table *TableName // Used for showing columns. + Column *ColumnName // Used for `desc table column`. + IndexName model.CIStr + Flag int // Some flag parsed from sql, such as FULL. + Full bool + User *auth.UserIdentity // Used for show grants/create user. + Roles []*auth.RoleIdentity // Used for show grants .. using + IfNotExists bool // Used for `show create database if not exists` + + // GlobalScope is used by `show variables` and `show bindings` + GlobalScope bool + Pattern *PatternLikeExpr + Where ExprNode + + ShowProfileTypes []int // Used for `SHOW PROFILE` syntax + ShowProfileArgs *int64 // Used for `SHOW PROFILE` syntax + ShowProfileLimit *Limit // Used for `SHOW PROFILE` syntax +} + +// Restore implements Node interface. +func (n *ShowStmt) Restore(ctx *RestoreCtx) error { + restoreOptFull := func() { + if n.Full { + ctx.WriteKeyWord("FULL ") + } + } + restoreShowDatabaseNameOpt := func() { + if n.DBName != "" { + // FROM OR IN + ctx.WriteKeyWord(" IN ") + ctx.WriteName(n.DBName) + } + } + restoreGlobalScope := func() { + if n.GlobalScope { + ctx.WriteKeyWord("GLOBAL ") + } else { + ctx.WriteKeyWord("SESSION ") + } + } + restoreShowLikeOrWhereOpt := func() error { + if n.Pattern != nil && n.Pattern.Pattern != nil { + ctx.WriteKeyWord(" LIKE ") + if err := n.Pattern.Pattern.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore ShowStmt.Pattern") + } + } else if n.Where != nil { + ctx.WriteKeyWord(" WHERE ") + if err := n.Where.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore ShowStmt.Where") + } + } + return nil + } + + ctx.WriteKeyWord("SHOW ") + switch n.Tp { + case ShowCreateTable: + ctx.WriteKeyWord("CREATE TABLE ") + if err := n.Table.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore ShowStmt.Table") + } + case ShowCreateView: + ctx.WriteKeyWord("CREATE VIEW ") + if err := n.Table.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore ShowStmt.VIEW") + } + case ShowCreateDatabase: + ctx.WriteKeyWord("CREATE DATABASE ") + if n.IfNotExists { + ctx.WriteKeyWord("IF NOT EXISTS ") + } + ctx.WriteName(n.DBName) + case ShowCreateUser: + ctx.WriteKeyWord("CREATE USER ") + if err := n.User.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore ShowStmt.User") + } + case ShowGrants: + ctx.WriteKeyWord("GRANTS") + if n.User != nil { + ctx.WriteKeyWord(" FOR ") + if err := n.User.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore ShowStmt.User") + } + } + if n.Roles != nil { + ctx.WriteKeyWord(" USING ") + for i, r := range n.Roles { + if err := r.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore ShowStmt.User") + } + if i != len(n.Roles)-1 { + ctx.WritePlain(", ") + } + } + } + case ShowMasterStatus: + ctx.WriteKeyWord("MASTER STATUS") + case ShowProcessList: + restoreOptFull() + ctx.WriteKeyWord("PROCESSLIST") + case ShowStatsMeta: + ctx.WriteKeyWord("STATS_META") + if err := restoreShowLikeOrWhereOpt(); err != nil { + return err + } + case ShowStatsHistograms: + ctx.WriteKeyWord("STATS_HISTOGRAMS") + if err := restoreShowLikeOrWhereOpt(); err != nil { + return err + } + case ShowStatsBuckets: + ctx.WriteKeyWord("STATS_BUCKETS") + if err := restoreShowLikeOrWhereOpt(); err != nil { + return err + } + case ShowStatsHealthy: + ctx.WriteKeyWord("STATS_HEALTHY") + if err := restoreShowLikeOrWhereOpt(); err != nil { + return err + } + case ShowProfiles: + ctx.WriteKeyWord("PROFILES") + case ShowProfile: + ctx.WriteKeyWord("PROFILE") + if len(n.ShowProfileTypes) > 0 { + for i, tp := range n.ShowProfileTypes { + if i != 0 { + ctx.WritePlain(",") + } + ctx.WritePlain(" ") + switch tp { + case ProfileTypeCPU: + ctx.WriteKeyWord("CPU") + case ProfileTypeMemory: + ctx.WriteKeyWord("MEMORY") + case ProfileTypeBlockIo: + ctx.WriteKeyWord("BLOCK IO") + case ProfileTypeContextSwitch: + ctx.WriteKeyWord("CONTEXT SWITCHES") + case ProfileTypeIpc: + ctx.WriteKeyWord("IPC") + case ProfileTypePageFaults: + ctx.WriteKeyWord("PAGE FAULTS") + case ProfileTypeSource: + ctx.WriteKeyWord("SOURCE") + case ProfileTypeSwaps: + ctx.WriteKeyWord("SWAPS") + case ProfileTypeAll: + ctx.WriteKeyWord("ALL") + } + } + } + if n.ShowProfileArgs != nil { + ctx.WriteKeyWord(" FOR QUERY ") + ctx.WritePlainf("%d", *n.ShowProfileArgs) + } + if n.ShowProfileLimit != nil { + ctx.WritePlain(" ") + if err := n.ShowProfileLimit.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore ShowStmt.WritePlain") + } + } + + case ShowPrivileges: + ctx.WriteKeyWord("PRIVILEGES") + // ShowTargetFilterable + default: + switch n.Tp { + case ShowEngines: + ctx.WriteKeyWord("ENGINES") + case ShowDatabases: + ctx.WriteKeyWord("DATABASES") + case ShowCharset: + ctx.WriteKeyWord("CHARSET") + case ShowTables: + restoreOptFull() + ctx.WriteKeyWord("TABLES") + restoreShowDatabaseNameOpt() + case ShowOpenTables: + ctx.WriteKeyWord("OPEN TABLES") + restoreShowDatabaseNameOpt() + case ShowTableStatus: + ctx.WriteKeyWord("TABLE STATUS") + restoreShowDatabaseNameOpt() + case ShowIndex: + // here can be INDEX INDEXES KEYS + // FROM or IN + ctx.WriteKeyWord("INDEX IN ") + if err := n.Table.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while resotre ShowStmt.Table") + } // TODO: remember to check this case + case ShowColumns: // equivalent to SHOW FIELDS + restoreOptFull() + ctx.WriteKeyWord("COLUMNS") + if n.Table != nil { + // FROM or IN + ctx.WriteKeyWord(" IN ") + if err := n.Table.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while resotre ShowStmt.Table") + } + } + restoreShowDatabaseNameOpt() + case ShowWarnings: + ctx.WriteKeyWord("WARNINGS") + case ShowErrors: + ctx.WriteKeyWord("ERRORS") + case ShowVariables: + restoreGlobalScope() + ctx.WriteKeyWord("VARIABLES") + case ShowStatus: + restoreGlobalScope() + ctx.WriteKeyWord("STATUS") + case ShowCollation: + ctx.WriteKeyWord("COLLATION") + case ShowTriggers: + ctx.WriteKeyWord("TRIGGERS") + restoreShowDatabaseNameOpt() + case ShowProcedureStatus: + ctx.WriteKeyWord("PROCEDURE STATUS") + case ShowEvents: + ctx.WriteKeyWord("EVENTS") + restoreShowDatabaseNameOpt() + case ShowPlugins: + ctx.WriteKeyWord("PLUGINS") + case ShowBindings: + if n.GlobalScope { + ctx.WriteKeyWord("GLOBAL ") + } else { + ctx.WriteKeyWord("SESSION ") + } + ctx.WriteKeyWord("BINDINGS") + case ShowPumpStatus: + ctx.WriteKeyWord("PUMP STATUS") + case ShowDrainerStatus: + ctx.WriteKeyWord("DRAINER STATUS") + case ShowAnalyzeStatus: + ctx.WriteKeyWord("ANALYZE STATUS") + case ShowRegions: + ctx.WriteKeyWord("TABLE ") + if err := n.Table.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore SplitIndexRegionStmt.Table") + } + if len(n.IndexName.L) > 0 { + ctx.WriteKeyWord(" INDEX ") + ctx.WriteName(n.IndexName.String()) + } + ctx.WriteKeyWord(" REGIONS") + return nil + default: + return errors.New("Unknown ShowStmt type") + } + restoreShowLikeOrWhereOpt() + } + return nil +} + +// Accept implements Node Accept interface. +func (n *ShowStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*ShowStmt) + if n.Table != nil { + node, ok := n.Table.Accept(v) + if !ok { + return n, false + } + n.Table = node.(*TableName) + } + if n.Column != nil { + node, ok := n.Column.Accept(v) + if !ok { + return n, false + } + n.Column = node.(*ColumnName) + } + if n.Pattern != nil { + node, ok := n.Pattern.Accept(v) + if !ok { + return n, false + } + n.Pattern = node.(*PatternLikeExpr) + } + + switch n.Tp { + case ShowTriggers, ShowProcedureStatus, ShowProcessList, ShowEvents: + // We don't have any data to return for those types, + // but visiting Where may cause resolving error, so return here to avoid error. + return v.Leave(n) + } + + if n.Where != nil { + node, ok := n.Where.Accept(v) + if !ok { + return n, false + } + n.Where = node.(ExprNode) + } + return v.Leave(n) +} + +// WindowSpec is the specification of a window. +type WindowSpec struct { + node + + Name model.CIStr + // Ref is the reference window of this specification. For example, in `w2 as (w1 order by a)`, + // the definition of `w2` references `w1`. + Ref model.CIStr + + PartitionBy *PartitionByClause + OrderBy *OrderByClause + Frame *FrameClause + + // OnlyAlias will set to true of the first following case. + // To make compatible with MySQL, we need to distinguish `select func over w` from `select func over (w)`. + OnlyAlias bool +} + +// Restore implements Node interface. +func (n *WindowSpec) Restore(ctx *RestoreCtx) error { + if name := n.Name.String(); name != "" { + ctx.WriteName(name) + if n.OnlyAlias { + return nil + } + ctx.WriteKeyWord(" AS ") + } + ctx.WritePlain("(") + sep := "" + if refName := n.Ref.String(); refName != "" { + ctx.WriteName(refName) + sep = " " + } + if n.PartitionBy != nil { + ctx.WritePlain(sep) + if err := n.PartitionBy.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore WindowSpec.PartitionBy") + } + sep = " " + } + if n.OrderBy != nil { + ctx.WritePlain(sep) + if err := n.OrderBy.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore WindowSpec.OrderBy") + } + sep = " " + } + if n.Frame != nil { + ctx.WritePlain(sep) + if err := n.Frame.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore WindowSpec.Frame") + } + } + ctx.WritePlain(")") + + return nil +} + +// Accept implements Node Accept interface. +func (n *WindowSpec) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*WindowSpec) + if n.PartitionBy != nil { + node, ok := n.PartitionBy.Accept(v) + if !ok { + return n, false + } + n.PartitionBy = node.(*PartitionByClause) + } + if n.OrderBy != nil { + node, ok := n.OrderBy.Accept(v) + if !ok { + return n, false + } + n.OrderBy = node.(*OrderByClause) + } + if n.Frame != nil { + node, ok := n.Frame.Accept(v) + if !ok { + return n, false + } + n.Frame = node.(*FrameClause) + } + return v.Leave(n) +} + +// PartitionByClause represents partition by clause. +type PartitionByClause struct { + node + + Items []*ByItem +} + +// Restore implements Node interface. +func (n *PartitionByClause) Restore(ctx *RestoreCtx) error { + ctx.WriteKeyWord("PARTITION BY ") + for i, v := range n.Items { + if i != 0 { + ctx.WritePlain(", ") + } + if err := v.Restore(ctx); err != nil { + return errors.Annotatef(err, "An error occurred while restore PartitionByClause.Items[%d]", i) + } + } + return nil +} + +// Accept implements Node Accept interface. +func (n *PartitionByClause) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*PartitionByClause) + for i, val := range n.Items { + node, ok := val.Accept(v) + if !ok { + return n, false + } + n.Items[i] = node.(*ByItem) + } + return v.Leave(n) +} + +// FrameType is the type of window function frame. +type FrameType int + +// Window function frame types. +// MySQL only supports `ROWS` and `RANGES`. +const ( + Rows = iota + Ranges + Groups +) + +// FrameClause represents frame clause. +type FrameClause struct { + node + + Type FrameType + Extent FrameExtent +} + +// Restore implements Node interface. +func (n *FrameClause) Restore(ctx *RestoreCtx) error { + switch n.Type { + case Rows: + ctx.WriteKeyWord("ROWS") + case Ranges: + ctx.WriteKeyWord("RANGE") + default: + return errors.New("Unsupported window function frame type") + } + ctx.WriteKeyWord(" BETWEEN ") + if err := n.Extent.Start.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore FrameClause.Extent.Start") + } + ctx.WriteKeyWord(" AND ") + if err := n.Extent.End.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore FrameClause.Extent.End") + } + + return nil +} + +// Accept implements Node Accept interface. +func (n *FrameClause) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*FrameClause) + node, ok := n.Extent.Start.Accept(v) + if !ok { + return n, false + } + n.Extent.Start = *node.(*FrameBound) + node, ok = n.Extent.End.Accept(v) + if !ok { + return n, false + } + n.Extent.End = *node.(*FrameBound) + return v.Leave(n) +} + +// FrameExtent represents frame extent. +type FrameExtent struct { + Start FrameBound + End FrameBound +} + +// FrameType is the type of window function frame bound. +type BoundType int + +// Frame bound types. +const ( + Following = iota + Preceding + CurrentRow +) + +// FrameBound represents frame bound. +type FrameBound struct { + node + + Type BoundType + UnBounded bool + Expr ExprNode + // `Unit` is used to indicate the units in which the `Expr` should be interpreted. + // For example: '2:30' MINUTE_SECOND. + Unit TimeUnitType +} + +// Restore implements Node interface. +func (n *FrameBound) Restore(ctx *RestoreCtx) error { + if n.UnBounded { + ctx.WriteKeyWord("UNBOUNDED") + } + switch n.Type { + case CurrentRow: + ctx.WriteKeyWord("CURRENT ROW") + case Preceding, Following: + if n.Unit != TimeUnitInvalid { + ctx.WriteKeyWord("INTERVAL ") + } + if n.Expr != nil { + if err := n.Expr.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore FrameBound.Expr") + } + } + if n.Unit != TimeUnitInvalid { + ctx.WritePlain(" ") + ctx.WriteKeyWord(n.Unit.String()) + } + if n.Type == Preceding { + ctx.WriteKeyWord(" PRECEDING") + } else { + ctx.WriteKeyWord(" FOLLOWING") + } + } + return nil +} + +// Accept implements Node Accept interface. +func (n *FrameBound) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*FrameBound) + if n.Expr != nil { + node, ok := n.Expr.Accept(v) + if !ok { + return n, false + } + n.Expr = node.(ExprNode) + } + return v.Leave(n) +} + +type SplitRegionStmt struct { + dmlNode + + Table *TableName + IndexName model.CIStr + + SplitOpt *SplitOption +} + +type SplitOption struct { + Lower []ExprNode + Upper []ExprNode + Num int64 + ValueLists [][]ExprNode +} + +func (n *SplitRegionStmt) Restore(ctx *RestoreCtx) error { + ctx.WriteKeyWord("SPLIT TABLE ") + if err := n.Table.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore SplitIndexRegionStmt.Table") + } + if len(n.IndexName.L) > 0 { + ctx.WriteKeyWord(" INDEX ") + ctx.WriteName(n.IndexName.String()) + } + ctx.WritePlain(" ") + err := n.SplitOpt.Restore(ctx) + return err +} + +func (n *SplitRegionStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + + n = newNode.(*SplitRegionStmt) + node, ok := n.Table.Accept(v) + if !ok { + return n, false + } + n.Table = node.(*TableName) + for i, val := range n.SplitOpt.Lower { + node, ok := val.Accept(v) + if !ok { + return n, false + } + n.SplitOpt.Lower[i] = node.(ExprNode) + } + for i, val := range n.SplitOpt.Upper { + node, ok := val.Accept(v) + if !ok { + return n, false + } + n.SplitOpt.Upper[i] = node.(ExprNode) + } + + for i, list := range n.SplitOpt.ValueLists { + for j, val := range list { + node, ok := val.Accept(v) + if !ok { + return n, false + } + n.SplitOpt.ValueLists[i][j] = node.(ExprNode) + } + } + return v.Leave(n) +} + +func (n *SplitOption) Restore(ctx *RestoreCtx) error { + if len(n.ValueLists) == 0 { + ctx.WriteKeyWord("BETWEEN ") + ctx.WritePlain("(") + for j, v := range n.Lower { + if j != 0 { + ctx.WritePlain(",") + } + if err := v.Restore(ctx); err != nil { + return errors.Annotatef(err, "An error occurred while restore SplitOption Lower") + } + } + ctx.WritePlain(")") + + ctx.WriteKeyWord(" AND ") + ctx.WritePlain("(") + for j, v := range n.Upper { + if j != 0 { + ctx.WritePlain(",") + } + if err := v.Restore(ctx); err != nil { + return errors.Annotatef(err, "An error occurred while restore SplitOption Upper") + } + } + ctx.WritePlain(")") + ctx.WriteKeyWord(" REGIONS") + ctx.WritePlainf(" %d", n.Num) + return nil + } + ctx.WriteKeyWord("BY ") + for i, row := range n.ValueLists { + if i != 0 { + ctx.WritePlain(",") + } + ctx.WritePlain("(") + for j, v := range row { + if j != 0 { + ctx.WritePlain(",") + } + if err := v.Restore(ctx); err != nil { + return errors.Annotatef(err, "An error occurred while restore SplitOption.ValueLists[%d][%d]", i, j) + } + } + ctx.WritePlain(")") + } + return nil +} diff --git a/vendor/github.com/pingcap/parser/ast/expressions.go b/vendor/github.com/pingcap/parser/ast/expressions.go new file mode 100755 index 0000000..b1bda01 --- /dev/null +++ b/vendor/github.com/pingcap/parser/ast/expressions.go @@ -0,0 +1,1275 @@ +// Copyright 2015 PingCAP, Inc. +// +// 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package ast + +import ( + "fmt" + "io" + "regexp" + "strings" + + "github.com/pingcap/errors" + . "github.com/pingcap/parser/format" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/opcode" +) + +var ( + _ ExprNode = &BetweenExpr{} + _ ExprNode = &BinaryOperationExpr{} + _ ExprNode = &CaseExpr{} + _ ExprNode = &ColumnNameExpr{} + _ ExprNode = &CompareSubqueryExpr{} + _ ExprNode = &DefaultExpr{} + _ ExprNode = &ExistsSubqueryExpr{} + _ ExprNode = &IsNullExpr{} + _ ExprNode = &IsTruthExpr{} + _ ExprNode = &ParenthesesExpr{} + _ ExprNode = &PatternInExpr{} + _ ExprNode = &PatternLikeExpr{} + _ ExprNode = &PatternRegexpExpr{} + _ ExprNode = &PositionExpr{} + _ ExprNode = &RowExpr{} + _ ExprNode = &SubqueryExpr{} + _ ExprNode = &UnaryOperationExpr{} + _ ExprNode = &ValuesExpr{} + _ ExprNode = &VariableExpr{} + + _ Node = &ColumnName{} + _ Node = &WhenClause{} +) + +// ValueExpr define a interface for ValueExpr. +type ValueExpr interface { + ExprNode + SetValue(val interface{}) + GetValue() interface{} + GetDatumString() string + GetString() string + GetProjectionOffset() int + SetProjectionOffset(offset int) +} + +// NewValueExpr creates a ValueExpr with value, and sets default field type. +var NewValueExpr func(interface{}) ValueExpr + +// NewParamMarkerExpr creates a ParamMarkerExpr. +var NewParamMarkerExpr func(offset int) ParamMarkerExpr + +// BetweenExpr is for "between and" or "not between and" expression. +type BetweenExpr struct { + exprNode + // Expr is the expression to be checked. + Expr ExprNode + // Left is the expression for minimal value in the range. + Left ExprNode + // Right is the expression for maximum value in the range. + Right ExprNode + // Not is true, the expression is "not between and". + Not bool +} + +// Restore implements Node interface. +func (n *BetweenExpr) Restore(ctx *RestoreCtx) error { + if err := n.Expr.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore BetweenExpr.Expr") + } + if n.Not { + ctx.WriteKeyWord(" NOT BETWEEN ") + } else { + ctx.WriteKeyWord(" BETWEEN ") + } + if err := n.Left.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore BetweenExpr.Left") + } + ctx.WriteKeyWord(" AND ") + if err := n.Right.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore BetweenExpr.Right ") + } + return nil +} + +// Format the ExprNode into a Writer. +func (n *BetweenExpr) Format(w io.Writer) { + n.Expr.Format(w) + if n.Not { + fmt.Fprint(w, " NOT BETWEEN ") + } else { + fmt.Fprint(w, " BETWEEN ") + } + n.Left.Format(w) + fmt.Fprint(w, " AND ") + n.Right.Format(w) +} + +// Accept implements Node interface. +func (n *BetweenExpr) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + + n = newNode.(*BetweenExpr) + node, ok := n.Expr.Accept(v) + if !ok { + return n, false + } + n.Expr = node.(ExprNode) + + node, ok = n.Left.Accept(v) + if !ok { + return n, false + } + n.Left = node.(ExprNode) + + node, ok = n.Right.Accept(v) + if !ok { + return n, false + } + n.Right = node.(ExprNode) + + return v.Leave(n) +} + +// BinaryOperationExpr is for binary operation like `1 + 1`, `1 - 1`, etc. +type BinaryOperationExpr struct { + exprNode + // Op is the operator code for BinaryOperation. + Op opcode.Op + // L is the left expression in BinaryOperation. + L ExprNode + // R is the right expression in BinaryOperation. + R ExprNode +} + +// Restore implements Node interface. +func (n *BinaryOperationExpr) Restore(ctx *RestoreCtx) error { + if err := n.L.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred when restore BinaryOperationExpr.L") + } + if ctx.Flags.HasSpacesAroundBinaryOperationFlag() { + ctx.WritePlain(" ") + } + if err := n.Op.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred when restore BinaryOperationExpr.Op") + } + if ctx.Flags.HasSpacesAroundBinaryOperationFlag() { + ctx.WritePlain(" ") + } + if err := n.R.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred when restore BinaryOperationExpr.R") + } + + return nil +} + +// Format the ExprNode into a Writer. +func (n *BinaryOperationExpr) Format(w io.Writer) { + n.L.Format(w) + fmt.Fprint(w, " ") + n.Op.Format(w) + fmt.Fprint(w, " ") + n.R.Format(w) +} + +// Accept implements Node interface. +func (n *BinaryOperationExpr) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + + n = newNode.(*BinaryOperationExpr) + node, ok := n.L.Accept(v) + if !ok { + return n, false + } + n.L = node.(ExprNode) + + node, ok = n.R.Accept(v) + if !ok { + return n, false + } + n.R = node.(ExprNode) + + return v.Leave(n) +} + +// WhenClause is the when clause in Case expression for "when condition then result". +type WhenClause struct { + node + // Expr is the condition expression in WhenClause. + Expr ExprNode + // Result is the result expression in WhenClause. + Result ExprNode +} + +// Restore implements Node interface. +func (n *WhenClause) Restore(ctx *RestoreCtx) error { + ctx.WriteKeyWord("WHEN ") + if err := n.Expr.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore WhenClauses.Expr") + } + ctx.WriteKeyWord(" THEN ") + if err := n.Result.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore WhenClauses.Result") + } + return nil +} + +// Accept implements Node Accept interface. +func (n *WhenClause) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + + n = newNode.(*WhenClause) + node, ok := n.Expr.Accept(v) + if !ok { + return n, false + } + n.Expr = node.(ExprNode) + + node, ok = n.Result.Accept(v) + if !ok { + return n, false + } + n.Result = node.(ExprNode) + return v.Leave(n) +} + +// CaseExpr is the case expression. +type CaseExpr struct { + exprNode + // Value is the compare value expression. + Value ExprNode + // WhenClauses is the condition check expression. + WhenClauses []*WhenClause + // ElseClause is the else result expression. + ElseClause ExprNode +} + +// Restore implements Node interface. +func (n *CaseExpr) Restore(ctx *RestoreCtx) error { + ctx.WriteKeyWord("CASE") + if n.Value != nil { + ctx.WritePlain(" ") + if err := n.Value.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore CaseExpr.Value") + } + } + for _, clause := range n.WhenClauses { + ctx.WritePlain(" ") + if err := clause.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore CaseExpr.WhenClauses") + } + } + if n.ElseClause != nil { + ctx.WriteKeyWord(" ELSE ") + if err := n.ElseClause.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore CaseExpr.ElseClause") + } + } + ctx.WriteKeyWord(" END") + + return nil +} + +// Format the ExprNode into a Writer. +func (n *CaseExpr) Format(w io.Writer) { + fmt.Fprint(w, "CASE") + // Because the presence of `case when` syntax, `Value` could be nil and we need check this. + if n.Value != nil { + fmt.Fprint(w, " ") + n.Value.Format(w) + } + for _, clause := range n.WhenClauses { + fmt.Fprint(w, " ") + fmt.Fprint(w, "WHEN ") + clause.Expr.Format(w) + fmt.Fprint(w, " THEN ") + clause.Result.Format(w) + } + if n.ElseClause != nil { + fmt.Fprint(w, " ELSE ") + n.ElseClause.Format(w) + } + fmt.Fprint(w, " END") +} + +// Accept implements Node Accept interface. +func (n *CaseExpr) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + + n = newNode.(*CaseExpr) + if n.Value != nil { + node, ok := n.Value.Accept(v) + if !ok { + return n, false + } + n.Value = node.(ExprNode) + } + for i, val := range n.WhenClauses { + node, ok := val.Accept(v) + if !ok { + return n, false + } + n.WhenClauses[i] = node.(*WhenClause) + } + if n.ElseClause != nil { + node, ok := n.ElseClause.Accept(v) + if !ok { + return n, false + } + n.ElseClause = node.(ExprNode) + } + return v.Leave(n) +} + +// SubqueryExpr represents a subquery. +type SubqueryExpr struct { + exprNode + // Query is the query SelectNode. + Query ResultSetNode + Evaluated bool + Correlated bool + MultiRows bool + Exists bool +} + +// Restore implements Node interface. +func (n *SubqueryExpr) Restore(ctx *RestoreCtx) error { + ctx.WritePlain("(") + if err := n.Query.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore SubqueryExpr.Query") + } + ctx.WritePlain(")") + return nil +} + +// Format the ExprNode into a Writer. +func (n *SubqueryExpr) Format(w io.Writer) { + panic("Not implemented") +} + +// Accept implements Node Accept interface. +func (n *SubqueryExpr) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*SubqueryExpr) + node, ok := n.Query.Accept(v) + if !ok { + return n, false + } + n.Query = node.(ResultSetNode) + return v.Leave(n) +} + +// CompareSubqueryExpr is the expression for "expr cmp (select ...)". +// See https://dev.mysql.com/doc/refman/5.7/en/comparisons-using-subqueries.html +// See https://dev.mysql.com/doc/refman/5.7/en/any-in-some-subqueries.html +// See https://dev.mysql.com/doc/refman/5.7/en/all-subqueries.html +type CompareSubqueryExpr struct { + exprNode + // L is the left expression + L ExprNode + // Op is the comparison opcode. + Op opcode.Op + // R is the subquery for right expression, may be rewritten to other type of expression. + R ExprNode + // All is true, we should compare all records in subquery. + All bool +} + +// Restore implements Node interface. +func (n *CompareSubqueryExpr) Restore(ctx *RestoreCtx) error { + if err := n.L.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore CompareSubqueryExpr.L") + } + if err := n.Op.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore CompareSubqueryExpr.Op") + } + if n.All { + ctx.WriteKeyWord("ALL ") + } else { + ctx.WriteKeyWord("ANY ") + } + if err := n.R.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore CompareSubqueryExpr.R") + } + return nil +} + +// Format the ExprNode into a Writer. +func (n *CompareSubqueryExpr) Format(w io.Writer) { + panic("Not implemented") +} + +// Accept implements Node Accept interface. +func (n *CompareSubqueryExpr) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*CompareSubqueryExpr) + node, ok := n.L.Accept(v) + if !ok { + return n, false + } + n.L = node.(ExprNode) + node, ok = n.R.Accept(v) + if !ok { + return n, false + } + n.R = node.(ExprNode) + return v.Leave(n) +} + +// ColumnName represents column name. +type ColumnName struct { + node + Schema model.CIStr + Table model.CIStr + Name model.CIStr +} + +// Restore implements Node interface. +func (n *ColumnName) Restore(ctx *RestoreCtx) error { + if n.Schema.O != "" { + ctx.WriteName(n.Schema.O) + ctx.WritePlain(".") + } + if n.Table.O != "" { + ctx.WriteName(n.Table.O) + ctx.WritePlain(".") + } + ctx.WriteName(n.Name.O) + return nil +} + +// Accept implements Node Accept interface. +func (n *ColumnName) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*ColumnName) + return v.Leave(n) +} + +// String implements Stringer interface. +func (n *ColumnName) String() string { + result := n.Name.L + if n.Table.L != "" { + result = n.Table.L + "." + result + } + if n.Schema.L != "" { + result = n.Schema.L + "." + result + } + return result +} + +// OrigColName returns the full original column name. +func (n *ColumnName) OrigColName() (ret string) { + ret = n.Name.O + if n.Table.O == "" { + return + } + ret = n.Table.O + "." + ret + if n.Schema.O == "" { + return + } + ret = n.Schema.O + "." + ret + return +} + +// ColumnNameExpr represents a column name expression. +type ColumnNameExpr struct { + exprNode + + // Name is the referenced column name. + Name *ColumnName + + // Refer is the result field the column name refers to. + // The value of Refer.Expr is used as the value of the expression. + Refer *ResultField +} + +// Restore implements Node interface. +func (n *ColumnNameExpr) Restore(ctx *RestoreCtx) error { + if err := n.Name.Restore(ctx); err != nil { + return errors.Trace(err) + } + return nil +} + +// Format the ExprNode into a Writer. +func (n *ColumnNameExpr) Format(w io.Writer) { + name := strings.Replace(n.Name.String(), ".", "`.`", -1) + fmt.Fprintf(w, "`%s`", name) +} + +// Accept implements Node Accept interface. +func (n *ColumnNameExpr) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*ColumnNameExpr) + node, ok := n.Name.Accept(v) + if !ok { + return n, false + } + n.Name = node.(*ColumnName) + return v.Leave(n) +} + +// DefaultExpr is the default expression using default value for a column. +type DefaultExpr struct { + exprNode + // Name is the column name. + Name *ColumnName +} + +// Restore implements Node interface. +func (n *DefaultExpr) Restore(ctx *RestoreCtx) error { + ctx.WriteKeyWord("DEFAULT") + if n.Name != nil { + ctx.WritePlain("(") + if err := n.Name.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore DefaultExpr.Name") + } + ctx.WritePlain(")") + } + return nil +} + +// Format the ExprNode into a Writer. +func (n *DefaultExpr) Format(w io.Writer) { + panic("Not implemented") +} + +// Accept implements Node Accept interface. +func (n *DefaultExpr) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*DefaultExpr) + if n.Name != nil { + node, ok := n.Name.Accept(v) + if !ok { + return n, false + } + n.Name = node.(*ColumnName) + } + return v.Leave(n) +} + +// ExistsSubqueryExpr is the expression for "exists (select ...)". +// See https://dev.mysql.com/doc/refman/5.7/en/exists-and-not-exists-subqueries.html +type ExistsSubqueryExpr struct { + exprNode + // Sel is the subquery, may be rewritten to other type of expression. + Sel ExprNode + // Not is true, the expression is "not exists". + Not bool +} + +// Restore implements Node interface. +func (n *ExistsSubqueryExpr) Restore(ctx *RestoreCtx) error { + if n.Not { + ctx.WriteKeyWord("NOT EXISTS ") + } else { + ctx.WriteKeyWord("EXISTS ") + } + if err := n.Sel.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore ExistsSubqueryExpr.Sel") + } + return nil +} + +// Format the ExprNode into a Writer. +func (n *ExistsSubqueryExpr) Format(w io.Writer) { + panic("Not implemented") +} + +// Accept implements Node Accept interface. +func (n *ExistsSubqueryExpr) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*ExistsSubqueryExpr) + node, ok := n.Sel.Accept(v) + if !ok { + return n, false + } + n.Sel = node.(ExprNode) + return v.Leave(n) +} + +// PatternInExpr is the expression for in operator, like "expr in (1, 2, 3)" or "expr in (select c from t)". +type PatternInExpr struct { + exprNode + // Expr is the value expression to be compared. + Expr ExprNode + // List is the list expression in compare list. + List []ExprNode + // Not is true, the expression is "not in". + Not bool + // Sel is the subquery, may be rewritten to other type of expression. + Sel ExprNode +} + +// Restore implements Node interface. +func (n *PatternInExpr) Restore(ctx *RestoreCtx) error { + if err := n.Expr.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore PatternInExpr.Expr") + } + if n.Not { + ctx.WriteKeyWord(" NOT IN ") + } else { + ctx.WriteKeyWord(" IN ") + } + if n.Sel != nil { + if err := n.Sel.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore PatternInExpr.Sel") + } + } else { + ctx.WritePlain("(") + for i, expr := range n.List { + if i != 0 { + ctx.WritePlain(",") + } + if err := expr.Restore(ctx); err != nil { + return errors.Annotatef(err, "An error occurred while restore PatternInExpr.List[%d]", i) + } + } + ctx.WritePlain(")") + } + return nil +} + +// Format the ExprNode into a Writer. +func (n *PatternInExpr) Format(w io.Writer) { + n.Expr.Format(w) + if n.Not { + fmt.Fprint(w, " NOT IN (") + } else { + fmt.Fprint(w, " IN (") + } + for i, expr := range n.List { + if i != 0 { + fmt.Fprint(w, ",") + } + expr.Format(w) + } + fmt.Fprint(w, ")") +} + +// Accept implements Node Accept interface. +func (n *PatternInExpr) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*PatternInExpr) + node, ok := n.Expr.Accept(v) + if !ok { + return n, false + } + n.Expr = node.(ExprNode) + for i, val := range n.List { + node, ok = val.Accept(v) + if !ok { + return n, false + } + n.List[i] = node.(ExprNode) + } + if n.Sel != nil { + node, ok = n.Sel.Accept(v) + if !ok { + return n, false + } + n.Sel = node.(ExprNode) + } + return v.Leave(n) +} + +// IsNullExpr is the expression for null check. +type IsNullExpr struct { + exprNode + // Expr is the expression to be checked. + Expr ExprNode + // Not is true, the expression is "is not null". + Not bool +} + +// Restore implements Node interface. +func (n *IsNullExpr) Restore(ctx *RestoreCtx) error { + if err := n.Expr.Restore(ctx); err != nil { + return errors.Trace(err) + } + if n.Not { + ctx.WriteKeyWord(" IS NOT NULL") + } else { + ctx.WriteKeyWord(" IS NULL") + } + return nil +} + +// Format the ExprNode into a Writer. +func (n *IsNullExpr) Format(w io.Writer) { + n.Expr.Format(w) + if n.Not { + fmt.Fprint(w, " IS NOT NULL") + return + } + fmt.Fprint(w, " IS NULL") +} + +// Accept implements Node Accept interface. +func (n *IsNullExpr) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*IsNullExpr) + node, ok := n.Expr.Accept(v) + if !ok { + return n, false + } + n.Expr = node.(ExprNode) + return v.Leave(n) +} + +// IsTruthExpr is the expression for true/false check. +type IsTruthExpr struct { + exprNode + // Expr is the expression to be checked. + Expr ExprNode + // Not is true, the expression is "is not true/false". + Not bool + // True indicates checking true or false. + True int64 +} + +// Restore implements Node interface. +func (n *IsTruthExpr) Restore(ctx *RestoreCtx) error { + if err := n.Expr.Restore(ctx); err != nil { + return errors.Trace(err) + } + if n.Not { + ctx.WriteKeyWord(" IS NOT") + } else { + ctx.WriteKeyWord(" IS") + } + if n.True > 0 { + ctx.WriteKeyWord(" TRUE") + } else { + ctx.WriteKeyWord(" FALSE") + } + return nil +} + +// Format the ExprNode into a Writer. +func (n *IsTruthExpr) Format(w io.Writer) { + n.Expr.Format(w) + if n.Not { + fmt.Fprint(w, " IS NOT") + } else { + fmt.Fprint(w, " IS") + } + if n.True > 0 { + fmt.Fprint(w, " TRUE") + } else { + fmt.Fprint(w, " FALSE") + } +} + +// Accept implements Node Accept interface. +func (n *IsTruthExpr) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*IsTruthExpr) + node, ok := n.Expr.Accept(v) + if !ok { + return n, false + } + n.Expr = node.(ExprNode) + return v.Leave(n) +} + +// PatternLikeExpr is the expression for like operator, e.g, expr like "%123%" +type PatternLikeExpr struct { + exprNode + // Expr is the expression to be checked. + Expr ExprNode + // Pattern is the like expression. + Pattern ExprNode + // Not is true, the expression is "not like". + Not bool + + Escape byte + + PatChars []byte + PatTypes []byte +} + +// Restore implements Node interface. +func (n *PatternLikeExpr) Restore(ctx *RestoreCtx) error { + if err := n.Expr.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore PatternLikeExpr.Expr") + } + + if n.Not { + ctx.WriteKeyWord(" NOT LIKE ") + } else { + ctx.WriteKeyWord(" LIKE ") + } + + if err := n.Pattern.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore PatternLikeExpr.Pattern") + } + + escape := string(n.Escape) + if escape != "\\" { + ctx.WriteKeyWord(" ESCAPE ") + ctx.WriteString(escape) + + } + return nil +} + +// Format the ExprNode into a Writer. +func (n *PatternLikeExpr) Format(w io.Writer) { + n.Expr.Format(w) + if n.Not { + fmt.Fprint(w, " NOT LIKE ") + } else { + fmt.Fprint(w, " LIKE ") + } + n.Pattern.Format(w) + if n.Escape != '\\' { + fmt.Fprint(w, " ESCAPE ") + fmt.Fprintf(w, "'%c'", n.Escape) + } +} + +// Accept implements Node Accept interface. +func (n *PatternLikeExpr) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*PatternLikeExpr) + if n.Expr != nil { + node, ok := n.Expr.Accept(v) + if !ok { + return n, false + } + n.Expr = node.(ExprNode) + } + if n.Pattern != nil { + node, ok := n.Pattern.Accept(v) + if !ok { + return n, false + } + n.Pattern = node.(ExprNode) + } + return v.Leave(n) +} + +// ParamMarkerExpr expression holds a place for another expression. +// Used in parsing prepare statement. +type ParamMarkerExpr interface { + ValueExpr + SetOrder(int) +} + +// ParenthesesExpr is the parentheses expression. +type ParenthesesExpr struct { + exprNode + // Expr is the expression in parentheses. + Expr ExprNode +} + +// Restore implements Node interface. +func (n *ParenthesesExpr) Restore(ctx *RestoreCtx) error { + ctx.WritePlain("(") + if err := n.Expr.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred when restore ParenthesesExpr.Expr") + } + ctx.WritePlain(")") + return nil +} + +// Format the ExprNode into a Writer. +func (n *ParenthesesExpr) Format(w io.Writer) { + fmt.Fprint(w, "(") + n.Expr.Format(w) + fmt.Fprint(w, ")") +} + +// Accept implements Node Accept interface. +func (n *ParenthesesExpr) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*ParenthesesExpr) + if n.Expr != nil { + node, ok := n.Expr.Accept(v) + if !ok { + return n, false + } + n.Expr = node.(ExprNode) + } + return v.Leave(n) +} + +// PositionExpr is the expression for order by and group by position. +// MySQL use position expression started from 1, it looks a little confused inner. +// maybe later we will use 0 at first. +type PositionExpr struct { + exprNode + // N is the position, started from 1 now. + N int + // P is the parameterized position. + P ExprNode + // Refer is the result field the position refers to. + Refer *ResultField +} + +// Restore implements Node interface. +func (n *PositionExpr) Restore(ctx *RestoreCtx) error { + ctx.WritePlainf("%d", n.N) + return nil +} + +// Format the ExprNode into a Writer. +func (n *PositionExpr) Format(w io.Writer) { + panic("Not implemented") +} + +// Accept implements Node Accept interface. +func (n *PositionExpr) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*PositionExpr) + if n.P != nil { + node, ok := n.P.Accept(v) + if !ok { + return n, false + } + n.P = node.(ExprNode) + } + return v.Leave(n) +} + +// PatternRegexpExpr is the pattern expression for pattern match. +type PatternRegexpExpr struct { + exprNode + // Expr is the expression to be checked. + Expr ExprNode + // Pattern is the expression for pattern. + Pattern ExprNode + // Not is true, the expression is "not rlike", + Not bool + + // Re is the compiled regexp. + Re *regexp.Regexp + // Sexpr is the string for Expr expression. + Sexpr *string +} + +// Restore implements Node interface. +func (n *PatternRegexpExpr) Restore(ctx *RestoreCtx) error { + if err := n.Expr.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore PatternRegexpExpr.Expr") + } + + if n.Not { + ctx.WriteKeyWord(" NOT REGEXP ") + } else { + ctx.WriteKeyWord(" REGEXP ") + } + + if err := n.Pattern.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore PatternRegexpExpr.Pattern") + } + + return nil +} + +// Format the ExprNode into a Writer. +func (n *PatternRegexpExpr) Format(w io.Writer) { + n.Expr.Format(w) + if n.Not { + fmt.Fprint(w, " NOT REGEXP ") + } else { + fmt.Fprint(w, " REGEXP ") + } + n.Pattern.Format(w) +} + +// Accept implements Node Accept interface. +func (n *PatternRegexpExpr) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*PatternRegexpExpr) + node, ok := n.Expr.Accept(v) + if !ok { + return n, false + } + n.Expr = node.(ExprNode) + node, ok = n.Pattern.Accept(v) + if !ok { + return n, false + } + n.Pattern = node.(ExprNode) + return v.Leave(n) +} + +// RowExpr is the expression for row constructor. +// See https://dev.mysql.com/doc/refman/5.7/en/row-subqueries.html +type RowExpr struct { + exprNode + + Values []ExprNode +} + +// Restore implements Node interface. +func (n *RowExpr) Restore(ctx *RestoreCtx) error { + ctx.WriteKeyWord("ROW") + ctx.WritePlain("(") + for i, v := range n.Values { + if i != 0 { + ctx.WritePlain(",") + } + if err := v.Restore(ctx); err != nil { + return errors.Annotatef(err, "An error occurred when restore RowExpr.Values[%v]", i) + } + } + ctx.WritePlain(")") + return nil +} + +// Format the ExprNode into a Writer. +func (n *RowExpr) Format(w io.Writer) { + panic("Not implemented") +} + +// Accept implements Node Accept interface. +func (n *RowExpr) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*RowExpr) + for i, val := range n.Values { + node, ok := val.Accept(v) + if !ok { + return n, false + } + n.Values[i] = node.(ExprNode) + } + return v.Leave(n) +} + +// UnaryOperationExpr is the expression for unary operator. +type UnaryOperationExpr struct { + exprNode + // Op is the operator opcode. + Op opcode.Op + // V is the unary expression. + V ExprNode +} + +// Restore implements Node interface. +func (n *UnaryOperationExpr) Restore(ctx *RestoreCtx) error { + if err := n.Op.Restore(ctx); err != nil { + return errors.Trace(err) + } + if err := n.V.Restore(ctx); err != nil { + return errors.Trace(err) + } + return nil +} + +// Format the ExprNode into a Writer. +func (n *UnaryOperationExpr) Format(w io.Writer) { + n.Op.Format(w) + n.V.Format(w) +} + +// Accept implements Node Accept interface. +func (n *UnaryOperationExpr) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*UnaryOperationExpr) + node, ok := n.V.Accept(v) + if !ok { + return n, false + } + n.V = node.(ExprNode) + return v.Leave(n) +} + +// ValuesExpr is the expression used in INSERT VALUES. +type ValuesExpr struct { + exprNode + // Column is column name. + Column *ColumnNameExpr +} + +// Restore implements Node interface. +func (n *ValuesExpr) Restore(ctx *RestoreCtx) error { + ctx.WriteKeyWord("VALUES") + ctx.WritePlain("(") + if err := n.Column.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore ValuesExpr.Column") + } + ctx.WritePlain(")") + + return nil +} + +// Format the ExprNode into a Writer. +func (n *ValuesExpr) Format(w io.Writer) { + panic("Not implemented") +} + +// Accept implements Node Accept interface. +func (n *ValuesExpr) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*ValuesExpr) + node, ok := n.Column.Accept(v) + if !ok { + return n, false + } + // `node` may be *ast.ValueExpr, to avoid panic, we write `ok` but do not use + // it. + n.Column, ok = node.(*ColumnNameExpr) + return v.Leave(n) +} + +// VariableExpr is the expression for variable. +type VariableExpr struct { + exprNode + // Name is the variable name. + Name string + // IsGlobal indicates whether this variable is global. + IsGlobal bool + // IsSystem indicates whether this variable is a system variable in current session. + IsSystem bool + // ExplicitScope indicates whether this variable scope is set explicitly. + ExplicitScope bool + // Value is the variable value. + Value ExprNode +} + +// Restore implements Node interface. +func (n *VariableExpr) Restore(ctx *RestoreCtx) error { + if n.IsSystem { + ctx.WritePlain("@@") + if n.ExplicitScope { + if n.IsGlobal { + ctx.WriteKeyWord("GLOBAL") + } else { + ctx.WriteKeyWord("SESSION") + } + ctx.WritePlain(".") + } + } else { + ctx.WritePlain("@") + } + ctx.WriteName(n.Name) + + if n.Value != nil { + ctx.WritePlain(":=") + if err := n.Value.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore VariableExpr.Value") + } + } + + return nil +} + +// Format the ExprNode into a Writer. +func (n *VariableExpr) Format(w io.Writer) { + panic("Not implemented") +} + +// Accept implements Node Accept interface. +func (n *VariableExpr) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*VariableExpr) + if n.Value == nil { + return v.Leave(n) + } + + node, ok := n.Value.Accept(v) + if !ok { + return n, false + } + n.Value = node.(ExprNode) + return v.Leave(n) +} + +// MaxValueExpr is the expression for "maxvalue" used in partition. +type MaxValueExpr struct { + exprNode +} + +// Restore implements Node interface. +func (n *MaxValueExpr) Restore(ctx *RestoreCtx) error { + ctx.WriteKeyWord("MAXVALUE") + return nil +} + +// Format the ExprNode into a Writer. +func (n *MaxValueExpr) Format(w io.Writer) { + fmt.Fprint(w, "MAXVALUE") +} + +// Accept implements Node Accept interface. +func (n *MaxValueExpr) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + return v.Leave(n) +} diff --git a/vendor/github.com/pingcap/parser/ast/flag.go b/vendor/github.com/pingcap/parser/ast/flag.go new file mode 100644 index 0000000..7dc4f5c --- /dev/null +++ b/vendor/github.com/pingcap/parser/ast/flag.go @@ -0,0 +1,170 @@ +// Copyright 2015 PingCAP, Inc. +// +// 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package ast + +// HasAggFlag checks if the expr contains FlagHasAggregateFunc. +func HasAggFlag(expr ExprNode) bool { + return expr.GetFlag()&FlagHasAggregateFunc > 0 +} + +func HasWindowFlag(expr ExprNode) bool { + return expr.GetFlag()&FlagHasWindowFunc > 0 +} + +// SetFlag sets flag for expression. +func SetFlag(n Node) { + var setter flagSetter + n.Accept(&setter) +} + +type flagSetter struct { +} + +func (f *flagSetter) Enter(in Node) (Node, bool) { + return in, false +} + +func (f *flagSetter) Leave(in Node) (Node, bool) { + if x, ok := in.(ParamMarkerExpr); ok { + x.SetFlag(FlagHasParamMarker) + } + switch x := in.(type) { + case *AggregateFuncExpr: + f.aggregateFunc(x) + case *WindowFuncExpr: + f.windowFunc(x) + case *BetweenExpr: + x.SetFlag(x.Expr.GetFlag() | x.Left.GetFlag() | x.Right.GetFlag()) + case *BinaryOperationExpr: + x.SetFlag(x.L.GetFlag() | x.R.GetFlag()) + case *CaseExpr: + f.caseExpr(x) + case *ColumnNameExpr: + x.SetFlag(FlagHasReference) + case *CompareSubqueryExpr: + x.SetFlag(x.L.GetFlag() | x.R.GetFlag()) + case *DefaultExpr: + x.SetFlag(FlagHasDefault) + case *ExistsSubqueryExpr: + x.SetFlag(x.Sel.GetFlag()) + case *FuncCallExpr: + f.funcCall(x) + case *FuncCastExpr: + x.SetFlag(FlagHasFunc | x.Expr.GetFlag()) + case *IsNullExpr: + x.SetFlag(x.Expr.GetFlag()) + case *IsTruthExpr: + x.SetFlag(x.Expr.GetFlag()) + case *ParenthesesExpr: + x.SetFlag(x.Expr.GetFlag()) + case *PatternInExpr: + f.patternIn(x) + case *PatternLikeExpr: + f.patternLike(x) + case *PatternRegexpExpr: + f.patternRegexp(x) + case *PositionExpr: + x.SetFlag(FlagHasReference) + case *RowExpr: + f.row(x) + case *SubqueryExpr: + x.SetFlag(FlagHasSubquery) + case *UnaryOperationExpr: + x.SetFlag(x.V.GetFlag()) + case *ValuesExpr: + x.SetFlag(FlagHasReference) + case *VariableExpr: + if x.Value == nil { + x.SetFlag(FlagHasVariable) + } else { + x.SetFlag(FlagHasVariable | x.Value.GetFlag()) + } + } + + return in, true +} + +func (f *flagSetter) caseExpr(x *CaseExpr) { + var flag uint64 + if x.Value != nil { + flag |= x.Value.GetFlag() + } + for _, val := range x.WhenClauses { + flag |= val.Expr.GetFlag() + flag |= val.Result.GetFlag() + } + if x.ElseClause != nil { + flag |= x.ElseClause.GetFlag() + } + x.SetFlag(flag) +} + +func (f *flagSetter) patternIn(x *PatternInExpr) { + flag := x.Expr.GetFlag() + for _, val := range x.List { + flag |= val.GetFlag() + } + if x.Sel != nil { + flag |= x.Sel.GetFlag() + } + x.SetFlag(flag) +} + +func (f *flagSetter) patternLike(x *PatternLikeExpr) { + flag := x.Pattern.GetFlag() + if x.Expr != nil { + flag |= x.Expr.GetFlag() + } + x.SetFlag(flag) +} + +func (f *flagSetter) patternRegexp(x *PatternRegexpExpr) { + flag := x.Pattern.GetFlag() + if x.Expr != nil { + flag |= x.Expr.GetFlag() + } + x.SetFlag(flag) +} + +func (f *flagSetter) row(x *RowExpr) { + var flag uint64 + for _, val := range x.Values { + flag |= val.GetFlag() + } + x.SetFlag(flag) +} + +func (f *flagSetter) funcCall(x *FuncCallExpr) { + flag := FlagHasFunc + for _, val := range x.Args { + flag |= val.GetFlag() + } + x.SetFlag(flag) +} + +func (f *flagSetter) aggregateFunc(x *AggregateFuncExpr) { + flag := FlagHasAggregateFunc + for _, val := range x.Args { + flag |= val.GetFlag() + } + x.SetFlag(flag) +} + +func (f *flagSetter) windowFunc(x *WindowFuncExpr) { + flag := FlagHasWindowFunc + for _, val := range x.Args { + flag |= val.GetFlag() + } + x.SetFlag(flag) +} diff --git a/vendor/github.com/pingcap/parser/ast/functions.go b/vendor/github.com/pingcap/parser/ast/functions.go new file mode 100755 index 0000000..6a1f940 --- /dev/null +++ b/vendor/github.com/pingcap/parser/ast/functions.go @@ -0,0 +1,990 @@ +// Copyright 2015 PingCAP, Inc. +// +// 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package ast + +import ( + "fmt" + "io" + "strings" + + "github.com/pingcap/errors" + . "github.com/pingcap/parser/format" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/types" +) + +var ( + _ FuncNode = &AggregateFuncExpr{} + _ FuncNode = &FuncCallExpr{} + _ FuncNode = &FuncCastExpr{} + _ FuncNode = &WindowFuncExpr{} +) + +// List scalar function names. +const ( + LogicAnd = "and" + Cast = "cast" + LeftShift = "leftshift" + RightShift = "rightshift" + LogicOr = "or" + GE = "ge" + LE = "le" + EQ = "eq" + NE = "ne" + LT = "lt" + GT = "gt" + Plus = "plus" + Minus = "minus" + And = "bitand" + Or = "bitor" + Mod = "mod" + Xor = "bitxor" + Div = "div" + Mul = "mul" + UnaryNot = "not" // Avoid name conflict with Not in github/pingcap/check. + BitNeg = "bitneg" + IntDiv = "intdiv" + LogicXor = "xor" + NullEQ = "nulleq" + UnaryPlus = "unaryplus" + UnaryMinus = "unaryminus" + In = "in" + Like = "like" + Case = "case" + Regexp = "regexp" + IsNull = "isnull" + IsTruth = "istrue" // Avoid name conflict with IsTrue in github/pingcap/check. + IsFalsity = "isfalse" // Avoid name conflict with IsFalse in github/pingcap/check. + RowFunc = "row" + SetVar = "setvar" + GetVar = "getvar" + Values = "values" + BitCount = "bit_count" + GetParam = "getparam" + + // common functions + Coalesce = "coalesce" + Greatest = "greatest" + Least = "least" + Interval = "interval" + + // math functions + Abs = "abs" + Acos = "acos" + Asin = "asin" + Atan = "atan" + Atan2 = "atan2" + Ceil = "ceil" + Ceiling = "ceiling" + Conv = "conv" + Cos = "cos" + Cot = "cot" + CRC32 = "crc32" + Degrees = "degrees" + Exp = "exp" + Floor = "floor" + Ln = "ln" + Log = "log" + Log2 = "log2" + Log10 = "log10" + PI = "pi" + Pow = "pow" + Power = "power" + Radians = "radians" + Rand = "rand" + Round = "round" + Sign = "sign" + Sin = "sin" + Sqrt = "sqrt" + Tan = "tan" + Truncate = "truncate" + + // time functions + AddDate = "adddate" + AddTime = "addtime" + ConvertTz = "convert_tz" + Curdate = "curdate" + CurrentDate = "current_date" + CurrentTime = "current_time" + CurrentTimestamp = "current_timestamp" + Curtime = "curtime" + Date = "date" + DateLiteral = "dateliteral" + DateAdd = "date_add" + DateFormat = "date_format" + DateSub = "date_sub" + DateDiff = "datediff" + Day = "day" + DayName = "dayname" + DayOfMonth = "dayofmonth" + DayOfWeek = "dayofweek" + DayOfYear = "dayofyear" + Extract = "extract" + FromDays = "from_days" + FromUnixTime = "from_unixtime" + GetFormat = "get_format" + Hour = "hour" + LocalTime = "localtime" + LocalTimestamp = "localtimestamp" + MakeDate = "makedate" + MakeTime = "maketime" + MicroSecond = "microsecond" + Minute = "minute" + Month = "month" + MonthName = "monthname" + Now = "now" + PeriodAdd = "period_add" + PeriodDiff = "period_diff" + Quarter = "quarter" + SecToTime = "sec_to_time" + Second = "second" + StrToDate = "str_to_date" + SubDate = "subdate" + SubTime = "subtime" + Sysdate = "sysdate" + Time = "time" + TimeLiteral = "timeliteral" + TimeFormat = "time_format" + TimeToSec = "time_to_sec" + TimeDiff = "timediff" + Timestamp = "timestamp" + TimestampLiteral = "timestampliteral" + TimestampAdd = "timestampadd" + TimestampDiff = "timestampdiff" + ToDays = "to_days" + ToSeconds = "to_seconds" + UnixTimestamp = "unix_timestamp" + UTCDate = "utc_date" + UTCTime = "utc_time" + UTCTimestamp = "utc_timestamp" + Week = "week" + Weekday = "weekday" + WeekOfYear = "weekofyear" + Year = "year" + YearWeek = "yearweek" + LastDay = "last_day" + TiDBParseTso = "tidb_parse_tso" + + // string functions + ASCII = "ascii" + Bin = "bin" + Concat = "concat" + ConcatWS = "concat_ws" + Convert = "convert" + Elt = "elt" + ExportSet = "export_set" + Field = "field" + Format = "format" + FromBase64 = "from_base64" + InsertFunc = "insert_func" + Instr = "instr" + Lcase = "lcase" + Left = "left" + Length = "length" + LoadFile = "load_file" + Locate = "locate" + Lower = "lower" + Lpad = "lpad" + LTrim = "ltrim" + MakeSet = "make_set" + Mid = "mid" + Oct = "oct" + OctetLength = "octet_length" + Ord = "ord" + Position = "position" + Quote = "quote" + Repeat = "repeat" + Replace = "replace" + Reverse = "reverse" + Right = "right" + RTrim = "rtrim" + Space = "space" + Strcmp = "strcmp" + Substring = "substring" + Substr = "substr" + SubstringIndex = "substring_index" + ToBase64 = "to_base64" + Trim = "trim" + Upper = "upper" + Ucase = "ucase" + Hex = "hex" + Unhex = "unhex" + Rpad = "rpad" + BitLength = "bit_length" + CharFunc = "char_func" + CharLength = "char_length" + CharacterLength = "character_length" + FindInSet = "find_in_set" + + // information functions + Benchmark = "benchmark" + Charset = "charset" + Coercibility = "coercibility" + Collation = "collation" + ConnectionID = "connection_id" + CurrentUser = "current_user" + CurrentRole = "current_role" + Database = "database" + FoundRows = "found_rows" + LastInsertId = "last_insert_id" + RowCount = "row_count" + Schema = "schema" + SessionUser = "session_user" + SystemUser = "system_user" + User = "user" + Version = "version" + TiDBVersion = "tidb_version" + TiDBIsDDLOwner = "tidb_is_ddl_owner" + + // control functions + If = "if" + Ifnull = "ifnull" + Nullif = "nullif" + + // miscellaneous functions + AnyValue = "any_value" + DefaultFunc = "default_func" + InetAton = "inet_aton" + InetNtoa = "inet_ntoa" + Inet6Aton = "inet6_aton" + Inet6Ntoa = "inet6_ntoa" + IsFreeLock = "is_free_lock" + IsIPv4 = "is_ipv4" + IsIPv4Compat = "is_ipv4_compat" + IsIPv4Mapped = "is_ipv4_mapped" + IsIPv6 = "is_ipv6" + IsUsedLock = "is_used_lock" + MasterPosWait = "master_pos_wait" + NameConst = "name_const" + ReleaseAllLocks = "release_all_locks" + Sleep = "sleep" + UUID = "uuid" + UUIDShort = "uuid_short" + // get_lock() and release_lock() is parsed but do nothing. + // It is used for preventing error in Ruby's activerecord migrations. + GetLock = "get_lock" + ReleaseLock = "release_lock" + + // encryption and compression functions + AesDecrypt = "aes_decrypt" + AesEncrypt = "aes_encrypt" + Compress = "compress" + Decode = "decode" + DesDecrypt = "des_decrypt" + DesEncrypt = "des_encrypt" + Encode = "encode" + Encrypt = "encrypt" + MD5 = "md5" + OldPassword = "old_password" + PasswordFunc = "password_func" + RandomBytes = "random_bytes" + SHA1 = "sha1" + SHA = "sha" + SHA2 = "sha2" + Uncompress = "uncompress" + UncompressedLength = "uncompressed_length" + ValidatePasswordStrength = "validate_password_strength" + + // json functions + JSONType = "json_type" + JSONExtract = "json_extract" + JSONUnquote = "json_unquote" + JSONArray = "json_array" + JSONObject = "json_object" + JSONMerge = "json_merge" + JSONSet = "json_set" + JSONInsert = "json_insert" + JSONReplace = "json_replace" + JSONRemove = "json_remove" + JSONContains = "json_contains" + JSONContainsPath = "json_contains_path" + JSONValid = "json_valid" + JSONArrayAppend = "json_array_append" + JSONArrayInsert = "json_array_insert" + JSONMergePatch = "json_merge_patch" + JSONMergePreserve = "json_merge_preserve" + JSONPretty = "json_pretty" + JSONQuote = "json_quote" + JSONSearch = "json_search" + JSONStorageSize = "json_storage_size" + JSONDepth = "json_depth" + JSONKeys = "json_keys" + JSONLength = "json_length" +) + +// FuncCallExpr is for function expression. +type FuncCallExpr struct { + funcNode + // FnName is the function name. + FnName model.CIStr + // Args is the function args. + Args []ExprNode +} + +// Restore implements Node interface. +func (n *FuncCallExpr) Restore(ctx *RestoreCtx) error { + ctx.WriteKeyWord(n.FnName.O) + ctx.WritePlain("(") + switch n.FnName.L { + case "convert": + if err := n.Args[0].Restore(ctx); err != nil { + return errors.Annotatef(err, "An error occurred while restore FuncCastExpr.Expr") + } + ctx.WriteKeyWord(" USING ") + ctx.WriteKeyWord(n.Args[1].GetType().Charset) + case "adddate", "subdate", "date_add", "date_sub": + if err := n.Args[0].Restore(ctx); err != nil { + return errors.Annotatef(err, "An error occurred while restore FuncCallExpr.Args[0]") + } + ctx.WritePlain(", ") + ctx.WriteKeyWord("INTERVAL ") + if err := n.Args[1].Restore(ctx); err != nil { + return errors.Annotatef(err, "An error occurred while restore FuncCallExpr.Args[1]") + } + ctx.WritePlain(" ") + if err := n.Args[2].Restore(ctx); err != nil { + return errors.Annotatef(err, "An error occurred while restore FuncCallExpr.Args[2]") + } + case "extract": + if err := n.Args[0].Restore(ctx); err != nil { + return errors.Annotatef(err, "An error occurred while restore FuncCallExpr.Args[0]") + } + ctx.WriteKeyWord(" FROM ") + if err := n.Args[1].Restore(ctx); err != nil { + return errors.Annotatef(err, "An error occurred while restore FuncCallExpr.Args[1]") + } + case "position": + if err := n.Args[0].Restore(ctx); err != nil { + return errors.Annotatef(err, "An error occurred while restore FuncCallExpr") + } + ctx.WriteKeyWord(" IN ") + if err := n.Args[1].Restore(ctx); err != nil { + return errors.Annotatef(err, "An error occurred while restore FuncCallExpr") + } + case "trim": + switch len(n.Args) { + case 3: + if err := n.Args[2].Restore(ctx); err != nil { + return errors.Annotatef(err, "An error occurred while restore FuncCallExpr.Args[2]") + } + ctx.WritePlain(" ") + fallthrough + case 2: + if n.Args[1].(ValueExpr).GetValue() != nil { + if err := n.Args[1].Restore(ctx); err != nil { + return errors.Annotatef(err, "An error occurred while restore FuncCallExpr.Args[1]") + } + ctx.WritePlain(" ") + } + ctx.WriteKeyWord("FROM ") + fallthrough + case 1: + if err := n.Args[0].Restore(ctx); err != nil { + return errors.Annotatef(err, "An error occurred while restore FuncCallExpr.Args[0]") + } + } + default: + for i, argv := range n.Args { + if i != 0 { + ctx.WritePlain(", ") + } + if err := argv.Restore(ctx); err != nil { + return errors.Annotatef(err, "An error occurred while restore FuncCallExpr.Args %d", i) + } + } + } + ctx.WritePlain(")") + return nil +} + +// Format the ExprNode into a Writer. +func (n *FuncCallExpr) Format(w io.Writer) { + fmt.Fprintf(w, "%s(", n.FnName.L) + if !n.specialFormatArgs(w) { + for i, arg := range n.Args { + arg.Format(w) + if i != len(n.Args)-1 { + fmt.Fprint(w, ", ") + } + } + } + fmt.Fprint(w, ")") +} + +// specialFormatArgs formats argument list for some special functions. +func (n *FuncCallExpr) specialFormatArgs(w io.Writer) bool { + switch n.FnName.L { + case DateAdd, DateSub, AddDate, SubDate: + n.Args[0].Format(w) + fmt.Fprint(w, ", INTERVAL ") + n.Args[1].Format(w) + fmt.Fprint(w, " ") + n.Args[2].Format(w) + return true + } + return false +} + +// Accept implements Node interface. +func (n *FuncCallExpr) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*FuncCallExpr) + for i, val := range n.Args { + node, ok := val.Accept(v) + if !ok { + return n, false + } + n.Args[i] = node.(ExprNode) + } + return v.Leave(n) +} + +// CastFunctionType is the type for cast function. +type CastFunctionType int + +// CastFunction types +const ( + CastFunction CastFunctionType = iota + 1 + CastConvertFunction + CastBinaryOperator +) + +// FuncCastExpr is the cast function converting value to another type, e.g, cast(expr AS signed). +// See https://dev.mysql.com/doc/refman/5.7/en/cast-functions.html +type FuncCastExpr struct { + funcNode + // Expr is the expression to be converted. + Expr ExprNode + // Tp is the conversion type. + Tp *types.FieldType + // FunctionType is either Cast, Convert or Binary. + FunctionType CastFunctionType +} + +// Restore implements Node interface. +func (n *FuncCastExpr) Restore(ctx *RestoreCtx) error { + switch n.FunctionType { + case CastFunction: + ctx.WriteKeyWord("CAST") + ctx.WritePlain("(") + if err := n.Expr.Restore(ctx); err != nil { + return errors.Annotatef(err, "An error occurred while restore FuncCastExpr.Expr") + } + ctx.WriteKeyWord(" AS ") + n.Tp.RestoreAsCastType(ctx) + ctx.WritePlain(")") + case CastConvertFunction: + ctx.WriteKeyWord("CONVERT") + ctx.WritePlain("(") + if err := n.Expr.Restore(ctx); err != nil { + return errors.Annotatef(err, "An error occurred while restore FuncCastExpr.Expr") + } + ctx.WritePlain(", ") + n.Tp.RestoreAsCastType(ctx) + ctx.WritePlain(")") + case CastBinaryOperator: + ctx.WriteKeyWord("BINARY ") + if err := n.Expr.Restore(ctx); err != nil { + return errors.Annotatef(err, "An error occurred while restore FuncCastExpr.Expr") + } + } + return nil +} + +// Format the ExprNode into a Writer. +func (n *FuncCastExpr) Format(w io.Writer) { + switch n.FunctionType { + case CastFunction: + fmt.Fprint(w, "CAST(") + n.Expr.Format(w) + fmt.Fprint(w, " AS ") + n.Tp.FormatAsCastType(w) + fmt.Fprint(w, ")") + case CastConvertFunction: + fmt.Fprint(w, "CONVERT(") + n.Expr.Format(w) + fmt.Fprint(w, ", ") + n.Tp.FormatAsCastType(w) + fmt.Fprint(w, ")") + case CastBinaryOperator: + fmt.Fprint(w, "BINARY ") + n.Expr.Format(w) + } +} + +// Accept implements Node Accept interface. +func (n *FuncCastExpr) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*FuncCastExpr) + node, ok := n.Expr.Accept(v) + if !ok { + return n, false + } + n.Expr = node.(ExprNode) + return v.Leave(n) +} + +// TrimDirectionType is the type for trim direction. +type TrimDirectionType int + +const ( + // TrimBothDefault trims from both direction by default. + TrimBothDefault TrimDirectionType = iota + // TrimBoth trims from both direction with explicit notation. + TrimBoth + // TrimLeading trims from left. + TrimLeading + // TrimTrailing trims from right. + TrimTrailing +) + +// String implements fmt.Stringer interface. +func (direction TrimDirectionType) String() string { + switch direction { + case TrimBoth, TrimBothDefault: + return "BOTH" + case TrimLeading: + return "LEADING" + case TrimTrailing: + return "TRAILING" + default: + return "" + } +} + +// TrimDirectionExpr is an expression representing the trim direction used in the TRIM() function. +type TrimDirectionExpr struct { + exprNode + // Direction is the trim direction + Direction TrimDirectionType +} + +// Restore implements Node interface. +func (n *TrimDirectionExpr) Restore(ctx *RestoreCtx) error { + ctx.WriteKeyWord(n.Direction.String()) + return nil +} + +// Format the ExprNode into a Writer. +func (n *TrimDirectionExpr) Format(w io.Writer) { + fmt.Fprint(w, n.Direction.String()) +} + +// Accept implements Node Accept interface. +func (n *TrimDirectionExpr) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + return v.Leave(n) +} + +// DateArithType is type for DateArith type. +type DateArithType byte + +const ( + // DateArithAdd is to run adddate or date_add function option. + // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_adddate + // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_date-add + DateArithAdd DateArithType = iota + 1 + // DateArithSub is to run subdate or date_sub function option. + // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_subdate + // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_date-sub + DateArithSub +) + +const ( + // AggFuncCount is the name of Count function. + AggFuncCount = "count" + // AggFuncSum is the name of Sum function. + AggFuncSum = "sum" + // AggFuncAvg is the name of Avg function. + AggFuncAvg = "avg" + // AggFuncFirstRow is the name of FirstRowColumn function. + AggFuncFirstRow = "firstrow" + // AggFuncMax is the name of max function. + AggFuncMax = "max" + // AggFuncMin is the name of min function. + AggFuncMin = "min" + // AggFuncGroupConcat is the name of group_concat function. + AggFuncGroupConcat = "group_concat" + // AggFuncBitOr is the name of bit_or function. + AggFuncBitOr = "bit_or" + // AggFuncBitXor is the name of bit_xor function. + AggFuncBitXor = "bit_xor" + // AggFuncBitAnd is the name of bit_and function. + AggFuncBitAnd = "bit_and" + // AggFuncVarPop is the name of var_pop function + AggFuncVarPop = "var_pop" + // AggFuncVarSamp is the name of var_samp function + AggFuncVarSamp = "var_samp" + // AggFuncStddevPop is the name of stddev_pop function + AggFuncStddevPop = "stddev_pop" + // AggFuncStddevSamp is the name of stddev_samp function + AggFuncStddevSamp = "stddev_samp" +) + +// AggregateFuncExpr represents aggregate function expression. +type AggregateFuncExpr struct { + funcNode + // F is the function name. + F string + // Args is the function args. + Args []ExprNode + // Distinct is true, function hence only aggregate distinct values. + // For example, column c1 values are "1", "2", "2", "sum(c1)" is "5", + // but "sum(distinct c1)" is "3". + Distinct bool +} + +// Restore implements Node interface. +func (n *AggregateFuncExpr) Restore(ctx *RestoreCtx) error { + ctx.WriteKeyWord(n.F) + ctx.WritePlain("(") + if n.Distinct { + ctx.WriteKeyWord("DISTINCT ") + } + switch strings.ToLower(n.F) { + case "group_concat": + for i := 0; i < len(n.Args)-1; i++ { + if i != 0 { + ctx.WritePlain(", ") + } + if err := n.Args[i].Restore(ctx); err != nil { + return errors.Annotatef(err, "An error occurred while restore AggregateFuncExpr.Args[%d]", i) + } + } + ctx.WriteKeyWord(" SEPARATOR ") + if err := n.Args[len(n.Args)-1].Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore AggregateFuncExpr.Args SEPARATOR") + } + default: + for i, argv := range n.Args { + if i != 0 { + ctx.WritePlain(", ") + } + if err := argv.Restore(ctx); err != nil { + return errors.Annotatef(err, "An error occurred while restore AggregateFuncExpr.Args[%d]", i) + } + } + } + ctx.WritePlain(")") + return nil +} + +// Format the ExprNode into a Writer. +func (n *AggregateFuncExpr) Format(w io.Writer) { + panic("Not implemented") +} + +// Accept implements Node Accept interface. +func (n *AggregateFuncExpr) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*AggregateFuncExpr) + for i, val := range n.Args { + node, ok := val.Accept(v) + if !ok { + return n, false + } + n.Args[i] = node.(ExprNode) + } + return v.Leave(n) +} + +const ( + // WindowFuncRowNumber is the name of row_number function. + WindowFuncRowNumber = "row_number" + // WindowFuncRank is the name of rank function. + WindowFuncRank = "rank" + // WindowFuncDenseRank is the name of dense_rank function. + WindowFuncDenseRank = "dense_rank" + // WindowFuncCumeDist is the name of cume_dist function. + WindowFuncCumeDist = "cume_dist" + // WindowFuncPercentRank is the name of percent_rank function. + WindowFuncPercentRank = "percent_rank" + // WindowFuncNtile is the name of ntile function. + WindowFuncNtile = "ntile" + // WindowFuncLead is the name of lead function. + WindowFuncLead = "lead" + // WindowFuncLag is the name of lag function. + WindowFuncLag = "lag" + // WindowFuncFirstValue is the name of first_value function. + WindowFuncFirstValue = "first_value" + // WindowFuncLastValue is the name of last_value function. + WindowFuncLastValue = "last_value" + // WindowFuncNthValue is the name of nth_value function. + WindowFuncNthValue = "nth_value" +) + +// WindowFuncExpr represents window function expression. +type WindowFuncExpr struct { + funcNode + + // F is the function name. + F string + // Args is the function args. + Args []ExprNode + // Distinct cannot be true for most window functions, except `max` and `min`. + // We need to raise error if it is not allowed to be true. + Distinct bool + // IgnoreNull indicates how to handle null value. + // MySQL only supports `RESPECT NULLS`, so we need to raise error if it is true. + IgnoreNull bool + // FromLast indicates the calculation direction of this window function. + // MySQL only supports calculation from first, so we need to raise error if it is true. + FromLast bool + // Spec is the specification of this window. + Spec WindowSpec +} + +// Restore implements Node interface. +func (n *WindowFuncExpr) Restore(ctx *RestoreCtx) error { + ctx.WriteKeyWord(n.F) + ctx.WritePlain("(") + for i, v := range n.Args { + if i != 0 { + ctx.WritePlain(", ") + } else if n.Distinct { + ctx.WriteKeyWord("DISTINCT ") + } + if err := v.Restore(ctx); err != nil { + return errors.Annotatef(err, "An error occurred while restore WindowFuncExpr.Args[%d]", i) + } + } + ctx.WritePlain(")") + if n.FromLast { + ctx.WriteKeyWord(" FROM LAST") + } + if n.IgnoreNull { + ctx.WriteKeyWord(" IGNORE NULLS") + } + ctx.WriteKeyWord(" OVER ") + if err := n.Spec.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore WindowFuncExpr.Spec") + } + + return nil +} + +// Format formats the window function expression into a Writer. +func (n *WindowFuncExpr) Format(w io.Writer) { + panic("Not implemented") +} + +// Accept implements Node Accept interface. +func (n *WindowFuncExpr) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*WindowFuncExpr) + for i, val := range n.Args { + node, ok := val.Accept(v) + if !ok { + return n, false + } + n.Args[i] = node.(ExprNode) + } + node, ok := n.Spec.Accept(v) + if !ok { + return n, false + } + n.Spec = *node.(*WindowSpec) + return v.Leave(n) +} + +// TimeUnitType is the type for time and timestamp units. +type TimeUnitType int + +const ( + // TimeUnitInvalid is a placeholder for an invalid time or timestamp unit + TimeUnitInvalid TimeUnitType = iota + // TimeUnitMicrosecond is the time or timestamp unit MICROSECOND. + TimeUnitMicrosecond + // TimeUnitSecond is the time or timestamp unit SECOND. + TimeUnitSecond + // TimeUnitMinute is the time or timestamp unit MINUTE. + TimeUnitMinute + // TimeUnitHour is the time or timestamp unit HOUR. + TimeUnitHour + // TimeUnitDay is the time or timestamp unit DAY. + TimeUnitDay + // TimeUnitWeek is the time or timestamp unit WEEK. + TimeUnitWeek + // TimeUnitMonth is the time or timestamp unit MONTH. + TimeUnitMonth + // TimeUnitQuarter is the time or timestamp unit QUARTER. + TimeUnitQuarter + // TimeUnitYear is the time or timestamp unit YEAR. + TimeUnitYear + // TimeUnitSecondMicrosecond is the time unit SECOND_MICROSECOND. + TimeUnitSecondMicrosecond + // TimeUnitMinuteMicrosecond is the time unit MINUTE_MICROSECOND. + TimeUnitMinuteMicrosecond + // TimeUnitMinuteSecond is the time unit MINUTE_SECOND. + TimeUnitMinuteSecond + // TimeUnitHourMicrosecond is the time unit HOUR_MICROSECOND. + TimeUnitHourMicrosecond + // TimeUnitHourSecond is the time unit HOUR_SECOND. + TimeUnitHourSecond + // TimeUnitHourMinute is the time unit HOUR_MINUTE. + TimeUnitHourMinute + // TimeUnitDayMicrosecond is the time unit DAY_MICROSECOND. + TimeUnitDayMicrosecond + // TimeUnitDaySecond is the time unit DAY_SECOND. + TimeUnitDaySecond + // TimeUnitDayMinute is the time unit DAY_MINUTE. + TimeUnitDayMinute + // TimeUnitDayHour is the time unit DAY_HOUR. + TimeUnitDayHour + // TimeUnitYearMonth is the time unit YEAR_MONTH. + TimeUnitYearMonth +) + +// String implements fmt.Stringer interface. +func (unit TimeUnitType) String() string { + switch unit { + case TimeUnitMicrosecond: + return "MICROSECOND" + case TimeUnitSecond: + return "SECOND" + case TimeUnitMinute: + return "MINUTE" + case TimeUnitHour: + return "HOUR" + case TimeUnitDay: + return "DAY" + case TimeUnitWeek: + return "WEEK" + case TimeUnitMonth: + return "MONTH" + case TimeUnitQuarter: + return "QUARTER" + case TimeUnitYear: + return "YEAR" + case TimeUnitSecondMicrosecond: + return "SECOND_MICROSECOND" + case TimeUnitMinuteMicrosecond: + return "MINUTE_MICROSECOND" + case TimeUnitMinuteSecond: + return "MINUTE_SECOND" + case TimeUnitHourMicrosecond: + return "HOUR_MICROSECOND" + case TimeUnitHourSecond: + return "HOUR_SECOND" + case TimeUnitHourMinute: + return "HOUR_MINUTE" + case TimeUnitDayMicrosecond: + return "DAY_MICROSECOND" + case TimeUnitDaySecond: + return "DAY_SECOND" + case TimeUnitDayMinute: + return "DAY_MINUTE" + case TimeUnitDayHour: + return "DAY_HOUR" + case TimeUnitYearMonth: + return "YEAR_MONTH" + default: + return "" + } +} + +// TimeUnitExpr is an expression representing a time or timestamp unit. +type TimeUnitExpr struct { + exprNode + // Unit is the time or timestamp unit. + Unit TimeUnitType +} + +// Restore implements Node interface. +func (n *TimeUnitExpr) Restore(ctx *RestoreCtx) error { + ctx.WriteKeyWord(n.Unit.String()) + return nil +} + +// Format the ExprNode into a Writer. +func (n *TimeUnitExpr) Format(w io.Writer) { + fmt.Fprint(w, n.Unit.String()) +} + +// Accept implements Node Accept interface. +func (n *TimeUnitExpr) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + return v.Leave(n) +} + +// GetFormatSelectorType is the type for the first argument of GET_FORMAT() function. +type GetFormatSelectorType int + +const ( + // GetFormatSelectorDate is the GET_FORMAT selector DATE. + GetFormatSelectorDate GetFormatSelectorType = iota + 1 + // GetFormatSelectorTime is the GET_FORMAT selector TIME. + GetFormatSelectorTime + // GetFormatSelectorDatetime is the GET_FORMAT selector DATETIME and TIMESTAMP. + GetFormatSelectorDatetime +) + +// GetFormatSelectorExpr is an expression used as the first argument of GET_FORMAT() function. +type GetFormatSelectorExpr struct { + exprNode + // Selector is the GET_FORMAT() selector. + Selector GetFormatSelectorType +} + +// String implements fmt.Stringer interface. +func (selector GetFormatSelectorType) String() string { + switch selector { + case GetFormatSelectorDate: + return "DATE" + case GetFormatSelectorTime: + return "TIME" + case GetFormatSelectorDatetime: + return "DATETIME" + default: + return "" + } +} + +// Restore implements Node interface. +func (n *GetFormatSelectorExpr) Restore(ctx *RestoreCtx) error { + ctx.WriteKeyWord(n.Selector.String()) + return nil +} + +// Format the ExprNode into a Writer. +func (n *GetFormatSelectorExpr) Format(w io.Writer) { + fmt.Fprint(w, n.Selector.String()) +} + +// Accept implements Node Accept interface. +func (n *GetFormatSelectorExpr) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + return v.Leave(n) +} diff --git a/vendor/github.com/pingcap/parser/ast/misc.go b/vendor/github.com/pingcap/parser/ast/misc.go new file mode 100755 index 0000000..545303b --- /dev/null +++ b/vendor/github.com/pingcap/parser/ast/misc.go @@ -0,0 +1,2144 @@ +// Copyright 2015 PingCAP, Inc. +// +// 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package ast + +import ( + "bytes" + "fmt" + "strconv" + "strings" + + "github.com/pingcap/errors" + "github.com/pingcap/parser/auth" + . "github.com/pingcap/parser/format" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" +) + +var ( + _ StmtNode = &AdminStmt{} + _ StmtNode = &AlterUserStmt{} + _ StmtNode = &BeginStmt{} + _ StmtNode = &BinlogStmt{} + _ StmtNode = &CommitStmt{} + _ StmtNode = &CreateUserStmt{} + _ StmtNode = &DeallocateStmt{} + _ StmtNode = &DoStmt{} + _ StmtNode = &ExecuteStmt{} + _ StmtNode = &ExplainStmt{} + _ StmtNode = &GrantStmt{} + _ StmtNode = &PrepareStmt{} + _ StmtNode = &RollbackStmt{} + _ StmtNode = &SetPwdStmt{} + _ StmtNode = &SetRoleStmt{} + _ StmtNode = &SetDefaultRoleStmt{} + _ StmtNode = &SetStmt{} + _ StmtNode = &UseStmt{} + _ StmtNode = &FlushStmt{} + _ StmtNode = &KillStmt{} + _ StmtNode = &CreateBindingStmt{} + _ StmtNode = &DropBindingStmt{} + + _ Node = &PrivElem{} + _ Node = &VariableAssignment{} +) + +// Isolation level constants. +const ( + ReadCommitted = "READ-COMMITTED" + ReadUncommitted = "READ-UNCOMMITTED" + Serializable = "SERIALIZABLE" + RepeatableRead = "REPEATABLE-READ" + + // Valid formats for explain statement. + ExplainFormatROW = "row" + ExplainFormatDOT = "dot" + PumpType = "PUMP" + DrainerType = "DRAINER" +) + +// Transaction mode constants. +const ( + Optimistic = "OPTIMISTIC" + Pessimistic = "PESSIMISTIC" +) + +var ( + // ExplainFormats stores the valid formats for explain statement, used by validator. + ExplainFormats = []string{ + ExplainFormatROW, + ExplainFormatDOT, + } +) + +// TypeOpt is used for parsing data type option from SQL. +type TypeOpt struct { + IsUnsigned bool + IsZerofill bool +} + +// FloatOpt is used for parsing floating-point type option from SQL. +// See http://dev.mysql.com/doc/refman/5.7/en/floating-point-types.html +type FloatOpt struct { + Flen int + Decimal int +} + +// AuthOption is used for parsing create use statement. +type AuthOption struct { + // ByAuthString set as true, if AuthString is used for authorization. Otherwise, authorization is done by HashString. + ByAuthString bool + AuthString string + HashString string + // TODO: support auth_plugin +} + +// Restore implements Node interface. +func (n *AuthOption) Restore(ctx *RestoreCtx) error { + ctx.WriteKeyWord("IDENTIFIED BY ") + if n.ByAuthString { + ctx.WriteString(n.AuthString) + } else { + ctx.WriteKeyWord("PASSWORD ") + ctx.WriteString(n.HashString) + } + return nil +} + +// TraceStmt is a statement to trace what sql actually does at background. +type TraceStmt struct { + stmtNode + + Stmt StmtNode + Format string +} + +// Restore implements Node interface. +func (n *TraceStmt) Restore(ctx *RestoreCtx) error { + ctx.WriteKeyWord("TRACE ") + if n.Format != "json" { + ctx.WriteKeyWord("FORMAT") + ctx.WritePlain(" = ") + ctx.WriteString(n.Format) + ctx.WritePlain(" ") + } + if err := n.Stmt.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore TraceStmt.Stmt") + } + return nil +} + +// Accept implements Node Accept interface. +func (n *TraceStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*TraceStmt) + node, ok := n.Stmt.Accept(v) + if !ok { + return n, false + } + n.Stmt = node.(StmtNode) + return v.Leave(n) +} + +// ExplainForStmt is a statement to provite information about how is SQL statement executeing +// in connection #ConnectionID +// See https://dev.mysql.com/doc/refman/5.7/en/explain.html +type ExplainForStmt struct { + stmtNode + + Format string + ConnectionID uint64 +} + +// Restore implements Node interface. +func (n *ExplainForStmt) Restore(ctx *RestoreCtx) error { + ctx.WriteKeyWord("EXPLAIN ") + ctx.WriteKeyWord("FORMAT ") + ctx.WritePlain("= ") + ctx.WriteString(n.Format) + ctx.WritePlain(" ") + ctx.WriteKeyWord("FOR ") + ctx.WriteKeyWord("CONNECTION ") + ctx.WritePlain(strconv.FormatUint(n.ConnectionID, 10)) + return nil +} + +// Accept implements Node Accept interface. +func (n *ExplainForStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*ExplainForStmt) + return v.Leave(n) +} + +// ExplainStmt is a statement to provide information about how is SQL statement executed +// or get columns information in a table. +// See https://dev.mysql.com/doc/refman/5.7/en/explain.html +type ExplainStmt struct { + stmtNode + + Stmt StmtNode + Format string + Analyze bool +} + +// Restore implements Node interface. +func (n *ExplainStmt) Restore(ctx *RestoreCtx) error { + if showStmt, ok := n.Stmt.(*ShowStmt); ok { + ctx.WriteKeyWord("DESC ") + if err := showStmt.Table.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore ExplainStmt.ShowStmt.Table") + } + if showStmt.Column != nil { + ctx.WritePlain(" ") + if err := showStmt.Column.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore ExplainStmt.ShowStmt.Column") + } + } + return nil + } + ctx.WriteKeyWord("EXPLAIN ") + if n.Analyze { + ctx.WriteKeyWord("ANALYZE ") + } else { + ctx.WriteKeyWord("FORMAT ") + ctx.WritePlain("= ") + ctx.WriteString(n.Format) + ctx.WritePlain(" ") + } + if err := n.Stmt.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore ExplainStmt.Stmt") + } + return nil +} + +// Accept implements Node Accept interface. +func (n *ExplainStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*ExplainStmt) + node, ok := n.Stmt.Accept(v) + if !ok { + return n, false + } + n.Stmt = node.(DMLNode) + return v.Leave(n) +} + +// PrepareStmt is a statement to prepares a SQL statement which contains placeholders, +// and it is executed with ExecuteStmt and released with DeallocateStmt. +// See https://dev.mysql.com/doc/refman/5.7/en/prepare.html +type PrepareStmt struct { + stmtNode + + Name string + SQLText string + SQLVar *VariableExpr +} + +// Restore implements Node interface. +func (n *PrepareStmt) Restore(ctx *RestoreCtx) error { + ctx.WriteKeyWord("PREPARE ") + ctx.WriteName(n.Name) + ctx.WriteKeyWord(" FROM ") + if n.SQLText != "" { + ctx.WriteString(n.SQLText) + return nil + } + if n.SQLVar != nil { + if err := n.SQLVar.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore PrepareStmt.SQLVar") + } + return nil + } + return errors.New("An error occurred while restore PrepareStmt") +} + +// Accept implements Node Accept interface. +func (n *PrepareStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*PrepareStmt) + if n.SQLVar != nil { + node, ok := n.SQLVar.Accept(v) + if !ok { + return n, false + } + n.SQLVar = node.(*VariableExpr) + } + return v.Leave(n) +} + +// DeallocateStmt is a statement to release PreparedStmt. +// See https://dev.mysql.com/doc/refman/5.7/en/deallocate-prepare.html +type DeallocateStmt struct { + stmtNode + + Name string +} + +// Restore implements Node interface. +func (n *DeallocateStmt) Restore(ctx *RestoreCtx) error { + ctx.WriteKeyWord("DEALLOCATE PREPARE ") + ctx.WriteName(n.Name) + return nil +} + +// Accept implements Node Accept interface. +func (n *DeallocateStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*DeallocateStmt) + return v.Leave(n) +} + +// Prepared represents a prepared statement. +type Prepared struct { + Stmt StmtNode + StmtType string + Params []ParamMarkerExpr + SchemaVersion int64 + UseCache bool +} + +// ExecuteStmt is a statement to execute PreparedStmt. +// See https://dev.mysql.com/doc/refman/5.7/en/execute.html +type ExecuteStmt struct { + stmtNode + + Name string + UsingVars []ExprNode + BinaryArgs interface{} + ExecID uint32 +} + +// Restore implements Node interface. +func (n *ExecuteStmt) Restore(ctx *RestoreCtx) error { + ctx.WriteKeyWord("EXECUTE ") + ctx.WriteName(n.Name) + if len(n.UsingVars) > 0 { + ctx.WriteKeyWord(" USING ") + for i, val := range n.UsingVars { + if i != 0 { + ctx.WritePlain(",") + } + if err := val.Restore(ctx); err != nil { + return errors.Annotatef(err, "An error occurred while restore ExecuteStmt.UsingVars index %d", i) + } + } + } + return nil +} + +// Accept implements Node Accept interface. +func (n *ExecuteStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*ExecuteStmt) + for i, val := range n.UsingVars { + node, ok := val.Accept(v) + if !ok { + return n, false + } + n.UsingVars[i] = node.(ExprNode) + } + return v.Leave(n) +} + +// BeginStmt is a statement to start a new transaction. +// See https://dev.mysql.com/doc/refman/5.7/en/commit.html +type BeginStmt struct { + stmtNode + Mode string +} + +// Restore implements Node interface. +func (n *BeginStmt) Restore(ctx *RestoreCtx) error { + if n.Mode == "" { + ctx.WriteKeyWord("START TRANSACTION") + } else { + ctx.WriteKeyWord("BEGIN ") + ctx.WriteKeyWord(n.Mode) + } + return nil +} + +// Accept implements Node Accept interface. +func (n *BeginStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*BeginStmt) + return v.Leave(n) +} + +// BinlogStmt is an internal-use statement. +// We just parse and ignore it. +// See http://dev.mysql.com/doc/refman/5.7/en/binlog.html +type BinlogStmt struct { + stmtNode + Str string +} + +// Restore implements Node interface. +func (n *BinlogStmt) Restore(ctx *RestoreCtx) error { + ctx.WriteKeyWord("BINLOG ") + ctx.WriteString(n.Str) + return nil +} + +// Accept implements Node Accept interface. +func (n *BinlogStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*BinlogStmt) + return v.Leave(n) +} + +// CommitStmt is a statement to commit the current transaction. +// See https://dev.mysql.com/doc/refman/5.7/en/commit.html +type CommitStmt struct { + stmtNode +} + +// Restore implements Node interface. +func (n *CommitStmt) Restore(ctx *RestoreCtx) error { + ctx.WriteKeyWord("COMMIT") + return nil +} + +// Accept implements Node Accept interface. +func (n *CommitStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*CommitStmt) + return v.Leave(n) +} + +// RollbackStmt is a statement to roll back the current transaction. +// See https://dev.mysql.com/doc/refman/5.7/en/commit.html +type RollbackStmt struct { + stmtNode +} + +// Restore implements Node interface. +func (n *RollbackStmt) Restore(ctx *RestoreCtx) error { + ctx.WriteKeyWord("ROLLBACK") + return nil +} + +// Accept implements Node Accept interface. +func (n *RollbackStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*RollbackStmt) + return v.Leave(n) +} + +// UseStmt is a statement to use the DBName database as the current database. +// See https://dev.mysql.com/doc/refman/5.7/en/use.html +type UseStmt struct { + stmtNode + + DBName string +} + +// Restore implements Node interface. +func (n *UseStmt) Restore(ctx *RestoreCtx) error { + ctx.WriteKeyWord("USE ") + ctx.WriteName(n.DBName) + return nil +} + +// Accept implements Node Accept interface. +func (n *UseStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*UseStmt) + return v.Leave(n) +} + +const ( + // SetNames is the const for set names/charset stmt. + // If VariableAssignment.Name == Names, it should be set names/charset stmt. + SetNames = "SetNAMES" +) + +// VariableAssignment is a variable assignment struct. +type VariableAssignment struct { + node + Name string + Value ExprNode + IsGlobal bool + IsSystem bool + + // ExtendValue is a way to store extended info. + // VariableAssignment should be able to store information for SetCharset/SetPWD Stmt. + // For SetCharsetStmt, Value is charset, ExtendValue is collation. + // TODO: Use SetStmt to implement set password statement. + ExtendValue ValueExpr +} + +// Restore implements Node interface. +func (n *VariableAssignment) Restore(ctx *RestoreCtx) error { + if n.IsSystem { + ctx.WritePlain("@@") + if n.IsGlobal { + ctx.WriteKeyWord("GLOBAL") + } else { + ctx.WriteKeyWord("SESSION") + } + ctx.WritePlain(".") + } else if n.Name != SetNames { + ctx.WriteKeyWord("@") + } + if n.Name == SetNames { + ctx.WriteKeyWord("NAMES ") + } else { + ctx.WriteName(n.Name) + ctx.WritePlain("=") + } + if err := n.Value.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore VariableAssignment.Value") + } + if n.ExtendValue != nil { + ctx.WriteKeyWord(" COLLATE ") + if err := n.ExtendValue.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore VariableAssignment.ExtendValue") + } + } + return nil +} + +// Accept implements Node interface. +func (n *VariableAssignment) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*VariableAssignment) + node, ok := n.Value.Accept(v) + if !ok { + return n, false + } + n.Value = node.(ExprNode) + return v.Leave(n) +} + +// FlushStmtType is the type for FLUSH statement. +type FlushStmtType int + +// Flush statement types. +const ( + FlushNone FlushStmtType = iota + FlushTables + FlushPrivileges + FlushStatus + FlushTiDBPlugin +) + +// FlushStmt is a statement to flush tables/privileges/optimizer costs and so on. +type FlushStmt struct { + stmtNode + + Tp FlushStmtType // Privileges/Tables/... + NoWriteToBinLog bool + Tables []*TableName // For FlushTableStmt, if Tables is empty, it means flush all tables. + ReadLock bool + Plugins []string +} + +// Restore implements Node interface. +func (n *FlushStmt) Restore(ctx *RestoreCtx) error { + ctx.WriteKeyWord("FLUSH ") + if n.NoWriteToBinLog { + ctx.WriteKeyWord("NO_WRITE_TO_BINLOG ") + } + switch n.Tp { + case FlushTables: + ctx.WriteKeyWord("TABLES") + for i, v := range n.Tables { + if i == 0 { + ctx.WritePlain(" ") + } else { + ctx.WritePlain(", ") + } + if err := v.Restore(ctx); err != nil { + return errors.Annotatef(err, "An error occurred while restore FlushStmt.Tables[%d]", i) + } + } + if n.ReadLock { + ctx.WriteKeyWord(" WITH READ LOCK") + } + case FlushPrivileges: + ctx.WriteKeyWord("PRIVILEGES") + case FlushStatus: + ctx.WriteKeyWord("STATUS") + case FlushTiDBPlugin: + ctx.WriteKeyWord("TIDB PLUGINS") + for i, v := range n.Plugins { + if i == 0 { + ctx.WritePlain(" ") + } else { + ctx.WritePlain(", ") + } + ctx.WritePlain(v) + } + default: + return errors.New("Unsupported type of FlushTables") + } + return nil +} + +// Accept implements Node Accept interface. +func (n *FlushStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*FlushStmt) + return v.Leave(n) +} + +// KillStmt is a statement to kill a query or connection. +type KillStmt struct { + stmtNode + + // Query indicates whether terminate a single query on this connection or the whole connection. + // If Query is true, terminates the statement the connection is currently executing, but leaves the connection itself intact. + // If Query is false, terminates the connection associated with the given ConnectionID, after terminating any statement the connection is executing. + Query bool + ConnectionID uint64 + // TiDBExtension is used to indicate whether the user knows he is sending kill statement to the right tidb-server. + // When the SQL grammar is "KILL TIDB [CONNECTION | QUERY] connectionID", TiDBExtension will be set. + // It's a special grammar extension in TiDB. This extension exists because, when the connection is: + // client -> LVS proxy -> TiDB, and type Ctrl+C in client, the following action will be executed: + // new a connection; kill xxx; + // kill command may send to the wrong TiDB, because the exists of LVS proxy, and kill the wrong session. + // So, "KILL TIDB" grammar is introduced, and it REQUIRES DIRECT client -> TiDB TOPOLOGY. + // TODO: The standard KILL grammar will be supported once we have global connectionID. + TiDBExtension bool +} + +// Restore implements Node interface. +func (n *KillStmt) Restore(ctx *RestoreCtx) error { + ctx.WriteKeyWord("KILL") + if n.TiDBExtension { + ctx.WriteKeyWord(" TIDB") + } + if n.Query { + ctx.WriteKeyWord(" QUERY") + } + ctx.WritePlainf(" %d", n.ConnectionID) + return nil +} + +// Accept implements Node Accept interface. +func (n *KillStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*KillStmt) + return v.Leave(n) +} + +// SetStmt is the statement to set variables. +type SetStmt struct { + stmtNode + // Variables is the list of variable assignment. + Variables []*VariableAssignment +} + +// Restore implements Node interface. +func (n *SetStmt) Restore(ctx *RestoreCtx) error { + ctx.WriteKeyWord("SET ") + for i, v := range n.Variables { + if i != 0 { + ctx.WritePlain(", ") + } + if err := v.Restore(ctx); err != nil { + return errors.Annotatef(err, "An error occurred while restore SetStmt.Variables[%d]", i) + } + } + return nil +} + +// Accept implements Node Accept interface. +func (n *SetStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*SetStmt) + for i, val := range n.Variables { + node, ok := val.Accept(v) + if !ok { + return n, false + } + n.Variables[i] = node.(*VariableAssignment) + } + return v.Leave(n) +} + +/* +// SetCharsetStmt is a statement to assign values to character and collation variables. +// See https://dev.mysql.com/doc/refman/5.7/en/set-statement.html +type SetCharsetStmt struct { + stmtNode + + Charset string + Collate string +} + +// Accept implements Node Accept interface. +func (n *SetCharsetStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*SetCharsetStmt) + return v.Leave(n) +} +*/ + +// SetPwdStmt is a statement to assign a password to user account. +// See https://dev.mysql.com/doc/refman/5.7/en/set-password.html +type SetPwdStmt struct { + stmtNode + + User *auth.UserIdentity + Password string +} + +// Restore implements Node interface. +func (n *SetPwdStmt) Restore(ctx *RestoreCtx) error { + ctx.WriteKeyWord("SET PASSWORD") + if n.User != nil { + ctx.WriteKeyWord(" FOR ") + if err := n.User.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore SetPwdStmt.User") + } + } + ctx.WritePlain("=") + ctx.WriteString(n.Password) + return nil +} + +// SecureText implements SensitiveStatement interface. +func (n *SetPwdStmt) SecureText() string { + return fmt.Sprintf("set password for user %s", n.User) +} + +// Accept implements Node Accept interface. +func (n *SetPwdStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*SetPwdStmt) + return v.Leave(n) +} + +type ChangeStmt struct { + stmtNode + + NodeType string + State string + NodeID string +} + +// Restore implements Node interface. +func (n *ChangeStmt) Restore(ctx *RestoreCtx) error { + ctx.WriteKeyWord("CHANGE ") + ctx.WriteKeyWord(n.NodeType) + ctx.WriteKeyWord(" TO NODE_STATE ") + ctx.WritePlain("=") + ctx.WriteString(n.State) + ctx.WriteKeyWord(" FOR NODE_ID ") + ctx.WriteString(n.NodeID) + return nil +} + +// SecureText implements SensitiveStatement interface. +func (n *ChangeStmt) SecureText() string { + return fmt.Sprintf("change %s to node_state='%s' for node_id '%s'", strings.ToLower(n.NodeType), n.State, n.NodeID) +} + +// Accept implements Node Accept interface. +func (n *ChangeStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*ChangeStmt) + return v.Leave(n) +} + +// SetRoleStmtType is the type for FLUSH statement. +type SetRoleStmtType int + +// SetRole statement types. +const ( + SetRoleDefault SetRoleStmtType = iota + SetRoleNone + SetRoleAll + SetRoleAllExcept + SetRoleRegular +) + +type SetRoleStmt struct { + stmtNode + + SetRoleOpt SetRoleStmtType + RoleList []*auth.RoleIdentity +} + +func (n *SetRoleStmt) Restore(ctx *RestoreCtx) error { + ctx.WriteKeyWord("SET ROLE") + switch n.SetRoleOpt { + case SetRoleDefault: + ctx.WriteKeyWord(" DEFAULT") + case SetRoleNone: + ctx.WriteKeyWord(" NONE") + case SetRoleAll: + ctx.WriteKeyWord(" ALL") + case SetRoleAllExcept: + ctx.WriteKeyWord(" ALL EXCEPT") + } + for i, role := range n.RoleList { + ctx.WritePlain(" ") + err := role.Restore(ctx) + if err != nil { + return errors.Annotate(err, "An error occurred while restore SetRoleStmt.RoleList") + } + if i != len(n.RoleList)-1 { + ctx.WritePlain(",") + } + } + return nil +} + +// Accept implements Node Accept interface. +func (n *SetRoleStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*SetRoleStmt) + return v.Leave(n) +} + +type SetDefaultRoleStmt struct { + stmtNode + + SetRoleOpt SetRoleStmtType + RoleList []*auth.RoleIdentity + UserList []*auth.UserIdentity +} + +func (n *SetDefaultRoleStmt) Restore(ctx *RestoreCtx) error { + ctx.WriteKeyWord("SET DEFAULT ROLE") + switch n.SetRoleOpt { + case SetRoleNone: + ctx.WriteKeyWord(" NONE") + case SetRoleAll: + ctx.WriteKeyWord(" ALL") + default: + } + for i, role := range n.RoleList { + ctx.WritePlain(" ") + err := role.Restore(ctx) + if err != nil { + return errors.Annotate(err, "An error occurred while restore SetDefaultRoleStmt.RoleList") + } + if i != len(n.RoleList)-1 { + ctx.WritePlain(",") + } + } + ctx.WritePlain(" TO") + for i, user := range n.UserList { + ctx.WritePlain(" ") + err := user.Restore(ctx) + if err != nil { + return errors.Annotate(err, "An error occurred while restore SetDefaultRoleStmt.UserList") + } + if i != len(n.UserList)-1 { + ctx.WritePlain(",") + } + } + return nil +} + +// Accept implements Node Accept interface. +func (n *SetDefaultRoleStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*SetDefaultRoleStmt) + return v.Leave(n) +} + +// UserSpec is used for parsing create user statement. +type UserSpec struct { + User *auth.UserIdentity + AuthOpt *AuthOption + IsRole bool +} + +// Restore implements Node interface. +func (n *UserSpec) Restore(ctx *RestoreCtx) error { + if err := n.User.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore UserSpec.User") + } + if n.AuthOpt != nil { + ctx.WritePlain(" ") + if err := n.AuthOpt.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore UserSpec.AuthOpt") + } + } + return nil +} + +// SecurityString formats the UserSpec without password information. +func (n *UserSpec) SecurityString() string { + withPassword := false + if opt := n.AuthOpt; opt != nil { + if len(opt.AuthString) > 0 || len(opt.HashString) > 0 { + withPassword = true + } + } + if withPassword { + return fmt.Sprintf("{%s password = ***}", n.User) + } + return n.User.String() +} + +// EncodedPassword returns the encoded password (which is the real data mysql.user). +// The boolean value indicates input's password format is legal or not. +func (n *UserSpec) EncodedPassword() (string, bool) { + if n.AuthOpt == nil { + return "", true + } + + opt := n.AuthOpt + if opt.ByAuthString { + return auth.EncodePassword(opt.AuthString), true + } + + // Not a legal password string. + if len(opt.HashString) != 41 || !strings.HasPrefix(opt.HashString, "*") { + return "", false + } + return opt.HashString, true +} + +const ( + TslNone = iota + Ssl + X509 + Cipher + Issuer + Subject +) + +type TslOption struct { + Type int + Value string +} + +func (t *TslOption) Restore(ctx *RestoreCtx) error { + switch t.Type { + case TslNone: + ctx.WriteKeyWord("NONE") + case Ssl: + ctx.WriteKeyWord("SSL") + case X509: + ctx.WriteKeyWord("X509") + case Cipher: + ctx.WriteKeyWord("CIPHER ") + ctx.WriteString(t.Value) + case Issuer: + ctx.WriteKeyWord("ISSUER ") + ctx.WriteString(t.Value) + case Subject: + ctx.WriteKeyWord("CIPHER") + ctx.WriteString(t.Value) + default: + return errors.Errorf("Unsupported TslOption.Type %d", t.Type) + } + return nil +} + +const ( + MaxQueriesPerHour = iota + 1 + MaxUpdatesPerHour + MaxConnectionsPerHour + MaxUserConnections +) + +type ResourceOption struct { + Type int + Count int64 +} + +func (r *ResourceOption) Restore(ctx *RestoreCtx) error { + switch r.Type { + case MaxQueriesPerHour: + ctx.WriteKeyWord("MAX_QUERIES_PER_HOUR ") + case MaxUpdatesPerHour: + ctx.WriteKeyWord("MAX_UPDATES_PER_HOUR ") + case MaxConnectionsPerHour: + ctx.WriteKeyWord("MAX_CONNECTIONS_PER_HOUR ") + case MaxUserConnections: + ctx.WriteKeyWord("MAX_USER_CONNECTIONS ") + default: + return errors.Errorf("Unsupported ResourceOption.Type %d", r.Type) + } + ctx.WritePlainf("%d", r.Count) + return nil +} + +const ( + PasswordExpire = iota + 1 + PasswordExpireDefault + PasswordExpireNever + PasswordExpireInterval + Lock + Unlock +) + +type PasswordOrLockOption struct { + Type int + Count int64 +} + +func (p *PasswordOrLockOption) Restore(ctx *RestoreCtx) error { + switch p.Type { + case PasswordExpire: + ctx.WriteKeyWord("PASSWORD EXPIRE") + case PasswordExpireDefault: + ctx.WriteKeyWord("PASSWORD EXPIRE DEFAULT") + case PasswordExpireNever: + ctx.WriteKeyWord("PASSWORD EXPIRE NEVER") + case PasswordExpireInterval: + ctx.WriteKeyWord("PASSWORD EXPIRE INTERVAL") + ctx.WritePlainf(" %d", p.Count) + ctx.WriteKeyWord(" DAY") + case Lock: + ctx.WriteKeyWord("ACCOUNT LOCK") + case Unlock: + ctx.WriteKeyWord("ACCOUNT UNLOCK") + default: + return errors.Errorf("Unsupported PasswordOrLockOption.Type %d", p.Type) + } + return nil +} + +// CreateUserStmt creates user account. +// See https://dev.mysql.com/doc/refman/5.7/en/create-user.html +type CreateUserStmt struct { + stmtNode + + IsCreateRole bool + IfNotExists bool + Specs []*UserSpec + TslOptions []*TslOption + ResourceOptions []*ResourceOption + PasswordOrLockOptions []*PasswordOrLockOption +} + +// Restore implements Node interface. +func (n *CreateUserStmt) Restore(ctx *RestoreCtx) error { + if n.IsCreateRole { + ctx.WriteKeyWord("CREATE ROLE ") + } else { + ctx.WriteKeyWord("CREATE USER ") + } + if n.IfNotExists { + ctx.WriteKeyWord("IF NOT EXISTS ") + } + for i, v := range n.Specs { + if i != 0 { + ctx.WritePlain(", ") + } + if err := v.Restore(ctx); err != nil { + return errors.Annotatef(err, "An error occurred while restore CreateUserStmt.Specs[%d]", i) + } + } + + tslOptionLen := len(n.TslOptions) + + if tslOptionLen != 0 { + ctx.WriteKeyWord(" REQUIRE ") + } + + // Restore `tslOptions` reversely to keep order the same with original sql + for i := tslOptionLen; i > 0; i-- { + if i != tslOptionLen { + ctx.WriteKeyWord(" AND ") + } + if err := n.TslOptions[i-1].Restore(ctx); err != nil { + return errors.Annotatef(err, "An error occurred while restore CreateUserStmt.TslOptions[%d]", i) + } + } + + if len(n.ResourceOptions) != 0 { + ctx.WriteKeyWord(" WITH") + } + + for i, v := range n.ResourceOptions { + ctx.WritePlain(" ") + if err := v.Restore(ctx); err != nil { + return errors.Annotatef(err, "An error occurred while restore CreateUserStmt.ResourceOptions[%d]", i) + } + } + + for i, v := range n.PasswordOrLockOptions { + ctx.WritePlain(" ") + if err := v.Restore(ctx); err != nil { + return errors.Annotatef(err, "An error occurred while restore CreateUserStmt.PasswordOrLockOptions[%d]", i) + } + } + return nil +} + +// Accept implements Node Accept interface. +func (n *CreateUserStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*CreateUserStmt) + return v.Leave(n) +} + +// SecureText implements SensitiveStatement interface. +func (n *CreateUserStmt) SecureText() string { + var buf bytes.Buffer + buf.WriteString("create user") + for _, user := range n.Specs { + buf.WriteString(" ") + buf.WriteString(user.SecurityString()) + } + return buf.String() +} + +// AlterUserStmt modifies user account. +// See https://dev.mysql.com/doc/refman/5.7/en/alter-user.html +type AlterUserStmt struct { + stmtNode + + IfExists bool + CurrentAuth *AuthOption + Specs []*UserSpec + TslOptions []*TslOption + ResourceOptions []*ResourceOption + PasswordOrLockOptions []*PasswordOrLockOption +} + +// Restore implements Node interface. +func (n *AlterUserStmt) Restore(ctx *RestoreCtx) error { + ctx.WriteKeyWord("ALTER USER ") + if n.IfExists { + ctx.WriteKeyWord("IF EXISTS ") + } + if n.CurrentAuth != nil { + ctx.WriteKeyWord("USER") + ctx.WritePlain("() ") + if err := n.CurrentAuth.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore AlterUserStmt.CurrentAuth") + } + } + for i, v := range n.Specs { + if i != 0 { + ctx.WritePlain(", ") + } + if err := v.Restore(ctx); err != nil { + return errors.Annotatef(err, "An error occurred while restore AlterUserStmt.Specs[%d]", i) + } + } + + tslOptionLen := len(n.TslOptions) + + if tslOptionLen != 0 { + ctx.WriteKeyWord(" REQUIRE ") + } + + // Restore `tslOptions` reversely to keep order the same with original sql + for i := tslOptionLen; i > 0; i-- { + if i != tslOptionLen { + ctx.WriteKeyWord(" AND ") + } + if err := n.TslOptions[i-1].Restore(ctx); err != nil { + return errors.Annotatef(err, "An error occurred while restore AlterUserStmt.TslOptions[%d]", i) + } + } + + if len(n.ResourceOptions) != 0 { + ctx.WriteKeyWord(" WITH") + } + + for i, v := range n.ResourceOptions { + ctx.WritePlain(" ") + if err := v.Restore(ctx); err != nil { + return errors.Annotatef(err, "An error occurred while restore AlterUserStmt.ResourceOptions[%d]", i) + } + } + + for i, v := range n.PasswordOrLockOptions { + ctx.WritePlain(" ") + if err := v.Restore(ctx); err != nil { + return errors.Annotatef(err, "An error occurred while restore AlterUserStmt.PasswordOrLockOptions[%d]", i) + } + } + return nil +} + +// SecureText implements SensitiveStatement interface. +func (n *AlterUserStmt) SecureText() string { + var buf bytes.Buffer + buf.WriteString("alter user") + for _, user := range n.Specs { + buf.WriteString(" ") + buf.WriteString(user.SecurityString()) + } + return buf.String() +} + +// Accept implements Node Accept interface. +func (n *AlterUserStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*AlterUserStmt) + return v.Leave(n) +} + +// DropUserStmt creates user account. +// See http://dev.mysql.com/doc/refman/5.7/en/drop-user.html +type DropUserStmt struct { + stmtNode + + IfExists bool + IsDropRole bool + UserList []*auth.UserIdentity +} + +// Restore implements Node interface. +func (n *DropUserStmt) Restore(ctx *RestoreCtx) error { + if n.IsDropRole { + ctx.WriteKeyWord("DROP ROLE ") + } else { + ctx.WriteKeyWord("DROP USER ") + } + if n.IfExists { + ctx.WriteKeyWord("IF EXISTS ") + } + for i, v := range n.UserList { + if i != 0 { + ctx.WritePlain(", ") + } + if err := v.Restore(ctx); err != nil { + return errors.Annotatef(err, "An error occurred while restore DropUserStmt.UserList[%d]", i) + } + } + return nil +} + +// Accept implements Node Accept interface. +func (n *DropUserStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*DropUserStmt) + return v.Leave(n) +} + +// CreateBindingStmt creates sql binding hint. +type CreateBindingStmt struct { + stmtNode + + GlobalScope bool + OriginSel StmtNode + HintedSel StmtNode +} + +func (n *CreateBindingStmt) Restore(ctx *RestoreCtx) error { + ctx.WriteKeyWord("CREATE ") + if n.GlobalScope { + ctx.WriteKeyWord("GLOBAL ") + } else { + ctx.WriteKeyWord("SESSION ") + } + ctx.WriteKeyWord("BINDING FOR ") + if err := n.OriginSel.Restore(ctx); err != nil { + return errors.Trace(err) + } + ctx.WriteKeyWord(" USING ") + if err := n.HintedSel.Restore(ctx); err != nil { + return errors.Trace(err) + } + return nil +} + +func (n *CreateBindingStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*CreateBindingStmt) + selnode, ok := n.OriginSel.Accept(v) + if !ok { + return n, false + } + n.OriginSel = selnode.(*SelectStmt) + hintedSelnode, ok := n.HintedSel.Accept(v) + if !ok { + return n, false + } + n.HintedSel = hintedSelnode.(*SelectStmt) + return v.Leave(n) +} + +// DropBindingStmt deletes sql binding hint. +type DropBindingStmt struct { + stmtNode + + GlobalScope bool + OriginSel StmtNode +} + +func (n *DropBindingStmt) Restore(ctx *RestoreCtx) error { + return errors.New("Not implemented") +} + +func (n *DropBindingStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*DropBindingStmt) + selnode, ok := n.OriginSel.Accept(v) + if !ok { + return n, false + } + n.OriginSel = selnode.(*SelectStmt) + return v.Leave(n) +} + +// DoStmt is the struct for DO statement. +type DoStmt struct { + stmtNode + + Exprs []ExprNode +} + +// Restore implements Node interface. +func (n *DoStmt) Restore(ctx *RestoreCtx) error { + ctx.WriteKeyWord("DO ") + for i, v := range n.Exprs { + if i != 0 { + ctx.WritePlain(", ") + } + if err := v.Restore(ctx); err != nil { + return errors.Annotatef(err, "An error occurred while restore DoStmt.Exprs[%d]", i) + } + } + return nil +} + +// Accept implements Node Accept interface. +func (n *DoStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*DoStmt) + for i, val := range n.Exprs { + node, ok := val.Accept(v) + if !ok { + return n, false + } + n.Exprs[i] = node.(ExprNode) + } + return v.Leave(n) +} + +// AdminStmtType is the type for admin statement. +type AdminStmtType int + +// Admin statement types. +const ( + AdminShowDDL = iota + 1 + AdminCheckTable + AdminShowDDLJobs + AdminCancelDDLJobs + AdminCheckIndex + AdminRecoverIndex + AdminCleanupIndex + AdminCheckIndexRange + AdminShowDDLJobQueries + AdminChecksumTable + AdminShowSlow + AdminShowNextRowID + AdminReloadExprPushdownBlacklist + AdminReloadOptRuleBlacklist + AdminPluginDisable + AdminPluginEnable +) + +// HandleRange represents a range where handle value >= Begin and < End. +type HandleRange struct { + Begin int64 + End int64 +} + +// ShowSlowType defines the type for SlowSlow statement. +type ShowSlowType int + +const ( + // ShowSlowTop is a ShowSlowType constant. + ShowSlowTop ShowSlowType = iota + // ShowSlowRecent is a ShowSlowType constant. + ShowSlowRecent +) + +// ShowSlowKind defines the kind for SlowSlow statement when the type is ShowSlowTop. +type ShowSlowKind int + +const ( + // ShowSlowKindDefault is a ShowSlowKind constant. + ShowSlowKindDefault ShowSlowKind = iota + // ShowSlowKindInternal is a ShowSlowKind constant. + ShowSlowKindInternal + // ShowSlowKindAll is a ShowSlowKind constant. + ShowSlowKindAll +) + +// ShowSlow is used for the following command: +// admin show slow top [ internal | all] N +// admin show slow recent N +type ShowSlow struct { + Tp ShowSlowType + Count uint64 + Kind ShowSlowKind +} + +// Restore implements Node interface. +func (n *ShowSlow) Restore(ctx *RestoreCtx) error { + switch n.Tp { + case ShowSlowRecent: + ctx.WriteKeyWord("RECENT ") + case ShowSlowTop: + ctx.WriteKeyWord("TOP ") + switch n.Kind { + case ShowSlowKindDefault: + // do nothing + case ShowSlowKindInternal: + ctx.WriteKeyWord("INTERNAL ") + case ShowSlowKindAll: + ctx.WriteKeyWord("ALL ") + default: + return errors.New("Unsupported kind of ShowSlowTop") + } + default: + return errors.New("Unsupported type of ShowSlow") + } + ctx.WritePlainf("%d", n.Count) + return nil +} + +// AdminStmt is the struct for Admin statement. +type AdminStmt struct { + stmtNode + + Tp AdminStmtType + Index string + Tables []*TableName + JobIDs []int64 + JobNumber int64 + + HandleRanges []HandleRange + ShowSlow *ShowSlow + Plugins []string +} + +// Restore implements Node interface. +func (n *AdminStmt) Restore(ctx *RestoreCtx) error { + restoreTables := func() error { + for i, v := range n.Tables { + if i != 0 { + ctx.WritePlain(", ") + } + if err := v.Restore(ctx); err != nil { + return errors.Annotatef(err, "An error occurred while restore AdminStmt.Tables[%d]", i) + } + } + return nil + } + restoreJobIDs := func() { + for i, v := range n.JobIDs { + if i != 0 { + ctx.WritePlain(", ") + } + ctx.WritePlainf("%d", v) + } + } + + ctx.WriteKeyWord("ADMIN ") + switch n.Tp { + case AdminShowDDL: + ctx.WriteKeyWord("SHOW DDL") + case AdminShowDDLJobs: + ctx.WriteKeyWord("SHOW DDL JOBS") + if n.JobNumber != 0 { + ctx.WritePlainf(" %d", n.JobNumber) + } + case AdminShowNextRowID: + ctx.WriteKeyWord("SHOW ") + if err := restoreTables(); err != nil { + return err + } + ctx.WriteKeyWord(" NEXT_ROW_ID") + case AdminCheckTable: + ctx.WriteKeyWord("CHECK TABLE ") + if err := restoreTables(); err != nil { + return err + } + case AdminCheckIndex: + ctx.WriteKeyWord("CHECK INDEX ") + if err := restoreTables(); err != nil { + return err + } + ctx.WritePlainf(" %s", n.Index) + case AdminRecoverIndex: + ctx.WriteKeyWord("RECOVER INDEX ") + if err := restoreTables(); err != nil { + return err + } + ctx.WritePlainf(" %s", n.Index) + case AdminCleanupIndex: + ctx.WriteKeyWord("CLEANUP INDEX ") + if err := restoreTables(); err != nil { + return err + } + ctx.WritePlainf(" %s", n.Index) + case AdminCheckIndexRange: + ctx.WriteKeyWord("CHECK INDEX ") + if err := restoreTables(); err != nil { + return err + } + ctx.WritePlainf(" %s", n.Index) + if n.HandleRanges != nil { + ctx.WritePlain(" ") + for i, v := range n.HandleRanges { + if i != 0 { + ctx.WritePlain(", ") + } + ctx.WritePlainf("(%d,%d)", v.Begin, v.End) + } + } + case AdminChecksumTable: + ctx.WriteKeyWord("CHECKSUM TABLE ") + if err := restoreTables(); err != nil { + return err + } + case AdminCancelDDLJobs: + ctx.WriteKeyWord("CANCEL DDL JOBS ") + restoreJobIDs() + case AdminShowDDLJobQueries: + ctx.WriteKeyWord("SHOW DDL JOB QUERIES ") + restoreJobIDs() + case AdminShowSlow: + ctx.WriteKeyWord("SHOW SLOW ") + if err := n.ShowSlow.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore AdminStmt.ShowSlow") + } + case AdminReloadExprPushdownBlacklist: + ctx.WriteKeyWord("RELOAD EXPR_PUSHDOWN_BLACKLIST") + case AdminReloadOptRuleBlacklist: + ctx.WriteKeyWord("RELOAD OPT_RULE_BLACKLIST") + case AdminPluginEnable: + ctx.WriteKeyWord("PLUGINS ENABLE") + for i, v := range n.Plugins { + if i == 0 { + ctx.WritePlain(" ") + } else { + ctx.WritePlain(", ") + } + ctx.WritePlain(v) + } + case AdminPluginDisable: + ctx.WriteKeyWord("PLUGINS DISABLE") + for i, v := range n.Plugins { + if i == 0 { + ctx.WritePlain(" ") + } else { + ctx.WritePlain(", ") + } + ctx.WritePlain(v) + } + default: + return errors.New("Unsupported AdminStmt type") + } + return nil +} + +// Accept implements Node Accept interface. +func (n *AdminStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + + n = newNode.(*AdminStmt) + for i, val := range n.Tables { + node, ok := val.Accept(v) + if !ok { + return n, false + } + n.Tables[i] = node.(*TableName) + } + + return v.Leave(n) +} + +// PrivElem is the privilege type and optional column list. +type PrivElem struct { + node + + Priv mysql.PrivilegeType + Cols []*ColumnName +} + +// Restore implements Node interface. +func (n *PrivElem) Restore(ctx *RestoreCtx) error { + if n.Priv == 0 { + ctx.WritePlain("/* UNSUPPORTED TYPE */") + } else if n.Priv == mysql.AllPriv { + ctx.WriteKeyWord("ALL") + } else { + str, ok := mysql.Priv2Str[n.Priv] + if ok { + ctx.WriteKeyWord(str) + } else { + return errors.New("Undefined privilege type") + } + } + if n.Cols != nil { + ctx.WritePlain(" (") + for i, v := range n.Cols { + if i != 0 { + ctx.WritePlain(",") + } + if err := v.Restore(ctx); err != nil { + return errors.Annotatef(err, "An error occurred while restore PrivElem.Cols[%d]", i) + } + } + ctx.WritePlain(")") + } + return nil +} + +// Accept implements Node Accept interface. +func (n *PrivElem) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*PrivElem) + for i, val := range n.Cols { + node, ok := val.Accept(v) + if !ok { + return n, false + } + n.Cols[i] = node.(*ColumnName) + } + return v.Leave(n) +} + +// ObjectTypeType is the type for object type. +type ObjectTypeType int + +const ( + // ObjectTypeNone is for empty object type. + ObjectTypeNone ObjectTypeType = iota + 1 + // ObjectTypeTable means the following object is a table. + ObjectTypeTable +) + +// Restore implements Node interface. +func (n ObjectTypeType) Restore(ctx *RestoreCtx) error { + switch n { + case ObjectTypeNone: + // do nothing + case ObjectTypeTable: + ctx.WriteKeyWord("TABLE") + default: + return errors.New("Unsupported object type") + } + return nil +} + +// GrantLevelType is the type for grant level. +type GrantLevelType int + +const ( + // GrantLevelNone is the dummy const for default value. + GrantLevelNone GrantLevelType = iota + 1 + // GrantLevelGlobal means the privileges are administrative or apply to all databases on a given server. + GrantLevelGlobal + // GrantLevelDB means the privileges apply to all objects in a given database. + GrantLevelDB + // GrantLevelTable means the privileges apply to all columns in a given table. + GrantLevelTable +) + +// GrantLevel is used for store the privilege scope. +type GrantLevel struct { + Level GrantLevelType + DBName string + TableName string +} + +// Restore implements Node interface. +func (n *GrantLevel) Restore(ctx *RestoreCtx) error { + switch n.Level { + case GrantLevelDB: + if n.DBName == "" { + ctx.WritePlain("*") + } else { + ctx.WriteName(n.DBName) + ctx.WritePlain(".*") + } + case GrantLevelGlobal: + ctx.WritePlain("*.*") + case GrantLevelTable: + if n.DBName != "" { + ctx.WriteName(n.DBName) + ctx.WritePlain(".") + } + ctx.WriteName(n.TableName) + } + return nil +} + +// RevokeStmt is the struct for REVOKE statement. +type RevokeStmt struct { + stmtNode + + Privs []*PrivElem + ObjectType ObjectTypeType + Level *GrantLevel + Users []*UserSpec +} + +// Restore implements Node interface. +func (n *RevokeStmt) Restore(ctx *RestoreCtx) error { + ctx.WriteKeyWord("REVOKE ") + for i, v := range n.Privs { + if i != 0 { + ctx.WritePlain(", ") + } + if err := v.Restore(ctx); err != nil { + return errors.Annotatef(err, "An error occurred while restore RevokeStmt.Privs[%d]", i) + } + } + ctx.WriteKeyWord(" ON ") + if n.ObjectType != ObjectTypeNone { + if err := n.ObjectType.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore RevokeStmt.ObjectType") + } + ctx.WritePlain(" ") + } + if err := n.Level.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore RevokeStmt.Level") + } + ctx.WriteKeyWord(" FROM ") + for i, v := range n.Users { + if i != 0 { + ctx.WritePlain(", ") + } + if err := v.Restore(ctx); err != nil { + return errors.Annotatef(err, "An error occurred while restore RevokeStmt.Users[%d]", i) + } + } + return nil +} + +// Accept implements Node Accept interface. +func (n *RevokeStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*RevokeStmt) + for i, val := range n.Privs { + node, ok := val.Accept(v) + if !ok { + return n, false + } + n.Privs[i] = node.(*PrivElem) + } + return v.Leave(n) +} + +// RevokeStmt is the struct for REVOKE statement. +type RevokeRoleStmt struct { + stmtNode + + Roles []*auth.RoleIdentity + Users []*auth.UserIdentity +} + +// Restore implements Node interface. +func (n *RevokeRoleStmt) Restore(ctx *RestoreCtx) error { + ctx.WriteKeyWord("REVOKE ") + for i, role := range n.Roles { + if i != 0 { + ctx.WritePlain(", ") + } + if err := role.Restore(ctx); err != nil { + return errors.Annotatef(err, "An error occurred while restore RevokeRoleStmt.Roles[%d]", i) + } + } + ctx.WriteKeyWord(" FROM ") + for i, v := range n.Users { + if i != 0 { + ctx.WritePlain(", ") + } + if err := v.Restore(ctx); err != nil { + return errors.Annotatef(err, "An error occurred while restore RevokeRoleStmt.Users[%d]", i) + } + } + return nil +} + +// Accept implements Node Accept interface. +func (n *RevokeRoleStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*RevokeRoleStmt) + return v.Leave(n) +} + +// GrantStmt is the struct for GRANT statement. +type GrantStmt struct { + stmtNode + + Privs []*PrivElem + ObjectType ObjectTypeType + Level *GrantLevel + Users []*UserSpec + WithGrant bool +} + +// Restore implements Node interface. +func (n *GrantStmt) Restore(ctx *RestoreCtx) error { + ctx.WriteKeyWord("GRANT ") + for i, v := range n.Privs { + if i != 0 && v.Priv != 0 { + ctx.WritePlain(", ") + } else if v.Priv == 0 { + ctx.WritePlain(" ") + } + if err := v.Restore(ctx); err != nil { + return errors.Annotatef(err, "An error occurred while restore GrantStmt.Privs[%d]", i) + } + } + ctx.WriteKeyWord(" ON ") + if n.ObjectType != ObjectTypeNone { + if err := n.ObjectType.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore GrantStmt.ObjectType") + } + ctx.WritePlain(" ") + } + if err := n.Level.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while restore GrantStmt.Level") + } + ctx.WriteKeyWord(" TO ") + for i, v := range n.Users { + if i != 0 { + ctx.WritePlain(", ") + } + if err := v.Restore(ctx); err != nil { + return errors.Annotatef(err, "An error occurred while restore GrantStmt.Users[%d]", i) + } + } + if n.WithGrant { + ctx.WriteKeyWord(" WITH GRANT OPTION") + } + return nil +} + +// SecureText implements SensitiveStatement interface. +func (n *GrantStmt) SecureText() string { + text := n.text + // Filter "identified by xxx" because it would expose password information. + idx := strings.Index(strings.ToLower(text), "identified") + if idx > 0 { + text = text[:idx] + } + return text +} + +// Accept implements Node Accept interface. +func (n *GrantStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*GrantStmt) + for i, val := range n.Privs { + node, ok := val.Accept(v) + if !ok { + return n, false + } + n.Privs[i] = node.(*PrivElem) + } + return v.Leave(n) +} + +// GrantRoleStmt is the struct for GRANT TO statement. +type GrantRoleStmt struct { + stmtNode + + Roles []*auth.RoleIdentity + Users []*auth.UserIdentity +} + +// Accept implements Node Accept interface. +func (n *GrantRoleStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*GrantRoleStmt) + return v.Leave(n) +} + +// Restore implements Node interface. +func (n *GrantRoleStmt) Restore(ctx *RestoreCtx) error { + ctx.WriteKeyWord("GRANT ") + if len(n.Roles) > 0 { + for i, role := range n.Roles { + if i != 0 { + ctx.WritePlain(", ") + } + if err := role.Restore(ctx); err != nil { + return errors.Annotatef(err, "An error occurred while restore GrantRoleStmt.Roles[%d]", i) + } + } + } + ctx.WriteKeyWord(" TO ") + for i, v := range n.Users { + if i != 0 { + ctx.WritePlain(", ") + } + if err := v.Restore(ctx); err != nil { + return errors.Annotatef(err, "An error occurred while restore GrantStmt.Users[%d]", i) + } + } + return nil +} + +// SecureText implements SensitiveStatement interface. +func (n *GrantRoleStmt) SecureText() string { + text := n.text + // Filter "identified by xxx" because it would expose password information. + idx := strings.Index(strings.ToLower(text), "identified") + if idx > 0 { + text = text[:idx] + } + return text +} + +// Ident is the table identifier composed of schema name and table name. +type Ident struct { + Schema model.CIStr + Name model.CIStr +} + +// String implements fmt.Stringer interface. +func (i Ident) String() string { + if i.Schema.O == "" { + return i.Name.O + } + return fmt.Sprintf("%s.%s", i.Schema, i.Name) +} + +// SelectStmtOpts wrap around select hints and switches +type SelectStmtOpts struct { + Distinct bool + SQLBigResult bool + SQLBufferResult bool + SQLCache bool + SQLSmallResult bool + CalcFoundRows bool + StraightJoin bool + Priority mysql.PriorityEnum + TableHints []*TableOptimizerHint +} + +// TableOptimizerHint is Table level optimizer hint +type TableOptimizerHint struct { + node + // HintName is the name or alias of the table(s) which the hint will affect. + // Table hints has no schema info + // It allows only table name or alias (if table has an alias) + HintName model.CIStr + // QBName is the default effective query block of this hint. + QBName model.CIStr + Tables []HintTable + Indexes []model.CIStr + StoreType model.CIStr + // Statement Execution Time Optimizer Hints + // See https://dev.mysql.com/doc/refman/5.7/en/optimizer-hints.html#optimizer-hints-execution-time + MaxExecutionTime uint64 + MemoryQuota int64 + QueryType model.CIStr + HintFlag bool +} + +// HintTable is table in the hint. It may have query block info. +type HintTable struct { + TableName model.CIStr + QBName model.CIStr +} + +func (ht *HintTable) Restore(ctx *RestoreCtx) { + ctx.WriteName(ht.TableName.String()) + if ht.QBName.L != "" { + ctx.WriteKeyWord("@") + ctx.WriteName(ht.QBName.String()) + } +} + +// Restore implements Node interface. +func (n *TableOptimizerHint) Restore(ctx *RestoreCtx) error { + ctx.WriteKeyWord(n.HintName.String()) + ctx.WritePlain("(") + if n.QBName.L != "" { + if n.HintName.L != "qb_name" { + ctx.WriteKeyWord("@") + } + ctx.WriteName(n.QBName.String()) + } + // Hints without args except query block. + switch n.HintName.L { + case "hash_agg", "stream_agg", "agg_to_cop", "read_consistent_replica", "no_index_merge", "qb_name": + ctx.WritePlain(")") + return nil + } + if n.QBName.L != "" { + ctx.WritePlain(" ") + } + // Hints with args except query block. + switch n.HintName.L { + case "max_execution_time": + ctx.WritePlainf("%d", n.MaxExecutionTime) + case "tidb_hj", "tidb_smj", "tidb_inlj", "hash_join", "sm_join", "inl_join": + for i, table := range n.Tables { + if i != 0 { + ctx.WritePlain(", ") + } + table.Restore(ctx) + } + case "index", "use_index_merge": + n.Tables[0].Restore(ctx) + ctx.WritePlain(" ") + for i, index := range n.Indexes { + if i != 0 { + ctx.WritePlain(", ") + } + ctx.WriteName(index.String()) + } + case "use_toja", "enable_plan_cache": + if n.HintFlag { + ctx.WritePlain("TRUE") + } else { + ctx.WritePlain("FALSE") + } + case "query_type": + ctx.WriteKeyWord(n.QueryType.String()) + case "memory_quota": + ctx.WritePlainf("%d MB", n.MemoryQuota/1024/1024) + case "read_from_storage": + ctx.WriteKeyWord(n.StoreType.String()) + for i, table := range n.Tables { + if i == 0 { + ctx.WritePlain("[") + } + table.Restore(ctx) + if i == len(n.Tables)-1 { + ctx.WritePlain("]") + } else { + ctx.WritePlain(", ") + } + } + } + ctx.WritePlain(")") + return nil +} + +// Accept implements Node Accept interface. +func (n *TableOptimizerHint) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*TableOptimizerHint) + return v.Leave(n) +} + +type BinaryLiteral interface { + ToString() string +} + +// NewDecimal creates a types.Decimal value, it's provided by parser driver. +var NewDecimal func(string) (interface{}, error) + +// NewHexLiteral creates a types.HexLiteral value, it's provided by parser driver. +var NewHexLiteral func(string) (interface{}, error) + +// NewBitLiteral creates a types.BitLiteral value, it's provided by parser driver. +var NewBitLiteral func(string) (interface{}, error) diff --git a/vendor/github.com/pingcap/parser/ast/stats.go b/vendor/github.com/pingcap/parser/ast/stats.go new file mode 100755 index 0000000..44cebd6 --- /dev/null +++ b/vendor/github.com/pingcap/parser/ast/stats.go @@ -0,0 +1,188 @@ +// Copyright 2017 PingCAP, Inc. +// +// 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package ast + +import ( + "github.com/pingcap/errors" + . "github.com/pingcap/parser/format" + "github.com/pingcap/parser/model" +) + +var ( + _ StmtNode = &AnalyzeTableStmt{} + _ StmtNode = &DropStatsStmt{} + _ StmtNode = &LoadStatsStmt{} +) + +// AnalyzeTableStmt is used to create table statistics. +type AnalyzeTableStmt struct { + stmtNode + + TableNames []*TableName + PartitionNames []model.CIStr + IndexNames []model.CIStr + AnalyzeOpts []AnalyzeOpt + + // IndexFlag is true when we only analyze indices for a table. + IndexFlag bool + Incremental bool +} + +// AnalyzeOptType is the type for analyze options. +type AnalyzeOptionType int + +// Analyze option types. +const ( + AnalyzeOptNumBuckets = iota + AnalyzeOptNumTopN + AnalyzeOptCMSketchDepth + AnalyzeOptCMSketchWidth + AnalyzeOptNumSamples +) + +// AnalyzeOptionString stores the string form of analyze options. +var AnalyzeOptionString = map[AnalyzeOptionType]string{ + AnalyzeOptNumBuckets: "BUCKETS", + AnalyzeOptNumTopN: "TOPN", + AnalyzeOptCMSketchWidth: "CMSKETCH WIDTH", + AnalyzeOptCMSketchDepth: "CMSKETCH DEPTH", + AnalyzeOptNumSamples: "SAMPLES", +} + +// AnalyzeOpt stores the analyze option type and value. +type AnalyzeOpt struct { + Type AnalyzeOptionType + Value uint64 +} + +// Restore implements Node interface. +func (n *AnalyzeTableStmt) Restore(ctx *RestoreCtx) error { + if n.Incremental { + ctx.WriteKeyWord("ANALYZE INCREMENTAL TABLE ") + } else { + ctx.WriteKeyWord("ANALYZE TABLE ") + } + for i, table := range n.TableNames { + if i != 0 { + ctx.WritePlain(",") + } + if err := table.Restore(ctx); err != nil { + return errors.Annotatef(err, "An error occurred while restore AnalyzeTableStmt.TableNames[%d]", i) + } + } + if len(n.PartitionNames) != 0 { + ctx.WriteKeyWord(" PARTITION ") + } + for i, partition := range n.PartitionNames { + if i != 0 { + ctx.WritePlain(",") + } + ctx.WriteName(partition.O) + } + if n.IndexFlag { + ctx.WriteKeyWord(" INDEX") + } + for i, index := range n.IndexNames { + if i != 0 { + ctx.WritePlain(",") + } else { + ctx.WritePlain(" ") + } + ctx.WriteName(index.O) + } + if len(n.AnalyzeOpts) != 0 { + ctx.WriteKeyWord(" WITH") + for i, opt := range n.AnalyzeOpts { + if i != 0 { + ctx.WritePlain(",") + } + ctx.WritePlainf(" %d ", opt.Value) + ctx.WritePlain(AnalyzeOptionString[opt.Type]) + } + } + return nil +} + +// Accept implements Node Accept interface. +func (n *AnalyzeTableStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*AnalyzeTableStmt) + for i, val := range n.TableNames { + node, ok := val.Accept(v) + if !ok { + return n, false + } + n.TableNames[i] = node.(*TableName) + } + return v.Leave(n) +} + +// DropStatsStmt is used to drop table statistics. +type DropStatsStmt struct { + stmtNode + + Table *TableName +} + +// Restore implements Node interface. +func (n *DropStatsStmt) Restore(ctx *RestoreCtx) error { + ctx.WriteKeyWord("DROP STATS ") + if err := n.Table.Restore(ctx); err != nil { + return errors.Annotate(err, "An error occurred while add table") + } + + return nil +} + +// Accept implements Node Accept interface. +func (n *DropStatsStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*DropStatsStmt) + node, ok := n.Table.Accept(v) + if !ok { + return n, false + } + n.Table = node.(*TableName) + return v.Leave(n) +} + +// LoadStatsStmt is the statement node for loading statistic. +type LoadStatsStmt struct { + stmtNode + + Path string +} + +// Restore implements Node interface. +func (n *LoadStatsStmt) Restore(ctx *RestoreCtx) error { + ctx.WriteKeyWord("LOAD STATS ") + ctx.WriteString(n.Path) + return nil +} + +// Accept implements Node Accept interface. +func (n *LoadStatsStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*LoadStatsStmt) + return v.Leave(n) +} diff --git a/vendor/github.com/pingcap/parser/ast/util.go b/vendor/github.com/pingcap/parser/ast/util.go new file mode 100755 index 0000000..30e1c3b --- /dev/null +++ b/vendor/github.com/pingcap/parser/ast/util.go @@ -0,0 +1,63 @@ +// Copyright 2018 PingCAP, Inc. +// +// 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package ast + +// IsReadOnly checks whether the input ast is readOnly. +func IsReadOnly(node Node) bool { + switch st := node.(type) { + case *SelectStmt: + if st.LockTp == SelectLockForUpdate { + return false + } + + checker := readOnlyChecker{ + readOnly: true, + } + + node.Accept(&checker) + return checker.readOnly + case *ExplainStmt: + return !st.Analyze || IsReadOnly(st.Stmt) + case *DoStmt: + return true + default: + return false + } +} + +// readOnlyChecker checks whether a query's ast is readonly, if it satisfied +// 1. selectstmt; +// 2. need not to set var; +// it is readonly statement. +type readOnlyChecker struct { + readOnly bool +} + +// Enter implements Visitor interface. +func (checker *readOnlyChecker) Enter(in Node) (out Node, skipChildren bool) { + switch node := in.(type) { + case *VariableExpr: + // like func rewriteVariable(), this stands for SetVar. + if !node.IsSystem && node.Value != nil { + checker.readOnly = false + return in, true + } + } + return in, false +} + +// Leave implements Visitor interface. +func (checker *readOnlyChecker) Leave(in Node) (out Node, ok bool) { + return in, checker.readOnly +} diff --git a/vendor/github.com/pingcap/parser/auth/auth.go b/vendor/github.com/pingcap/parser/auth/auth.go new file mode 100644 index 0000000..d8d805e --- /dev/null +++ b/vendor/github.com/pingcap/parser/auth/auth.go @@ -0,0 +1,141 @@ +// Copyright 2015 PingCAP, Inc. +// +// 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package auth + +import ( + "bytes" + "crypto/sha1" + "encoding/hex" + "fmt" + + "github.com/pingcap/errors" + . "github.com/pingcap/parser/format" + "github.com/pingcap/parser/terror" +) + +// UserIdentity represents username and hostname. +type UserIdentity struct { + Username string + Hostname string + CurrentUser bool + AuthUsername string // Username matched in privileges system + AuthHostname string // Match in privs system (i.e. could be a wildcard) +} + +// Restore implements Node interface. +func (user *UserIdentity) Restore(ctx *RestoreCtx) error { + if user.CurrentUser { + ctx.WriteKeyWord("CURRENT_USER") + } else { + ctx.WriteName(user.Username) + if user.Hostname != "" { + ctx.WritePlain("@") + ctx.WriteName(user.Hostname) + } + } + return nil +} + +// String converts UserIdentity to the format user@host. +func (user *UserIdentity) String() string { + // TODO: Escape username and hostname. + if user == nil { + return "" + } + return fmt.Sprintf("%s@%s", user.Username, user.Hostname) +} + +// AuthIdentityString returns matched identity in user@host format +func (user *UserIdentity) AuthIdentityString() string { + // TODO: Escape username and hostname. + return fmt.Sprintf("%s@%s", user.AuthUsername, user.AuthHostname) +} + +type RoleIdentity struct { + Username string + Hostname string +} + +func (role *RoleIdentity) Restore(ctx *RestoreCtx) error { + ctx.WriteName(role.Username) + if role.Hostname != "" { + ctx.WritePlain("@") + ctx.WriteName(role.Hostname) + } + return nil +} + +// String converts UserIdentity to the format user@host. +func (role *RoleIdentity) String() string { + // TODO: Escape username and hostname. + return fmt.Sprintf("`%s`@`%s`", role.Username, role.Hostname) +} + +// CheckScrambledPassword check scrambled password received from client. +// The new authentication is performed in following manner: +// SERVER: public_seed=create_random_string() +// send(public_seed) +// CLIENT: recv(public_seed) +// hash_stage1=sha1("password") +// hash_stage2=sha1(hash_stage1) +// reply=xor(hash_stage1, sha1(public_seed,hash_stage2) +// // this three steps are done in scramble() +// send(reply) +// SERVER: recv(reply) +// hash_stage1=xor(reply, sha1(public_seed,hash_stage2)) +// candidate_hash2=sha1(hash_stage1) +// check(candidate_hash2==hash_stage2) +// // this three steps are done in check_scramble() +func CheckScrambledPassword(salt, hpwd, auth []byte) bool { + crypt := sha1.New() + _, err := crypt.Write(salt) + terror.Log(errors.Trace(err)) + _, err = crypt.Write(hpwd) + terror.Log(errors.Trace(err)) + hash := crypt.Sum(nil) + // token = scrambleHash XOR stage1Hash + for i := range hash { + hash[i] ^= auth[i] + } + + return bytes.Equal(hpwd, Sha1Hash(hash)) +} + +// Sha1Hash is an util function to calculate sha1 hash. +func Sha1Hash(bs []byte) []byte { + crypt := sha1.New() + _, err := crypt.Write(bs) + terror.Log(errors.Trace(err)) + return crypt.Sum(nil) +} + +// EncodePassword converts plaintext password to hashed hex string. +func EncodePassword(pwd string) string { + if len(pwd) == 0 { + return "" + } + hash1 := Sha1Hash([]byte(pwd)) + hash2 := Sha1Hash(hash1) + + return fmt.Sprintf("*%X", hash2) +} + +// DecodePassword converts hex string password without prefix '*' to byte array. +func DecodePassword(pwd string) ([]byte, error) { + x, err := hex.DecodeString(pwd[1:]) + if err != nil { + return nil, errors.Trace(err) + } + return x, nil +} diff --git a/vendor/github.com/pingcap/parser/charset/charset.go b/vendor/github.com/pingcap/parser/charset/charset.go new file mode 100644 index 0000000..aa2c980 --- /dev/null +++ b/vendor/github.com/pingcap/parser/charset/charset.go @@ -0,0 +1,463 @@ +// Copyright 2015 PingCAP, Inc. +// +// 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package charset + +import ( + "strings" + + "github.com/pingcap/errors" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/terror" +) + +const ( + codeCollationCharsetMismatch = terror.ErrCode(mysql.ErrCollationCharsetMismatch) + codeUnknownCollation = terror.ErrCode(mysql.ErrUnknownCollation) +) + +var ( + ErrUnknownCollation = terror.ClassDDL.New(codeUnknownCollation, mysql.MySQLErrName[mysql.ErrUnknownCollation]) + ErrCollationCharsetMismatch = terror.ClassDDL.New(codeCollationCharsetMismatch, mysql.MySQLErrName[mysql.ErrCollationCharsetMismatch]) +) + +// Charset is a charset. +// Now we only support MySQL. +type Charset struct { + Name string + DefaultCollation string + Collations map[string]*Collation + Desc string + Maxlen int +} + +// Collation is a collation. +// Now we only support MySQL. +type Collation struct { + ID int + CharsetName string + Name string + IsDefault bool +} + +var charsets = make(map[string]*Charset) +var collationsIDMap = make(map[int]*Collation) +var collationsNameMap = make(map[string]*Collation) +var descs = make([]*Desc, 0, len(charsetInfos)) +var supportedCollations = make([]*Collation, 0, len(supportedCollationNames)) + +// All the supported charsets should be in the following table. +var charsetInfos = []*Charset{ + {CharsetUTF8, CollationUTF8, make(map[string]*Collation), "UTF-8 Unicode", 3}, + {CharsetUTF8MB4, CollationUTF8MB4, make(map[string]*Collation), "UTF-8 Unicode", 4}, + {CharsetASCII, CollationASCII, make(map[string]*Collation), "US ASCII", 1}, + {CharsetLatin1, CollationLatin1, make(map[string]*Collation), "Latin1", 1}, + {CharsetBin, CollationBin, make(map[string]*Collation), "binary", 1}, +} + +// All the names supported collations should be in the following table. +var supportedCollationNames = map[string]struct{}{ + CollationUTF8: {}, + CollationUTF8MB4: {}, + CollationASCII: {}, + CollationLatin1: {}, + CollationBin: {}, +} + +// Desc is a charset description. +type Desc struct { + Name string + Desc string + DefaultCollation string + Maxlen int +} + +// GetSupportedCharsets gets descriptions for all charsets supported so far. +func GetSupportedCharsets() []*Desc { + return descs +} + +// GetSupportedCollations gets information for all collations supported so far. +func GetSupportedCollations() []*Collation { + return supportedCollations +} + +// ValidCharsetAndCollation checks the charset and the collation validity +// and returns a boolean. +func ValidCharsetAndCollation(cs string, co string) bool { + // We will use utf8 as a default charset. + if cs == "" { + cs = "utf8" + } + cs = strings.ToLower(cs) + c, ok := charsets[cs] + if !ok { + return false + } + + if co == "" { + return true + } + co = strings.ToLower(co) + _, ok = c.Collations[co] + if !ok { + return false + } + + return true +} + +// GetDefaultCollation returns the default collation for charset. +func GetDefaultCollation(charset string) (string, error) { + charset = strings.ToLower(charset) + if charset == CharsetBin { + return CollationBin, nil + } + c, ok := charsets[charset] + if !ok { + return "", errors.Errorf("Unknown charset %s", charset) + } + return c.DefaultCollation, nil +} + +// GetDefaultCharsetAndCollate returns the default charset and collation. +func GetDefaultCharsetAndCollate() (string, string) { + return mysql.DefaultCharset, mysql.DefaultCollationName +} + +// GetCharsetInfo returns charset and collation for cs as name. +func GetCharsetInfo(cs string) (string, string, error) { + c, ok := charsets[strings.ToLower(cs)] + if !ok { + return "", "", errors.Errorf("Unknown charset %s", cs) + } + return c.Name, c.DefaultCollation, nil +} + +// GetCharsetDesc gets charset descriptions in the local charsets. +func GetCharsetDesc(cs string) (*Desc, error) { + switch strings.ToLower(cs) { + case CharsetUTF8: + return descs[0], nil + case CharsetUTF8MB4: + return descs[1], nil + case CharsetASCII: + return descs[2], nil + case CharsetLatin1: + return descs[3], nil + case CharsetBin: + return descs[4], nil + default: + return nil, errors.Errorf("Unknown charset %s", cs) + } +} + +// GetCharsetInfoByID returns charset and collation for id as cs_number. +func GetCharsetInfoByID(coID int) (string, string, error) { + if coID == mysql.DefaultCollationID { + return mysql.DefaultCharset, mysql.DefaultCollationName, nil + } + if collation, ok := collationsIDMap[coID]; ok { + return collation.CharsetName, collation.Name, nil + } + return "", "", errors.Errorf("Unknown charset id %d", coID) +} + +// GetCollations returns a list for all collations. +func GetCollations() []*Collation { + return collations +} + +func GetCollationByName(name string) (*Collation, error) { + collation, ok := collationsNameMap[strings.ToLower(name)] + if !ok { + return nil, ErrUnknownCollation.GenWithStackByArgs(name) + } + return collation, nil +} + +const ( + // CharsetBin is used for marking binary charset. + CharsetBin = "binary" + // CollationBin is the default collation for CharsetBin. + CollationBin = "binary" + // CharsetUTF8 is the default charset for string types. + CharsetUTF8 = "utf8" + // CollationUTF8 is the default collation for CharsetUTF8. + CollationUTF8 = "utf8_bin" + // CharsetUTF8MB4 represents 4 bytes utf8, which works the same way as utf8 in Go. + CharsetUTF8MB4 = "utf8mb4" + // CollationUTF8MB4 is the default collation for CharsetUTF8MB4. + CollationUTF8MB4 = "utf8mb4_bin" + // CharsetASCII is a subset of UTF8. + CharsetASCII = "ascii" + // CollationASCII is the default collation for CharsetACSII. + CollationASCII = "ascii_bin" + // CharsetLatin1 is a single byte charset. + CharsetLatin1 = "latin1" + // CollationLatin1 is the default collation for CharsetLatin1. + CollationLatin1 = "latin1_bin" +) + +var collations = []*Collation{ + {1, "big5", "big5_chinese_ci", true}, + {2, "latin2", "latin2_czech_cs", false}, + {3, "dec8", "dec8_swedish_ci", true}, + {4, "cp850", "cp850_general_ci", true}, + {5, "latin1", "latin1_german1_ci", false}, + {6, "hp8", "hp8_english_ci", true}, + {7, "koi8r", "koi8r_general_ci", true}, + {8, "latin1", "latin1_swedish_ci", false}, + {9, "latin2", "latin2_general_ci", true}, + {10, "swe7", "swe7_swedish_ci", true}, + {11, "ascii", "ascii_general_ci", false}, + {12, "ujis", "ujis_japanese_ci", true}, + {13, "sjis", "sjis_japanese_ci", true}, + {14, "cp1251", "cp1251_bulgarian_ci", false}, + {15, "latin1", "latin1_danish_ci", false}, + {16, "hebrew", "hebrew_general_ci", true}, + {18, "tis620", "tis620_thai_ci", true}, + {19, "euckr", "euckr_korean_ci", true}, + {20, "latin7", "latin7_estonian_cs", false}, + {21, "latin2", "latin2_hungarian_ci", false}, + {22, "koi8u", "koi8u_general_ci", true}, + {23, "cp1251", "cp1251_ukrainian_ci", false}, + {24, "gb2312", "gb2312_chinese_ci", true}, + {25, "greek", "greek_general_ci", true}, + {26, "cp1250", "cp1250_general_ci", true}, + {27, "latin2", "latin2_croatian_ci", false}, + {28, "gbk", "gbk_chinese_ci", true}, + {29, "cp1257", "cp1257_lithuanian_ci", false}, + {30, "latin5", "latin5_turkish_ci", true}, + {31, "latin1", "latin1_german2_ci", false}, + {32, "armscii8", "armscii8_general_ci", true}, + {33, "utf8", "utf8_general_ci", false}, + {34, "cp1250", "cp1250_czech_cs", false}, + {35, "ucs2", "ucs2_general_ci", true}, + {36, "cp866", "cp866_general_ci", true}, + {37, "keybcs2", "keybcs2_general_ci", true}, + {38, "macce", "macce_general_ci", true}, + {39, "macroman", "macroman_general_ci", true}, + {40, "cp852", "cp852_general_ci", true}, + {41, "latin7", "latin7_general_ci", true}, + {42, "latin7", "latin7_general_cs", false}, + {43, "macce", "macce_bin", false}, + {44, "cp1250", "cp1250_croatian_ci", false}, + {45, "utf8mb4", "utf8mb4_general_ci", false}, + {46, "utf8mb4", "utf8mb4_bin", true}, + {47, "latin1", "latin1_bin", true}, + {48, "latin1", "latin1_general_ci", false}, + {49, "latin1", "latin1_general_cs", false}, + {50, "cp1251", "cp1251_bin", false}, + {51, "cp1251", "cp1251_general_ci", true}, + {52, "cp1251", "cp1251_general_cs", false}, + {53, "macroman", "macroman_bin", false}, + {54, "utf16", "utf16_general_ci", true}, + {55, "utf16", "utf16_bin", false}, + {56, "utf16le", "utf16le_general_ci", true}, + {57, "cp1256", "cp1256_general_ci", true}, + {58, "cp1257", "cp1257_bin", false}, + {59, "cp1257", "cp1257_general_ci", true}, + {60, "utf32", "utf32_general_ci", true}, + {61, "utf32", "utf32_bin", false}, + {62, "utf16le", "utf16le_bin", false}, + {63, "binary", "binary", true}, + {64, "armscii8", "armscii8_bin", false}, + {65, "ascii", "ascii_bin", true}, + {66, "cp1250", "cp1250_bin", false}, + {67, "cp1256", "cp1256_bin", false}, + {68, "cp866", "cp866_bin", false}, + {69, "dec8", "dec8_bin", false}, + {70, "greek", "greek_bin", false}, + {71, "hebrew", "hebrew_bin", false}, + {72, "hp8", "hp8_bin", false}, + {73, "keybcs2", "keybcs2_bin", false}, + {74, "koi8r", "koi8r_bin", false}, + {75, "koi8u", "koi8u_bin", false}, + {77, "latin2", "latin2_bin", false}, + {78, "latin5", "latin5_bin", false}, + {79, "latin7", "latin7_bin", false}, + {80, "cp850", "cp850_bin", false}, + {81, "cp852", "cp852_bin", false}, + {82, "swe7", "swe7_bin", false}, + {83, "utf8", "utf8_bin", true}, + {84, "big5", "big5_bin", false}, + {85, "euckr", "euckr_bin", false}, + {86, "gb2312", "gb2312_bin", false}, + {87, "gbk", "gbk_bin", false}, + {88, "sjis", "sjis_bin", false}, + {89, "tis620", "tis620_bin", false}, + {90, "ucs2", "ucs2_bin", false}, + {91, "ujis", "ujis_bin", false}, + {92, "geostd8", "geostd8_general_ci", true}, + {93, "geostd8", "geostd8_bin", false}, + {94, "latin1", "latin1_spanish_ci", false}, + {95, "cp932", "cp932_japanese_ci", true}, + {96, "cp932", "cp932_bin", false}, + {97, "eucjpms", "eucjpms_japanese_ci", true}, + {98, "eucjpms", "eucjpms_bin", false}, + {99, "cp1250", "cp1250_polish_ci", false}, + {101, "utf16", "utf16_unicode_ci", false}, + {102, "utf16", "utf16_icelandic_ci", false}, + {103, "utf16", "utf16_latvian_ci", false}, + {104, "utf16", "utf16_romanian_ci", false}, + {105, "utf16", "utf16_slovenian_ci", false}, + {106, "utf16", "utf16_polish_ci", false}, + {107, "utf16", "utf16_estonian_ci", false}, + {108, "utf16", "utf16_spanish_ci", false}, + {109, "utf16", "utf16_swedish_ci", false}, + {110, "utf16", "utf16_turkish_ci", false}, + {111, "utf16", "utf16_czech_ci", false}, + {112, "utf16", "utf16_danish_ci", false}, + {113, "utf16", "utf16_lithuanian_ci", false}, + {114, "utf16", "utf16_slovak_ci", false}, + {115, "utf16", "utf16_spanish2_ci", false}, + {116, "utf16", "utf16_roman_ci", false}, + {117, "utf16", "utf16_persian_ci", false}, + {118, "utf16", "utf16_esperanto_ci", false}, + {119, "utf16", "utf16_hungarian_ci", false}, + {120, "utf16", "utf16_sinhala_ci", false}, + {121, "utf16", "utf16_german2_ci", false}, + {122, "utf16", "utf16_croatian_ci", false}, + {123, "utf16", "utf16_unicode_520_ci", false}, + {124, "utf16", "utf16_vietnamese_ci", false}, + {128, "ucs2", "ucs2_unicode_ci", false}, + {129, "ucs2", "ucs2_icelandic_ci", false}, + {130, "ucs2", "ucs2_latvian_ci", false}, + {131, "ucs2", "ucs2_romanian_ci", false}, + {132, "ucs2", "ucs2_slovenian_ci", false}, + {133, "ucs2", "ucs2_polish_ci", false}, + {134, "ucs2", "ucs2_estonian_ci", false}, + {135, "ucs2", "ucs2_spanish_ci", false}, + {136, "ucs2", "ucs2_swedish_ci", false}, + {137, "ucs2", "ucs2_turkish_ci", false}, + {138, "ucs2", "ucs2_czech_ci", false}, + {139, "ucs2", "ucs2_danish_ci", false}, + {140, "ucs2", "ucs2_lithuanian_ci", false}, + {141, "ucs2", "ucs2_slovak_ci", false}, + {142, "ucs2", "ucs2_spanish2_ci", false}, + {143, "ucs2", "ucs2_roman_ci", false}, + {144, "ucs2", "ucs2_persian_ci", false}, + {145, "ucs2", "ucs2_esperanto_ci", false}, + {146, "ucs2", "ucs2_hungarian_ci", false}, + {147, "ucs2", "ucs2_sinhala_ci", false}, + {148, "ucs2", "ucs2_german2_ci", false}, + {149, "ucs2", "ucs2_croatian_ci", false}, + {150, "ucs2", "ucs2_unicode_520_ci", false}, + {151, "ucs2", "ucs2_vietnamese_ci", false}, + {159, "ucs2", "ucs2_general_mysql500_ci", false}, + {160, "utf32", "utf32_unicode_ci", false}, + {161, "utf32", "utf32_icelandic_ci", false}, + {162, "utf32", "utf32_latvian_ci", false}, + {163, "utf32", "utf32_romanian_ci", false}, + {164, "utf32", "utf32_slovenian_ci", false}, + {165, "utf32", "utf32_polish_ci", false}, + {166, "utf32", "utf32_estonian_ci", false}, + {167, "utf32", "utf32_spanish_ci", false}, + {168, "utf32", "utf32_swedish_ci", false}, + {169, "utf32", "utf32_turkish_ci", false}, + {170, "utf32", "utf32_czech_ci", false}, + {171, "utf32", "utf32_danish_ci", false}, + {172, "utf32", "utf32_lithuanian_ci", false}, + {173, "utf32", "utf32_slovak_ci", false}, + {174, "utf32", "utf32_spanish2_ci", false}, + {175, "utf32", "utf32_roman_ci", false}, + {176, "utf32", "utf32_persian_ci", false}, + {177, "utf32", "utf32_esperanto_ci", false}, + {178, "utf32", "utf32_hungarian_ci", false}, + {179, "utf32", "utf32_sinhala_ci", false}, + {180, "utf32", "utf32_german2_ci", false}, + {181, "utf32", "utf32_croatian_ci", false}, + {182, "utf32", "utf32_unicode_520_ci", false}, + {183, "utf32", "utf32_vietnamese_ci", false}, + {192, "utf8", "utf8_unicode_ci", false}, + {193, "utf8", "utf8_icelandic_ci", false}, + {194, "utf8", "utf8_latvian_ci", false}, + {195, "utf8", "utf8_romanian_ci", false}, + {196, "utf8", "utf8_slovenian_ci", false}, + {197, "utf8", "utf8_polish_ci", false}, + {198, "utf8", "utf8_estonian_ci", false}, + {199, "utf8", "utf8_spanish_ci", false}, + {200, "utf8", "utf8_swedish_ci", false}, + {201, "utf8", "utf8_turkish_ci", false}, + {202, "utf8", "utf8_czech_ci", false}, + {203, "utf8", "utf8_danish_ci", false}, + {204, "utf8", "utf8_lithuanian_ci", false}, + {205, "utf8", "utf8_slovak_ci", false}, + {206, "utf8", "utf8_spanish2_ci", false}, + {207, "utf8", "utf8_roman_ci", false}, + {208, "utf8", "utf8_persian_ci", false}, + {209, "utf8", "utf8_esperanto_ci", false}, + {210, "utf8", "utf8_hungarian_ci", false}, + {211, "utf8", "utf8_sinhala_ci", false}, + {212, "utf8", "utf8_german2_ci", false}, + {213, "utf8", "utf8_croatian_ci", false}, + {214, "utf8", "utf8_unicode_520_ci", false}, + {215, "utf8", "utf8_vietnamese_ci", false}, + {223, "utf8", "utf8_general_mysql500_ci", false}, + {224, "utf8mb4", "utf8mb4_unicode_ci", false}, + {225, "utf8mb4", "utf8mb4_icelandic_ci", false}, + {226, "utf8mb4", "utf8mb4_latvian_ci", false}, + {227, "utf8mb4", "utf8mb4_romanian_ci", false}, + {228, "utf8mb4", "utf8mb4_slovenian_ci", false}, + {229, "utf8mb4", "utf8mb4_polish_ci", false}, + {230, "utf8mb4", "utf8mb4_estonian_ci", false}, + {231, "utf8mb4", "utf8mb4_spanish_ci", false}, + {232, "utf8mb4", "utf8mb4_swedish_ci", false}, + {233, "utf8mb4", "utf8mb4_turkish_ci", false}, + {234, "utf8mb4", "utf8mb4_czech_ci", false}, + {235, "utf8mb4", "utf8mb4_danish_ci", false}, + {236, "utf8mb4", "utf8mb4_lithuanian_ci", false}, + {237, "utf8mb4", "utf8mb4_slovak_ci", false}, + {238, "utf8mb4", "utf8mb4_spanish2_ci", false}, + {239, "utf8mb4", "utf8mb4_roman_ci", false}, + {240, "utf8mb4", "utf8mb4_persian_ci", false}, + {241, "utf8mb4", "utf8mb4_esperanto_ci", false}, + {242, "utf8mb4", "utf8mb4_hungarian_ci", false}, + {243, "utf8mb4", "utf8mb4_sinhala_ci", false}, + {244, "utf8mb4", "utf8mb4_german2_ci", false}, + {245, "utf8mb4", "utf8mb4_croatian_ci", false}, + {246, "utf8mb4", "utf8mb4_unicode_520_ci", false}, + {247, "utf8mb4", "utf8mb4_vietnamese_ci", false}, + {255, "utf8mb4", "utf8mb4_0900_ai_ci", false}, +} + +// init method always puts to the end of file. +func init() { + for _, c := range charsetInfos { + charsets[c.Name] = c + desc := &Desc{ + Name: c.Name, + DefaultCollation: c.DefaultCollation, + Desc: c.Desc, + Maxlen: c.Maxlen, + } + descs = append(descs, desc) + } + + for _, c := range collations { + collationsIDMap[c.ID] = c + + if _, ok := supportedCollationNames[c.Name]; ok { + supportedCollations = append(supportedCollations, c) + } + + if charset, ok := charsets[c.CharsetName]; ok { + charset.Collations[c.Name] = c + } + } + + for id, name := range mysql.Collations { + collationsNameMap[name] = collationsIDMap[int(id)] + } +} diff --git a/vendor/github.com/pingcap/parser/charset/encoding_table.go b/vendor/github.com/pingcap/parser/charset/encoding_table.go new file mode 100644 index 0000000..37a5550 --- /dev/null +++ b/vendor/github.com/pingcap/parser/charset/encoding_table.go @@ -0,0 +1,260 @@ +// Copyright 2015 PingCAP, Inc. +// +// 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package charset + +import ( + "strings" + + "golang.org/x/text/encoding" + "golang.org/x/text/encoding/charmap" + "golang.org/x/text/encoding/japanese" + "golang.org/x/text/encoding/korean" + "golang.org/x/text/encoding/simplifiedchinese" + "golang.org/x/text/encoding/traditionalchinese" + "golang.org/x/text/encoding/unicode" +) + +// Lookup returns the encoding with the specified label, and its canonical +// name. It returns nil and the empty string if label is not one of the +// standard encodings for HTML. Matching is case-insensitive and ignores +// leading and trailing whitespace. +func Lookup(label string) (e encoding.Encoding, name string) { + label = strings.ToLower(strings.Trim(label, "\t\n\r\f ")) + enc := encodings[label] + return enc.e, enc.name +} + +var encodings = map[string]struct { + e encoding.Encoding + name string +}{ + "unicode-1-1-utf-8": {encoding.Nop, "utf-8"}, + "utf-8": {encoding.Nop, "utf-8"}, + "utf8": {encoding.Nop, "utf-8"}, + "utf8mb4": {encoding.Nop, "utf-8"}, + "binary": {encoding.Nop, "binary"}, + "866": {charmap.CodePage866, "ibm866"}, + "cp866": {charmap.CodePage866, "ibm866"}, + "csibm866": {charmap.CodePage866, "ibm866"}, + "ibm866": {charmap.CodePage866, "ibm866"}, + "csisolatin2": {charmap.ISO8859_2, "iso-8859-2"}, + "iso-8859-2": {charmap.ISO8859_2, "iso-8859-2"}, + "iso-ir-101": {charmap.ISO8859_2, "iso-8859-2"}, + "iso8859-2": {charmap.ISO8859_2, "iso-8859-2"}, + "iso88592": {charmap.ISO8859_2, "iso-8859-2"}, + "iso_8859-2": {charmap.ISO8859_2, "iso-8859-2"}, + "iso_8859-2:1987": {charmap.ISO8859_2, "iso-8859-2"}, + "l2": {charmap.ISO8859_2, "iso-8859-2"}, + "latin2": {charmap.ISO8859_2, "iso-8859-2"}, + "csisolatin3": {charmap.ISO8859_3, "iso-8859-3"}, + "iso-8859-3": {charmap.ISO8859_3, "iso-8859-3"}, + "iso-ir-109": {charmap.ISO8859_3, "iso-8859-3"}, + "iso8859-3": {charmap.ISO8859_3, "iso-8859-3"}, + "iso88593": {charmap.ISO8859_3, "iso-8859-3"}, + "iso_8859-3": {charmap.ISO8859_3, "iso-8859-3"}, + "iso_8859-3:1988": {charmap.ISO8859_3, "iso-8859-3"}, + "l3": {charmap.ISO8859_3, "iso-8859-3"}, + "latin3": {charmap.ISO8859_3, "iso-8859-3"}, + "csisolatin4": {charmap.ISO8859_4, "iso-8859-4"}, + "iso-8859-4": {charmap.ISO8859_4, "iso-8859-4"}, + "iso-ir-110": {charmap.ISO8859_4, "iso-8859-4"}, + "iso8859-4": {charmap.ISO8859_4, "iso-8859-4"}, + "iso88594": {charmap.ISO8859_4, "iso-8859-4"}, + "iso_8859-4": {charmap.ISO8859_4, "iso-8859-4"}, + "iso_8859-4:1988": {charmap.ISO8859_4, "iso-8859-4"}, + "l4": {charmap.ISO8859_4, "iso-8859-4"}, + "latin4": {charmap.ISO8859_4, "iso-8859-4"}, + "csisolatincyrillic": {charmap.ISO8859_5, "iso-8859-5"}, + "cyrillic": {charmap.ISO8859_5, "iso-8859-5"}, + "iso-8859-5": {charmap.ISO8859_5, "iso-8859-5"}, + "iso-ir-144": {charmap.ISO8859_5, "iso-8859-5"}, + "iso8859-5": {charmap.ISO8859_5, "iso-8859-5"}, + "iso88595": {charmap.ISO8859_5, "iso-8859-5"}, + "iso_8859-5": {charmap.ISO8859_5, "iso-8859-5"}, + "iso_8859-5:1988": {charmap.ISO8859_5, "iso-8859-5"}, + "arabic": {charmap.ISO8859_6, "iso-8859-6"}, + "asmo-708": {charmap.ISO8859_6, "iso-8859-6"}, + "csiso88596e": {charmap.ISO8859_6, "iso-8859-6"}, + "csiso88596i": {charmap.ISO8859_6, "iso-8859-6"}, + "csisolatinarabic": {charmap.ISO8859_6, "iso-8859-6"}, + "ecma-114": {charmap.ISO8859_6, "iso-8859-6"}, + "iso-8859-6": {charmap.ISO8859_6, "iso-8859-6"}, + "iso-8859-6-e": {charmap.ISO8859_6, "iso-8859-6"}, + "iso-8859-6-i": {charmap.ISO8859_6, "iso-8859-6"}, + "iso-ir-127": {charmap.ISO8859_6, "iso-8859-6"}, + "iso8859-6": {charmap.ISO8859_6, "iso-8859-6"}, + "iso88596": {charmap.ISO8859_6, "iso-8859-6"}, + "iso_8859-6": {charmap.ISO8859_6, "iso-8859-6"}, + "iso_8859-6:1987": {charmap.ISO8859_6, "iso-8859-6"}, + "csisolatingreek": {charmap.ISO8859_7, "iso-8859-7"}, + "ecma-118": {charmap.ISO8859_7, "iso-8859-7"}, + "elot_928": {charmap.ISO8859_7, "iso-8859-7"}, + "greek": {charmap.ISO8859_7, "iso-8859-7"}, + "greek8": {charmap.ISO8859_7, "iso-8859-7"}, + "iso-8859-7": {charmap.ISO8859_7, "iso-8859-7"}, + "iso-ir-126": {charmap.ISO8859_7, "iso-8859-7"}, + "iso8859-7": {charmap.ISO8859_7, "iso-8859-7"}, + "iso88597": {charmap.ISO8859_7, "iso-8859-7"}, + "iso_8859-7": {charmap.ISO8859_7, "iso-8859-7"}, + "iso_8859-7:1987": {charmap.ISO8859_7, "iso-8859-7"}, + "sun_eu_greek": {charmap.ISO8859_7, "iso-8859-7"}, + "csiso88598e": {charmap.ISO8859_8, "iso-8859-8"}, + "csisolatinhebrew": {charmap.ISO8859_8, "iso-8859-8"}, + "hebrew": {charmap.ISO8859_8, "iso-8859-8"}, + "iso-8859-8": {charmap.ISO8859_8, "iso-8859-8"}, + "iso-8859-8-e": {charmap.ISO8859_8, "iso-8859-8"}, + "iso-ir-138": {charmap.ISO8859_8, "iso-8859-8"}, + "iso8859-8": {charmap.ISO8859_8, "iso-8859-8"}, + "iso88598": {charmap.ISO8859_8, "iso-8859-8"}, + "iso_8859-8": {charmap.ISO8859_8, "iso-8859-8"}, + "iso_8859-8:1988": {charmap.ISO8859_8, "iso-8859-8"}, + "visual": {charmap.ISO8859_8, "iso-8859-8"}, + "csiso88598i": {charmap.ISO8859_8, "iso-8859-8-i"}, + "iso-8859-8-i": {charmap.ISO8859_8, "iso-8859-8-i"}, + "logical": {charmap.ISO8859_8, "iso-8859-8-i"}, + "csisolatin6": {charmap.ISO8859_10, "iso-8859-10"}, + "iso-8859-10": {charmap.ISO8859_10, "iso-8859-10"}, + "iso-ir-157": {charmap.ISO8859_10, "iso-8859-10"}, + "iso8859-10": {charmap.ISO8859_10, "iso-8859-10"}, + "iso885910": {charmap.ISO8859_10, "iso-8859-10"}, + "l6": {charmap.ISO8859_10, "iso-8859-10"}, + "latin6": {charmap.ISO8859_10, "iso-8859-10"}, + "iso-8859-13": {charmap.ISO8859_13, "iso-8859-13"}, + "iso8859-13": {charmap.ISO8859_13, "iso-8859-13"}, + "iso885913": {charmap.ISO8859_13, "iso-8859-13"}, + "iso-8859-14": {charmap.ISO8859_14, "iso-8859-14"}, + "iso8859-14": {charmap.ISO8859_14, "iso-8859-14"}, + "iso885914": {charmap.ISO8859_14, "iso-8859-14"}, + "csisolatin9": {charmap.ISO8859_15, "iso-8859-15"}, + "iso-8859-15": {charmap.ISO8859_15, "iso-8859-15"}, + "iso8859-15": {charmap.ISO8859_15, "iso-8859-15"}, + "iso885915": {charmap.ISO8859_15, "iso-8859-15"}, + "iso_8859-15": {charmap.ISO8859_15, "iso-8859-15"}, + "l9": {charmap.ISO8859_15, "iso-8859-15"}, + "iso-8859-16": {charmap.ISO8859_16, "iso-8859-16"}, + "cskoi8r": {charmap.KOI8R, "koi8-r"}, + "koi": {charmap.KOI8R, "koi8-r"}, + "koi8": {charmap.KOI8R, "koi8-r"}, + "koi8-r": {charmap.KOI8R, "koi8-r"}, + "koi8_r": {charmap.KOI8R, "koi8-r"}, + "koi8-u": {charmap.KOI8U, "koi8-u"}, + "csmacintosh": {charmap.Macintosh, "macintosh"}, + "mac": {charmap.Macintosh, "macintosh"}, + "macintosh": {charmap.Macintosh, "macintosh"}, + "x-mac-roman": {charmap.Macintosh, "macintosh"}, + "dos-874": {charmap.Windows874, "windows-874"}, + "iso-8859-11": {charmap.Windows874, "windows-874"}, + "iso8859-11": {charmap.Windows874, "windows-874"}, + "iso885911": {charmap.Windows874, "windows-874"}, + "tis-620": {charmap.Windows874, "windows-874"}, + "windows-874": {charmap.Windows874, "windows-874"}, + "cp1250": {charmap.Windows1250, "windows-1250"}, + "windows-1250": {charmap.Windows1250, "windows-1250"}, + "x-cp1250": {charmap.Windows1250, "windows-1250"}, + "cp1251": {charmap.Windows1251, "windows-1251"}, + "windows-1251": {charmap.Windows1251, "windows-1251"}, + "x-cp1251": {charmap.Windows1251, "windows-1251"}, + "ansi_x3.4-1968": {charmap.Windows1252, "windows-1252"}, + "ascii": {charmap.Windows1252, "windows-1252"}, + "cp1252": {charmap.Windows1252, "windows-1252"}, + "cp819": {charmap.Windows1252, "windows-1252"}, + "csisolatin1": {charmap.Windows1252, "windows-1252"}, + "ibm819": {charmap.Windows1252, "windows-1252"}, + "iso-8859-1": {charmap.Windows1252, "windows-1252"}, + "iso-ir-100": {charmap.Windows1252, "windows-1252"}, + "iso8859-1": {charmap.Windows1252, "windows-1252"}, + "iso88591": {charmap.Windows1252, "windows-1252"}, + "iso_8859-1": {charmap.Windows1252, "windows-1252"}, + "iso_8859-1:1987": {charmap.Windows1252, "windows-1252"}, + "l1": {charmap.Windows1252, "windows-1252"}, + "latin1": {charmap.Windows1252, "windows-1252"}, + "us-ascii": {charmap.Windows1252, "windows-1252"}, + "windows-1252": {charmap.Windows1252, "windows-1252"}, + "x-cp1252": {charmap.Windows1252, "windows-1252"}, + "cp1253": {charmap.Windows1253, "windows-1253"}, + "windows-1253": {charmap.Windows1253, "windows-1253"}, + "x-cp1253": {charmap.Windows1253, "windows-1253"}, + "cp1254": {charmap.Windows1254, "windows-1254"}, + "csisolatin5": {charmap.Windows1254, "windows-1254"}, + "iso-8859-9": {charmap.Windows1254, "windows-1254"}, + "iso-ir-148": {charmap.Windows1254, "windows-1254"}, + "iso8859-9": {charmap.Windows1254, "windows-1254"}, + "iso88599": {charmap.Windows1254, "windows-1254"}, + "iso_8859-9": {charmap.Windows1254, "windows-1254"}, + "iso_8859-9:1989": {charmap.Windows1254, "windows-1254"}, + "l5": {charmap.Windows1254, "windows-1254"}, + "latin5": {charmap.Windows1254, "windows-1254"}, + "windows-1254": {charmap.Windows1254, "windows-1254"}, + "x-cp1254": {charmap.Windows1254, "windows-1254"}, + "cp1255": {charmap.Windows1255, "windows-1255"}, + "windows-1255": {charmap.Windows1255, "windows-1255"}, + "x-cp1255": {charmap.Windows1255, "windows-1255"}, + "cp1256": {charmap.Windows1256, "windows-1256"}, + "windows-1256": {charmap.Windows1256, "windows-1256"}, + "x-cp1256": {charmap.Windows1256, "windows-1256"}, + "cp1257": {charmap.Windows1257, "windows-1257"}, + "windows-1257": {charmap.Windows1257, "windows-1257"}, + "x-cp1257": {charmap.Windows1257, "windows-1257"}, + "cp1258": {charmap.Windows1258, "windows-1258"}, + "windows-1258": {charmap.Windows1258, "windows-1258"}, + "x-cp1258": {charmap.Windows1258, "windows-1258"}, + "x-mac-cyrillic": {charmap.MacintoshCyrillic, "x-mac-cyrillic"}, + "x-mac-ukrainian": {charmap.MacintoshCyrillic, "x-mac-cyrillic"}, + "chinese": {simplifiedchinese.GBK, "gbk"}, + "csgb2312": {simplifiedchinese.GBK, "gbk"}, + "csiso58gb231280": {simplifiedchinese.GBK, "gbk"}, + "gb2312": {simplifiedchinese.GBK, "gbk"}, + "gb_2312": {simplifiedchinese.GBK, "gbk"}, + "gb_2312-80": {simplifiedchinese.GBK, "gbk"}, + "gbk": {simplifiedchinese.GBK, "gbk"}, + "iso-ir-58": {simplifiedchinese.GBK, "gbk"}, + "x-gbk": {simplifiedchinese.GBK, "gbk"}, + "gb18030": {simplifiedchinese.GB18030, "gb18030"}, + "hz-gb-2312": {simplifiedchinese.HZGB2312, "hz-gb-2312"}, + "big5": {traditionalchinese.Big5, "big5"}, + "big5-hkscs": {traditionalchinese.Big5, "big5"}, + "cn-big5": {traditionalchinese.Big5, "big5"}, + "csbig5": {traditionalchinese.Big5, "big5"}, + "x-x-big5": {traditionalchinese.Big5, "big5"}, + "cseucpkdfmtjapanese": {japanese.EUCJP, "euc-jp"}, + "euc-jp": {japanese.EUCJP, "euc-jp"}, + "x-euc-jp": {japanese.EUCJP, "euc-jp"}, + "csiso2022jp": {japanese.ISO2022JP, "iso-2022-jp"}, + "iso-2022-jp": {japanese.ISO2022JP, "iso-2022-jp"}, + "csshiftjis": {japanese.ShiftJIS, "shift_jis"}, + "ms_kanji": {japanese.ShiftJIS, "shift_jis"}, + "shift-jis": {japanese.ShiftJIS, "shift_jis"}, + "shift_jis": {japanese.ShiftJIS, "shift_jis"}, + "sjis": {japanese.ShiftJIS, "shift_jis"}, + "windows-31j": {japanese.ShiftJIS, "shift_jis"}, + "x-sjis": {japanese.ShiftJIS, "shift_jis"}, + "cseuckr": {korean.EUCKR, "euc-kr"}, + "csksc56011987": {korean.EUCKR, "euc-kr"}, + "euc-kr": {korean.EUCKR, "euc-kr"}, + "iso-ir-149": {korean.EUCKR, "euc-kr"}, + "korean": {korean.EUCKR, "euc-kr"}, + "ks_c_5601-1987": {korean.EUCKR, "euc-kr"}, + "ks_c_5601-1989": {korean.EUCKR, "euc-kr"}, + "ksc5601": {korean.EUCKR, "euc-kr"}, + "ksc_5601": {korean.EUCKR, "euc-kr"}, + "windows-949": {korean.EUCKR, "euc-kr"}, + "csiso2022kr": {encoding.Replacement, "replacement"}, + "iso-2022-kr": {encoding.Replacement, "replacement"}, + "iso-2022-cn": {encoding.Replacement, "replacement"}, + "iso-2022-cn-ext": {encoding.Replacement, "replacement"}, + "utf-16be": {unicode.UTF16(unicode.BigEndian, unicode.IgnoreBOM), "utf-16be"}, + "utf-16": {unicode.UTF16(unicode.LittleEndian, unicode.IgnoreBOM), "utf-16le"}, + "utf-16le": {unicode.UTF16(unicode.LittleEndian, unicode.IgnoreBOM), "utf-16le"}, + "x-user-defined": {charmap.XUserDefined, "x-user-defined"}, +} diff --git a/vendor/github.com/pingcap/parser/checkout-pr-branch.sh b/vendor/github.com/pingcap/parser/checkout-pr-branch.sh new file mode 100755 index 0000000..e66b4aa --- /dev/null +++ b/vendor/github.com/pingcap/parser/checkout-pr-branch.sh @@ -0,0 +1,24 @@ +#!/bin/bash + +# This script is used to checkout a Parser PR branch in a forked repo. +if test -z $1; then + echo -e "Usage:\n" + echo -e "\tcheckout-pr-branch.sh [github-username]:[pr-branch]\n" + echo -e "The argument can be copied directly from github PR page." + echo -e "The local branch name would be [github-username]/[pr-branch]." + exit 0; +fi + +username=$(echo $1 | cut -d':' -f1) +branch=$(echo $1 | cut -d':' -f2) +local_branch=$username/$branch +fork="https://github.com/$username/parser" + +exists=`git show-ref refs/heads/$local_branch` +if [ -n "$exists" ]; then + git checkout $local_branch + git pull $fork $branch:$local_branch +else + git fetch $fork $branch:$local_branch + git checkout $local_branch +fi diff --git a/vendor/github.com/pingcap/parser/circle.yml b/vendor/github.com/pingcap/parser/circle.yml new file mode 100644 index 0000000..f0176a4 --- /dev/null +++ b/vendor/github.com/pingcap/parser/circle.yml @@ -0,0 +1,57 @@ +version: 2 + +jobs: + build-ut: + docker: + - image: golang:1.11 + working_directory: /go/src/github.com/pingcap/parser + steps: + - checkout + - run: + name: "Verify parser.go is up-to-date" + command: | + mv parser.go parser.go.committed + make parser + diff -u parser.go.committed parser.go + - run: + name: "Check code format" + command: make fmt + - run: + name: "Build & Test" + command: make test + - run: + name: "Upload coverage" + command: bash <(curl -s https://codecov.io/bash) + build-integration: + docker: + - image: golang:1.11 + working_directory: /go/src/github.com/pingcap/parser + steps: + - checkout + - run: + name: "Verify parser.go is up-to-date" + command: | + mv parser.go parser.go.committed + make parser + diff -u parser.go.committed parser.go + - run: + name: "Check code format" + command: make fmt + - run: + name: "Build" + command: make + - run: + name: "Integration Test" + command: | + cd /go/src/github.com/pingcap/ + git clone git@github.com:pingcap/tidb.git + cd tidb + rm go.sum + GO111MODULE=on go mod edit -replace github.com/pingcap/parser=github.com/${CIRCLE_PR_USERNAME:-$CIRCLE_PROJECT_USERNAME}/${CIRCLE_PR_REPONAME:-$CIRCLE_PROJECT_REPONAME}@$CIRCLE_SHA1 + make gotest +workflows: + version: 2 + build_and_test: + jobs: + - build-ut + - build-integration \ No newline at end of file diff --git a/vendor/github.com/pingcap/parser/digester.go b/vendor/github.com/pingcap/parser/digester.go new file mode 100644 index 0000000..191bd9c --- /dev/null +++ b/vendor/github.com/pingcap/parser/digester.go @@ -0,0 +1,362 @@ +// Copyright 2019 PingCAP, Inc. +// +// 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package parser + +import ( + "bytes" + "crypto/sha256" + "fmt" + hash2 "hash" + "strings" + "sync" + "unicode" +) + +// DigestHash generates the digest of statements. +// it will generate a hash on normalized form of statement text +// which removes general property of a statement but keeps specific property. +// +// for example: both DigestHash('select 1') and DigestHash('select 2') => e1c71d1661ae46e09b7aaec1c390957f0d6260410df4e4bc71b9c8d681021471 +func DigestHash(sql string) (result string) { + d := digesterPool.Get().(*sqlDigester) + result = d.doDigest(sql) + digesterPool.Put(d) + return +} + +// Normalize generates the normalized statements. +// it will get normalized form of statement text +// which removes general property of a statement but keeps specific property. +// +// for example: Normalize('select 1 from b where a = 1') => 'select ? from b where a = ?' +func Normalize(sql string) (result string) { + d := digesterPool.Get().(*sqlDigester) + result = d.doNormalize(sql) + digesterPool.Put(d) + return +} + +// NormalizeDigest combines Normalize and DigestHash into one method. +func NormalizeDigest(sql string) (normalized, digest string) { + d := digesterPool.Get().(*sqlDigester) + normalized, digest = d.doNormalizeDigest(sql) + digesterPool.Put(d) + return +} + +var digesterPool = sync.Pool{ + New: func() interface{} { + return &sqlDigester{ + lexer: NewScanner(""), + hasher: sha256.New(), + } + }, +} + +// sqlDigester is used to compute DigestHash or Normalize for sql. +type sqlDigester struct { + buffer bytes.Buffer + lexer *Scanner + hasher hash2.Hash + tokens tokenDeque +} + +func (d *sqlDigester) doDigest(sql string) (result string) { + d.normalize(sql) + d.hasher.Write(d.buffer.Bytes()) + d.buffer.Reset() + result = fmt.Sprintf("%x", d.hasher.Sum(nil)) + d.hasher.Reset() + return +} + +func (d *sqlDigester) doNormalize(sql string) (result string) { + d.normalize(sql) + result = string(d.buffer.Bytes()) + d.buffer.Reset() + return +} + +func (d *sqlDigester) doNormalizeDigest(sql string) (normalized, digest string) { + d.normalize(sql) + normalized = string(d.buffer.Bytes()) + d.hasher.Write(d.buffer.Bytes()) + d.buffer.Reset() + digest = fmt.Sprintf("%x", d.hasher.Sum(nil)) + d.hasher.Reset() + return +} + +const ( + // genericSymbol presents parameter holder ("?") in statement + // it can be any value as long as it is not repeated with other tokens. + genericSymbol = -1 + // genericSymbolList presents parameter holder lists ("?, ?, ...") in statement + // it can be any value as long as it is not repeated with other tokens. + genericSymbolList = -2 +) + +func (d *sqlDigester) normalize(sql string) { + d.lexer.reset(sql) + for { + tok, pos, lit := d.lexer.scan() + if tok == invalid { + break + } + if tok == unicode.ReplacementChar && d.lexer.r.eof() { + break + } + if pos.Offset == len(sql) { + break + } + currTok := token{tok, strings.ToLower(lit)} + + if d.reduceOptimizerHint(&currTok) { + continue + } + + d.reduceLit(&currTok) + + d.tokens = append(d.tokens, currTok) + } + d.lexer.reset("") + for i, token := range d.tokens { + d.buffer.WriteString(token.lit) + if i != len(d.tokens)-1 { + d.buffer.WriteRune(' ') + } + } + d.tokens = d.tokens[:0] +} + +func (d *sqlDigester) reduceOptimizerHint(tok *token) (reduced bool) { + // ignore /*+..*/ + if tok.tok == hintBegin { + for { + tok, _, _ := d.lexer.scan() + if tok == 0 || (tok == unicode.ReplacementChar && d.lexer.r.eof()) { + break + } + if tok == hintEnd { + reduced = true + break + } + } + return + } + + // ignore force/use/ignore index(x) + if tok.lit == "index" { + toks := d.tokens.back(1) + if len(toks) > 0 { + switch strings.ToLower(toks[0].lit) { + case "force", "use", "ignore": + for { + tok, _, lit := d.lexer.scan() + if tok == 0 || (tok == unicode.ReplacementChar && d.lexer.r.eof()) { + break + } + if lit == ")" { + reduced = true + d.tokens.popBack(1) + break + } + } + return + } + } + } + + // ignore straight_join + if tok.lit == "straight_join" { + tok.lit = "join" + return + } + return +} + +func (d *sqlDigester) reduceLit(currTok *token) { + if !d.isLit(*currTok) { + return + } + // count(*) => count(?) + if currTok.lit == "*" { + if d.isStarParam() { + currTok.tok = genericSymbol + currTok.lit = "?" + } + return + } + + // "-x" or "+x" => "x" + if d.isPrefixByUnary(currTok.tok) { + d.tokens.popBack(1) + } + + // "?, ?, ?, ?" => "..." + last2 := d.tokens.back(2) + if d.isGenericList(last2) { + d.tokens.popBack(2) + currTok.tok = genericSymbolList + currTok.lit = "..." + return + } + + // order by n => order by n + if currTok.tok == intLit { + if d.isOrderOrGroupBy() { + return + } + } + + // 2 => ? + currTok.tok = genericSymbol + currTok.lit = "?" + return +} + +func (d *sqlDigester) isPrefixByUnary(currTok int) (isUnary bool) { + if !d.isNumLit(currTok) { + return + } + last := d.tokens.back(1) + if last == nil { + return + } + // a[0] != '-' and a[0] != '+' + if last[0].lit != "-" && last[0].lit != "+" { + return + } + last2 := d.tokens.back(2) + if last2 == nil { + isUnary = true + return + } + // '(-x' or ',-x' or ',+x' or '--x' or '+-x' + switch last2[0].lit { + case "(", ",", "+", "-", ">=", "is", "<=", "=", "<", ">": + isUnary = true + default: + } + // select -x or select +x + last2Lit := strings.ToLower(last2[0].lit) + if last2Lit == "select" { + isUnary = true + } + return +} + +func (d *sqlDigester) isGenericList(last2 []token) (generic bool) { + if len(last2) < 2 { + return false + } + if !d.isComma(last2[1]) { + return false + } + switch last2[0].tok { + case genericSymbol, genericSymbolList: + generic = true + default: + } + return +} + +func (d *sqlDigester) isOrderOrGroupBy() (orderOrGroupBy bool) { + var ( + last []token + n int + ) + // skip number item lists, e.g. "order by 1, 2, 3" should NOT convert to "order by ?, ?, ?" + for n = 2; ; n += 2 { + last = d.tokens.back(n) + if len(last) < 2 { + return false + } + if !d.isComma(last[1]) { + break + } + } + // handle group by number item list surround by "()", e.g. "group by (1, 2)" should not convert to "group by (?, ?)" + if last[1].lit == "(" { + last = d.tokens.back(n + 1) + if len(last) < 2 { + return false + } + } + orderOrGroupBy = (last[0].lit == "order" || last[0].lit == "group") && last[1].lit == "by" + return +} + +func (d *sqlDigester) isStarParam() (starParam bool) { + last := d.tokens.back(1) + if last == nil { + starParam = false + return + } + starParam = last[0].lit == "(" + return +} + +func (d *sqlDigester) isLit(t token) (beLit bool) { + tok := t.tok + if d.isNumLit(tok) || tok == stringLit || tok == bitLit { + beLit = true + } else if t.lit == "*" { + beLit = true + } + return +} + +func (d *sqlDigester) isNumLit(tok int) (beNum bool) { + switch tok { + case intLit, decLit, floatLit, hexLit: + beNum = true + default: + } + return +} + +func (d *sqlDigester) isComma(tok token) (isComma bool) { + isComma = tok.lit == "," + return +} + +type token struct { + tok int + lit string +} + +type tokenDeque []token + +func (s *tokenDeque) pushBack(t token) { + *s = append(*s, t) +} + +func (s *tokenDeque) popBack(n int) (t []token) { + if len(*s) < n { + t = nil + return + } + t = (*s)[len(*s)-n:] + *s = (*s)[:len(*s)-n] + return +} + +func (s *tokenDeque) back(n int) (t []token) { + if len(*s)-n < 0 { + return + } + t = (*s)[len(*s)-n:] + return +} diff --git a/vendor/github.com/pingcap/parser/format/format.go b/vendor/github.com/pingcap/parser/format/format.go new file mode 100755 index 0000000..214d830 --- /dev/null +++ b/vendor/github.com/pingcap/parser/format/format.go @@ -0,0 +1,352 @@ +// Copyright (c) 2014 The sortutil Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSES/STRUTIL-LICENSE file. + +// Copyright 2015 PingCAP, Inc. +// +// 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package format + +import ( + "bytes" + "fmt" + "io" + "strings" +) + +const ( + st0 = iota + stBOL + stPERC + stBOLPERC +) + +// Formatter is an io.Writer extended formatter by a fmt.Printf like function Format. +type Formatter interface { + io.Writer + Format(format string, args ...interface{}) (n int, errno error) +} + +type indentFormatter struct { + io.Writer + indent []byte + indentLevel int + state int +} + +var replace = map[rune]string{ + '\000': "\\0", + '\'': "''", + '\n': "\\n", + '\r': "\\r", +} + +// IndentFormatter returns a new Formatter which interprets %i and %u in the +// Format() formats string as indent and unindent commands. The commands can +// nest. The Formatter writes to io.Writer 'w' and inserts one 'indent' +// string per current indent level value. +// Behaviour of commands reaching negative indent levels is undefined. +// IndentFormatter(os.Stdout, "\t").Format("abc%d%%e%i\nx\ny\n%uz\n", 3) +// output: +// abc3%e +// x +// y +// z +// The Go quoted string literal form of the above is: +// "abc%%e\n\tx\n\tx\nz\n" +// The commands can be scattered between separate invocations of Format(), +// i.e. the formatter keeps track of the indent level and knows if it is +// positioned on start of a line and should emit indentation(s). +// The same output as above can be produced by e.g.: +// f := IndentFormatter(os.Stdout, " ") +// f.Format("abc%d%%e%i\nx\n", 3) +// f.Format("y\n%uz\n") +func IndentFormatter(w io.Writer, indent string) Formatter { + return &indentFormatter{w, []byte(indent), 0, stBOL} +} + +func (f *indentFormatter) format(flat bool, format string, args ...interface{}) (n int, errno error) { + var buf = make([]byte, 0) + for i := 0; i < len(format); i++ { + c := format[i] + switch f.state { + case st0: + switch c { + case '\n': + cc := c + if flat && f.indentLevel != 0 { + cc = ' ' + } + buf = append(buf, cc) + f.state = stBOL + case '%': + f.state = stPERC + default: + buf = append(buf, c) + } + case stBOL: + switch c { + case '\n': + cc := c + if flat && f.indentLevel != 0 { + cc = ' ' + } + buf = append(buf, cc) + case '%': + f.state = stBOLPERC + default: + if !flat { + for i := 0; i < f.indentLevel; i++ { + buf = append(buf, f.indent...) + } + } + buf = append(buf, c) + f.state = st0 + } + case stBOLPERC: + switch c { + case 'i': + f.indentLevel++ + f.state = stBOL + case 'u': + f.indentLevel-- + f.state = stBOL + default: + if !flat { + for i := 0; i < f.indentLevel; i++ { + buf = append(buf, f.indent...) + } + } + buf = append(buf, '%', c) + f.state = st0 + } + case stPERC: + switch c { + case 'i': + f.indentLevel++ + f.state = st0 + case 'u': + f.indentLevel-- + f.state = st0 + default: + buf = append(buf, '%', c) + f.state = st0 + } + default: + panic("unexpected state") + } + } + switch f.state { + case stPERC, stBOLPERC: + buf = append(buf, '%') + } + return f.Write([]byte(fmt.Sprintf(string(buf), args...))) +} + +// Format implements Format interface. +func (f *indentFormatter) Format(format string, args ...interface{}) (n int, errno error) { + return f.format(false, format, args...) +} + +type flatFormatter indentFormatter + +// FlatFormatter returns a newly created Formatter with the same functionality as the one returned +// by IndentFormatter except it allows a newline in the 'format' string argument of Format +// to pass through if the indent level is current zero. +// +// If the indent level is non-zero then such new lines are changed to a space character. +// There is no indent string, the %i and %u format verbs are used solely to determine the indent level. +// +// The FlatFormatter is intended for flattening of normally nested structure textual representation to +// a one top level structure per line form. +// FlatFormatter(os.Stdout, " ").Format("abc%d%%e%i\nx\ny\n%uz\n", 3) +// output in the form of a Go quoted string literal: +// "abc3%%e x y z\n" +func FlatFormatter(w io.Writer) Formatter { + return (*flatFormatter)(IndentFormatter(w, "").(*indentFormatter)) +} + +// Format implements Format interface. +func (f *flatFormatter) Format(format string, args ...interface{}) (n int, errno error) { + return (*indentFormatter)(f).format(true, format, args...) +} + +// OutputFormat output escape character with backslash. +func OutputFormat(s string) string { + var buf bytes.Buffer + for _, old := range s { + if newVal, ok := replace[old]; ok { + buf.WriteString(newVal) + continue + } + buf.WriteRune(old) + } + + return buf.String() +} + +//RestoreFlag mark the Restore format +type RestoreFlags uint64 + +// Mutually exclusive group of `RestoreFlags`: +// [RestoreStringSingleQuotes, RestoreStringDoubleQuotes] +// [RestoreKeyWordUppercase, RestoreKeyWordLowercase] +// [RestoreNameUppercase, RestoreNameLowercase] +// [RestoreNameDoubleQuotes, RestoreNameBackQuotes] +// The flag with the left position in each group has a higher priority. +const ( + RestoreStringSingleQuotes RestoreFlags = 1 << iota + RestoreStringDoubleQuotes + RestoreStringEscapeBackslash + + RestoreKeyWordUppercase + RestoreKeyWordLowercase + + RestoreNameUppercase + RestoreNameLowercase + RestoreNameDoubleQuotes + RestoreNameBackQuotes + + RestoreSpacesAroundBinaryOperation +) + +const ( + DefaultRestoreFlags = RestoreStringSingleQuotes | RestoreKeyWordUppercase | RestoreNameBackQuotes +) + +func (rf RestoreFlags) has(flag RestoreFlags) bool { + return rf&flag != 0 +} + +// HasStringSingleQuotesFlag returns a boolean indicating when `rf` has `RestoreStringSingleQuotes` flag. +func (rf RestoreFlags) HasStringSingleQuotesFlag() bool { + return rf.has(RestoreStringSingleQuotes) +} + +// HasStringDoubleQuotesFlag returns a boolean indicating whether `rf` has `RestoreStringDoubleQuotes` flag. +func (rf RestoreFlags) HasStringDoubleQuotesFlag() bool { + return rf.has(RestoreStringDoubleQuotes) +} + +// HasStringEscapeBackslashFlag returns a boolean indicating whether `rf` has `RestoreStringEscapeBackslash` flag. +func (rf RestoreFlags) HasStringEscapeBackslashFlag() bool { + return rf.has(RestoreStringEscapeBackslash) +} + +// HasKeyWordUppercaseFlag returns a boolean indicating whether `rf` has `RestoreKeyWordUppercase` flag. +func (rf RestoreFlags) HasKeyWordUppercaseFlag() bool { + return rf.has(RestoreKeyWordUppercase) +} + +// HasKeyWordLowercaseFlag returns a boolean indicating whether `rf` has `RestoreKeyWordLowercase` flag. +func (rf RestoreFlags) HasKeyWordLowercaseFlag() bool { + return rf.has(RestoreKeyWordLowercase) +} + +// HasNameUppercaseFlag returns a boolean indicating whether `rf` has `RestoreNameUppercase` flag. +func (rf RestoreFlags) HasNameUppercaseFlag() bool { + return rf.has(RestoreNameUppercase) +} + +// HasNameLowercaseFlag returns a boolean indicating whether `rf` has `RestoreNameLowercase` flag. +func (rf RestoreFlags) HasNameLowercaseFlag() bool { + return rf.has(RestoreNameLowercase) +} + +// HasNameDoubleQuotesFlag returns a boolean indicating whether `rf` has `RestoreNameDoubleQuotes` flag. +func (rf RestoreFlags) HasNameDoubleQuotesFlag() bool { + return rf.has(RestoreNameDoubleQuotes) +} + +// HasNameBackQuotesFlag returns a boolean indicating whether `rf` has `RestoreNameBackQuotes` flag. +func (rf RestoreFlags) HasNameBackQuotesFlag() bool { + return rf.has(RestoreNameBackQuotes) +} + +// HasSpacesAroundBinaryOperationFlag returns a boolean indicating whether `rf` has `RestoreSpacesAroundBinaryOperation` flag. +func (rf RestoreFlags) HasSpacesAroundBinaryOperationFlag() bool { + return rf.has(RestoreSpacesAroundBinaryOperation) +} + +// RestoreCtx is `Restore` context to hold flags and writer. +type RestoreCtx struct { + Flags RestoreFlags + In io.Writer + JoinLevel int +} + +// NewRestoreCtx returns a new `RestoreCtx`. +func NewRestoreCtx(flags RestoreFlags, in io.Writer) *RestoreCtx { + return &RestoreCtx{flags, in, 0} +} + +// WriteKeyWord writes the `keyWord` into writer. +// `keyWord` will be converted format(uppercase and lowercase for now) according to `RestoreFlags`. +func (ctx *RestoreCtx) WriteKeyWord(keyWord string) { + switch { + case ctx.Flags.HasKeyWordUppercaseFlag(): + keyWord = strings.ToUpper(keyWord) + case ctx.Flags.HasKeyWordLowercaseFlag(): + keyWord = strings.ToLower(keyWord) + } + fmt.Fprint(ctx.In, keyWord) +} + +// WriteString writes the string into writer +// `str` may be wrapped in quotes and escaped according to RestoreFlags. +func (ctx *RestoreCtx) WriteString(str string) { + if ctx.Flags.HasStringEscapeBackslashFlag() { + str = strings.Replace(str, `\`, `\\`, -1) + } + quotes := "" + switch { + case ctx.Flags.HasStringSingleQuotesFlag(): + str = strings.Replace(str, `'`, `''`, -1) + quotes = `'` + case ctx.Flags.HasStringDoubleQuotesFlag(): + str = strings.Replace(str, `"`, `""`, -1) + quotes = `"` + } + fmt.Fprint(ctx.In, quotes, str, quotes) +} + +// WriteName writes the name into writer +// `name` maybe wrapped in quotes and escaped according to RestoreFlags. +func (ctx *RestoreCtx) WriteName(name string) { + switch { + case ctx.Flags.HasNameUppercaseFlag(): + name = strings.ToUpper(name) + case ctx.Flags.HasNameLowercaseFlag(): + name = strings.ToLower(name) + } + quotes := "" + switch { + case ctx.Flags.HasNameDoubleQuotesFlag(): + name = strings.Replace(name, `"`, `""`, -1) + quotes = `"` + case ctx.Flags.HasNameBackQuotesFlag(): + name = strings.Replace(name, "`", "``", -1) + quotes = "`" + } + fmt.Fprint(ctx.In, quotes, name, quotes) +} + +// WritePlain writes the plain text into writer without any handling. +func (ctx *RestoreCtx) WritePlain(plainText string) { + fmt.Fprint(ctx.In, plainText) +} + +// WritePlainf write the plain text into writer without any handling. +func (ctx *RestoreCtx) WritePlainf(format string, a ...interface{}) { + fmt.Fprintf(ctx.In, format, a...) +} diff --git a/vendor/github.com/pingcap/parser/go.mod1 b/vendor/github.com/pingcap/parser/go.mod1 new file mode 100644 index 0000000..e8ec892 --- /dev/null +++ b/vendor/github.com/pingcap/parser/go.mod1 @@ -0,0 +1,16 @@ +module github.com/pingcap/parser + +require ( + github.com/cznic/golex v0.0.0-20181122101858-9c343928389c // indirect + github.com/cznic/mathutil v0.0.0-20181122101859-297441e03548 + github.com/cznic/parser v0.0.0-20160622100904-31edd927e5b1 + github.com/cznic/sortutil v0.0.0-20181122101858-f5f958428db8 + github.com/cznic/strutil v0.0.0-20171016134553-529a34b1c186 + github.com/cznic/y v0.0.0-20170802143616-045f81c6662a + github.com/pingcap/check v0.0.0-20190102082844-67f458068fc8 + github.com/pingcap/errors v0.11.4 + github.com/pingcap/tidb v0.0.0-20190703092821-755875aacb5a + github.com/pingcap/tipb v0.0.0-20190428032612-535e1abaa330 + github.com/sirupsen/logrus v1.3.0 + golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2 +) diff --git a/vendor/github.com/pingcap/parser/go.sum1 b/vendor/github.com/pingcap/parser/go.sum1 new file mode 100644 index 0000000..06cf677 --- /dev/null +++ b/vendor/github.com/pingcap/parser/go.sum1 @@ -0,0 +1,344 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/StackExchange/wmi v0.0.0-20180725035823-b12b22c5341f h1:5ZfJxyXo8KyX8DgGXC5B7ILL8y51fci/qYz2B4j8iLY= +github.com/StackExchange/wmi v0.0.0-20180725035823-b12b22c5341f/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= +github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973 h1:xJ4a3vCFaGF/jqvzLMYoU8P317H5OQ+Via4RmuPwCS0= +github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/blacktear23/go-proxyprotocol v0.0.0-20180807104634-af7a81e8dd0d/go.mod h1:VKt7CNAQxpFpSDz3sXyj9hY/GbVsQCr0sB3w59nE7lU= +github.com/boltdb/bolt v1.3.1 h1:JQmyP4ZBrce+ZQu0dY660FMfatumYDLun9hBCUVIkF4= +github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20171208011716-f6d7a1f6fbf3/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd h1:qMd81Ts1T2OTKmB4acZcyKaMtRnY5Y44NuXGX2GFJ1w= +github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= +github.com/coreos/bbolt v1.3.0 h1:HIgH5xUWXT914HCI671AxuTTqjj64UOFr7pHn48LUTI= +github.com/coreos/bbolt v1.3.0/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= +github.com/coreos/bbolt v1.3.3/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= +github.com/coreos/etcd v3.3.10+incompatible h1:jFneRYjIvLMLhDLCzuTuU4rSJUjRplcJQ7pD7MnhC04= +github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/go-semver v0.2.0 h1:3Jm3tLmsgAYcjC+4Up7hJrFBPr+n7rAqYeSw/SZazuY= +github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd v0.0.0-20181031085051-9002847aa142 h1:3jFq2xL4ZajGK4aZY8jz+DAF0FHjI51BXjjSwCzS1Dk= +github.com/coreos/go-systemd v0.0.0-20181031085051-9002847aa142/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f h1:lBNOc5arjvs8E5mO2tbpBpLoyyu8B6e44T7hJy6potg= +github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/cznic/golex v0.0.0-20181122101858-9c343928389c h1:G8zTsaqyVfIHpgMFcGgdbhHSFhlNc77rAKkhVbQ9kQg= +github.com/cznic/golex v0.0.0-20181122101858-9c343928389c/go.mod h1:+bmmJDNmKlhWNG+gwWCkaBoTy39Fs+bzRxVBzoTQbIc= +github.com/cznic/mathutil v0.0.0-20181122101859-297441e03548 h1:iwZdTE0PVqJCos1vaoKsclOGD3ADKpshg3SRtYBbwso= +github.com/cznic/mathutil v0.0.0-20181122101859-297441e03548/go.mod h1:e6NPNENfs9mPDVNRekM7lKScauxd5kXTr1Mfyig6TDM= +github.com/cznic/parser v0.0.0-20160622100904-31edd927e5b1 h1:uWcWCkSP+E1w1z8r082miT+c+9vzg+5UdrgGCo15lMo= +github.com/cznic/parser v0.0.0-20160622100904-31edd927e5b1/go.mod h1:2B43mz36vGZNZEwkWi8ayRSSUXLfjL8OkbzwW4NcPMM= +github.com/cznic/sortutil v0.0.0-20150617083342-4c7342852e65/go.mod h1:q2w6Bg5jeox1B+QkJ6Wp/+Vn0G/bo3f1uY7Fn3vivIQ= +github.com/cznic/sortutil v0.0.0-20181122101858-f5f958428db8 h1:LpMLYGyy67BoAFGda1NeOBQwqlv7nUXpm+rIVHGxZZ4= +github.com/cznic/sortutil v0.0.0-20181122101858-f5f958428db8/go.mod h1:q2w6Bg5jeox1B+QkJ6Wp/+Vn0G/bo3f1uY7Fn3vivIQ= +github.com/cznic/strutil v0.0.0-20171016134553-529a34b1c186 h1:0rkFMAbn5KBKNpJyHQ6Prb95vIKanmAe62KxsrN+sqA= +github.com/cznic/strutil v0.0.0-20171016134553-529a34b1c186/go.mod h1:AHHPPPXTw0h6pVabbcbyGRK1DckRn7r/STdZEeIDzZc= +github.com/cznic/y v0.0.0-20170802143616-045f81c6662a h1:N2rDAvHuM46OGscJkGX4Dw4BBqZgg6mGNGLYs5utVVo= +github.com/cznic/y v0.0.0-20170802143616-045f81c6662a/go.mod h1:1rk5VM7oSnA4vjp+hrLQ3HWHa+Y4yPCa3/CsJrcNnvs= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= +github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dgryski/go-farm v0.0.0-20190104051053-3adb47b1fb0f/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v0.0.0-20180421182945-02af3965c54e/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385 h1:clC1lXBpe2kTj2VHdaIu9ajZQe4kcEY9j0NsnDDBZ3o= +github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM= +github.com/etcd-io/gofail v0.0.0-20180808172546-51ce9a71510a h1:QNEenQIsGDEEfFNSnN+h6hE1OwnHqTg7Dl9gEk1Cko4= +github.com/etcd-io/gofail v0.0.0-20180808172546-51ce9a71510a/go.mod h1:49H/RkXP8pKaZy4h0d+NW16rSLhyVBt4o6VLJbmOqDE= +github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32/go.mod h1:GIjDIg/heH5DOkXY3YJ/wNhfHsQHoXGjl8G8amsYQ1I= +github.com/go-ole/go-ole v1.2.1 h1:2lOsA72HgjxAuMlKpFiCbHTvu44PIVkZ5hqm3RSdI/E= +github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8= +github.com/go-playground/overalls v0.0.0-20180201144345-22ec1a223b7c/go.mod h1:UqxAgEOt89sCiXlrc/ycnx00LVvUO/eS8tMUkWX4R7w= +github.com/go-sql-driver/mysql v0.0.0-20170715192408-3955978caca4/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= +github.com/gogo/protobuf v0.0.0-20180717141946-636bf0302bc9/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.0.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.0 h1:xU6/SpYbvkNYiptHJYEDRseDLvYE7wSqhYYNy0QSUzI= +github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20181024230925-c65c006176ff h1:kOkM9whyQYodu09SJ6W3NCsHG7crFaJILQ22Gozp3lg= +github.com/golang/groupcache v0.0.0-20181024230925-c65c006176ff/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:tluoj9z5200jBnyusfRPU2LqT6J+DAorxEvtC7LHB+E= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/protobuf v0.0.0-20180814211427-aa810b61a9c7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db h1:woRePGFeVFfLKN/pOkfl+p/TAqKOfFu+7KPlMVpok/w= +github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/btree v0.0.0-20180124185431-e89373fe6b4a/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c h1:964Od4U6p2jUkFxvCydnIczKteheJEzHRToSGK3Bnlw= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/shlex v0.0.0-20181106134648-c34317bd91bf/go.mod h1:RpwtwJQFrIEPstU94h88MWPXP2ektJZ8cZ0YntAmXiE= +github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/gorilla/context v0.0.0-20160226214623-1ea25387ff6f/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= +github.com/gorilla/context v1.1.1 h1:AWwleXJkX/nhcU9bZSnZoi3h/qGYqQAGhq6zZe/aQW8= +github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= +github.com/gorilla/mux v1.6.1/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/mux v1.6.2 h1:Pgr17XVTNXAk3q/r4CpKzC5xBM/qW1uVLV+IhRZpIIk= +github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/gorilla/websocket v1.2.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/gorilla/websocket v1.4.0 h1:WDFjx/TMzVgy9VdMMQi2K2Emtwi2QcUQsztZ/zLaH/Q= +github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.0 h1:Iju5GlWwrvL6UBg4zJJt3btmonfrMlCDdsejg4CZE7c= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= +github.com/grpc-ecosystem/grpc-gateway v1.4.1/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= +github.com/grpc-ecosystem/grpc-gateway v1.5.1 h1:3scN4iuXkNOyP98jF55Lv8a9j1o/IwvnDIZ0LHJK1nk= +github.com/grpc-ecosystem/grpc-gateway v1.5.1/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= +github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/jonboulle/clockwork v0.1.0 h1:VKV+ZcuP6l3yW9doeqz6ziZGgcynBVQO+obU0+0hcPo= +github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/juju/ratelimit v1.0.1/go.mod h1:qapgC/Gy+xNh9UxzV13HGGl/6UXNN+ct+vwSgWNm/qk= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5 h1:2U0HzY8BJ8hVwDKIzp7y4voR9CX/nvcfymLmg2UiOio= +github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= +github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pty v1.0.0/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe h1:W/GaMY0y69G4cFlmsC6B9sbuo2fP8OFP1ABjt4kPz+w= +github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/mattn/go-shellwords v1.0.3/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= +github.com/matttproud/golang_protobuf_extensions v1.0.0/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/montanaflynn/stats v0.0.0-20151014174947-eeaced052adb/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= +github.com/montanaflynn/stats v0.0.0-20180911141734-db72e6cae808 h1:pmpDGKLw4n82EtrNiLqB+xSz/JQwFOaZuMALYUHwX5s= +github.com/montanaflynn/stats v0.0.0-20180911141734-db72e6cae808/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= +github.com/myesui/uuid v1.0.0 h1:xCBmH4l5KuvLYc5L7AS7SZg9/jKdIFubM7OVoLqaQUI= +github.com/myesui/uuid v1.0.0/go.mod h1:2CDfNgU0LR8mIdO8vdWd8i9gWWxLlcoIGGpSNgafq84= +github.com/ngaut/pools v0.0.0-20180318154953-b7bc8c42aac7 h1:7KAv7KMGTTqSmYZtNdcNTgsos+vFzULLwyElndwn+5c= +github.com/ngaut/pools v0.0.0-20180318154953-b7bc8c42aac7/go.mod h1:iWMfgwqYW+e8n5lC/jjNEhwcjbRDpl5NT7n2h+4UNcI= +github.com/ngaut/sync2 v0.0.0-20141008032647-7a24ed77b2ef h1:K0Fn+DoFqNqktdZtdV3bPQ/0cuYh2H4rkg0tytX/07k= +github.com/ngaut/sync2 v0.0.0-20141008032647-7a24ed77b2ef/go.mod h1:7WjlapSfwQyo6LNmIvEWzsW1hbBQfpUO4JWnuQRmva8= +github.com/nicksnyder/go-i18n v1.10.0/go.mod h1:HrK7VCrbOvQoUAQ7Vpy7i87N7JZZZ7R2xBGjv0j365Q= +github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.7.0 h1:WSHQ+IS43OoUrWtD1/bbclrwK8TTH5hzp+umCiuxHgs= +github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/gomega v1.4.2/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.4.3 h1:RE1xgDvH7imwFD45h+u2SgIfERHlS2yNG4DObb5BSKU= +github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/opentracing/basictracer-go v1.0.0 h1:YyUAhaEfjoWXclZVJ9sGoNct7j4TVk7lZWlQw5UXuoo= +github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= +github.com/opentracing/opentracing-go v1.0.2 h1:3jA2P6O1F9UOrWVpwrIo17pu01KWvNWg4X946/Y5Zwg= +github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/pelletier/go-toml v1.3.0/go.mod h1:PN7xzY2wHTK0K9p34ErDQMlFxa51Fk0OUruD3k1mMwo= +github.com/philhofer/fwd v1.0.0 h1:UbZqGr5Y38ApvM/V/jEljVxwocdweyH+vmYvRPBnbqQ= +github.com/philhofer/fwd v1.0.0/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU= +github.com/pingcap/check v0.0.0-20190102082844-67f458068fc8 h1:USx2/E1bX46VG32FIw034Au6seQ2fY9NEILmNh/UlQg= +github.com/pingcap/check v0.0.0-20190102082844-67f458068fc8/go.mod h1:B1+S9LNcuMyLH/4HMTViQOJevkGiik3wW2AN9zb2fNQ= +github.com/pingcap/errcode v0.0.0-20180921232412-a1a7271709d9/go.mod h1:4b2X8xSqxIroj/IZ9MX/VGZhAwc11wB9wRIzHvz6SeM= +github.com/pingcap/errors v0.10.1/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= +github.com/pingcap/errors v0.11.0 h1:DCJQB8jrHbQ1VVlMFIrbj2ApScNNotVmkSNplu2yUt4= +github.com/pingcap/errors v0.11.0/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= +github.com/pingcap/errors v0.11.1 h1:BXFZ6MdDd2U1uJUa2sRAWTmm+nieEzuyYM0R4aUTcC8= +github.com/pingcap/errors v0.11.1/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= +github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= +github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= +github.com/pingcap/failpoint v0.0.0-20190512135322-30cc7431d99c/go.mod h1:DNS3Qg7bEDhU6EXNHF+XSv/PGznQaMJ5FWvctpm6pQI= +github.com/pingcap/gofail v0.0.0-20181217135706-6a951c1e42c3 h1:04yuCf5NMvLU8rB2m4Qs3rynH7EYpMno3lHkewIOdMo= +github.com/pingcap/gofail v0.0.0-20181217135706-6a951c1e42c3/go.mod h1:DazNTg0PTldtpsQiT9I5tVJwV1onHMKBBgXzmJUlMns= +github.com/pingcap/goleveldb v0.0.0-20171020122428-b9ff6c35079e h1:P73/4dPCL96rGrobssy1nVy2VaVpNCuLpCbr+FEaTA8= +github.com/pingcap/goleveldb v0.0.0-20171020122428-b9ff6c35079e/go.mod h1:O17XtbryoCJhkKGbT62+L2OlrniwqiGLSqrmdHCMzZw= +github.com/pingcap/kvproto v0.0.0-20190215154024-7f2fc73ef562 h1:32oF1/8lVnBR2JVcCAnKPQATTOX0+ckRDFpjQk4Ngno= +github.com/pingcap/kvproto v0.0.0-20190215154024-7f2fc73ef562/go.mod h1:QMdbTAXCHzzygQzqcG9uVUgU2fKeSN1GmfMiykdSzzY= +github.com/pingcap/kvproto v0.0.0-20190516013202-4cf58ad90b6c/go.mod h1:QMdbTAXCHzzygQzqcG9uVUgU2fKeSN1GmfMiykdSzzY= +github.com/pingcap/kvproto v0.0.0-20190619024611-a4759dfe3753/go.mod h1:QMdbTAXCHzzygQzqcG9uVUgU2fKeSN1GmfMiykdSzzY= +github.com/pingcap/log v0.0.0-20190214045112-b37da76f67a7/go.mod h1:xsfkWVaFVV5B8e1K9seWfyJWFrIhbtUTAD8NV1Pq3+w= +github.com/pingcap/log v0.0.0-20190307075452-bd41d9273596 h1:t2OQTpPJnrPDGlvA+3FwJptMTt6MEPdzK1Wt99oaefQ= +github.com/pingcap/log v0.0.0-20190307075452-bd41d9273596/go.mod h1:WpHUKhNZ18v116SvGrmjkA9CBhYmuUTKL+p8JC9ANEw= +github.com/pingcap/parser v0.0.0-20190312024907-3f6280b08c8b/go.mod h1:1FNvfp9+J0wvc4kl8eGNh7Rqrxveg15jJoWo/a0uHwA= +github.com/pingcap/parser v0.0.0-20190701123046-5768e68c1e65/go.mod h1:1FNvfp9+J0wvc4kl8eGNh7Rqrxveg15jJoWo/a0uHwA= +github.com/pingcap/pd v0.0.0-20190617100349-293d4b5189bf/go.mod h1:3DlDlFT7EF64A1bmb/tulZb6wbPSagm5G4p1AlhaEDs= +github.com/pingcap/pd v2.1.0-rc.4+incompatible h1:/buwGk04aHO5odk/+O8ZOXGs4qkUjYTJ2UpCJXna8NE= +github.com/pingcap/pd v2.1.0-rc.4+incompatible/go.mod h1:nD3+EoYes4+aNNODO99ES59V83MZSI+dFbhyr667a0E= +github.com/pingcap/tidb v0.0.0-20190321025159-e8299209340c h1:n3i2K6zUzXZDe6imOtdOhWltuqCLFtmLropKwS6ljeI= +github.com/pingcap/tidb v0.0.0-20190321025159-e8299209340c/go.mod h1:FcgD4o1kq3YNk08MWtMRwNZXQJpM28bFdb/go9KpmEA= +github.com/pingcap/tidb v0.0.0-20190703092821-755875aacb5a h1:YfYdeUJC7LwGt2HYAWqtOuNAidYIg6uKPYWpNe+Px3s= +github.com/pingcap/tidb v0.0.0-20190703092821-755875aacb5a/go.mod h1:DU3S1YEJN8b1BookBt3g27hljItkONKZSJR+Bu/C/9g= +github.com/pingcap/tidb-tools v2.1.3-0.20190116051332-34c808eef588+incompatible h1:e9Gi/LP9181HT3gBfSOeSBA+5JfemuE4aEAhqNgoE4k= +github.com/pingcap/tidb-tools v2.1.3-0.20190116051332-34c808eef588+incompatible/go.mod h1:XGdcy9+yqlDSEMTpOXnwf3hiTeqrV6MN/u1se9N8yIM= +github.com/pingcap/tidb-tools v2.1.3-0.20190321065848-1e8b48f5c168+incompatible/go.mod h1:XGdcy9+yqlDSEMTpOXnwf3hiTeqrV6MN/u1se9N8yIM= +github.com/pingcap/tipb v0.0.0-20190107072121-abbec73437b7 h1:wnjdQRhybddDesBVBKyOLUPgDaOFdtqA92pduBgWvVQ= +github.com/pingcap/tipb v0.0.0-20190107072121-abbec73437b7/go.mod h1:RtkHW8WbcNxj8lsbzjaILci01CtYnYbIkQhjyZWrWVI= +github.com/pingcap/tipb v0.0.0-20190428032612-535e1abaa330 h1:rRMLMjIMFulCX9sGKZ1hoov/iROMsKyC8Snc02nSukw= +github.com/pingcap/tipb v0.0.0-20190428032612-535e1abaa330/go.mod h1:RtkHW8WbcNxj8lsbzjaILci01CtYnYbIkQhjyZWrWVI= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pquerna/ffjson v0.0.0-20181028064349-e517b90714f7 h1:gGBSHPOU7g8YjTbhwn+lvFm2VDEhhA+PwDIlstkgSxE= +github.com/pquerna/ffjson v0.0.0-20181028064349-e517b90714f7/go.mod h1:YARuvh7BUWHNhzDq2OM5tzR2RiCcN2D7sapiKyCel/M= +github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.9.0 h1:tXuTFVHC03mW0D+Ua1Q2d1EAVqLTuggX50V0VLICCzY= +github.com/prometheus/client_golang v0.9.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_model v0.0.0-20170216185247-6f3806018612/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20171117100541-99fa1f4be8e5/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910 h1:idejC8f05m9MGOsuEi1ATq9shN03HrxNkD/luQvxCv8= +github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/common v0.0.0-20180518154759-7600349dcfe1/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.0.0-20181020173914-7e9e6cabbd39 h1:Cto4X6SVMWRPBkJ/3YHn1iDGDGc/Z+sW+AEMKHMVvN4= +github.com/prometheus/common v0.0.0-20181020173914-7e9e6cabbd39/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/procfs v0.0.0-20180612222113-7d6f385de8be/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d h1:GoAlyOgbOEIFdaDqxJVlbOQ1DtGmZWs/Qau0hIlk+WQ= +github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/remyoudompheng/bigfft v0.0.0-20170806203942-52369c62f446 h1:/NRJ5vAYoqz+7sG51ubIDHXeWO8DlTSrToPu6q11ziA= +github.com/remyoudompheng/bigfft v0.0.0-20170806203942-52369c62f446/go.mod h1:uYEyJGbgTkfkS4+E/PavXkNJcbFIpEtjt2B0KDQ5+9M= +github.com/remyoudompheng/bigfft v0.0.0-20190512091148-babf20351dd7 h1:FUL3b97ZY2EPqg2NbXKuMHs5pXJB9hjj1fDHnF2vl28= +github.com/remyoudompheng/bigfft v0.0.0-20190512091148-babf20351dd7/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= +github.com/sergi/go-diff v1.0.1-0.20180205163309-da645544ed44/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= +github.com/shirou/gopsutil v2.18.10+incompatible h1:cy84jW6EVRPa5g9HAHrlbxMSIjBhDSX0OFYyMYminYs= +github.com/shirou/gopsutil v2.18.10+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= +github.com/shurcooL/httpfs v0.0.0-20171119174359-809beceb2371/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg= +github.com/shurcooL/vfsgen v0.0.0-20181020040650-a97a25d856ca/go.mod h1:TrYk7fJVaAttu97ZZKrO9UbRa8izdowaMIZcxYMbVaw= +github.com/sirupsen/logrus v1.0.5/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= +github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.3.0 h1:hI/7Q+DtNZ2kINb6qt/lS+IyXnHQe9e90POfeewL/ME= +github.com/sirupsen/logrus v1.3.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/soheilhy/cmux v0.1.4 h1:0HKaf1o97UwFjHH9o5XsHUOF+tqmdA7KEzXLpiyaw0E= +github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72 h1:qLC7fQah7D6K1B0ujays3HV9gkFtllcxhzImRR7ArPQ= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= +github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/struCoder/pidusage v0.1.2/go.mod h1:pWBlW3YuSwRl6h7R5KbvA4N8oOqe9LjaKW5CwT1SPjI= +github.com/syndtr/goleveldb v0.0.0-20180815032940-ae2bd5eed72d/go.mod h1:Z4AUp2Km+PwemOoO/VB5AOx9XSsIItzFjoJlOSiYmn0= +github.com/tiancaiamao/appdash v0.0.0-20181126055449-889f96f722a2/go.mod h1:2PfKggNGDuadAa0LElHrByyrz4JPZ9fFx6Gs7nx7ZZU= +github.com/tinylib/msgp v1.1.0 h1:9fQd+ICuRIu/ue4vxJZu6/LzxN0HwMds2nq/0cFvxHU= +github.com/tinylib/msgp v1.1.0/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE= +github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tmc/grpc-websocket-proxy v0.0.0-20171017195756-830351dc03c6 h1:lYIiVDtZnyTWlNwiAxLj0bbpTcx1BWCFhXjfsvmPdNc= +github.com/tmc/grpc-websocket-proxy v0.0.0-20171017195756-830351dc03c6/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/twinj/uuid v1.0.0 h1:fzz7COZnDrXGTAOHGuUGYd6sG+JMq+AoE7+Jlu0przk= +github.com/twinj/uuid v1.0.0/go.mod h1:mMgcE1RHFUFqe5AfiwlINXisXfDGro23fWdPUfOMjRY= +github.com/uber-go/atomic v1.3.2 h1:Azu9lPBWRNKzYXSIwRfgRuDuS0YKsK4NFhiQv98gkxo= +github.com/uber-go/atomic v1.3.2/go.mod h1:/Ct5t2lcmbJ4OSe/waGBoaVvVqtO0bmtfVNex1PFV8g= +github.com/uber/jaeger-client-go v2.15.0+incompatible h1:NP3qsSqNxh8VYr956ur1N/1C1PjvOJnJykCzcD5QHbk= +github.com/uber/jaeger-client-go v2.15.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= +github.com/uber/jaeger-lib v1.5.0 h1:OHbgr8l656Ub3Fw5k9SWnBfIEwvoHQ+W2y+Aa9D1Uyo= +github.com/uber/jaeger-lib v1.5.0/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= +github.com/ugorji/go v0.0.0-20171019201919-bdcc60b419d1 h1:UvhxfNjNqlZ/x3cDyqxMhoiUpemd3zXkVQApN6bM/lg= +github.com/ugorji/go v0.0.0-20171019201919-bdcc60b419d1/go.mod h1:hnLbHMwcvSihnDhEfx2/BzKp2xb0Y+ErdfYcrs9tkJQ= +github.com/ugorji/go v1.1.2/go.mod h1:hnLbHMwcvSihnDhEfx2/BzKp2xb0Y+ErdfYcrs9tkJQ= +github.com/ugorji/go/codec v0.0.0-20190204201341-e444a5086c43/go.mod h1:iT03XoTwV7xq/+UGwKO3UbC1nNNlopQiY61beSdrtOA= +github.com/unrolled/render v0.0.0-20171102162132-65450fb6b2d3/go.mod h1:tu82oB5W2ykJRVioYsB+IQKcft7ryBr7w12qMBUPyXg= +github.com/unrolled/render v0.0.0-20180914162206-b9786414de4d h1:ggUgChAeyge4NZ4QUw6lhHsVymzwSDJOZcE0s2X8S20= +github.com/unrolled/render v0.0.0-20180914162206-b9786414de4d/go.mod h1:tu82oB5W2ykJRVioYsB+IQKcft7ryBr7w12qMBUPyXg= +github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= +github.com/urfave/negroni v0.3.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= +github.com/xiang90/probing v0.0.0-20160813154853-07dd2e8dfe18 h1:MPPkRncZLN9Kh4MEFmbnK4h3BD7AUmskWv2+EeZJCCs= +github.com/xiang90/probing v0.0.0-20160813154853-07dd2e8dfe18/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= +github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= +github.com/yookoala/realpath v1.0.0/go.mod h1:gJJMA9wuX7AcqLy1+ffPatSCySA1FQ2S8Ya9AIoYBpE= +go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.etcd.io/etcd v0.0.0-20190320044326-77d4b742cdbf/go.mod h1:KSGwdbiFchh5KIC9My2+ZVl5/3ANcwohw50dpPwa2cw= +go.uber.org/atomic v1.3.2 h1:2Oa65PReHzfn29GpvgsYwloV9AVFHPDk8tYxt2c2tr4= +go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/multierr v1.1.0 h1:HoEmRHQPVSqub6w2z2d2EOVs2fjyFRGyofhKuyDq0QI= +go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/zap v1.9.1 h1:XCJQEf3W6eZaVwhRBof6ImoYGJSITeKWsyeh3HFu/5o= +go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +golang.org/x/crypto v0.0.0-20180608092829-8ac0e0d97ce4/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793 h1:u+LnwYTOOW7Ukr/fppxEb1Nwz0AtPflrblfvUudpo+I= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181106065722-10aee1819953/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e h1:bRhVy7zSSasaqNksaRZiA5EEI+Ei4I1nO5Jh72wfHlg= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4 h1:YUO/7uOKsKeq9UokNS62b8FYywz3ker1l1vDZRCRefw= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190109145017-48ac38b7c8cb h1:1w588/yEchbPNpa9sEvOcMZYbWHedwJjg4VOAdDHWHk= +golang.org/x/sys v0.0.0-20190109145017-48ac38b7c8cb/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2 h1:z99zHgr7hKfrUcX/KsoJk5FJfjTceCKIp96+biqP4To= +golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20181108054448-85acf8d2951c h1:fqgJT0MGcGpPgpWU7VRdRjuArfcOvC4AoJmILihzhDg= +golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190130214255-bb1329dc71a0 h1:iRpjPej1fPzmfoBhMFkp3HdqzF+ytPmAwiQhJGV0zGw= +golang.org/x/tools v0.0.0-20190130214255-bb1329dc71a0/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/genproto v0.0.0-20180608181217-32ee49c4dd80/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20181004005441-af9cb2a35e7f/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190108161440-ae2f86662275 h1:9oFlwfEGIvmxXTcY53ygNyxIQtWciRHjrnUvZJCYXYU= +google.golang.org/genproto v0.0.0-20190108161440-ae2f86662275/go.mod h1:7Ep/1NZk928CDR8SjdVbjWNpdIf6nzjE3BTgJDr2Atg= +google.golang.org/grpc v0.0.0-20180607172857-7a6a684ca69e/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= +google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= +google.golang.org/grpc v1.16.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio= +google.golang.org/grpc v1.17.0 h1:TRJYBgMclJvGYn2rIMjj+h9KtMt5r1Ij7ODVRIZkwhk= +google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= +gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= +gopkg.in/alecthomas/gometalinter.v2 v2.0.12/go.mod h1:NDRytsqEZyolNuAgTzJkZMkSQM7FIKyzVzGhjB/qfYo= +gopkg.in/alecthomas/kingpin.v3-unstable v3.0.0-20180810215634-df19058c872c/go.mod h1:3HH7i1SgMqlzxCcBmUHW657sD4Kvv9sC3HpL3YukzwA= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= +gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= +gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8= +gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= +gopkg.in/stretchr/testify.v1 v1.2.2 h1:yhQC6Uy5CqibAIlk1wlusa/MJ3iAN49/BsR/dCCKz3M= +gopkg.in/stretchr/testify.v1 v1.2.2/go.mod h1:QI5V/q6UbPmuhtm10CaFZxED9NreB8PnFYN9JcR6TxU= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +sourcegraph.com/sourcegraph/appdash v0.0.0-20180531100431-4c381bd170b4 h1:VO9oZbbkvTwqLimlQt15QNdOOBArT2dw/bvzsMZBiqQ= +sourcegraph.com/sourcegraph/appdash v0.0.0-20180531100431-4c381bd170b4/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= +sourcegraph.com/sourcegraph/appdash-data v0.0.0-20151005221446-73f23eafcf67/go.mod h1:L5q+DGLGOQFpo1snNEkLOJT2d1YTW66rWNzatr3He1k= diff --git a/vendor/github.com/pingcap/parser/lexer.go b/vendor/github.com/pingcap/parser/lexer.go new file mode 100644 index 0000000..3adfb47 --- /dev/null +++ b/vendor/github.com/pingcap/parser/lexer.go @@ -0,0 +1,869 @@ +// Copyright 2016 PingCAP, Inc. +// +// 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package parser + +import ( + "bytes" + "fmt" + "strconv" + "strings" + "unicode" + "unicode/utf8" + + "github.com/pingcap/parser/mysql" +) + +var _ = yyLexer(&Scanner{}) + +// Pos represents the position of a token. +type Pos struct { + Line int + Col int + Offset int +} + +// Scanner implements the yyLexer interface. +type Scanner struct { + r reader + buf bytes.Buffer + + errs []error + warns []error + stmtStartPos int + + // For scanning such kind of comment: /*! MySQL-specific code */ or /*+ optimizer hint */ + specialComment specialCommentScanner + + sqlMode mysql.SQLMode + + // If the lexer should recognize keywords for window function. + // It may break the compatibility when support those keywords, + // because some application may already use them as identifiers. + supportWindowFunc bool + + // lastScanOffset indicates last offset returned by scan(). + // It's used to substring sql in syntax error message. + lastScanOffset int +} + +type specialCommentScanner interface { + stmtTexter + scan() (tok int, pos Pos, lit string) +} + +type mysqlSpecificCodeScanner struct { + *Scanner + Pos +} + +func (s *mysqlSpecificCodeScanner) scan() (tok int, pos Pos, lit string) { + tok, pos, lit = s.Scanner.scan() + pos.Line += s.Pos.Line + pos.Col += s.Pos.Col + pos.Offset += s.Pos.Offset + return +} + +type optimizerHintScanner struct { + *Scanner + Pos + end bool +} + +func (s *optimizerHintScanner) scan() (tok int, pos Pos, lit string) { + tok, pos, lit = s.Scanner.scan() + pos.Line += s.Pos.Line + pos.Col += s.Pos.Col + pos.Offset += s.Pos.Offset + switch tok { + case 0: + if !s.end { + tok = hintEnd + s.end = true + } + case invalid: + // an optimizer hint is allowed to contain invalid characters, the + // remaining hints are just ignored. + // force advance the lexer even when encountering an invalid character + // to prevent infinite parser loop. (see issue #336) + s.r.inc() + } + return +} + +// Errors returns the errors and warns during a scan. +func (s *Scanner) Errors() (warns []error, errs []error) { + return s.warns, s.errs +} + +// reset resets the sql string to be scanned. +func (s *Scanner) reset(sql string) { + s.r = reader{s: sql, p: Pos{Line: 1}} + s.buf.Reset() + s.errs = s.errs[:0] + s.warns = s.warns[:0] + s.stmtStartPos = 0 + s.specialComment = nil +} + +func (s *Scanner) stmtText() string { + if s.specialComment != nil { + return s.specialComment.stmtText() + } + + endPos := s.r.pos().Offset + if s.r.s[endPos-1] == '\n' { + endPos = endPos - 1 // trim new line + } + if s.r.s[s.stmtStartPos] == '\n' { + s.stmtStartPos++ + } + + text := s.r.s[s.stmtStartPos:endPos] + + s.stmtStartPos = endPos + return text +} + +// Errorf tells scanner something is wrong. +// Scanner satisfies yyLexer interface which need this function. +func (s *Scanner) Errorf(format string, a ...interface{}) (err error) { + str := fmt.Sprintf(format, a...) + val := s.r.s[s.lastScanOffset:] + var lenStr = "" + if len(val) > 2048 { + lenStr = "(total length " + strconv.Itoa(len(val)) + ")" + val = val[:2048] + } + err = fmt.Errorf("line %d column %d near \"%s\"%s %s", + s.r.p.Line, s.r.p.Col, val, str, lenStr) + return +} + +// AppendError sets error into scanner. +// Scanner satisfies yyLexer interface which need this function. +func (s *Scanner) AppendError(err error) { + if err == nil { + return + } + s.errs = append(s.errs, err) +} + +// Lex returns a token and store the token value in v. +// Scanner satisfies yyLexer interface. +// 0 and invalid are special token id this function would return: +// return 0 tells parser that scanner meets EOF, +// return invalid tells parser that scanner meets illegal character. +func (s *Scanner) Lex(v *yySymType) int { + tok, pos, lit := s.scan() + s.lastScanOffset = pos.Offset + v.offset = pos.Offset + v.ident = lit + if tok == identifier { + tok = handleIdent(v) + } + if tok == identifier { + if tok1 := s.isTokenIdentifier(lit, pos.Offset); tok1 != 0 { + tok = tok1 + } + } + if s.sqlMode.HasANSIQuotesMode() && + tok == stringLit && + s.r.s[v.offset] == '"' { + tok = identifier + } + + if tok == pipes && !(s.sqlMode.HasPipesAsConcatMode()) { + return pipesAsOr + } + + if tok == not && s.sqlMode.HasHighNotPrecedenceMode() { + return not2 + } + + switch tok { + case intLit: + return toInt(s, v, lit) + case floatLit: + return toFloat(s, v, lit) + case decLit: + return toDecimal(s, v, lit) + case hexLit: + return toHex(s, v, lit) + case bitLit: + return toBit(s, v, lit) + case singleAtIdentifier, doubleAtIdentifier, cast, extract: + v.item = lit + return tok + case null: + v.item = nil + case quotedIdentifier: + tok = identifier + } + + if tok == unicode.ReplacementChar { + return invalid + } + + return tok +} + +// SetSQLMode sets the SQL mode for scanner. +func (s *Scanner) SetSQLMode(mode mysql.SQLMode) { + s.sqlMode = mode +} + +// GetSQLMode return the SQL mode of scanner. +func (s *Scanner) GetSQLMode() mysql.SQLMode { + return s.sqlMode +} + +// EnableWindowFunc controls whether the scanner recognize the keywords of window function. +func (s *Scanner) EnableWindowFunc(val bool) { + s.supportWindowFunc = val +} + +// InheritScanner returns a new scanner object which inherits configurations from the parent scanner. +func (s *Scanner) InheritScanner(sql string) *Scanner { + return &Scanner{ + r: reader{s: sql}, + sqlMode: s.sqlMode, + supportWindowFunc: s.supportWindowFunc, + } +} + +// NewScanner returns a new scanner object. +func NewScanner(s string) *Scanner { + return &Scanner{r: reader{s: s}} +} + +func (s *Scanner) skipWhitespace() rune { + return s.r.incAsLongAs(unicode.IsSpace) +} + +func (s *Scanner) scan() (tok int, pos Pos, lit string) { + if s.specialComment != nil { + // Enter specialComment scan mode. + // for scanning such kind of comment: /*! MySQL-specific code */ + specialComment := s.specialComment + tok, pos, lit = specialComment.scan() + if tok != 0 { + // return the specialComment scan result as the result + return + } + // leave specialComment scan mode after all stream consumed. + s.specialComment = nil + } + + ch0 := s.r.peek() + if unicode.IsSpace(ch0) { + ch0 = s.skipWhitespace() + } + pos = s.r.pos() + if s.r.eof() { + // when scanner meets EOF, the returned token should be 0, + // because 0 is a special token id to remind the parser that stream is end. + return 0, pos, "" + } + + if !s.r.eof() && isIdentExtend(ch0) { + return scanIdentifier(s) + } + + // search a trie to get a token. + node := &ruleTable + for ch0 >= 0 && ch0 <= 255 { + if node.childs[ch0] == nil || s.r.eof() { + break + } + node = node.childs[ch0] + if node.fn != nil { + return node.fn(s) + } + s.r.inc() + ch0 = s.r.peek() + } + + tok, lit = node.token, s.r.data(&pos) + return +} + +func startWithXx(s *Scanner) (tok int, pos Pos, lit string) { + pos = s.r.pos() + s.r.inc() + if s.r.peek() == '\'' { + s.r.inc() + s.scanHex() + if s.r.peek() == '\'' { + s.r.inc() + tok, lit = hexLit, s.r.data(&pos) + } else { + tok = unicode.ReplacementChar + } + return + } + s.r.incAsLongAs(isIdentChar) + tok, lit = identifier, s.r.data(&pos) + return +} + +func startWithNn(s *Scanner) (tok int, pos Pos, lit string) { + tok, pos, lit = scanIdentifier(s) + // The National Character Set, N'some text' or n'some test'. + // See https://dev.mysql.com/doc/refman/5.7/en/string-literals.html + // and https://dev.mysql.com/doc/refman/5.7/en/charset-national.html + if lit == "N" || lit == "n" { + if s.r.peek() == '\'' { + tok = underscoreCS + lit = "utf8" + } + } + return +} + +func startWithBb(s *Scanner) (tok int, pos Pos, lit string) { + pos = s.r.pos() + s.r.inc() + if s.r.peek() == '\'' { + s.r.inc() + s.scanBit() + if s.r.peek() == '\'' { + s.r.inc() + tok, lit = bitLit, s.r.data(&pos) + } else { + tok = unicode.ReplacementChar + } + return + } + s.r.incAsLongAs(isIdentChar) + tok, lit = identifier, s.r.data(&pos) + return +} + +func startWithSharp(s *Scanner) (tok int, pos Pos, lit string) { + s.r.incAsLongAs(func(ch rune) bool { + return ch != '\n' + }) + return s.scan() +} + +func startWithDash(s *Scanner) (tok int, pos Pos, lit string) { + pos = s.r.pos() + if strings.HasPrefix(s.r.s[pos.Offset:], "--") { + remainLen := len(s.r.s[pos.Offset:]) + if remainLen == 2 || (remainLen > 2 && unicode.IsSpace(rune(s.r.s[pos.Offset+2]))) { + s.r.incAsLongAs(func(ch rune) bool { + return ch != '\n' + }) + return s.scan() + } + } + if strings.HasPrefix(s.r.s[pos.Offset:], "->>") { + tok = juss + s.r.incN(3) + return + } + if strings.HasPrefix(s.r.s[pos.Offset:], "->") { + tok = jss + s.r.incN(2) + return + } + tok = int('-') + lit = "-" + s.r.inc() + return +} + +func startWithSlash(s *Scanner) (tok int, pos Pos, lit string) { + pos = s.r.pos() + s.r.inc() + ch0 := s.r.peek() + if ch0 == '*' { + s.r.inc() + startWithAsterisk := false + for { + ch0 = s.r.readByte() + if startWithAsterisk && ch0 == '/' { + // Meets */, means comment end. + break + } else if ch0 == '*' { + startWithAsterisk = true + } else { + startWithAsterisk = false + } + + if ch0 == unicode.ReplacementChar && s.r.eof() { + // unclosed comment + s.errs = append(s.errs, ParseErrorWith(s.r.data(&pos), s.r.p.Line)) + return + } + + } + + comment := s.r.data(&pos) + + // See https://dev.mysql.com/doc/refman/5.7/en/optimizer-hints.html + if strings.HasPrefix(comment, "/*+") { + begin := sqlOffsetInComment(comment) + end := len(comment) - 2 + sql := comment[begin:end] + s.specialComment = &optimizerHintScanner{ + Scanner: s.InheritScanner(sql), + Pos: Pos{ + pos.Line, + pos.Col, + pos.Offset + begin, + }, + } + + tok = hintBegin + return + } + + // See http://dev.mysql.com/doc/refman/5.7/en/comments.html + // Convert "/*!VersionNumber MySQL-specific-code */" to "MySQL-specific-code". + if strings.HasPrefix(comment, "/*!") { + sql := specCodePattern.ReplaceAllStringFunc(comment, TrimComment) + s.specialComment = &mysqlSpecificCodeScanner{ + Scanner: s.InheritScanner(sql), + Pos: Pos{ + pos.Line, + pos.Col, + pos.Offset + sqlOffsetInComment(comment), + }, + } + } + + return s.scan() + } + tok = int('/') + return +} + +func sqlOffsetInComment(comment string) int { + // find the first SQL token offset in pattern like "/*!40101 mysql specific code */" + offset := 0 + for i := 0; i < len(comment); i++ { + if unicode.IsSpace(rune(comment[i])) { + offset = i + break + } + } + for offset < len(comment) { + offset++ + if !unicode.IsSpace(rune(comment[offset])) { + break + } + } + return offset +} + +func startWithAt(s *Scanner) (tok int, pos Pos, lit string) { + pos = s.r.pos() + s.r.inc() + + tok, lit = scanIdentifierOrString(s) + switch tok { + case '@': + s.r.inc() + stream := s.r.s[pos.Offset+2:] + var prefix string + for _, v := range []string{"global.", "session.", "local."} { + if len(v) > len(stream) { + continue + } + if strings.EqualFold(stream[:len(v)], v) { + prefix = v + s.r.incN(len(v)) + break + } + } + tok, lit = scanIdentifierOrString(s) + switch tok { + case stringLit, quotedIdentifier: + tok, lit = doubleAtIdentifier, "@@"+prefix+lit + case identifier: + tok, lit = doubleAtIdentifier, s.r.data(&pos) + } + case unicode.ReplacementChar: + break + default: + tok = singleAtIdentifier + } + + return +} + +func scanIdentifier(s *Scanner) (int, Pos, string) { + pos := s.r.pos() + s.r.inc() + s.r.incAsLongAs(isIdentChar) + return identifier, pos, s.r.data(&pos) +} + +func scanIdentifierOrString(s *Scanner) (tok int, lit string) { + ch1 := s.r.peek() + switch ch1 { + case '\'', '"': + tok, _, lit = startString(s) + case '`': + tok, _, lit = scanQuotedIdent(s) + default: + if isUserVarChar(ch1) { + pos := s.r.pos() + s.r.incAsLongAs(isUserVarChar) + tok, lit = identifier, s.r.data(&pos) + } else { + tok = int(ch1) + } + } + return +} + +var ( + quotedIdentifier = -identifier +) + +func scanQuotedIdent(s *Scanner) (tok int, pos Pos, lit string) { + pos = s.r.pos() + s.r.inc() + s.buf.Reset() + for { + ch := s.r.readByte() + if ch == unicode.ReplacementChar && s.r.eof() { + tok = unicode.ReplacementChar + return + } + if ch == '`' { + if s.r.peek() != '`' { + // don't return identifier in case that it's interpreted as keyword token later. + tok, lit = quotedIdentifier, s.buf.String() + return + } + s.r.inc() + } + s.buf.WriteRune(ch) + } +} + +func startString(s *Scanner) (tok int, pos Pos, lit string) { + return s.scanString() +} + +// lazyBuf is used to avoid allocation if possible. +// it has a useBuf field indicates whether bytes.Buffer is necessary. if +// useBuf is false, we can avoid calling bytes.Buffer.String(), which +// make a copy of data and cause allocation. +type lazyBuf struct { + useBuf bool + r *reader + b *bytes.Buffer + p *Pos +} + +func (mb *lazyBuf) setUseBuf(str string) { + if !mb.useBuf { + mb.useBuf = true + mb.b.Reset() + mb.b.WriteString(str) + } +} + +func (mb *lazyBuf) writeRune(r rune, w int) { + if mb.useBuf { + if w > 1 { + mb.b.WriteRune(r) + } else { + mb.b.WriteByte(byte(r)) + } + } +} + +func (mb *lazyBuf) data() string { + var lit string + if mb.useBuf { + lit = mb.b.String() + } else { + lit = mb.r.data(mb.p) + lit = lit[1 : len(lit)-1] + } + return lit +} + +func (s *Scanner) scanString() (tok int, pos Pos, lit string) { + tok, pos = stringLit, s.r.pos() + mb := lazyBuf{false, &s.r, &s.buf, &pos} + ending := s.r.readByte() + ch0 := s.r.peek() + for !s.r.eof() { + if ch0 == ending { + s.r.inc() + if s.r.peek() != ending { + lit = mb.data() + return + } + str := mb.r.data(&pos) + mb.setUseBuf(str[1 : len(str)-1]) + } else if ch0 == '\\' && !s.sqlMode.HasNoBackslashEscapesMode() { + mb.setUseBuf(mb.r.data(&pos)[1:]) + ch0 = handleEscape(s) + } + mb.writeRune(ch0, s.r.w) + if !s.r.eof() { + s.r.inc() + ch0 = s.r.peek() + } + } + + tok = unicode.ReplacementChar + return +} + +// handleEscape handles the case in scanString when previous char is '\'. +func handleEscape(s *Scanner) rune { + s.r.inc() + ch0 := s.r.peek() + /* + \" \' \\ \n \0 \b \Z \r \t ==> escape to one char + \% \_ ==> preserve both char + other ==> remove \ + */ + switch ch0 { + case 'n': + ch0 = '\n' + case '0': + ch0 = 0 + case 'b': + ch0 = 8 + case 'Z': + ch0 = 26 + case 'r': + ch0 = '\r' + case 't': + ch0 = '\t' + case '%', '_': + s.buf.WriteByte('\\') + } + return ch0 +} + +func startWithNumber(s *Scanner) (tok int, pos Pos, lit string) { + pos = s.r.pos() + tok = intLit + ch0 := s.r.readByte() + if ch0 == '0' { + tok = intLit + ch1 := s.r.peek() + switch { + case ch1 >= '0' && ch1 <= '7': + s.r.inc() + s.scanOct() + case ch1 == 'x' || ch1 == 'X': + s.r.inc() + p1 := s.r.pos() + s.scanHex() + p2 := s.r.pos() + // 0x, 0x7fz3 are identifier + if p1 == p2 || isDigit(s.r.peek()) { + s.r.incAsLongAs(isIdentChar) + return identifier, pos, s.r.data(&pos) + } + tok = hexLit + case ch1 == 'b': + s.r.inc() + p1 := s.r.pos() + s.scanBit() + p2 := s.r.pos() + // 0b, 0b123, 0b1ab are identifier + if p1 == p2 || isDigit(s.r.peek()) { + s.r.incAsLongAs(isIdentChar) + return identifier, pos, s.r.data(&pos) + } + tok = bitLit + case ch1 == '.': + return s.scanFloat(&pos) + case ch1 == 'B': + s.r.incAsLongAs(isIdentChar) + return identifier, pos, s.r.data(&pos) + } + } + + s.scanDigits() + ch0 = s.r.peek() + if ch0 == '.' || ch0 == 'e' || ch0 == 'E' { + return s.scanFloat(&pos) + } + + // Identifiers may begin with a digit but unless quoted may not consist solely of digits. + if !s.r.eof() && isIdentChar(ch0) { + s.r.incAsLongAs(isIdentChar) + return identifier, pos, s.r.data(&pos) + } + lit = s.r.data(&pos) + return +} + +func startWithDot(s *Scanner) (tok int, pos Pos, lit string) { + pos = s.r.pos() + s.r.inc() + save := s.r.pos() + if isDigit(s.r.peek()) { + tok, _, lit = s.scanFloat(&pos) + if s.r.eof() || !isIdentChar(s.r.peek()) { + return + } + // Fail to parse a float, reset to dot. + s.r.p = save + } + tok, lit = int('.'), "." + return +} + +func (s *Scanner) scanOct() { + s.r.incAsLongAs(func(ch rune) bool { + return ch >= '0' && ch <= '7' + }) +} + +func (s *Scanner) scanHex() { + s.r.incAsLongAs(func(ch rune) bool { + return ch >= '0' && ch <= '9' || + ch >= 'a' && ch <= 'f' || + ch >= 'A' && ch <= 'F' + }) +} + +func (s *Scanner) scanBit() { + s.r.incAsLongAs(func(ch rune) bool { + return ch == '0' || ch == '1' + }) +} + +func (s *Scanner) scanFloat(beg *Pos) (tok int, pos Pos, lit string) { + s.r.p = *beg + // float = D1 . D2 e D3 + s.scanDigits() + ch0 := s.r.peek() + if ch0 == '.' { + s.r.inc() + s.scanDigits() + ch0 = s.r.peek() + } + if ch0 == 'e' || ch0 == 'E' { + s.r.inc() + ch0 = s.r.peek() + if ch0 == '-' || ch0 == '+' || isDigit(ch0) { + s.r.inc() + s.scanDigits() + tok = floatLit + } else { + // D1 . D2 e XX when XX is not D3, parse the result to an identifier. + // 9e9e = 9e9(float) + e(identifier) + // 9est = 9est(identifier) + s.r.incAsLongAs(isIdentChar) + tok = identifier + } + } else { + tok = decLit + } + pos, lit = *beg, s.r.data(beg) + return +} + +func (s *Scanner) scanDigits() string { + pos := s.r.pos() + s.r.incAsLongAs(isDigit) + return s.r.data(&pos) +} + +type reader struct { + s string + p Pos + w int +} + +var eof = Pos{-1, -1, -1} + +func (r *reader) eof() bool { + return r.p.Offset >= len(r.s) +} + +// peek() peeks a rune from underlying reader. +// if reader meets EOF, it will return unicode.ReplacementChar. to distinguish from +// the real unicode.ReplacementChar, the caller should call r.eof() again to check. +func (r *reader) peek() rune { + if r.eof() { + return unicode.ReplacementChar + } + v, w := rune(r.s[r.p.Offset]), 1 + switch { + case v == 0: + r.w = w + return v // illegal UTF-8 encoding + case v >= 0x80: + v, w = utf8.DecodeRuneInString(r.s[r.p.Offset:]) + if v == utf8.RuneError && w == 1 { + v = rune(r.s[r.p.Offset]) // illegal UTF-8 encoding + } + } + r.w = w + return v +} + +// inc increase the position offset of the reader. +// peek must be called before calling inc! +func (r *reader) inc() { + if r.s[r.p.Offset] == '\n' { + r.p.Line++ + r.p.Col = 0 + } + r.p.Offset += r.w + r.p.Col++ +} + +func (r *reader) incN(n int) { + for i := 0; i < n; i++ { + r.inc() + } +} + +func (r *reader) readByte() (ch rune) { + ch = r.peek() + if ch == unicode.ReplacementChar && r.eof() { + return + } + r.inc() + return +} + +func (r *reader) pos() Pos { + return r.p +} + +func (r *reader) data(from *Pos) string { + return r.s[from.Offset:r.p.Offset] +} + +func (r *reader) incAsLongAs(fn func(rune) bool) rune { + for { + ch := r.peek() + if !fn(ch) { + return ch + } + if ch == unicode.ReplacementChar && r.eof() { + return 0 + } + r.inc() + } +} diff --git a/vendor/github.com/pingcap/parser/misc.go b/vendor/github.com/pingcap/parser/misc.go new file mode 100644 index 0000000..92b74ee --- /dev/null +++ b/vendor/github.com/pingcap/parser/misc.go @@ -0,0 +1,787 @@ +// Copyright 2016 PingCAP, Inc. +// +// 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package parser + +import ( + "strings" + + "github.com/pingcap/parser/charset" +) + +func isLetter(ch rune) bool { + return (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') +} + +func isDigit(ch rune) bool { + return ch >= '0' && ch <= '9' +} + +func isIdentChar(ch rune) bool { + return isLetter(ch) || isDigit(ch) || ch == '_' || ch == '$' || isIdentExtend(ch) +} + +func isIdentExtend(ch rune) bool { + return ch >= 0x80 && ch <= '\uffff' +} + +func isUserVarChar(ch rune) bool { + return isLetter(ch) || isDigit(ch) || ch == '_' || ch == '$' || ch == '.' || isIdentExtend(ch) +} + +type trieNode struct { + childs [256]*trieNode + token int + fn func(s *Scanner) (int, Pos, string) +} + +var ruleTable trieNode + +func initTokenByte(c byte, tok int) { + if ruleTable.childs[c] == nil { + ruleTable.childs[c] = &trieNode{} + } + ruleTable.childs[c].token = tok +} + +func initTokenString(str string, tok int) { + node := &ruleTable + for _, c := range str { + if node.childs[c] == nil { + node.childs[c] = &trieNode{} + } + node = node.childs[c] + } + node.token = tok +} + +func initTokenFunc(str string, fn func(s *Scanner) (int, Pos, string)) { + for i := 0; i < len(str); i++ { + c := str[i] + if ruleTable.childs[c] == nil { + ruleTable.childs[c] = &trieNode{} + } + ruleTable.childs[c].fn = fn + } + return +} + +func init() { + // invalid is a special token defined in parser.y, when parser meet + // this token, it will throw an error. + // set root trie node's token to invalid, so when input match nothing + // in the trie, invalid will be the default return token. + ruleTable.token = invalid + initTokenByte('*', int('*')) + initTokenByte('/', int('/')) + initTokenByte('+', int('+')) + initTokenByte('>', int('>')) + initTokenByte('<', int('<')) + initTokenByte('(', int('(')) + initTokenByte(')', int(')')) + initTokenByte('[', int('[')) + initTokenByte(']', int(']')) + initTokenByte(';', int(';')) + initTokenByte(',', int(',')) + initTokenByte('&', int('&')) + initTokenByte('%', int('%')) + initTokenByte(':', int(':')) + initTokenByte('|', int('|')) + initTokenByte('!', int('!')) + initTokenByte('^', int('^')) + initTokenByte('~', int('~')) + initTokenByte('\\', int('\\')) + initTokenByte('?', paramMarker) + initTokenByte('=', eq) + initTokenByte('{', int('{')) + initTokenByte('}', int('}')) + + initTokenString("||", pipes) + initTokenString("&&", andand) + initTokenString("&^", andnot) + initTokenString(":=", assignmentEq) + initTokenString("<=>", nulleq) + initTokenString(">=", ge) + initTokenString("<=", le) + initTokenString("!=", neq) + initTokenString("<>", neqSynonym) + initTokenString("<<", lsh) + initTokenString(">>", rsh) + initTokenString("\\N", null) + + initTokenFunc("@", startWithAt) + initTokenFunc("/", startWithSlash) + initTokenFunc("-", startWithDash) + initTokenFunc("#", startWithSharp) + initTokenFunc("Xx", startWithXx) + initTokenFunc("Nn", startWithNn) + initTokenFunc("Bb", startWithBb) + initTokenFunc(".", startWithDot) + initTokenFunc("_$ACDEFGHIJKLMOPQRSTUVWYZacdefghijklmopqrstuvwyz", scanIdentifier) + initTokenFunc("`", scanQuotedIdent) + initTokenFunc("0123456789", startWithNumber) + initTokenFunc("'\"", startString) +} + +var tokenMap = map[string]int{ + "ACCOUNT": account, + "ACTION": action, + "ADD": add, + "ADDDATE": addDate, + "ADMIN": admin, + "AFTER": after, + "AGG_TO_COP": hintAggToCop, + "ALL": all, + "ALGORITHM": algorithm, + "ALTER": alter, + "ALWAYS": always, + "ANALYZE": analyze, + "AND": and, + "ANY": any, + "AS": as, + "ASC": asc, + "ASCII": ascii, + "AUTO_INCREMENT": autoIncrement, + "AVG": avg, + "AVG_ROW_LENGTH": avgRowLength, + "BEGIN": begin, + "BETWEEN": between, + "BIGINT": bigIntType, + "BINARY": binaryType, + "BINLOG": binlog, + "BIT": bitType, + "BIT_AND": bitAnd, + "BIT_OR": bitOr, + "BIT_XOR": bitXor, + "BLOB": blobType, + "BLOCK": block, + "BOOL": boolType, + "BOOLEAN": booleanType, + "BOTH": both, + "BTREE": btree, + "BUCKETS": buckets, + "BY": by, + "BYTE": byteType, + "CANCEL": cancel, + "CASCADE": cascade, + "CASCADED": cascaded, + "CASE": caseKwd, + "CAST": cast, + "CHANGE": change, + "CHAR": charType, + "CHARACTER": character, + "CHARSET": charsetKwd, + "CHECK": check, + "CHECKSUM": checksum, + "CIPHER": cipher, + "CLEANUP": cleanup, + "CLIENT": client, + "CMSKETCH": cmSketch, + "COALESCE": coalesce, + "COLLATE": collate, + "COLLATION": collation, + "COLUMN": column, + "COLUMN_FORMAT": columnFormat, + "COLUMNS": columns, + "COMMENT": comment, + "COMMIT": commit, + "COMMITTED": committed, + "COMPACT": compact, + "COMPRESSED": compressed, + "COMPRESSION": compression, + "CONNECTION": connection, + "CONSISTENT": consistent, + "CONSTRAINT": constraint, + "CONTEXT": context, + "CONVERT": convert, + "COPY": copyKwd, + "COUNT": count, + "CPU": cpu, + "CREATE": create, + "CROSS": cross, + "CURRENT": current, + "CURRENT_DATE": currentDate, + "CURRENT_TIME": currentTime, + "CURRENT_TIMESTAMP": currentTs, + "CURRENT_USER": currentUser, + "CURRENT_ROLE": currentRole, + "CURTIME": curTime, + "DATA": data, + "DATABASE": database, + "DATABASES": databases, + "DATE": dateType, + "DATE_ADD": dateAdd, + "DATE_SUB": dateSub, + "DATETIME": datetimeType, + "DAY": day, + "DAY_HOUR": dayHour, + "DAY_MICROSECOND": dayMicrosecond, + "DAY_MINUTE": dayMinute, + "DAY_SECOND": daySecond, + "DDL": ddl, + "DEALLOCATE": deallocate, + "DEC": decimalType, + "DECIMAL": decimalType, + "DEFAULT": defaultKwd, + "DEFINER": definer, + "DELAY_KEY_WRITE": delayKeyWrite, + "DELAYED": delayed, + "DELETE": deleteKwd, + "DEPTH": depth, + "DESC": desc, + "DESCRIBE": describe, + "DIRECTORY": directory, + "DISABLE": disable, + "DISCARD": discard, + "DISK": disk, + "DISTINCT": distinct, + "DISTINCTROW": distinct, + "DIV": div, + "DO": do, + "DOUBLE": doubleType, + "DRAINER": drainer, + "DROP": drop, + "DUAL": dual, + "DUPLICATE": duplicate, + "DYNAMIC": dynamic, + "ELSE": elseKwd, + "ENABLE": enable, + "ENABLE_PLAN_CACHE": hintEnablePlanCache, + "ENCLOSED": enclosed, + "ENCRYPTION": encryption, + "END": end, + "ENFORCED": enforced, + "ENGINE": engine, + "ENGINES": engines, + "ENUM": enum, + "ESCAPE": escape, + "ESCAPED": escaped, + "EVENT": event, + "EVENTS": events, + "EXCLUSIVE": exclusive, + "EXCEPT": except, + "EXCHANGE": exchange, + "EXECUTE": execute, + "EXISTS": exists, + "EXPIRE": expire, + "EXPLAIN": explain, + "EXTRACT": extract, + "FALSE": falseKwd, + "FAULTS": faultsSym, + "FIELDS": fields, + "FIRST": first, + "FIXED": fixed, + "FLOAT": floatType, + "FLUSH": flush, + "FOLLOWING": following, + "FOR": forKwd, + "FORCE": force, + "FOREIGN": foreign, + "FORMAT": format, + "FROM": from, + "FULL": full, + "FULLTEXT": fulltext, + "FUNCTION": function, + "GENERATED": generated, + "GET_FORMAT": getFormat, + "GLOBAL": global, + "GRANT": grant, + "GRANTS": grants, + "GROUP": group, + "GROUP_CONCAT": groupConcat, + "HASH": hash, + "HASH_AGG": hintHASHAGG, + "HASH_JOIN": hintHJ, + "HAVING": having, + "HIGH_PRIORITY": highPriority, + "HISTORY": history, + "HOUR": hour, + "HOUR_MICROSECOND": hourMicrosecond, + "HOUR_MINUTE": hourMinute, + "HOUR_SECOND": hourSecond, + "IDENTIFIED": identified, + "IF": ifKwd, + "IGNORE": ignore, + "IMPORT": importKwd, + "IN": in, + "INCREMENTAL": incremental, + "INDEX": index, + "INDEXES": indexes, + "INFILE": infile, + "INL_JOIN": hintINLJ, + "INNER": inner, + "INPLACE": inplace, + "INSTANT": instant, + "INSERT": insert, + "INSERT_METHOD": insertMethod, + "INT": intType, + "INT1": int1Type, + "INT2": int2Type, + "INT3": int3Type, + "INT4": int4Type, + "INT8": int8Type, + "IO": io, + "IPC": ipc, + "INTEGER": integerType, + "INTERVAL": interval, + "INTERNAL": internal, + "INTO": into, + "INVISIBLE": invisible, + "INVOKER": invoker, + "IS": is, + "ISSUER": issuer, + "ISOLATION": isolation, + "USE_TOJA": hintUseToja, + "JOBS": jobs, + "JOB": job, + "JOIN": join, + "JSON": jsonType, + "KEY": key, + "KEY_BLOCK_SIZE": keyBlockSize, + "KEYS": keys, + "KILL": kill, + "LAST": last, + "LEADING": leading, + "LEFT": left, + "LESS": less, + "LEVEL": level, + "LIKE": like, + "LIMIT": limit, + "LINES": lines, + "LINEAR": linear, + "LIST": list, + "LOAD": load, + "LOCAL": local, + "LOCALTIME": localTime, + "LOCALTIMESTAMP": localTs, + "LOCK": lock, + "LONG": long, + "LONGBLOB": longblobType, + "LONGTEXT": longtextType, + "LOW_PRIORITY": lowPriority, + "MASTER": master, + "MATCH": match, + "MAX": max, + "MAX_CONNECTIONS_PER_HOUR": maxConnectionsPerHour, + "MAX_EXECUTION_TIME": maxExecutionTime, + "MAX_QUERIES_PER_HOUR": maxQueriesPerHour, + "MAX_ROWS": maxRows, + "MAX_UPDATES_PER_HOUR": maxUpdatesPerHour, + "MAX_USER_CONNECTIONS": maxUserConnections, + "MAXVALUE": maxValue, + "MEDIUMBLOB": mediumblobType, + "MEDIUMINT": mediumIntType, + "MEDIUMTEXT": mediumtextType, + "MEMORY": memory, + "MEMORY_QUOTA": hintMemoryQuota, + "MERGE": merge, + "MICROSECOND": microsecond, + "MIN": min, + "MIN_ROWS": minRows, + "MINUTE": minute, + "MINUTE_MICROSECOND": minuteMicrosecond, + "MINUTE_SECOND": minuteSecond, + "MOD": mod, + "MODE": mode, + "MODIFY": modify, + "MONTH": month, + "NAMES": names, + "NATIONAL": national, + "NATURAL": natural, + "NEVER": never, + "NEXT_ROW_ID": next_row_id, + "NO": no, + "NO_INDEX_MERGE": hintNoIndexMerge, + "NO_WRITE_TO_BINLOG": noWriteToBinLog, + "NODE_ID": nodeID, + "NODE_STATE": nodeState, + "NODEGROUP": nodegroup, + "NONE": none, + "NOT": not, + "NOW": now, + "NULL": null, + "NULLS": nulls, + "NUMERIC": numericType, + "NCHAR": ncharType, + "NVARCHAR": nvarcharType, + "OFFSET": offset, + "OLAP": hintOLAP, + "OLTP": hintOLTP, + "ON": on, + "ONLY": only, + "OPTIMISTIC": optimistic, + "OPTIMIZE": optimize, + "OPTION": option, + "OPTIONALLY": optionally, + "OR": or, + "ORDER": order, + "OUTER": outer, + "PACK_KEYS": packKeys, + "PAGE": pageSym, + "PARSER": parser, + "PARTIAL": partial, + "PARTITION": partition, + "PARTITIONING": partitioning, + "PARTITIONS": partitions, + "PASSWORD": password, + "PESSIMISTIC": pessimistic, + "PLUGINS": plugins, + "POSITION": position, + "PRECEDING": preceding, + "PRECISION": precisionType, + "PREPARE": prepare, + "PRIMARY": primary, + "PRIVILEGES": privileges, + "PROCEDURE": procedure, + "PROCESS": process, + "PROCESSLIST": processlist, + "PROFILE": profile, + "PROFILES": profiles, + "PUMP": pump, + "QB_NAME": hintQBName, + "QUARTER": quarter, + "QUERY": query, + "QUERY_TYPE": hintQueryType, + "QUERIES": queries, + "QUICK": quick, + "SHARD_ROW_ID_BITS": shardRowIDBits, + "PRE_SPLIT_REGIONS": preSplitRegions, + "RANGE": rangeKwd, + "RECOVER": recover, + "REBUILD": rebuild, + "READ": read, + "READ_CONSISTENT_REPLICA": hintReadConsistentReplica, + "READ_FROM_STORAGE": hintReadFromStorage, + "REAL": realType, + "RECENT": recent, + "REDUNDANT": redundant, + "REFERENCES": references, + "REGEXP": regexpKwd, + "REGIONS": regions, + "RELOAD": reload, + "REMOVE": remove, + "RENAME": rename, + "REORGANIZE": reorganize, + "REPAIR": repair, + "REPEAT": repeat, + "REPEATABLE": repeatable, + "REPLACE": replace, + "RESPECT": respect, + "REPLICATION": replication, + "REQUIRE": require, + "RESTRICT": restrict, + "REVERSE": reverse, + "REVOKE": revoke, + "RIGHT": right, + "RLIKE": rlike, + "ROLE": role, + "ROLLBACK": rollback, + "ROUTINE": routine, + "ROW": row, + "ROW_COUNT": rowCount, + "ROW_FORMAT": rowFormat, + "RTREE": rtree, + "SAMPLES": samples, + "SCHEMA": database, + "SCHEMAS": databases, + "SECOND": second, + "SECONDARY_ENGINE": secondaryEngine, + "SECONDARY_LOAD": secondaryLoad, + "SECONDARY_UNLOAD": secondaryUnload, + "SECOND_MICROSECOND": secondMicrosecond, + "SECURITY": security, + "SELECT": selectKwd, + "SERIAL": serial, + "SERIALIZABLE": serializable, + "SESSION": session, + "SET": set, + "SEPARATOR": separator, + "SHARE": share, + "SHARED": shared, + "SHOW": show, + "SIGNED": signed, + "SIMPLE": simple, + "SLAVE": slave, + "SLOW": slow, + "SM_JOIN": hintSMJ, + "SMALLINT": smallIntType, + "SNAPSHOT": snapshot, + "SOME": some, + "SPATIAL": spatial, + "SPLIT": split, + "SQL": sql, + "SQL_BIG_RESULT": sqlBigResult, + "SQL_BUFFER_RESULT": sqlBufferResult, + "SQL_CACHE": sqlCache, + "SQL_CALC_FOUND_ROWS": sqlCalcFoundRows, + "SQL_NO_CACHE": sqlNoCache, + "SQL_SMALL_RESULT": sqlSmallResult, + "SQL_TSI_DAY": sqlTsiDay, + "SQL_TSI_HOUR": sqlTsiHour, + "SQL_TSI_MINUTE": sqlTsiMinute, + "SQL_TSI_MONTH": sqlTsiMonth, + "SQL_TSI_QUARTER": sqlTsiQuarter, + "SQL_TSI_SECOND": sqlTsiSecond, + "SQL_TSI_WEEK": sqlTsiWeek, + "SQL_TSI_YEAR": sqlTsiYear, + "SOURCE": source, + "SSL": ssl, + "START": start, + "STARTING": starting, + "STATS": stats, + "STATS_BUCKETS": statsBuckets, + "STATS_HISTOGRAMS": statsHistograms, + "STATS_HEALTHY": statsHealthy, + "STATS_META": statsMeta, + "STATS_AUTO_RECALC": statsAutoRecalc, + "STATS_PERSISTENT": statsPersistent, + "STATS_SAMPLE_PAGES": statsSamplePages, + "STATUS": status, + "STORAGE": storage, + "SWAPS": swaps, + "SWITCHES": switchesSym, + "SYSTEM_TIME": systemTime, + "OPEN": open, + "STD": stddevPop, + "STDDEV": stddevPop, + "STDDEV_POP": stddevPop, + "STDDEV_SAMP": stddevSamp, + "STORED": stored, + "STRAIGHT_JOIN": straightJoin, + "STREAM_AGG": hintSTREAMAGG, + "SUBDATE": subDate, + "SUBJECT": subject, + "SUBPARTITION": subpartition, + "SUBPARTITIONS": subpartitions, + "SUBSTR": substring, + "SUBSTRING": substring, + "SUM": sum, + "SUPER": super, + "TABLE": tableKwd, + "TABLE_CHECKSUM": tableChecksum, + "TABLES": tables, + "TABLESPACE": tablespace, + "TEMPORARY": temporary, + "TEMPTABLE": temptable, + "TERMINATED": terminated, + "TEXT": textType, + "THAN": than, + "THEN": then, + "TIDB": tidb, + "TIDB_HJ": hintHJ, + "TIDB_INLJ": hintINLJ, + "TIDB_SMJ": hintSMJ, + "TIKV": hintTiKV, + "TIFLASH": hintTiFlash, + "TIME": timeType, + "TIMESTAMP": timestampType, + "TIMESTAMPADD": timestampAdd, + "TIMESTAMPDIFF": timestampDiff, + "TINYBLOB": tinyblobType, + "TINYINT": tinyIntType, + "TINYTEXT": tinytextType, + "TO": to, + "TOKUDB_DEFAULT": tokudbDefault, + "TOKUDB_FAST": tokudbFast, + "TOKUDB_LZMA": tokudbLzma, + "TOKUDB_QUICKLZ": tokudbQuickLZ, + "TOKUDB_SNAPPY": tokudbSnappy, + "TOKUDB_SMALL": tokudbSmall, + "TOKUDB_UNCOMPRESSED": tokudbUncompressed, + "TOKUDB_ZLIB": tokudbZlib, + "TOP": top, + "TOPN": topn, + "TRACE": trace, + "TRADITIONAL": traditional, + "TRAILING": trailing, + "TRANSACTION": transaction, + "TRIGGER": trigger, + "TRIGGERS": triggers, + "TRIM": trim, + "TRUE": trueKwd, + "TRUNCATE": truncate, + "TYPE": tp, + "UNBOUNDED": unbounded, + "UNCOMMITTED": uncommitted, + "UNDEFINED": undefined, + "UNION": union, + "UNIQUE": unique, + "UNKNOWN": unknown, + "UNLOCK": unlock, + "UNSIGNED": unsigned, + "UPDATE": update, + "USAGE": usage, + "USE": use, + "USE_INDEX_MERGE": hintUseIndexMerge, + "USE_PLAN_CACHE": hintUsePlanCache, + "USER": user, + "USING": using, + "UTC_DATE": utcDate, + "UTC_TIME": utcTime, + "UTC_TIMESTAMP": utcTimestamp, + "VALIDATION": validation, + "VALUE": value, + "VALUES": values, + "VARBINARY": varbinaryType, + "VARCHAR": varcharType, + "VARCHARACTER": varcharacter, + "VARIABLES": variables, + "VARIANCE": varPop, + "VARYING": varying, + "VAR_POP": varPop, + "VAR_SAMP": varSamp, + "VIEW": view, + "VIRTUAL": virtual, + "VISIBLE": visible, + "WARNINGS": warnings, + "ERRORS": identSQLErrors, + "WEEK": week, + "WHEN": when, + "WHERE": where, + "WIDTH": width, + "WITH": with, + "WITHOUT": without, + "WRITE": write, + "XOR": xor, + "X509": x509, + "YEAR": yearType, + "YEAR_MONTH": yearMonth, + "ZEROFILL": zerofill, + "BINDING": binding, + "BINDINGS": bindings, + "EXPR_PUSHDOWN_BLACKLIST": exprPushdownBlacklist, + "OPT_RULE_BLACKLIST": optRuleBlacklist, +} + +// See https://dev.mysql.com/doc/refman/5.7/en/function-resolution.html for details +var btFuncTokenMap = map[string]int{ + "ADDDATE": builtinAddDate, + "BIT_AND": builtinBitAnd, + "BIT_OR": builtinBitOr, + "BIT_XOR": builtinBitXor, + "CAST": builtinCast, + "COUNT": builtinCount, + "CURDATE": builtinCurDate, + "CURTIME": builtinCurTime, + "DATE_ADD": builtinDateAdd, + "DATE_SUB": builtinDateSub, + "EXTRACT": builtinExtract, + "GROUP_CONCAT": builtinGroupConcat, + "MAX": builtinMax, + "MID": builtinSubstring, + "MIN": builtinMin, + "NOW": builtinNow, + "POSITION": builtinPosition, + "SESSION_USER": builtinUser, + "STD": builtinStddevPop, + "STDDEV": builtinStddevPop, + "STDDEV_POP": builtinStddevPop, + "STDDEV_SAMP": builtinStddevSamp, + "SUBDATE": builtinSubDate, + "SUBSTR": builtinSubstring, + "SUBSTRING": builtinSubstring, + "SUM": builtinSum, + "SYSDATE": builtinSysDate, + "SYSTEM_USER": builtinUser, + "TRIM": builtinTrim, + "VARIANCE": builtinVarPop, + "VAR_POP": builtinVarPop, + "VAR_SAMP": builtinVarSamp, +} + +var windowFuncTokenMap = map[string]int{ + "CUME_DIST": cumeDist, + "DENSE_RANK": denseRank, + "FIRST_VALUE": firstValue, + "GROUPS": groups, + "LAG": lag, + "LAST_VALUE": lastValue, + "LEAD": lead, + "NTH_VALUE": nthValue, + "NTILE": ntile, + "OVER": over, + "PERCENT_RANK": percentRank, + "RANK": rank, + "ROWS": rows, + "ROW_NUMBER": rowNumber, + "WINDOW": window, +} + +// aliases are strings directly map to another string and use the same token. +var aliases = map[string]string{ + "SCHEMA": "DATABASE", + "SCHEMAS": "DATABASES", + "DEC": "DECIMAL", + "SUBSTR": "SUBSTRING", + "TIDB_HJ": "HASH_JOIN", + "TIDB_INLJ": "INL_JOIN", + "TIDB_SMJ": "SM_JOIN", +} + +func (s *Scanner) isTokenIdentifier(lit string, offset int) int { + // An identifier before or after '.' means it is part of a qualified identifier. + // We do not parse it as keyword. + if s.r.peek() == '.' { + return 0 + } + if offset > 0 && s.r.s[offset-1] == '.' { + return 0 + } + buf := &s.buf + buf.Reset() + buf.Grow(len(lit)) + data := buf.Bytes()[:len(lit)] + for i := 0; i < len(lit); i++ { + if lit[i] >= 'a' && lit[i] <= 'z' { + data[i] = lit[i] + 'A' - 'a' + } else { + data[i] = lit[i] + } + } + + checkBtFuncToken, tokenStr := false, string(data) + if s.r.peek() == '(' { + checkBtFuncToken = true + } else if s.sqlMode.HasIgnoreSpaceMode() { + s.skipWhitespace() + if s.r.peek() == '(' { + checkBtFuncToken = true + } + } + if checkBtFuncToken { + if tok := btFuncTokenMap[tokenStr]; tok != 0 { + return tok + } + } + tok, ok := tokenMap[string(data)] + if !ok && s.supportWindowFunc { + tok = windowFuncTokenMap[string(data)] + } + return tok +} + +func handleIdent(lval *yySymType) int { + s := lval.ident + // A character string literal may have an optional character set introducer and COLLATE clause: + // [_charset_name]'string' [COLLATE collation_name] + // See https://dev.mysql.com/doc/refman/5.7/en/charset-literal.html + if !strings.HasPrefix(s, "_") { + return identifier + } + cs, _, err := charset.GetCharsetInfo(s[1:]) + if err != nil { + return identifier + } + lval.ident = cs + return underscoreCS +} diff --git a/vendor/github.com/pingcap/parser/model/ddl.go b/vendor/github.com/pingcap/parser/model/ddl.go new file mode 100644 index 0000000..cd3d2af --- /dev/null +++ b/vendor/github.com/pingcap/parser/model/ddl.go @@ -0,0 +1,401 @@ +// Copyright 2015 PingCAP, Inc. +// +// 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package model + +import ( + "encoding/json" + "fmt" + "math" + "sync" + "time" + + "github.com/pingcap/errors" + "github.com/pingcap/parser/terror" +) + +// ActionType is the type for DDL action. +type ActionType byte + +// List DDL actions. +const ( + ActionNone ActionType = 0 + ActionCreateSchema ActionType = 1 + ActionDropSchema ActionType = 2 + ActionCreateTable ActionType = 3 + ActionDropTable ActionType = 4 + ActionAddColumn ActionType = 5 + ActionDropColumn ActionType = 6 + ActionAddIndex ActionType = 7 + ActionDropIndex ActionType = 8 + ActionAddForeignKey ActionType = 9 + ActionDropForeignKey ActionType = 10 + ActionTruncateTable ActionType = 11 + ActionModifyColumn ActionType = 12 + ActionRebaseAutoID ActionType = 13 + ActionRenameTable ActionType = 14 + ActionSetDefaultValue ActionType = 15 + ActionShardRowID ActionType = 16 + ActionModifyTableComment ActionType = 17 + ActionRenameIndex ActionType = 18 + ActionAddTablePartition ActionType = 19 + ActionDropTablePartition ActionType = 20 + ActionCreateView ActionType = 21 + ActionModifyTableCharsetAndCollate ActionType = 22 + ActionTruncateTablePartition ActionType = 23 + ActionDropView ActionType = 24 + ActionRecoverTable ActionType = 25 + ActionModifySchemaCharsetAndCollate ActionType = 26 + ActionLockTable ActionType = 27 + ActionUnlockTable ActionType = 28 +) + +// AddIndexStr is a string related to the operation of "add index". +const AddIndexStr = "add index" + +var actionMap = map[ActionType]string{ + ActionCreateSchema: "create schema", + ActionDropSchema: "drop schema", + ActionCreateTable: "create table", + ActionDropTable: "drop table", + ActionAddColumn: "add column", + ActionDropColumn: "drop column", + ActionAddIndex: AddIndexStr, + ActionDropIndex: "drop index", + ActionAddForeignKey: "add foreign key", + ActionDropForeignKey: "drop foreign key", + ActionTruncateTable: "truncate table", + ActionModifyColumn: "modify column", + ActionRebaseAutoID: "rebase auto_increment ID", + ActionRenameTable: "rename table", + ActionSetDefaultValue: "set default value", + ActionShardRowID: "shard row ID", + ActionModifyTableComment: "modify table comment", + ActionRenameIndex: "rename index", + ActionAddTablePartition: "add partition", + ActionDropTablePartition: "drop partition", + ActionCreateView: "create view", + ActionModifyTableCharsetAndCollate: "modify table charset and collate", + ActionTruncateTablePartition: "truncate partition", + ActionDropView: "drop view", + ActionRecoverTable: "recover table", + ActionModifySchemaCharsetAndCollate: "modify schema charset and collate", + ActionLockTable: "lock table", + ActionUnlockTable: "unlock table", +} + +// String return current ddl action in string +func (action ActionType) String() string { + if v, ok := actionMap[action]; ok { + return v + } + return "none" +} + +// HistoryInfo is used for binlog. +type HistoryInfo struct { + SchemaVersion int64 + DBInfo *DBInfo + TableInfo *TableInfo + FinishedTS uint64 +} + +// AddDBInfo adds schema version and schema information that are used for binlog. +// dbInfo is added in the following operations: create database, drop database. +func (h *HistoryInfo) AddDBInfo(schemaVer int64, dbInfo *DBInfo) { + h.SchemaVersion = schemaVer + h.DBInfo = dbInfo +} + +// AddTableInfo adds schema version and table information that are used for binlog. +// tblInfo is added except for the following operations: create database, drop database. +func (h *HistoryInfo) AddTableInfo(schemaVer int64, tblInfo *TableInfo) { + h.SchemaVersion = schemaVer + h.TableInfo = tblInfo +} + +// Clean cleans history information. +func (h *HistoryInfo) Clean() { + h.SchemaVersion = 0 + h.DBInfo = nil + h.TableInfo = nil +} + +// DDLReorgMeta is meta info of DDL reorganization. +type DDLReorgMeta struct { + // EndHandle is the last handle of the adding indices table. + // We should only backfill indices in the range [startHandle, EndHandle]. + EndHandle int64 `json:"end_handle"` +} + +// NewDDLReorgMeta new a DDLReorgMeta. +func NewDDLReorgMeta() *DDLReorgMeta { + return &DDLReorgMeta{ + EndHandle: math.MaxInt64, + } +} + +// Job is for a DDL operation. +type Job struct { + ID int64 `json:"id"` + Type ActionType `json:"type"` + SchemaID int64 `json:"schema_id"` + TableID int64 `json:"table_id"` + SchemaName string `json:"schema_name"` + State JobState `json:"state"` + Error *terror.Error `json:"err"` + // ErrorCount will be increased, every time we meet an error when running job. + ErrorCount int64 `json:"err_count"` + // RowCount means the number of rows that are processed. + RowCount int64 `json:"row_count"` + Mu sync.Mutex `json:"-"` + Args []interface{} `json:"-"` + // RawArgs : We must use json raw message to delay parsing special args. + RawArgs json.RawMessage `json:"raw_args"` + SchemaState SchemaState `json:"schema_state"` + // SnapshotVer means snapshot version for this job. + SnapshotVer uint64 `json:"snapshot_ver"` + // StartTS uses timestamp allocated by TSO. + // Now it's the TS when we put the job to TiKV queue. + StartTS uint64 `json:"start_ts"` + // DependencyID is the job's ID that the current job depends on. + DependencyID int64 `json:"dependency_id"` + // Query string of the ddl job. + Query string `json:"query"` + BinlogInfo *HistoryInfo `json:"binlog"` + + // Version indicates the DDL job version. For old jobs, it will be 0. + Version int64 `json:"version"` + + // ReorgMeta is meta info of ddl reorganization. + // This field is depreciated. + ReorgMeta *DDLReorgMeta `json:"reorg_meta"` + + // Priority is only used to set the operation priority of adding indices. + Priority int `json:"priority"` +} + +// FinishTableJob is called when a job is finished. +// It updates the job's state information and adds tblInfo to the binlog. +func (job *Job) FinishTableJob(jobState JobState, schemaState SchemaState, ver int64, tblInfo *TableInfo) { + job.State = jobState + job.SchemaState = schemaState + job.BinlogInfo.AddTableInfo(ver, tblInfo) +} + +// FinishDBJob is called when a job is finished. +// It updates the job's state information and adds dbInfo the binlog. +func (job *Job) FinishDBJob(jobState JobState, schemaState SchemaState, ver int64, dbInfo *DBInfo) { + job.State = jobState + job.SchemaState = schemaState + job.BinlogInfo.AddDBInfo(ver, dbInfo) +} + +// TSConvert2Time converts timestamp to time. +func TSConvert2Time(ts uint64) time.Time { + t := int64(ts >> 18) // 18 is for the logical time. + return time.Unix(t/1e3, (t%1e3)*1e6) +} + +// SetRowCount sets the number of rows. Make sure it can pass `make race`. +func (job *Job) SetRowCount(count int64) { + job.Mu.Lock() + defer job.Mu.Unlock() + + job.RowCount = count +} + +// GetRowCount gets the number of rows. Make sure it can pass `make race`. +func (job *Job) GetRowCount() int64 { + job.Mu.Lock() + defer job.Mu.Unlock() + + return job.RowCount +} + +// Encode encodes job with json format. +// updateRawArgs is used to determine whether to update the raw args. +func (job *Job) Encode(updateRawArgs bool) ([]byte, error) { + var err error + if updateRawArgs { + job.RawArgs, err = json.Marshal(job.Args) + if err != nil { + return nil, errors.Trace(err) + } + } + + var b []byte + job.Mu.Lock() + defer job.Mu.Unlock() + b, err = json.Marshal(job) + + return b, errors.Trace(err) +} + +// Decode decodes job from the json buffer, we must use DecodeArgs later to +// decode special args for this job. +func (job *Job) Decode(b []byte) error { + err := json.Unmarshal(b, job) + return errors.Trace(err) +} + +// DecodeArgs decodes job args. +func (job *Job) DecodeArgs(args ...interface{}) error { + job.Args = args + err := json.Unmarshal(job.RawArgs, &job.Args) + return errors.Trace(err) +} + +// String implements fmt.Stringer interface. +func (job *Job) String() string { + rowCount := job.GetRowCount() + return fmt.Sprintf("ID:%d, Type:%s, State:%s, SchemaState:%s, SchemaID:%d, TableID:%d, RowCount:%d, ArgLen:%d, start time: %v, Err:%v, ErrCount:%d, SnapshotVersion:%v", + job.ID, job.Type, job.State, job.SchemaState, job.SchemaID, job.TableID, rowCount, len(job.Args), TSConvert2Time(job.StartTS), job.Error, job.ErrorCount, job.SnapshotVer) +} + +func (job *Job) hasDependentSchema(other *Job) (bool, error) { + if other.Type == ActionDropSchema || other.Type == ActionCreateSchema { + if other.SchemaID == job.SchemaID { + return true, nil + } + if job.Type == ActionRenameTable { + var oldSchemaID int64 + if err := job.DecodeArgs(&oldSchemaID); err != nil { + return false, errors.Trace(err) + } + if other.SchemaID == oldSchemaID { + return true, nil + } + } + } + return false, nil +} + +// IsDependentOn returns whether the job depends on "other". +// How to check the job depends on "other"? +// 1. The two jobs handle the same database when one of the two jobs is an ActionDropSchema or ActionCreateSchema type. +// 2. Or the two jobs handle the same table. +func (job *Job) IsDependentOn(other *Job) (bool, error) { + isDependent, err := job.hasDependentSchema(other) + if err != nil || isDependent { + return isDependent, errors.Trace(err) + } + isDependent, err = other.hasDependentSchema(job) + if err != nil || isDependent { + return isDependent, errors.Trace(err) + } + + // TODO: If a job is ActionRenameTable, we need to check table name. + if other.TableID == job.TableID { + return true, nil + } + return false, nil +} + +// IsFinished returns whether job is finished or not. +// If the job state is Done or Cancelled, it is finished. +func (job *Job) IsFinished() bool { + return job.State == JobStateDone || job.State == JobStateRollbackDone || job.State == JobStateCancelled +} + +// IsCancelled returns whether the job is cancelled or not. +func (job *Job) IsCancelled() bool { + return job.State == JobStateCancelled +} + +// IsRollbackDone returns whether the job is rolled back or not. +func (job *Job) IsRollbackDone() bool { + return job.State == JobStateRollbackDone +} + +// IsRollingback returns whether the job is rolling back or not. +func (job *Job) IsRollingback() bool { + return job.State == JobStateRollingback +} + +// IsCancelling returns whether the job is cancelling or not. +func (job *Job) IsCancelling() bool { + return job.State == JobStateCancelling +} + +// IsSynced returns whether the DDL modification is synced among all TiDB servers. +func (job *Job) IsSynced() bool { + return job.State == JobStateSynced +} + +// IsDone returns whether job is done. +func (job *Job) IsDone() bool { + return job.State == JobStateDone +} + +// IsRunning returns whether job is still running or not. +func (job *Job) IsRunning() bool { + return job.State == JobStateRunning +} + +// JobState is for job state. +type JobState byte + +// List job states. +const ( + JobStateNone JobState = 0 + JobStateRunning JobState = 1 + // When DDL encountered an unrecoverable error at reorganization state, + // some keys has been added already, we need to remove them. + // JobStateRollingback is the state to do the rolling back job. + JobStateRollingback JobState = 2 + JobStateRollbackDone JobState = 3 + JobStateDone JobState = 4 + JobStateCancelled JobState = 5 + // JobStateSynced is used to mark the information about the completion of this job + // has been synchronized to all servers. + JobStateSynced JobState = 6 + // JobStateCancelling is used to mark the DDL job is cancelled by the client, but the DDL work hasn't handle it. + JobStateCancelling JobState = 7 +) + +// String implements fmt.Stringer interface. +func (s JobState) String() string { + switch s { + case JobStateRunning: + return "running" + case JobStateRollingback: + return "rollingback" + case JobStateRollbackDone: + return "rollback done" + case JobStateDone: + return "done" + case JobStateCancelled: + return "cancelled" + case JobStateCancelling: + return "cancelling" + case JobStateSynced: + return "synced" + default: + return "none" + } +} + +// SchemaDiff contains the schema modification at a particular schema version. +// It is used to reduce schema reload cost. +type SchemaDiff struct { + Version int64 `json:"version"` + Type ActionType `json:"type"` + SchemaID int64 `json:"schema_id"` + TableID int64 `json:"table_id"` + + // OldTableID is the table ID before truncate, only used by truncate table DDL. + OldTableID int64 `json:"old_table_id"` + // OldSchemaID is the schema ID before rename table, only used by rename table DDL. + OldSchemaID int64 `json:"old_schema_id"` +} diff --git a/vendor/github.com/pingcap/parser/model/flags.go b/vendor/github.com/pingcap/parser/model/flags.go new file mode 100644 index 0000000..428ac16 --- /dev/null +++ b/vendor/github.com/pingcap/parser/model/flags.go @@ -0,0 +1,47 @@ +// Copyright 2018 PingCAP, Inc. +// +// 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package model + +// Flags are used by tipb.SelectRequest.Flags to handle execution mode, like how to handle truncate error. +const ( + // FlagIgnoreTruncate indicates if truncate error should be ignored. + // Read-only statements should ignore truncate error, write statements should not ignore truncate error. + FlagIgnoreTruncate uint64 = 1 + // FlagTruncateAsWarning indicates if truncate error should be returned as warning. + // This flag only matters if FlagIgnoreTruncate is not set, in strict sql mode, truncate error should + // be returned as error, in non-strict sql mode, truncate error should be saved as warning. + FlagTruncateAsWarning = 1 << 1 + // FlagPadCharToFullLength indicates if sql_mode 'PAD_CHAR_TO_FULL_LENGTH' is set. + FlagPadCharToFullLength = 1 << 2 + // FlagInInsertStmt indicates if this is a INSERT statement. + FlagInInsertStmt = 1 << 3 + // FlagInUpdateOrDeleteStmt indicates if this is a UPDATE statement or a DELETE statement. + FlagInUpdateOrDeleteStmt = 1 << 4 + // FlagInSelectStmt indicates if this is a SELECT statement. + FlagInSelectStmt = 1 << 5 + // FlagOverflowAsWarning indicates if overflow error should be returned as warning. + // In strict sql mode, overflow error should be returned as error, + // in non-strict sql mode, overflow error should be saved as warning. + FlagOverflowAsWarning = 1 << 6 + // FlagIgnoreZeroInDate indicates if ZeroInDate error should be ignored. + // Read-only statements should ignore ZeroInDate error. + // Write statements should not ignore ZeroInDate error in strict sql mode. + FlagIgnoreZeroInDate = 1 << 7 + // FlagDividedByZeroAsWarning indicates if DividedByZero should be returned as warning. + FlagDividedByZeroAsWarning = 1 << 8 + // FlagInUnionStmt indicates if this is a UNION statement. + FlagInUnionStmt = 1 << 9 + // FlagInLoadDataStmt indicates if this is a LOAD DATA statement. + FlagInLoadDataStmt = 1 << 10 +) diff --git a/vendor/github.com/pingcap/parser/model/model.go b/vendor/github.com/pingcap/parser/model/model.go new file mode 100644 index 0000000..7c57abb --- /dev/null +++ b/vendor/github.com/pingcap/parser/model/model.go @@ -0,0 +1,844 @@ +// Copyright 2015 PingCAP, Inc. +// +// 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package model + +import ( + "encoding/json" + "strconv" + "strings" + "time" + + "github.com/pingcap/errors" + "github.com/pingcap/parser/auth" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/types" + "github.com/pingcap/tipb/go-tipb" +) + +// SchemaState is the state for schema elements. +type SchemaState byte + +const ( + // StateNone means this schema element is absent and can't be used. + StateNone SchemaState = iota + // StateDeleteOnly means we can only delete items for this schema element. + StateDeleteOnly + // StateWriteOnly means we can use any write operation on this schema element, + // but outer can't read the changed data. + StateWriteOnly + // StateWriteReorganization means we are re-organizing whole data after write only state. + StateWriteReorganization + // StateDeleteReorganization means we are re-organizing whole data after delete only state. + StateDeleteReorganization + // StatePublic means this schema element is ok for all write and read operations. + StatePublic +) + +// String implements fmt.Stringer interface. +func (s SchemaState) String() string { + switch s { + case StateDeleteOnly: + return "delete only" + case StateWriteOnly: + return "write only" + case StateWriteReorganization: + return "write reorganization" + case StateDeleteReorganization: + return "delete reorganization" + case StatePublic: + return "public" + default: + return "none" + } +} + +const ( + // ColumnInfoVersion0 means the column info version is 0. + ColumnInfoVersion0 = uint64(0) + // ColumnInfoVersion1 means the column info version is 1. + ColumnInfoVersion1 = uint64(1) + // ColumnInfoVersion2 means the column info version is 2. + // This is for v2.1.7 to Compatible with older versions charset problem. + // Old version such as v2.0.8 treat utf8 as utf8mb4, because there is no UTF8 check in v2.0.8. + // After version V2.1.2 (PR#8738) , TiDB add UTF8 check, then the user upgrade from v2.0.8 insert some UTF8MB4 characters will got error. + // This is not compatibility for user. Then we try to fix this in PR #9820, and increase the version number. + ColumnInfoVersion2 = uint64(2) + + // CurrLatestColumnInfoVersion means the latest column info in the current TiDB. + CurrLatestColumnInfoVersion = ColumnInfoVersion2 +) + +// ColumnInfo provides meta data describing of a table column. +type ColumnInfo struct { + ID int64 `json:"id"` + Name CIStr `json:"name"` + Offset int `json:"offset"` + OriginDefaultValue interface{} `json:"origin_default"` + DefaultValue interface{} `json:"default"` + DefaultValueBit []byte `json:"default_bit"` + GeneratedExprString string `json:"generated_expr_string"` + GeneratedStored bool `json:"generated_stored"` + Dependences map[string]struct{} `json:"dependences"` + types.FieldType `json:"type"` + State SchemaState `json:"state"` + Comment string `json:"comment"` + // Version means the version of the column info. + // Version = 0: For OriginDefaultValue and DefaultValue of timestamp column will stores the default time in system time zone. + // That is a bug if multiple TiDB servers in different system time zone. + // Version = 1: For OriginDefaultValue and DefaultValue of timestamp column will stores the default time in UTC time zone. + // This will fix bug in version 0. For compatibility with version 0, we add version field in column info struct. + Version uint64 `json:"version"` +} + +// Clone clones ColumnInfo. +func (c *ColumnInfo) Clone() *ColumnInfo { + nc := *c + return &nc +} + +// IsGenerated returns true if the column is generated column. +func (c *ColumnInfo) IsGenerated() bool { + return len(c.GeneratedExprString) != 0 +} + +// SetDefaultValue sets the default value. +func (c *ColumnInfo) SetDefaultValue(value interface{}) error { + c.DefaultValue = value + if c.Tp == mysql.TypeBit { + // For mysql.TypeBit type, the default value storage format must be a string. + // Other value such as int must convert to string format first. + // The mysql.TypeBit type supports the null default value. + if value == nil { + return nil + } + if v, ok := value.(string); ok { + c.DefaultValueBit = []byte(v) + return nil + } + return types.ErrInvalidDefault.GenWithStackByArgs(c.Name) + } + return nil +} + +// GetDefaultValue gets the default value of the column. +// Default value use to stored in DefaultValue field, but now, +// bit type default value will store in DefaultValueBit for fix bit default value decode/encode bug. +func (c *ColumnInfo) GetDefaultValue() interface{} { + if c.Tp == mysql.TypeBit && c.DefaultValueBit != nil { + return string(c.DefaultValueBit) + } + return c.DefaultValue +} + +// FindColumnInfo finds ColumnInfo in cols by name. +func FindColumnInfo(cols []*ColumnInfo, name string) *ColumnInfo { + name = strings.ToLower(name) + for _, col := range cols { + if col.Name.L == name { + return col + } + } + + return nil +} + +// ExtraHandleID is the column ID of column which we need to append to schema to occupy the handle's position +// for use of execution phase. +const ExtraHandleID = -1 + +const ( + // TableInfoVersion0 means the table info version is 0. + // Upgrade from v2.1.1 or v2.1.2 to v2.1.3 and later, and then execute a "change/modify column" statement + // that does not specify a charset value for column. Then the following error may be reported: + // ERROR 1105 (HY000): unsupported modify charset from utf8mb4 to utf8. + // To eliminate this error, we will not modify the charset of this column + // when executing a change/modify column statement that does not specify a charset value for column. + // This behavior is not compatible with MySQL. + TableInfoVersion0 = uint16(0) + // TableInfoVersion1 means the table info version is 1. + // When we execute a change/modify column statement that does not specify a charset value for column, + // we set the charset of this column to the charset of table. This behavior is compatible with MySQL. + TableInfoVersion1 = uint16(1) + // TableInfoVersion2 means the table info version is 2. + // This is for v2.1.7 to Compatible with older versions charset problem. + // Old version such as v2.0.8 treat utf8 as utf8mb4, because there is no UTF8 check in v2.0.8. + // After version V2.1.2 (PR#8738) , TiDB add UTF8 check, then the user upgrade from v2.0.8 insert some UTF8MB4 characters will got error. + // This is not compatibility for user. Then we try to fix this in PR #9820, and increase the version number. + TableInfoVersion2 = uint16(2) + // TableInfoVersion3 means the table info version is 3. + // This version aims to deal with upper-cased charset name in TableInfo stored by versions prior to TiDB v2.1.9: + // TiDB always suppose all charsets / collations as lower-cased and try to convert them if they're not. + // However, the convert is missed in some scenarios before v2.1.9, so for all those tables prior to TableInfoVersion3, their + // charsets / collations will be converted to lower-case while loading from the storage. + TableInfoVersion3 = uint16(3) + + // CurrLatestTableInfoVersion means the latest table info in the current TiDB. + CurrLatestTableInfoVersion = TableInfoVersion3 +) + +// ExtraHandleName is the name of ExtraHandle Column. +var ExtraHandleName = NewCIStr("_tidb_rowid") + +// TableInfo provides meta data describing a DB table. +type TableInfo struct { + ID int64 `json:"id"` + Name CIStr `json:"name"` + Charset string `json:"charset"` + Collate string `json:"collate"` + // Columns are listed in the order in which they appear in the schema. + Columns []*ColumnInfo `json:"cols"` + Indices []*IndexInfo `json:"index_info"` + ForeignKeys []*FKInfo `json:"fk_info"` + State SchemaState `json:"state"` + PKIsHandle bool `json:"pk_is_handle"` + Comment string `json:"comment"` + AutoIncID int64 `json:"auto_inc_id"` + MaxColumnID int64 `json:"max_col_id"` + MaxIndexID int64 `json:"max_idx_id"` + // UpdateTS is used to record the timestamp of updating the table's schema information. + // These changing schema operations don't include 'truncate table' and 'rename table'. + UpdateTS uint64 `json:"update_timestamp"` + // OldSchemaID : + // Because auto increment ID has schemaID as prefix, + // We need to save original schemaID to keep autoID unchanged + // while renaming a table from one database to another. + // TODO: Remove it. + // Now it only uses for compatibility with the old version that already uses this field. + OldSchemaID int64 `json:"old_schema_id,omitempty"` + + // ShardRowIDBits specify if the implicit row ID is sharded. + ShardRowIDBits uint64 + // MaxShardRowIDBits uses to record the max ShardRowIDBits be used so far. + MaxShardRowIDBits uint64 `json:"max_shard_row_id_bits"` + // PreSplitRegions specify the pre-split region when create table. + // The pre-split region num is 2^(PreSplitRegions-1). + // And the PreSplitRegions should less than or equal to ShardRowIDBits. + PreSplitRegions uint64 `json:"pre_split_regions"` + + Partition *PartitionInfo `json:"partition"` + + Compression string `json:"compression"` + + View *ViewInfo `json:"view"` + // Lock represent the table lock info. + Lock *TableLockInfo `json:"Lock"` + + // Version means the version of the table info. + Version uint16 `json:"version"` +} + +// TableLockInfo provides meta data describing a table lock. +type TableLockInfo struct { + Tp TableLockType + // Use array because there may be multiple sessions holding the same read lock. + Sessions []SessionInfo + State TableLockState + // TS is used to record the timestamp this table lock been locked. + TS uint64 +} + +// SessionInfo contain the session ID and the server ID. +type SessionInfo struct { + ServerID string + SessionID uint64 +} + +func (s SessionInfo) String() string { + return "server: " + s.ServerID + "_session: " + strconv.FormatUint(s.SessionID, 10) +} + +// TableLockTpInfo is composed by schema ID, table ID and table lock type. +type TableLockTpInfo struct { + SchemaID int64 + TableID int64 + Tp TableLockType +} + +// TableLockState is the state for table lock. +type TableLockState byte + +const ( + // TableLockStateNone means this table lock is absent. + TableLockStateNone TableLockState = iota + // TableLockStatePreLock means this table lock is pre-lock state. Other session doesn't hold this lock should't do corresponding operation according to the lock type. + TableLockStatePreLock + // TableLockStatePublic means this table lock is public state. + TableLockStatePublic +) + +// String implements fmt.Stringer interface. +func (t TableLockState) String() string { + switch t { + case TableLockStatePreLock: + return "pre-lock" + case TableLockStatePublic: + return "public" + default: + return "none" + } +} + +// TableLockType is the type of the table lock. +type TableLockType byte + +const ( + TableLockNone TableLockType = iota + // TableLockRead means the session with this lock can read the table (but not write it). + // Multiple sessions can acquire a READ lock for the table at the same time. + // Other sessions can read the table without explicitly acquiring a READ lock. + TableLockRead + // TableLockReadLocal is not supported. + TableLockReadLocal + // TableLockWrite means only the session with this lock has write/read permission. + // Only the session that holds the lock can access the table. No other session can access it until the lock is released. + TableLockWrite + // TableLockWriteLocal means the session with this lock has write/read permission, and the other session still has read permission. + TableLockWriteLocal +) + +func (t TableLockType) String() string { + switch t { + case TableLockNone: + return "NONE" + case TableLockRead: + return "READ" + case TableLockReadLocal: + return "READ LOCAL" + case TableLockWriteLocal: + return "WRITE LOCAL" + case TableLockWrite: + return "WRITE" + } + return "" +} + +// GetPartitionInfo returns the partition information. +func (t *TableInfo) GetPartitionInfo() *PartitionInfo { + if t.Partition != nil && t.Partition.Enable { + return t.Partition + } + return nil +} + +// GetUpdateTime gets the table's updating time. +func (t *TableInfo) GetUpdateTime() time.Time { + return TSConvert2Time(t.UpdateTS) +} + +// GetDBID returns the schema ID that is used to create an allocator. +// TODO: Remove it after removing OldSchemaID. +func (t *TableInfo) GetDBID(dbID int64) int64 { + if t.OldSchemaID != 0 { + return t.OldSchemaID + } + return dbID +} + +// Clone clones TableInfo. +func (t *TableInfo) Clone() *TableInfo { + nt := *t + nt.Columns = make([]*ColumnInfo, len(t.Columns)) + nt.Indices = make([]*IndexInfo, len(t.Indices)) + nt.ForeignKeys = make([]*FKInfo, len(t.ForeignKeys)) + + for i := range t.Columns { + nt.Columns[i] = t.Columns[i].Clone() + } + + for i := range t.Indices { + nt.Indices[i] = t.Indices[i].Clone() + } + + for i := range t.ForeignKeys { + nt.ForeignKeys[i] = t.ForeignKeys[i].Clone() + } + + return &nt +} + +// GetPkName will return the pk name if pk exists. +func (t *TableInfo) GetPkName() CIStr { + if t.PKIsHandle { + for _, colInfo := range t.Columns { + if mysql.HasPriKeyFlag(colInfo.Flag) { + return colInfo.Name + } + } + } + return CIStr{} +} + +// GetPkColInfo gets the ColumnInfo of pk if exists. +// Make sure PkIsHandle checked before call this method. +func (t *TableInfo) GetPkColInfo() *ColumnInfo { + for _, colInfo := range t.Columns { + if mysql.HasPriKeyFlag(colInfo.Flag) { + return colInfo + } + } + return nil +} + +func (t *TableInfo) GetAutoIncrementColInfo() *ColumnInfo { + for _, colInfo := range t.Columns { + if mysql.HasAutoIncrementFlag(colInfo.Flag) { + return colInfo + } + } + return nil +} + +func (t *TableInfo) IsAutoIncColUnsigned() bool { + col := t.GetAutoIncrementColInfo() + if col == nil { + return false + } + return mysql.HasUnsignedFlag(col.Flag) +} + +// Cols returns the columns of the table in public state. +func (t *TableInfo) Cols() []*ColumnInfo { + publicColumns := make([]*ColumnInfo, len(t.Columns)) + maxOffset := -1 + for _, col := range t.Columns { + if col.State != StatePublic { + continue + } + publicColumns[col.Offset] = col + if maxOffset < col.Offset { + maxOffset = col.Offset + } + } + return publicColumns[0 : maxOffset+1] +} + +// FindIndexByName finds index by name. +func (t *TableInfo) FindIndexByName(idxName string) *IndexInfo { + for _, idx := range t.Indices { + if idx.Name.L == idxName { + return idx + } + } + return nil +} + +// IsLocked checks whether the table was locked. +func (t *TableInfo) IsLocked() bool { + return t.Lock != nil && len(t.Lock.Sessions) > 0 +} + +// NewExtraHandleColInfo mocks a column info for extra handle column. +func NewExtraHandleColInfo() *ColumnInfo { + colInfo := &ColumnInfo{ + ID: ExtraHandleID, + Name: ExtraHandleName, + } + colInfo.Flag = mysql.PriKeyFlag + colInfo.Tp = mysql.TypeLonglong + colInfo.Flen, colInfo.Decimal = mysql.GetDefaultFieldLengthAndDecimal(mysql.TypeLonglong) + return colInfo +} + +// ColumnIsInIndex checks whether c is included in any indices of t. +func (t *TableInfo) ColumnIsInIndex(c *ColumnInfo) bool { + for _, index := range t.Indices { + for _, column := range index.Columns { + if column.Name.L == c.Name.L { + return true + } + } + } + return false +} + +// IsView checks if tableinfo is a view +func (t *TableInfo) IsView() bool { + return t.View != nil +} + +// ViewAlgorithm is VIEW's SQL AlGORITHM characteristic. +// See https://dev.mysql.com/doc/refman/5.7/en/view-algorithms.html +type ViewAlgorithm int + +const ( + AlgorithmUndefined ViewAlgorithm = iota + AlgorithmMerge + AlgorithmTemptable +) + +func (v *ViewAlgorithm) String() string { + switch *v { + case AlgorithmMerge: + return "MERGE" + case AlgorithmTemptable: + return "TEMPTABLE" + case AlgorithmUndefined: + return "UNDEFINED" + default: + return "UNDEFINED" + } +} + +// ViewSecurity is VIEW's SQL SECURITY characteristic. +// See https://dev.mysql.com/doc/refman/5.7/en/create-view.html +type ViewSecurity int + +const ( + SecurityDefiner ViewSecurity = iota + SecurityInvoker +) + +func (v *ViewSecurity) String() string { + switch *v { + case SecurityInvoker: + return "INVOKER" + case SecurityDefiner: + return "DEFINER" + default: + return "DEFINER" + } +} + +// ViewCheckOption is VIEW's WITH CHECK OPTION clause part. +// See https://dev.mysql.com/doc/refman/5.7/en/view-check-option.html +type ViewCheckOption int + +const ( + CheckOptionLocal ViewCheckOption = iota + CheckOptionCascaded +) + +func (v *ViewCheckOption) String() string { + switch *v { + case CheckOptionLocal: + return "LOCAL" + case CheckOptionCascaded: + return "CASCADED" + default: + return "CASCADED" + } +} + +// ViewInfo provides meta data describing a DB view. +type ViewInfo struct { + Algorithm ViewAlgorithm `json:"view_algorithm"` + Definer *auth.UserIdentity `json:"view_definer"` + Security ViewSecurity `json:"view_security"` + SelectStmt string `json:"view_select"` + CheckOption ViewCheckOption `json:"view_checkoption"` + Cols []CIStr `json:"view_cols"` +} + +// PartitionType is the type for PartitionInfo +type PartitionType int + +// Partition types. +const ( + PartitionTypeRange PartitionType = 1 + PartitionTypeHash = 2 + PartitionTypeList = 3 + PartitionTypeKey = 4 + PartitionTypeSystemTime = 5 +) + +func (p PartitionType) String() string { + switch p { + case PartitionTypeRange: + return "RANGE" + case PartitionTypeHash: + return "HASH" + case PartitionTypeList: + return "LIST" + case PartitionTypeKey: + return "KEY" + case PartitionTypeSystemTime: + return "SYSTEM_TIME" + default: + return "" + } + +} + +// PartitionInfo provides table partition info. +type PartitionInfo struct { + Type PartitionType `json:"type"` + Expr string `json:"expr"` + Columns []CIStr `json:"columns"` + + // User may already creates table with partition but table partition is not + // yet supported back then. When Enable is true, write/read need use tid + // rather than pid. + Enable bool `json:"enable"` + + Definitions []PartitionDefinition `json:"definitions"` + Num uint64 `json:"num"` +} + +// GetNameByID gets the partition name by ID. +func (pi *PartitionInfo) GetNameByID(id int64) string { + for _, def := range pi.Definitions { + if id == def.ID { + return def.Name.L + } + } + return "" +} + +// PartitionDefinition defines a single partition. +type PartitionDefinition struct { + ID int64 `json:"id"` + Name CIStr `json:"name"` + LessThan []string `json:"less_than"` + Comment string `json:"comment,omitempty"` +} + +// IndexColumn provides index column info. +type IndexColumn struct { + Name CIStr `json:"name"` // Index name + Offset int `json:"offset"` // Index offset + // Length of prefix when using column prefix + // for indexing; + // UnspecifedLength if not using prefix indexing + Length int `json:"length"` +} + +// Clone clones IndexColumn. +func (i *IndexColumn) Clone() *IndexColumn { + ni := *i + return &ni +} + +// IndexType is the type of index +type IndexType int + +// String implements Stringer interface. +func (t IndexType) String() string { + switch t { + case IndexTypeBtree: + return "BTREE" + case IndexTypeHash: + return "HASH" + case IndexTypeRtree: + return "RTREE" + default: + return "" + } +} + +// IndexTypes +const ( + IndexTypeInvalid IndexType = iota + IndexTypeBtree + IndexTypeHash + IndexTypeRtree +) + +// IndexInfo provides meta data describing a DB index. +// It corresponds to the statement `CREATE INDEX Name ON Table (Column);` +// See https://dev.mysql.com/doc/refman/5.7/en/create-index.html +type IndexInfo struct { + ID int64 `json:"id"` + Name CIStr `json:"idx_name"` // Index name. + Table CIStr `json:"tbl_name"` // Table name. + Columns []*IndexColumn `json:"idx_cols"` // Index columns. + Unique bool `json:"is_unique"` // Whether the index is unique. + Primary bool `json:"is_primary"` // Whether the index is primary key. + State SchemaState `json:"state"` + Comment string `json:"comment"` // Comment + Tp IndexType `json:"index_type"` // Index type: Btree, Hash or Rtree +} + +// Clone clones IndexInfo. +func (index *IndexInfo) Clone() *IndexInfo { + ni := *index + ni.Columns = make([]*IndexColumn, len(index.Columns)) + for i := range index.Columns { + ni.Columns[i] = index.Columns[i].Clone() + } + return &ni +} + +// HasPrefixIndex returns whether any columns of this index uses prefix length. +func (index *IndexInfo) HasPrefixIndex() bool { + for _, ic := range index.Columns { + if ic.Length != types.UnspecifiedLength { + return true + } + } + return false +} + +// FKInfo provides meta data describing a foreign key constraint. +type FKInfo struct { + ID int64 `json:"id"` + Name CIStr `json:"fk_name"` + RefTable CIStr `json:"ref_table"` + RefCols []CIStr `json:"ref_cols"` + Cols []CIStr `json:"cols"` + OnDelete int `json:"on_delete"` + OnUpdate int `json:"on_update"` + State SchemaState `json:"state"` +} + +// Clone clones FKInfo. +func (fk *FKInfo) Clone() *FKInfo { + nfk := *fk + + nfk.RefCols = make([]CIStr, len(fk.RefCols)) + nfk.Cols = make([]CIStr, len(fk.Cols)) + copy(nfk.RefCols, fk.RefCols) + copy(nfk.Cols, fk.Cols) + + return &nfk +} + +// DBInfo provides meta data describing a DB. +type DBInfo struct { + ID int64 `json:"id"` // Database ID + Name CIStr `json:"db_name"` // DB name. + Charset string `json:"charset"` + Collate string `json:"collate"` + Tables []*TableInfo `json:"-"` // Tables in the DB. + State SchemaState `json:"state"` +} + +// Clone clones DBInfo. +func (db *DBInfo) Clone() *DBInfo { + newInfo := *db + newInfo.Tables = make([]*TableInfo, len(db.Tables)) + for i := range db.Tables { + newInfo.Tables[i] = db.Tables[i].Clone() + } + return &newInfo +} + +// Copy shallow copies DBInfo. +func (db *DBInfo) Copy() *DBInfo { + newInfo := *db + newInfo.Tables = make([]*TableInfo, len(db.Tables)) + copy(newInfo.Tables, db.Tables) + return &newInfo +} + +// CIStr is case insensitive string. +type CIStr struct { + O string `json:"O"` // Original string. + L string `json:"L"` // Lower case string. +} + +// String implements fmt.Stringer interface. +func (cis CIStr) String() string { + return cis.O +} + +// NewCIStr creates a new CIStr. +func NewCIStr(s string) (cs CIStr) { + cs.O = s + cs.L = strings.ToLower(s) + return +} + +// UnmarshalJSON implements the user defined unmarshal method. +// CIStr can be unmarshaled from a single string, so PartitionDefinition.Name +// in this change https://github.com/pingcap/tidb/pull/6460/files would be +// compatible during TiDB upgrading. +func (cis *CIStr) UnmarshalJSON(b []byte) error { + type T CIStr + if err := json.Unmarshal(b, (*T)(cis)); err == nil { + return nil + } + + // Unmarshal CIStr from a single string. + err := json.Unmarshal(b, &cis.O) + if err != nil { + return errors.Trace(err) + } + cis.L = strings.ToLower(cis.O) + return nil +} + +// ColumnsToProto converts a slice of model.ColumnInfo to a slice of tipb.ColumnInfo. +func ColumnsToProto(columns []*ColumnInfo, pkIsHandle bool) []*tipb.ColumnInfo { + cols := make([]*tipb.ColumnInfo, 0, len(columns)) + for _, c := range columns { + col := ColumnToProto(c) + // TODO: Here `PkHandle`'s meaning is changed, we will change it to `IsHandle` when tikv's old select logic + // is abandoned. + if (pkIsHandle && mysql.HasPriKeyFlag(c.Flag)) || c.ID == ExtraHandleID { + col.PkHandle = true + } else { + col.PkHandle = false + } + cols = append(cols, col) + } + return cols +} + +// IndexToProto converts a model.IndexInfo to a tipb.IndexInfo. +func IndexToProto(t *TableInfo, idx *IndexInfo) *tipb.IndexInfo { + pi := &tipb.IndexInfo{ + TableId: t.ID, + IndexId: idx.ID, + Unique: idx.Unique, + } + cols := make([]*tipb.ColumnInfo, 0, len(idx.Columns)+1) + for _, c := range idx.Columns { + cols = append(cols, ColumnToProto(t.Columns[c.Offset])) + } + if t.PKIsHandle { + // Coprocessor needs to know PKHandle column info, so we need to append it. + for _, col := range t.Columns { + if mysql.HasPriKeyFlag(col.Flag) { + colPB := ColumnToProto(col) + colPB.PkHandle = true + cols = append(cols, colPB) + break + } + } + } + pi.Columns = cols + return pi +} + +// ColumnToProto converts model.ColumnInfo to tipb.ColumnInfo. +func ColumnToProto(c *ColumnInfo) *tipb.ColumnInfo { + pc := &tipb.ColumnInfo{ + ColumnId: c.ID, + Collation: collationToProto(c.FieldType.Collate), + ColumnLen: int32(c.FieldType.Flen), + Decimal: int32(c.FieldType.Decimal), + Flag: int32(c.Flag), + Elems: c.Elems, + } + pc.Tp = int32(c.FieldType.Tp) + return pc +} + +// TODO: update it when more collate is supported. +func collationToProto(c string) int32 { + v := mysql.CollationNames[c] + if v == mysql.BinaryDefaultCollationID { + return int32(mysql.BinaryDefaultCollationID) + } + // We only support binary and utf8_bin collation. + // Setting other collations to utf8_bin for old data compatibility. + // For the data created when we didn't enforce utf8_bin collation in create table. + return int32(mysql.DefaultCollationID) +} + +// TableColumnID is composed by table ID and column ID. +type TableColumnID struct { + TableID int64 + ColumnID int64 +} diff --git a/vendor/github.com/pingcap/parser/mysql/charset.go b/vendor/github.com/pingcap/parser/mysql/charset.go new file mode 100644 index 0000000..d3115df --- /dev/null +++ b/vendor/github.com/pingcap/parser/mysql/charset.go @@ -0,0 +1,635 @@ +// Copyright 2015 PingCAP, Inc. +// +// 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package mysql + +import "unicode" + +// CharsetNameToID maps charset name to its default collation ID. +func CharsetNameToID(charset string) uint8 { + // Use quick path for TiDB to avoid access CharsetIDs map + // "SHOW CHARACTER SET;" to see all the supported character sets. + if charset == "utf8mb4" { + return UTF8MB4DefaultCollationID + } else if charset == "binary" { + return BinaryDefaultCollationID + } else if charset == "utf8" { + return UTF8DefaultCollationID + } else if charset == "ascii" { + return ASCIIDefaultCollationID + } else if charset == "latin1" { + return Latin1DefaultCollationID + } else { + return CharsetIDs[charset] + } +} + +// CharsetIDs maps charset name to its default collation ID. +var CharsetIDs = map[string]uint8{ + "big5": 1, + "dec8": 3, + "cp850": 4, + "hp8": 6, + "koi8r": 7, + "latin1": Latin1DefaultCollationID, + "latin2": 9, + "swe7": 10, + "ascii": ASCIIDefaultCollationID, + "ujis": 12, + "sjis": 13, + "hebrew": 16, + "tis620": 18, + "euckr": 19, + "koi8u": 22, + "gb2312": 24, + "greek": 25, + "cp1250": 26, + "gbk": 28, + "latin5": 30, + "armscii8": 32, + "utf8": UTF8DefaultCollationID, + "ucs2": 35, + "cp866": 36, + "keybcs2": 37, + "macce": 38, + "macroman": 39, + "cp852": 40, + "latin7": 41, + "utf8mb4": UTF8MB4DefaultCollationID, + "cp1251": 51, + "utf16": 54, + "utf16le": 56, + "cp1256": 57, + "cp1257": 59, + "utf32": 60, + "binary": BinaryDefaultCollationID, + "geostd8": 92, + "cp932": 95, + "eucjpms": 97, +} + +// Charsets maps charset name to its default collation name. +var Charsets = map[string]string{ + "big5": "big5_chinese_ci", + "dec8": "dec8_swedish_ci", + "cp850": "cp850_general_ci", + "hp8": "hp8_english_ci", + "koi8r": "koi8r_general_ci", + "latin1": "latin1_bin", + "latin2": "latin2_general_ci", + "swe7": "swe7_swedish_ci", + "ascii": "ascii_bin", + "ujis": "ujis_japanese_ci", + "sjis": "sjis_japanese_ci", + "hebrew": "hebrew_general_ci", + "tis620": "tis620_thai_ci", + "euckr": "euckr_korean_ci", + "koi8u": "koi8u_general_ci", + "gb2312": "gb2312_chinese_ci", + "greek": "greek_general_ci", + "cp1250": "cp1250_general_ci", + "gbk": "gbk_chinese_ci", + "latin5": "latin5_turkish_ci", + "armscii8": "armscii8_general_ci", + "utf8": "utf8_bin", + "ucs2": "ucs2_general_ci", + "cp866": "cp866_general_ci", + "keybcs2": "keybcs2_general_ci", + "macce": "macce_general_ci", + "macroman": "macroman_general_ci", + "cp852": "cp852_general_ci", + "latin7": "latin7_general_ci", + "utf8mb4": "utf8mb4_bin", + "cp1251": "cp1251_general_ci", + "utf16": "utf16_general_ci", + "utf16le": "utf16le_general_ci", + "cp1256": "cp1256_general_ci", + "cp1257": "cp1257_general_ci", + "utf32": "utf32_general_ci", + "binary": "binary", + "geostd8": "geostd8_general_ci", + "cp932": "cp932_japanese_ci", + "eucjpms": "eucjpms_japanese_ci", +} + +// Collations maps MySQL collation ID to its name. +var Collations = map[uint8]string{ + 1: "big5_chinese_ci", + 2: "latin2_czech_cs", + 3: "dec8_swedish_ci", + 4: "cp850_general_ci", + 5: "latin1_german1_ci", + 6: "hp8_english_ci", + 7: "koi8r_general_ci", + 8: "latin1_swedish_ci", + 9: "latin2_general_ci", + 10: "swe7_swedish_ci", + 11: "ascii_general_ci", + 12: "ujis_japanese_ci", + 13: "sjis_japanese_ci", + 14: "cp1251_bulgarian_ci", + 15: "latin1_danish_ci", + 16: "hebrew_general_ci", + 18: "tis620_thai_ci", + 19: "euckr_korean_ci", + 20: "latin7_estonian_cs", + 21: "latin2_hungarian_ci", + 22: "koi8u_general_ci", + 23: "cp1251_ukrainian_ci", + 24: "gb2312_chinese_ci", + 25: "greek_general_ci", + 26: "cp1250_general_ci", + 27: "latin2_croatian_ci", + 28: "gbk_chinese_ci", + 29: "cp1257_lithuanian_ci", + 30: "latin5_turkish_ci", + 31: "latin1_german2_ci", + 32: "armscii8_general_ci", + 33: "utf8_general_ci", + 34: "cp1250_czech_cs", + 35: "ucs2_general_ci", + 36: "cp866_general_ci", + 37: "keybcs2_general_ci", + 38: "macce_general_ci", + 39: "macroman_general_ci", + 40: "cp852_general_ci", + 41: "latin7_general_ci", + 42: "latin7_general_cs", + 43: "macce_bin", + 44: "cp1250_croatian_ci", + 45: "utf8mb4_general_ci", + 46: "utf8mb4_bin", + 47: "latin1_bin", + 48: "latin1_general_ci", + 49: "latin1_general_cs", + 50: "cp1251_bin", + 51: "cp1251_general_ci", + 52: "cp1251_general_cs", + 53: "macroman_bin", + 54: "utf16_general_ci", + 55: "utf16_bin", + 56: "utf16le_general_ci", + 57: "cp1256_general_ci", + 58: "cp1257_bin", + 59: "cp1257_general_ci", + 60: "utf32_general_ci", + 61: "utf32_bin", + 62: "utf16le_bin", + 63: "binary", + 64: "armscii8_bin", + 65: "ascii_bin", + 66: "cp1250_bin", + 67: "cp1256_bin", + 68: "cp866_bin", + 69: "dec8_bin", + 70: "greek_bin", + 71: "hebrew_bin", + 72: "hp8_bin", + 73: "keybcs2_bin", + 74: "koi8r_bin", + 75: "koi8u_bin", + 77: "latin2_bin", + 78: "latin5_bin", + 79: "latin7_bin", + 80: "cp850_bin", + 81: "cp852_bin", + 82: "swe7_bin", + 83: "utf8_bin", + 84: "big5_bin", + 85: "euckr_bin", + 86: "gb2312_bin", + 87: "gbk_bin", + 88: "sjis_bin", + 89: "tis620_bin", + 90: "ucs2_bin", + 91: "ujis_bin", + 92: "geostd8_general_ci", + 93: "geostd8_bin", + 94: "latin1_spanish_ci", + 95: "cp932_japanese_ci", + 96: "cp932_bin", + 97: "eucjpms_japanese_ci", + 98: "eucjpms_bin", + 99: "cp1250_polish_ci", + 101: "utf16_unicode_ci", + 102: "utf16_icelandic_ci", + 103: "utf16_latvian_ci", + 104: "utf16_romanian_ci", + 105: "utf16_slovenian_ci", + 106: "utf16_polish_ci", + 107: "utf16_estonian_ci", + 108: "utf16_spanish_ci", + 109: "utf16_swedish_ci", + 110: "utf16_turkish_ci", + 111: "utf16_czech_ci", + 112: "utf16_danish_ci", + 113: "utf16_lithuanian_ci", + 114: "utf16_slovak_ci", + 115: "utf16_spanish2_ci", + 116: "utf16_roman_ci", + 117: "utf16_persian_ci", + 118: "utf16_esperanto_ci", + 119: "utf16_hungarian_ci", + 120: "utf16_sinhala_ci", + 121: "utf16_german2_ci", + 122: "utf16_croatian_ci", + 123: "utf16_unicode_520_ci", + 124: "utf16_vietnamese_ci", + 128: "ucs2_unicode_ci", + 129: "ucs2_icelandic_ci", + 130: "ucs2_latvian_ci", + 131: "ucs2_romanian_ci", + 132: "ucs2_slovenian_ci", + 133: "ucs2_polish_ci", + 134: "ucs2_estonian_ci", + 135: "ucs2_spanish_ci", + 136: "ucs2_swedish_ci", + 137: "ucs2_turkish_ci", + 138: "ucs2_czech_ci", + 139: "ucs2_danish_ci", + 140: "ucs2_lithuanian_ci", + 141: "ucs2_slovak_ci", + 142: "ucs2_spanish2_ci", + 143: "ucs2_roman_ci", + 144: "ucs2_persian_ci", + 145: "ucs2_esperanto_ci", + 146: "ucs2_hungarian_ci", + 147: "ucs2_sinhala_ci", + 148: "ucs2_german2_ci", + 149: "ucs2_croatian_ci", + 150: "ucs2_unicode_520_ci", + 151: "ucs2_vietnamese_ci", + 159: "ucs2_general_mysql500_ci", + 160: "utf32_unicode_ci", + 161: "utf32_icelandic_ci", + 162: "utf32_latvian_ci", + 163: "utf32_romanian_ci", + 164: "utf32_slovenian_ci", + 165: "utf32_polish_ci", + 166: "utf32_estonian_ci", + 167: "utf32_spanish_ci", + 168: "utf32_swedish_ci", + 169: "utf32_turkish_ci", + 170: "utf32_czech_ci", + 171: "utf32_danish_ci", + 172: "utf32_lithuanian_ci", + 173: "utf32_slovak_ci", + 174: "utf32_spanish2_ci", + 175: "utf32_roman_ci", + 176: "utf32_persian_ci", + 177: "utf32_esperanto_ci", + 178: "utf32_hungarian_ci", + 179: "utf32_sinhala_ci", + 180: "utf32_german2_ci", + 181: "utf32_croatian_ci", + 182: "utf32_unicode_520_ci", + 183: "utf32_vietnamese_ci", + 192: "utf8_unicode_ci", + 193: "utf8_icelandic_ci", + 194: "utf8_latvian_ci", + 195: "utf8_romanian_ci", + 196: "utf8_slovenian_ci", + 197: "utf8_polish_ci", + 198: "utf8_estonian_ci", + 199: "utf8_spanish_ci", + 200: "utf8_swedish_ci", + 201: "utf8_turkish_ci", + 202: "utf8_czech_ci", + 203: "utf8_danish_ci", + 204: "utf8_lithuanian_ci", + 205: "utf8_slovak_ci", + 206: "utf8_spanish2_ci", + 207: "utf8_roman_ci", + 208: "utf8_persian_ci", + 209: "utf8_esperanto_ci", + 210: "utf8_hungarian_ci", + 211: "utf8_sinhala_ci", + 212: "utf8_german2_ci", + 213: "utf8_croatian_ci", + 214: "utf8_unicode_520_ci", + 215: "utf8_vietnamese_ci", + 223: "utf8_general_mysql500_ci", + 224: "utf8mb4_unicode_ci", + 225: "utf8mb4_icelandic_ci", + 226: "utf8mb4_latvian_ci", + 227: "utf8mb4_romanian_ci", + 228: "utf8mb4_slovenian_ci", + 229: "utf8mb4_polish_ci", + 230: "utf8mb4_estonian_ci", + 231: "utf8mb4_spanish_ci", + 232: "utf8mb4_swedish_ci", + 233: "utf8mb4_turkish_ci", + 234: "utf8mb4_czech_ci", + 235: "utf8mb4_danish_ci", + 236: "utf8mb4_lithuanian_ci", + 237: "utf8mb4_slovak_ci", + 238: "utf8mb4_spanish2_ci", + 239: "utf8mb4_roman_ci", + 240: "utf8mb4_persian_ci", + 241: "utf8mb4_esperanto_ci", + 242: "utf8mb4_hungarian_ci", + 243: "utf8mb4_sinhala_ci", + 244: "utf8mb4_german2_ci", + 245: "utf8mb4_croatian_ci", + 246: "utf8mb4_unicode_520_ci", + 247: "utf8mb4_vietnamese_ci", + 255: "utf8mb4_0900_ai_ci", +} + +// CollationNames maps MySQL collation name to its ID +var CollationNames = map[string]uint8{ + "big5_chinese_ci": 1, + "latin2_czech_cs": 2, + "dec8_swedish_ci": 3, + "cp850_general_ci": 4, + "latin1_german1_ci": 5, + "hp8_english_ci": 6, + "koi8r_general_ci": 7, + "latin1_swedish_ci": 8, + "latin2_general_ci": 9, + "swe7_swedish_ci": 10, + "ascii_general_ci": 11, + "ujis_japanese_ci": 12, + "sjis_japanese_ci": 13, + "cp1251_bulgarian_ci": 14, + "latin1_danish_ci": 15, + "hebrew_general_ci": 16, + "tis620_thai_ci": 18, + "euckr_korean_ci": 19, + "latin7_estonian_cs": 20, + "latin2_hungarian_ci": 21, + "koi8u_general_ci": 22, + "cp1251_ukrainian_ci": 23, + "gb2312_chinese_ci": 24, + "greek_general_ci": 25, + "cp1250_general_ci": 26, + "latin2_croatian_ci": 27, + "gbk_chinese_ci": 28, + "cp1257_lithuanian_ci": 29, + "latin5_turkish_ci": 30, + "latin1_german2_ci": 31, + "armscii8_general_ci": 32, + "utf8_general_ci": 33, + "cp1250_czech_cs": 34, + "ucs2_general_ci": 35, + "cp866_general_ci": 36, + "keybcs2_general_ci": 37, + "macce_general_ci": 38, + "macroman_general_ci": 39, + "cp852_general_ci": 40, + "latin7_general_ci": 41, + "latin7_general_cs": 42, + "macce_bin": 43, + "cp1250_croatian_ci": 44, + "utf8mb4_general_ci": 45, + "utf8mb4_bin": 46, + "latin1_bin": 47, + "latin1_general_ci": 48, + "latin1_general_cs": 49, + "cp1251_bin": 50, + "cp1251_general_ci": 51, + "cp1251_general_cs": 52, + "macroman_bin": 53, + "utf16_general_ci": 54, + "utf16_bin": 55, + "utf16le_general_ci": 56, + "cp1256_general_ci": 57, + "cp1257_bin": 58, + "cp1257_general_ci": 59, + "utf32_general_ci": 60, + "utf32_bin": 61, + "utf16le_bin": 62, + "binary": 63, + "armscii8_bin": 64, + "ascii_bin": 65, + "cp1250_bin": 66, + "cp1256_bin": 67, + "cp866_bin": 68, + "dec8_bin": 69, + "greek_bin": 70, + "hebrew_bin": 71, + "hp8_bin": 72, + "keybcs2_bin": 73, + "koi8r_bin": 74, + "koi8u_bin": 75, + "latin2_bin": 77, + "latin5_bin": 78, + "latin7_bin": 79, + "cp850_bin": 80, + "cp852_bin": 81, + "swe7_bin": 82, + "utf8_bin": 83, + "big5_bin": 84, + "euckr_bin": 85, + "gb2312_bin": 86, + "gbk_bin": 87, + "sjis_bin": 88, + "tis620_bin": 89, + "ucs2_bin": 90, + "ujis_bin": 91, + "geostd8_general_ci": 92, + "geostd8_bin": 93, + "latin1_spanish_ci": 94, + "cp932_japanese_ci": 95, + "cp932_bin": 96, + "eucjpms_japanese_ci": 97, + "eucjpms_bin": 98, + "cp1250_polish_ci": 99, + "utf16_unicode_ci": 101, + "utf16_icelandic_ci": 102, + "utf16_latvian_ci": 103, + "utf16_romanian_ci": 104, + "utf16_slovenian_ci": 105, + "utf16_polish_ci": 106, + "utf16_estonian_ci": 107, + "utf16_spanish_ci": 108, + "utf16_swedish_ci": 109, + "utf16_turkish_ci": 110, + "utf16_czech_ci": 111, + "utf16_danish_ci": 112, + "utf16_lithuanian_ci": 113, + "utf16_slovak_ci": 114, + "utf16_spanish2_ci": 115, + "utf16_roman_ci": 116, + "utf16_persian_ci": 117, + "utf16_esperanto_ci": 118, + "utf16_hungarian_ci": 119, + "utf16_sinhala_ci": 120, + "utf16_german2_ci": 121, + "utf16_croatian_ci": 122, + "utf16_unicode_520_ci": 123, + "utf16_vietnamese_ci": 124, + "ucs2_unicode_ci": 128, + "ucs2_icelandic_ci": 129, + "ucs2_latvian_ci": 130, + "ucs2_romanian_ci": 131, + "ucs2_slovenian_ci": 132, + "ucs2_polish_ci": 133, + "ucs2_estonian_ci": 134, + "ucs2_spanish_ci": 135, + "ucs2_swedish_ci": 136, + "ucs2_turkish_ci": 137, + "ucs2_czech_ci": 138, + "ucs2_danish_ci": 139, + "ucs2_lithuanian_ci": 140, + "ucs2_slovak_ci": 141, + "ucs2_spanish2_ci": 142, + "ucs2_roman_ci": 143, + "ucs2_persian_ci": 144, + "ucs2_esperanto_ci": 145, + "ucs2_hungarian_ci": 146, + "ucs2_sinhala_ci": 147, + "ucs2_german2_ci": 148, + "ucs2_croatian_ci": 149, + "ucs2_unicode_520_ci": 150, + "ucs2_vietnamese_ci": 151, + "ucs2_general_mysql500_ci": 159, + "utf32_unicode_ci": 160, + "utf32_icelandic_ci": 161, + "utf32_latvian_ci": 162, + "utf32_romanian_ci": 163, + "utf32_slovenian_ci": 164, + "utf32_polish_ci": 165, + "utf32_estonian_ci": 166, + "utf32_spanish_ci": 167, + "utf32_swedish_ci": 168, + "utf32_turkish_ci": 169, + "utf32_czech_ci": 170, + "utf32_danish_ci": 171, + "utf32_lithuanian_ci": 172, + "utf32_slovak_ci": 173, + "utf32_spanish2_ci": 174, + "utf32_roman_ci": 175, + "utf32_persian_ci": 176, + "utf32_esperanto_ci": 177, + "utf32_hungarian_ci": 178, + "utf32_sinhala_ci": 179, + "utf32_german2_ci": 180, + "utf32_croatian_ci": 181, + "utf32_unicode_520_ci": 182, + "utf32_vietnamese_ci": 183, + "utf8_unicode_ci": 192, + "utf8_icelandic_ci": 193, + "utf8_latvian_ci": 194, + "utf8_romanian_ci": 195, + "utf8_slovenian_ci": 196, + "utf8_polish_ci": 197, + "utf8_estonian_ci": 198, + "utf8_spanish_ci": 199, + "utf8_swedish_ci": 200, + "utf8_turkish_ci": 201, + "utf8_czech_ci": 202, + "utf8_danish_ci": 203, + "utf8_lithuanian_ci": 204, + "utf8_slovak_ci": 205, + "utf8_spanish2_ci": 206, + "utf8_roman_ci": 207, + "utf8_persian_ci": 208, + "utf8_esperanto_ci": 209, + "utf8_hungarian_ci": 210, + "utf8_sinhala_ci": 211, + "utf8_german2_ci": 212, + "utf8_croatian_ci": 213, + "utf8_unicode_520_ci": 214, + "utf8_vietnamese_ci": 215, + "utf8_general_mysql500_ci": 223, + "utf8mb4_unicode_ci": 224, + "utf8mb4_icelandic_ci": 225, + "utf8mb4_latvian_ci": 226, + "utf8mb4_romanian_ci": 227, + "utf8mb4_slovenian_ci": 228, + "utf8mb4_polish_ci": 229, + "utf8mb4_estonian_ci": 230, + "utf8mb4_spanish_ci": 231, + "utf8mb4_swedish_ci": 232, + "utf8mb4_turkish_ci": 233, + "utf8mb4_czech_ci": 234, + "utf8mb4_danish_ci": 235, + "utf8mb4_lithuanian_ci": 236, + "utf8mb4_slovak_ci": 237, + "utf8mb4_spanish2_ci": 238, + "utf8mb4_roman_ci": 239, + "utf8mb4_persian_ci": 240, + "utf8mb4_esperanto_ci": 241, + "utf8mb4_hungarian_ci": 242, + "utf8mb4_sinhala_ci": 243, + "utf8mb4_german2_ci": 244, + "utf8mb4_croatian_ci": 245, + "utf8mb4_unicode_520_ci": 246, + "utf8mb4_vietnamese_ci": 247, + "utf8mb4_0900_ai_ci": 255, +} + +// MySQL collation information. +const ( + UTF8Charset = "utf8" + UTF8MB4Charset = "utf8mb4" + DefaultCharset = UTF8MB4Charset + // DefaultCollationID is utf8mb4_bin(46) + DefaultCollationID = 46 + Latin1DefaultCollationID = 47 + ASCIIDefaultCollationID = 65 + UTF8DefaultCollationID = 83 + UTF8MB4DefaultCollationID = 46 + BinaryDefaultCollationID = 63 + UTF8DefaultCollation = "utf8_bin" + UTF8MB4DefaultCollation = "utf8mb4_bin" + DefaultCollationName = UTF8MB4DefaultCollation + + // MaxBytesOfCharacter, is the max bytes length of a character, + // refer to RFC3629, in UTF-8, characters from the U+0000..U+10FFFF range + // (the UTF-16 accessible range) are encoded using sequences of 1 to 4 octets. + MaxBytesOfCharacter = 4 +) + +// IsUTF8Charset checks if charset is utf8 or utf8mb4 +func IsUTF8Charset(charset string) bool { + return charset == UTF8Charset || charset == UTF8MB4Charset +} + +// RangeGraph defines valid unicode characters to use in column names. It strictly follows MySQL's definition. +// See #3994. +var RangeGraph = []*unicode.RangeTable{ + // _MY_PNT + unicode.No, + unicode.Mn, + unicode.Me, + unicode.Pc, + unicode.Pd, + unicode.Pd, + unicode.Ps, + unicode.Pe, + unicode.Pi, + unicode.Pf, + unicode.Po, + unicode.Sm, + unicode.Sc, + unicode.Sk, + unicode.So, + // _MY_U + unicode.Lu, + unicode.Lt, + unicode.Nl, + // _MY_L + unicode.Ll, + unicode.Lm, + unicode.Lo, + unicode.Nl, + unicode.Mn, + unicode.Mc, + unicode.Me, + // _MY_NMR + unicode.Nd, + unicode.Nl, + unicode.No, +} diff --git a/vendor/github.com/pingcap/parser/mysql/const.go b/vendor/github.com/pingcap/parser/mysql/const.go new file mode 100644 index 0000000..93ce1f8 --- /dev/null +++ b/vendor/github.com/pingcap/parser/mysql/const.go @@ -0,0 +1,782 @@ +// Copyright 2017 PingCAP, Inc. +// +// 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package mysql + +import ( + "fmt" + "strings" + + "github.com/pingcap/errors" + . "github.com/pingcap/parser/format" +) + +func newInvalidModeErr(s string) error { + return NewErr(ErrWrongValueForVar, "sql_mode", s) +} + +// Version information. +var ( + // TiDBReleaseVersion is initialized by (git describe --tags) in Makefile. + TiDBReleaseVersion = "None" + + // ServerVersion is the version information of this tidb-server in MySQL's format. + ServerVersion = fmt.Sprintf("5.7.25-TiDB-%s", TiDBReleaseVersion) +) + +// Header information. +const ( + OKHeader byte = 0x00 + ErrHeader byte = 0xff + EOFHeader byte = 0xfe + LocalInFileHeader byte = 0xfb +) + +// Server information. +const ( + ServerStatusInTrans uint16 = 0x0001 + ServerStatusAutocommit uint16 = 0x0002 + ServerMoreResultsExists uint16 = 0x0008 + ServerStatusNoGoodIndexUsed uint16 = 0x0010 + ServerStatusNoIndexUsed uint16 = 0x0020 + ServerStatusCursorExists uint16 = 0x0040 + ServerStatusLastRowSend uint16 = 0x0080 + ServerStatusDBDropped uint16 = 0x0100 + ServerStatusNoBackslashEscaped uint16 = 0x0200 + ServerStatusMetadataChanged uint16 = 0x0400 + ServerStatusWasSlow uint16 = 0x0800 + ServerPSOutParams uint16 = 0x1000 +) + +// HasCursorExistsFlag return true if cursor exists indicated by server status. +func HasCursorExistsFlag(serverStatus uint16) bool { + return serverStatus&ServerStatusCursorExists > 0 +} + +// Identifier length limitations. +// See https://dev.mysql.com/doc/refman/5.7/en/identifiers.html +const ( + // MaxPayloadLen is the max packet payload length. + MaxPayloadLen = 1<<24 - 1 + // MaxTableNameLength is max length of table name identifier. + MaxTableNameLength = 64 + // MaxDatabaseNameLength is max length of database name identifier. + MaxDatabaseNameLength = 64 + // MaxColumnNameLength is max length of column name identifier. + MaxColumnNameLength = 64 + // MaxKeyParts is max length of key parts. + MaxKeyParts = 16 + // MaxIndexIdentifierLen is max length of index identifier. + MaxIndexIdentifierLen = 64 + // MaxConstraintIdentifierLen is max length of constrain identifier. + MaxConstraintIdentifierLen = 64 + // MaxViewIdentifierLen is max length of view identifier. + MaxViewIdentifierLen = 64 + // MaxAliasIdentifierLen is max length of alias identifier. + MaxAliasIdentifierLen = 256 + // MaxUserDefinedVariableLen is max length of user-defined variable. + MaxUserDefinedVariableLen = 64 +) + +// ErrTextLength error text length limit. +const ErrTextLength = 80 + +// Command information. +const ( + ComSleep byte = iota + ComQuit + ComInitDB + ComQuery + ComFieldList + ComCreateDB + ComDropDB + ComRefresh + ComShutdown + ComStatistics + ComProcessInfo + ComConnect + ComProcessKill + ComDebug + ComPing + ComTime + ComDelayedInsert + ComChangeUser + ComBinlogDump + ComTableDump + ComConnectOut + ComRegisterSlave + ComStmtPrepare + ComStmtExecute + ComStmtSendLongData + ComStmtClose + ComStmtReset + ComSetOption + ComStmtFetch + ComDaemon + ComBinlogDumpGtid + ComResetConnection + ComEnd +) + +// Client information. +const ( + ClientLongPassword uint32 = 1 << iota + ClientFoundRows + ClientLongFlag + ClientConnectWithDB + ClientNoSchema + ClientCompress + ClientODBC + ClientLocalFiles + ClientIgnoreSpace + ClientProtocol41 + ClientInteractive + ClientSSL + ClientIgnoreSigpipe + ClientTransactions + ClientReserved + ClientSecureConnection + ClientMultiStatements + ClientMultiResults + ClientPSMultiResults + ClientPluginAuth + ClientConnectAtts + ClientPluginAuthLenencClientData +) + +// Cache type information. +const ( + TypeNoCache byte = 0xff +) + +// Auth name information. +const ( + AuthName = "mysql_native_password" +) + +// MySQL database and tables. +const ( + // SystemDB is the name of system database. + SystemDB = "mysql" + // UserTable is the table in system db contains user info. + UserTable = "User" + // DBTable is the table in system db contains db scope privilege info. + DBTable = "DB" + // TablePrivTable is the table in system db contains table scope privilege info. + TablePrivTable = "Tables_priv" + // ColumnPrivTable is the table in system db contains column scope privilege info. + ColumnPrivTable = "Columns_priv" + // GlobalVariablesTable is the table contains global system variables. + GlobalVariablesTable = "GLOBAL_VARIABLES" + // GlobalStatusTable is the table contains global status variables. + GlobalStatusTable = "GLOBAL_STATUS" + // TiDBTable is the table contains tidb info. + TiDBTable = "tidb" + // RoleEdgesTable is the table contains role relation info + RoleEdgeTable = "role_edges" + // DefaultRoleTable is the table contain default active role info + DefaultRoleTable = "default_roles" +) + +// PrivilegeType privilege +type PrivilegeType uint32 + +const ( + _ PrivilegeType = 1 << iota + // CreatePriv is the privilege to create schema/table. + CreatePriv + // SelectPriv is the privilege to read from table. + SelectPriv + // InsertPriv is the privilege to insert data into table. + InsertPriv + // UpdatePriv is the privilege to update data in table. + UpdatePriv + // DeletePriv is the privilege to delete data from table. + DeletePriv + // ShowDBPriv is the privilege to run show databases statement. + ShowDBPriv + // SuperPriv enables many operations and server behaviors. + SuperPriv + // CreateUserPriv is the privilege to create user. + CreateUserPriv + // TriggerPriv is not checked yet. + TriggerPriv + // DropPriv is the privilege to drop schema/table. + DropPriv + // ProcessPriv pertains to display of information about the threads executing within the server. + ProcessPriv + // GrantPriv is the privilege to grant privilege to user. + GrantPriv + // ReferencesPriv is not checked yet. + ReferencesPriv + // AlterPriv is the privilege to run alter statement. + AlterPriv + // ExecutePriv is the privilege to run execute statement. + ExecutePriv + // IndexPriv is the privilege to create/drop index. + IndexPriv + // CreateViewPriv is the privilege to create view. + CreateViewPriv + // ShowViewPriv is the privilege to show create view. + ShowViewPriv + // CreateRolePriv the privilege to create a role. + CreateRolePriv + // DropRolePriv is the privilege to drop a role. + DropRolePriv + + CreateTMPTablePriv + LockTablesPriv + CreateRoutinePriv + AlterRoutinePriv + EventPriv + + // AllPriv is the privilege for all actions. + AllPriv +) + +// AllPrivMask is the mask for PrivilegeType with all bits set to 1. +// If it's passed to RequestVerification, it means any privilege would be OK. +const AllPrivMask = AllPriv - 1 + +// MySQL type maximum length. +const ( + // For arguments that have no fixed number of decimals, the decimals value is set to 31, + // which is 1 more than the maximum number of decimals permitted for the DECIMAL, FLOAT, and DOUBLE data types. + NotFixedDec = 31 + + MaxIntWidth = 20 + MaxRealWidth = 23 + MaxFloatingTypeScale = 30 + MaxFloatingTypeWidth = 255 + MaxDecimalScale = 30 + MaxDecimalWidth = 65 + MaxDateWidth = 10 // YYYY-MM-DD. + MaxDatetimeWidthNoFsp = 19 // YYYY-MM-DD HH:MM:SS + MaxDatetimeWidthWithFsp = 26 // YYYY-MM-DD HH:MM:SS[.fraction] + MaxDatetimeFullWidth = 29 // YYYY-MM-DD HH:MM:SS.###### AM + MaxDurationWidthNoFsp = 10 // HH:MM:SS + MaxDurationWidthWithFsp = 15 // HH:MM:SS[.fraction] + MaxBlobWidth = 16777216 + MaxBitDisplayWidth = 64 + MaxFloatPrecisionLength = 24 + MaxDoublePrecisionLength = 53 +) + +// MySQL max type field length. +const ( + MaxFieldCharLength = 255 + MaxFieldVarCharLength = 65535 +) + +// MaxTypeSetMembers is the number of set members. +const MaxTypeSetMembers = 64 + +// PWDHashLen is the length of password's hash. +const PWDHashLen = 40 + +// Priv2UserCol is the privilege to mysql.user table column name. +var Priv2UserCol = map[PrivilegeType]string{ + CreatePriv: "Create_priv", + SelectPriv: "Select_priv", + InsertPriv: "Insert_priv", + UpdatePriv: "Update_priv", + DeletePriv: "Delete_priv", + ShowDBPriv: "Show_db_priv", + SuperPriv: "Super_priv", + CreateUserPriv: "Create_user_priv", + TriggerPriv: "Trigger_priv", + DropPriv: "Drop_priv", + ProcessPriv: "Process_priv", + GrantPriv: "Grant_priv", + ReferencesPriv: "References_priv", + AlterPriv: "Alter_priv", + ExecutePriv: "Execute_priv", + IndexPriv: "Index_priv", + CreateViewPriv: "Create_view_priv", + ShowViewPriv: "Show_view_priv", + CreateRolePriv: "Create_role_priv", + DropRolePriv: "Drop_role_priv", + CreateTMPTablePriv: "Create_tmp_table_priv", + LockTablesPriv: "Lock_tables_priv", + CreateRoutinePriv: "Create_routine_priv", + AlterRoutinePriv: "Alter_routine_priv", + EventPriv: "Event_priv", +} + +// Col2PrivType is the privilege tables column name to privilege type. +var Col2PrivType = map[string]PrivilegeType{ + "Create_priv": CreatePriv, + "Select_priv": SelectPriv, + "Insert_priv": InsertPriv, + "Update_priv": UpdatePriv, + "Delete_priv": DeletePriv, + "Show_db_priv": ShowDBPriv, + "Super_priv": SuperPriv, + "Create_user_priv": CreateUserPriv, + "Trigger_priv": TriggerPriv, + "Drop_priv": DropPriv, + "Process_priv": ProcessPriv, + "Grant_priv": GrantPriv, + "References_priv": ReferencesPriv, + "Alter_priv": AlterPriv, + "Execute_priv": ExecutePriv, + "Index_priv": IndexPriv, + "Create_view_priv": CreateViewPriv, + "Show_view_priv": ShowViewPriv, + "Create_role_priv": CreateRolePriv, + "Drop_role_priv": DropRolePriv, + "Create_tmp_table_priv": CreateTMPTablePriv, + "Lock_tables_priv": LockTablesPriv, + "Create_routine_priv": CreateRoutinePriv, + "Alter_routine_priv": AlterRoutinePriv, + "Event_priv": EventPriv, +} + +// Command2Str is the command information to command name. +var Command2Str = map[byte]string{ + ComSleep: "Sleep", + ComQuit: "Quit", + ComInitDB: "Init DB", + ComQuery: "Query", + ComFieldList: "Field List", + ComCreateDB: "Create DB", + ComDropDB: "Drop DB", + ComRefresh: "Refresh", + ComShutdown: "Shutdown", + ComStatistics: "Statistics", + ComProcessInfo: "Processlist", + ComConnect: "Connect", + ComProcessKill: "Kill", + ComDebug: "Debug", + ComPing: "Ping", + ComTime: "Time", + ComDelayedInsert: "Delayed Insert", + ComChangeUser: "Change User", + ComBinlogDump: "Binlog Dump", + ComTableDump: "Table Dump", + ComConnectOut: "Connect out", + ComRegisterSlave: "Register Slave", + ComStmtPrepare: "Prepare", + ComStmtExecute: "Execute", + ComStmtSendLongData: "Long Data", + ComStmtClose: "Close stmt", + ComStmtReset: "Reset stmt", + ComSetOption: "Set option", + ComStmtFetch: "Fetch", + ComDaemon: "Daemon", + ComBinlogDumpGtid: "Binlog Dump", + ComResetConnection: "Reset connect", +} + +// Priv2Str is the map for privilege to string. +var Priv2Str = map[PrivilegeType]string{ + CreatePriv: "Create", + SelectPriv: "Select", + InsertPriv: "Insert", + UpdatePriv: "Update", + DeletePriv: "Delete", + ShowDBPriv: "Show Databases", + SuperPriv: "Super", + CreateUserPriv: "Create User", + TriggerPriv: "Trigger", + DropPriv: "Drop", + ProcessPriv: "Process", + GrantPriv: "Grant Option", + ReferencesPriv: "References", + AlterPriv: "Alter", + ExecutePriv: "Execute", + IndexPriv: "Index", + CreateViewPriv: "Create View", + ShowViewPriv: "Show View", + CreateRolePriv: "Create Role", + DropRolePriv: "Drop Role", + CreateTMPTablePriv: "CREATE TEMPORARY TABLES", + LockTablesPriv: "LOCK TABLES", + CreateRoutinePriv: "CREATE ROUTINE", + AlterRoutinePriv: "ALTER ROUTINE", + EventPriv: "EVENT", +} + +// Priv2SetStr is the map for privilege to string. +var Priv2SetStr = map[PrivilegeType]string{ + CreatePriv: "Create", + SelectPriv: "Select", + InsertPriv: "Insert", + UpdatePriv: "Update", + DeletePriv: "Delete", + DropPriv: "Drop", + GrantPriv: "Grant", + AlterPriv: "Alter", + ExecutePriv: "Execute", + IndexPriv: "Index", + CreateViewPriv: "Create View", + ShowViewPriv: "Show View", + CreateRolePriv: "Create Role", + DropRolePriv: "Drop Role", +} + +// SetStr2Priv is the map for privilege set string to privilege type. +var SetStr2Priv = map[string]PrivilegeType{ + "Create": CreatePriv, + "Select": SelectPriv, + "Insert": InsertPriv, + "Update": UpdatePriv, + "Delete": DeletePriv, + "Drop": DropPriv, + "Grant": GrantPriv, + "Alter": AlterPriv, + "Execute": ExecutePriv, + "Index": IndexPriv, + "Create View": CreateViewPriv, + "Show View": ShowViewPriv, +} + +// AllGlobalPrivs is all the privileges in global scope. +var AllGlobalPrivs = []PrivilegeType{SelectPriv, InsertPriv, UpdatePriv, DeletePriv, CreatePriv, DropPriv, ProcessPriv, GrantPriv, ReferencesPriv, AlterPriv, ShowDBPriv, SuperPriv, ExecutePriv, IndexPriv, CreateUserPriv, TriggerPriv, CreateViewPriv, ShowViewPriv, CreateRolePriv, DropRolePriv, CreateTMPTablePriv, LockTablesPriv, CreateRoutinePriv, AlterRoutinePriv, EventPriv} + +// AllDBPrivs is all the privileges in database scope. +var AllDBPrivs = []PrivilegeType{SelectPriv, InsertPriv, UpdatePriv, DeletePriv, CreatePriv, DropPriv, GrantPriv, AlterPriv, ExecutePriv, IndexPriv, CreateViewPriv, ShowViewPriv} + +// AllTablePrivs is all the privileges in table scope. +var AllTablePrivs = []PrivilegeType{SelectPriv, InsertPriv, UpdatePriv, DeletePriv, CreatePriv, DropPriv, GrantPriv, AlterPriv, IndexPriv} + +// AllColumnPrivs is all the privileges in column scope. +var AllColumnPrivs = []PrivilegeType{SelectPriv, InsertPriv, UpdatePriv} + +// AllPrivilegeLiteral is the string literal for All Privilege. +const AllPrivilegeLiteral = "ALL PRIVILEGES" + +// DefaultSQLMode for GLOBAL_VARIABLES +const DefaultSQLMode = "ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION" + +// DefaultLengthOfMysqlTypes is the map for default physical length of MySQL data types. +// See http://dev.mysql.com/doc/refman/5.7/en/storage-requirements.html +var DefaultLengthOfMysqlTypes = map[byte]int{ + TypeYear: 1, + TypeDate: 3, + TypeDuration: 3, + TypeDatetime: 8, + TypeTimestamp: 4, + + TypeTiny: 1, + TypeShort: 2, + TypeInt24: 3, + TypeLong: 4, + TypeLonglong: 8, + TypeFloat: 4, + TypeDouble: 8, + + TypeEnum: 2, + TypeString: 1, + TypeSet: 8, +} + +// DefaultLengthOfTimeFraction is the map for default physical length of time fractions. +var DefaultLengthOfTimeFraction = map[int]int{ + 0: 0, + + 1: 1, + 2: 1, + + 3: 2, + 4: 2, + + 5: 3, + 6: 3, +} + +// SQLMode is the type for MySQL sql_mode. +// See https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html +type SQLMode int + +// HasNoZeroDateMode detects if 'NO_ZERO_DATE' mode is set in SQLMode +func (m SQLMode) HasNoZeroDateMode() bool { + return m&ModeNoZeroDate == ModeNoZeroDate +} + +// HasNoZeroInDateMode detects if 'NO_ZERO_IN_DATE' mode is set in SQLMode +func (m SQLMode) HasNoZeroInDateMode() bool { + return m&ModeNoZeroInDate == ModeNoZeroInDate +} + +// HasErrorForDivisionByZeroMode detects if 'ERROR_FOR_DIVISION_BY_ZERO' mode is set in SQLMode +func (m SQLMode) HasErrorForDivisionByZeroMode() bool { + return m&ModeErrorForDivisionByZero == ModeErrorForDivisionByZero +} + +// HasOnlyFullGroupBy detects if 'ONLY_FULL_GROUP_BY' mode is set in SQLMode +func (m SQLMode) HasOnlyFullGroupBy() bool { + return m&ModeOnlyFullGroupBy == ModeOnlyFullGroupBy +} + +// HasStrictMode detects if 'STRICT_TRANS_TABLES' or 'STRICT_ALL_TABLES' mode is set in SQLMode +func (m SQLMode) HasStrictMode() bool { + return m&ModeStrictTransTables == ModeStrictTransTables || m&ModeStrictAllTables == ModeStrictAllTables +} + +// HasPipesAsConcatMode detects if 'PIPES_AS_CONCAT' mode is set in SQLMode +func (m SQLMode) HasPipesAsConcatMode() bool { + return m&ModePipesAsConcat == ModePipesAsConcat +} + +// HasNoUnsignedSubtractionMode detects if 'NO_UNSIGNED_SUBTRACTION' mode is set in SQLMode +func (m SQLMode) HasNoUnsignedSubtractionMode() bool { + return m&ModeNoUnsignedSubtraction == ModeNoUnsignedSubtraction +} + +// HasHighNotPrecedenceMode detects if 'HIGH_NOT_PRECEDENCE' mode is set in SQLMode +func (m SQLMode) HasHighNotPrecedenceMode() bool { + return m&ModeHighNotPrecedence == ModeHighNotPrecedence +} + +// HasANSIQuotesMode detects if 'ANSI_QUOTES' mode is set in SQLMode +func (m SQLMode) HasANSIQuotesMode() bool { + return m&ModeANSIQuotes == ModeANSIQuotes +} + +// HasRealAsFloatMode detects if 'REAL_AS_FLOAT' mode is set in SQLMode +func (m SQLMode) HasRealAsFloatMode() bool { + return m&ModeRealAsFloat == ModeRealAsFloat +} + +// HasPadCharToFullLengthMode detects if 'PAD_CHAR_TO_FULL_LENGTH' mode is set in SQLMode +func (m SQLMode) HasPadCharToFullLengthMode() bool { + return m&ModePadCharToFullLength == ModePadCharToFullLength +} + +// HasNoBackslashEscapesMode detects if 'NO_BACKSLASH_ESCAPES' mode is set in SQLMode +func (m SQLMode) HasNoBackslashEscapesMode() bool { + return m&ModeNoBackslashEscapes == ModeNoBackslashEscapes +} + +// HasIgnoreSpaceMode detects if 'IGNORE_SPACE' mode is set in SQLMode +func (m SQLMode) HasIgnoreSpaceMode() bool { + return m&ModeIgnoreSpace == ModeIgnoreSpace +} + +// HasNoAutoCreateUserMode detects if 'NO_AUTO_CREATE_USER' mode is set in SQLMode +func (m SQLMode) HasNoAutoCreateUserMode() bool { + return m&ModeNoAutoCreateUser == ModeNoAutoCreateUser +} + +// HasAllowInvalidDatesMode detects if 'ALLOW_INVALID_DATES' mode is set in SQLMode +func (m SQLMode) HasAllowInvalidDatesMode() bool { + return m&ModeAllowInvalidDates == ModeAllowInvalidDates +} + +// consts for sql modes. +const ( + ModeNone SQLMode = 0 + ModeRealAsFloat SQLMode = 1 << iota + ModePipesAsConcat + ModeANSIQuotes + ModeIgnoreSpace + ModeNotUsed + ModeOnlyFullGroupBy + ModeNoUnsignedSubtraction + ModeNoDirInCreate + ModePostgreSQL + ModeOracle + ModeMsSQL + ModeDb2 + ModeMaxdb + ModeNoKeyOptions + ModeNoTableOptions + ModeNoFieldOptions + ModeMySQL323 + ModeMySQL40 + ModeANSI + ModeNoAutoValueOnZero + ModeNoBackslashEscapes + ModeStrictTransTables + ModeStrictAllTables + ModeNoZeroInDate + ModeNoZeroDate + ModeInvalidDates + ModeErrorForDivisionByZero + ModeTraditional + ModeNoAutoCreateUser + ModeHighNotPrecedence + ModeNoEngineSubstitution + ModePadCharToFullLength + ModeAllowInvalidDates +) + +// FormatSQLModeStr re-format 'SQL_MODE' variable. +func FormatSQLModeStr(s string) string { + s = strings.ToUpper(strings.TrimRight(s, " ")) + parts := strings.Split(s, ",") + var nonEmptyParts []string + existParts := make(map[string]string) + for _, part := range parts { + if len(part) == 0 { + continue + } + if modeParts, ok := CombinationSQLMode[part]; ok { + for _, modePart := range modeParts { + if _, exist := existParts[modePart]; !exist { + nonEmptyParts = append(nonEmptyParts, modePart) + existParts[modePart] = modePart + } + } + } + if _, exist := existParts[part]; !exist { + nonEmptyParts = append(nonEmptyParts, part) + existParts[part] = part + } + } + return strings.Join(nonEmptyParts, ",") +} + +// GetSQLMode gets the sql mode for string literal. SQL_mode is a list of different modes separated by commas. +// The input string must be formatted by 'FormatSQLModeStr' +func GetSQLMode(s string) (SQLMode, error) { + strs := strings.Split(s, ",") + var sqlMode SQLMode + for i, length := 0, len(strs); i < length; i++ { + mode, ok := Str2SQLMode[strs[i]] + if !ok && strs[i] != "" { + return sqlMode, newInvalidModeErr(strs[i]) + } + sqlMode = sqlMode | mode + } + return sqlMode, nil +} + +// Str2SQLMode is the string represent of sql_mode to sql_mode map. +var Str2SQLMode = map[string]SQLMode{ + "REAL_AS_FLOAT": ModeRealAsFloat, + "PIPES_AS_CONCAT": ModePipesAsConcat, + "ANSI_QUOTES": ModeANSIQuotes, + "IGNORE_SPACE": ModeIgnoreSpace, + "NOT_USED": ModeNotUsed, + "ONLY_FULL_GROUP_BY": ModeOnlyFullGroupBy, + "NO_UNSIGNED_SUBTRACTION": ModeNoUnsignedSubtraction, + "NO_DIR_IN_CREATE": ModeNoDirInCreate, + "POSTGRESQL": ModePostgreSQL, + "ORACLE": ModeOracle, + "MSSQL": ModeMsSQL, + "DB2": ModeDb2, + "MAXDB": ModeMaxdb, + "NO_KEY_OPTIONS": ModeNoKeyOptions, + "NO_TABLE_OPTIONS": ModeNoTableOptions, + "NO_FIELD_OPTIONS": ModeNoFieldOptions, + "MYSQL323": ModeMySQL323, + "MYSQL40": ModeMySQL40, + "ANSI": ModeANSI, + "NO_AUTO_VALUE_ON_ZERO": ModeNoAutoValueOnZero, + "NO_BACKSLASH_ESCAPES": ModeNoBackslashEscapes, + "STRICT_TRANS_TABLES": ModeStrictTransTables, + "STRICT_ALL_TABLES": ModeStrictAllTables, + "NO_ZERO_IN_DATE": ModeNoZeroInDate, + "NO_ZERO_DATE": ModeNoZeroDate, + "INVALID_DATES": ModeInvalidDates, + "ERROR_FOR_DIVISION_BY_ZERO": ModeErrorForDivisionByZero, + "TRADITIONAL": ModeTraditional, + "NO_AUTO_CREATE_USER": ModeNoAutoCreateUser, + "HIGH_NOT_PRECEDENCE": ModeHighNotPrecedence, + "NO_ENGINE_SUBSTITUTION": ModeNoEngineSubstitution, + "PAD_CHAR_TO_FULL_LENGTH": ModePadCharToFullLength, + "ALLOW_INVALID_DATES": ModeAllowInvalidDates, +} + +// CombinationSQLMode is the special modes that provided as shorthand for combinations of mode values. +// See https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sql-mode-combo. +var CombinationSQLMode = map[string][]string{ + "ANSI": {"REAL_AS_FLOAT", "PIPES_AS_CONCAT", "ANSI_QUOTES", "IGNORE_SPACE", "ONLY_FULL_GROUP_BY"}, + "DB2": {"PIPES_AS_CONCAT", "ANSI_QUOTES", "IGNORE_SPACE", "NO_KEY_OPTIONS", "NO_TABLE_OPTIONS", "NO_FIELD_OPTIONS"}, + "MAXDB": {"PIPES_AS_CONCAT", "ANSI_QUOTES", "IGNORE_SPACE", "NO_KEY_OPTIONS", "NO_TABLE_OPTIONS", "NO_FIELD_OPTIONS", "NO_AUTO_CREATE_USER"}, + "MSSQL": {"PIPES_AS_CONCAT", "ANSI_QUOTES", "IGNORE_SPACE", "NO_KEY_OPTIONS", "NO_TABLE_OPTIONS", "NO_FIELD_OPTIONS"}, + "MYSQL323": {"MYSQL323", "HIGH_NOT_PRECEDENCE"}, + "MYSQL40": {"MYSQL40", "HIGH_NOT_PRECEDENCE"}, + "ORACLE": {"PIPES_AS_CONCAT", "ANSI_QUOTES", "IGNORE_SPACE", "NO_KEY_OPTIONS", "NO_TABLE_OPTIONS", "NO_FIELD_OPTIONS", "NO_AUTO_CREATE_USER"}, + "POSTGRESQL": {"PIPES_AS_CONCAT", "ANSI_QUOTES", "IGNORE_SPACE", "NO_KEY_OPTIONS", "NO_TABLE_OPTIONS", "NO_FIELD_OPTIONS"}, + "TRADITIONAL": {"STRICT_TRANS_TABLES", "STRICT_ALL_TABLES", "NO_ZERO_IN_DATE", "NO_ZERO_DATE", "ERROR_FOR_DIVISION_BY_ZERO", "NO_AUTO_CREATE_USER", "NO_ENGINE_SUBSTITUTION"}, +} + +// FormatFunc is the locale format function signature. +type FormatFunc func(string, string) (string, error) + +// GetLocaleFormatFunction get the format function for sepcific locale. +func GetLocaleFormatFunction(loc string) FormatFunc { + locale, exist := locale2FormatFunction[loc] + if !exist { + return formatNotSupport + } + return locale +} + +// locale2FormatFunction is the string represent of locale format function. +var locale2FormatFunction = map[string]FormatFunc{ + "en_US": formatENUS, + "zh_CN": formatZHCN, +} + +// PriorityEnum is defined for Priority const values. +type PriorityEnum int + +// Priority const values. +// See https://dev.mysql.com/doc/refman/5.7/en/insert.html +const ( + NoPriority PriorityEnum = iota + LowPriority + HighPriority + DelayedPriority +) + +// Priority2Str is used to convert the statement priority to string. +var Priority2Str = map[PriorityEnum]string{ + NoPriority: "NO_PRIORITY", + LowPriority: "LOW_PRIORITY", + HighPriority: "HIGH_PRIORITY", + DelayedPriority: "DELAYED", +} + +// Str2Priority is used to convert a string to a priority. +func Str2Priority(val string) PriorityEnum { + val = strings.ToUpper(val) + switch val { + case "NO_PRIORITY": + return NoPriority + case "HIGH_PRIORITY": + return HighPriority + case "LOW_PRIORITY": + return LowPriority + case "DELAYED": + return DelayedPriority + default: + return NoPriority + } +} + +// Restore implements Node interface. +func (n *PriorityEnum) Restore(ctx *RestoreCtx) error { + switch *n { + case NoPriority: + return nil + case LowPriority: + ctx.WriteKeyWord("LOW_PRIORITY") + case HighPriority: + ctx.WriteKeyWord("HIGH_PRIORITY") + case DelayedPriority: + ctx.WriteKeyWord("DELAYED") + default: + return errors.Errorf("undefined PriorityEnum Type[%d]", *n) + } + return nil +} + +// PrimaryKeyName defines primary key name. +const ( + PrimaryKeyName = "PRIMARY" +) diff --git a/vendor/github.com/pingcap/parser/mysql/errcode.go b/vendor/github.com/pingcap/parser/mysql/errcode.go new file mode 100644 index 0000000..22248c4 --- /dev/null +++ b/vendor/github.com/pingcap/parser/mysql/errcode.go @@ -0,0 +1,956 @@ +// Copyright 2015 PingCAP, Inc. +// +// 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package mysql + +// MySQL error code. +// This value is numeric. It is not portable to other database systems. +const ( + ErrErrorFirst uint16 = 1000 + ErrHashchk = 1000 + ErrNisamchk = 1001 + ErrNo = 1002 + ErrYes = 1003 + ErrCantCreateFile = 1004 + ErrCantCreateTable = 1005 + ErrCantCreateDB = 1006 + ErrDBCreateExists = 1007 + ErrDBDropExists = 1008 + ErrDBDropDelete = 1009 + ErrDBDropRmdir = 1010 + ErrCantDeleteFile = 1011 + ErrCantFindSystemRec = 1012 + ErrCantGetStat = 1013 + ErrCantGetWd = 1014 + ErrCantLock = 1015 + ErrCantOpenFile = 1016 + ErrFileNotFound = 1017 + ErrCantReadDir = 1018 + ErrCantSetWd = 1019 + ErrCheckread = 1020 + ErrDiskFull = 1021 + ErrDupKey = 1022 + ErrErrorOnClose = 1023 + ErrErrorOnRead = 1024 + ErrErrorOnRename = 1025 + ErrErrorOnWrite = 1026 + ErrFileUsed = 1027 + ErrFilsortAbort = 1028 + ErrFormNotFound = 1029 + ErrGetErrno = 1030 + ErrIllegalHa = 1031 + ErrKeyNotFound = 1032 + ErrNotFormFile = 1033 + ErrNotKeyFile = 1034 + ErrOldKeyFile = 1035 + ErrOpenAsReadonly = 1036 + ErrOutofMemory = 1037 + ErrOutOfSortMemory = 1038 + ErrUnexpectedEOF = 1039 + ErrConCount = 1040 + ErrOutOfResources = 1041 + ErrBadHost = 1042 + ErrHandshake = 1043 + ErrDBaccessDenied = 1044 + ErrAccessDenied = 1045 + ErrNoDB = 1046 + ErrUnknownCom = 1047 + ErrBadNull = 1048 + ErrBadDB = 1049 + ErrTableExists = 1050 + ErrBadTable = 1051 + ErrNonUniq = 1052 + ErrServerShutdown = 1053 + ErrBadField = 1054 + ErrFieldNotInGroupBy = 1055 + ErrWrongGroupField = 1056 + ErrWrongSumSelect = 1057 + ErrWrongValueCount = 1058 + ErrTooLongIdent = 1059 + ErrDupFieldName = 1060 + ErrDupKeyName = 1061 + ErrDupEntry = 1062 + ErrWrongFieldSpec = 1063 + ErrParse = 1064 + ErrEmptyQuery = 1065 + ErrNonuniqTable = 1066 + ErrInvalidDefault = 1067 + ErrMultiplePriKey = 1068 + ErrTooManyKeys = 1069 + ErrTooManyKeyParts = 1070 + ErrTooLongKey = 1071 + ErrKeyColumnDoesNotExits = 1072 + ErrBlobUsedAsKey = 1073 + ErrTooBigFieldlength = 1074 + ErrWrongAutoKey = 1075 + ErrReady = 1076 + ErrNormalShutdown = 1077 + ErrGotSignal = 1078 + ErrShutdownComplete = 1079 + ErrForcingClose = 1080 + ErrIpsock = 1081 + ErrNoSuchIndex = 1082 + ErrWrongFieldTerminators = 1083 + ErrBlobsAndNoTerminated = 1084 + ErrTextFileNotReadable = 1085 + ErrFileExists = 1086 + ErrLoadInfo = 1087 + ErrAlterInfo = 1088 + ErrWrongSubKey = 1089 + ErrCantRemoveAllFields = 1090 + ErrCantDropFieldOrKey = 1091 + ErrInsertInfo = 1092 + ErrUpdateTableUsed = 1093 + ErrNoSuchThread = 1094 + ErrKillDenied = 1095 + ErrNoTablesUsed = 1096 + ErrTooBigSet = 1097 + ErrNoUniqueLogFile = 1098 + ErrTableNotLockedForWrite = 1099 + ErrTableNotLocked = 1100 + ErrBlobCantHaveDefault = 1101 + ErrWrongDBName = 1102 + ErrWrongTableName = 1103 + ErrTooBigSelect = 1104 + ErrUnknown = 1105 + ErrUnknownProcedure = 1106 + ErrWrongParamcountToProcedure = 1107 + ErrWrongParametersToProcedure = 1108 + ErrUnknownTable = 1109 + ErrFieldSpecifiedTwice = 1110 + ErrInvalidGroupFuncUse = 1111 + ErrUnsupportedExtension = 1112 + ErrTableMustHaveColumns = 1113 + ErrRecordFileFull = 1114 + ErrUnknownCharacterSet = 1115 + ErrTooManyTables = 1116 + ErrTooManyFields = 1117 + ErrTooBigRowsize = 1118 + ErrStackOverrun = 1119 + ErrWrongOuterJoin = 1120 + ErrNullColumnInIndex = 1121 + ErrCantFindUdf = 1122 + ErrCantInitializeUdf = 1123 + ErrUdfNoPaths = 1124 + ErrUdfExists = 1125 + ErrCantOpenLibrary = 1126 + ErrCantFindDlEntry = 1127 + ErrFunctionNotDefined = 1128 + ErrHostIsBlocked = 1129 + ErrHostNotPrivileged = 1130 + ErrPasswordAnonymousUser = 1131 + ErrPasswordNotAllowed = 1132 + ErrPasswordNoMatch = 1133 + ErrUpdateInfo = 1134 + ErrCantCreateThread = 1135 + ErrWrongValueCountOnRow = 1136 + ErrCantReopenTable = 1137 + ErrInvalidUseOfNull = 1138 + ErrRegexp = 1139 + ErrMixOfGroupFuncAndFields = 1140 + ErrNonexistingGrant = 1141 + ErrTableaccessDenied = 1142 + ErrColumnaccessDenied = 1143 + ErrIllegalGrantForTable = 1144 + ErrGrantWrongHostOrUser = 1145 + ErrNoSuchTable = 1146 + ErrNonexistingTableGrant = 1147 + ErrNotAllowedCommand = 1148 + ErrSyntax = 1149 + ErrDelayedCantChangeLock = 1150 + ErrTooManyDelayedThreads = 1151 + ErrAbortingConnection = 1152 + ErrNetPacketTooLarge = 1153 + ErrNetReadErrorFromPipe = 1154 + ErrNetFcntl = 1155 + ErrNetPacketsOutOfOrder = 1156 + ErrNetUncompress = 1157 + ErrNetRead = 1158 + ErrNetReadInterrupted = 1159 + ErrNetErrorOnWrite = 1160 + ErrNetWriteInterrupted = 1161 + ErrTooLongString = 1162 + ErrTableCantHandleBlob = 1163 + ErrTableCantHandleAutoIncrement = 1164 + ErrDelayedInsertTableLocked = 1165 + ErrWrongColumnName = 1166 + ErrWrongKeyColumn = 1167 + ErrWrongMrgTable = 1168 + ErrDupUnique = 1169 + ErrBlobKeyWithoutLength = 1170 + ErrPrimaryCantHaveNull = 1171 + ErrTooManyRows = 1172 + ErrRequiresPrimaryKey = 1173 + ErrNoRaidCompiled = 1174 + ErrUpdateWithoutKeyInSafeMode = 1175 + ErrKeyDoesNotExist = 1176 + ErrCheckNoSuchTable = 1177 + ErrCheckNotImplemented = 1178 + ErrCantDoThisDuringAnTransaction = 1179 + ErrErrorDuringCommit = 1180 + ErrErrorDuringRollback = 1181 + ErrErrorDuringFlushLogs = 1182 + ErrErrorDuringCheckpoint = 1183 + ErrNewAbortingConnection = 1184 + ErrDumpNotImplemented = 1185 + ErrFlushMasterBinlogClosed = 1186 + ErrIndexRebuild = 1187 + ErrMaster = 1188 + ErrMasterNetRead = 1189 + ErrMasterNetWrite = 1190 + ErrFtMatchingKeyNotFound = 1191 + ErrLockOrActiveTransaction = 1192 + ErrUnknownSystemVariable = 1193 + ErrCrashedOnUsage = 1194 + ErrCrashedOnRepair = 1195 + ErrWarningNotCompleteRollback = 1196 + ErrTransCacheFull = 1197 + ErrSlaveMustStop = 1198 + ErrSlaveNotRunning = 1199 + ErrBadSlave = 1200 + ErrMasterInfo = 1201 + ErrSlaveThread = 1202 + ErrTooManyUserConnections = 1203 + ErrSetConstantsOnly = 1204 + ErrLockWaitTimeout = 1205 + ErrLockTableFull = 1206 + ErrReadOnlyTransaction = 1207 + ErrDropDBWithReadLock = 1208 + ErrCreateDBWithReadLock = 1209 + ErrWrongArguments = 1210 + ErrNoPermissionToCreateUser = 1211 + ErrUnionTablesInDifferentDir = 1212 + ErrLockDeadlock = 1213 + ErrTableCantHandleFt = 1214 + ErrCannotAddForeign = 1215 + ErrNoReferencedRow = 1216 + ErrRowIsReferenced = 1217 + ErrConnectToMaster = 1218 + ErrQueryOnMaster = 1219 + ErrErrorWhenExecutingCommand = 1220 + ErrWrongUsage = 1221 + ErrWrongNumberOfColumnsInSelect = 1222 + ErrCantUpdateWithReadlock = 1223 + ErrMixingNotAllowed = 1224 + ErrDupArgument = 1225 + ErrUserLimitReached = 1226 + ErrSpecificAccessDenied = 1227 + ErrLocalVariable = 1228 + ErrGlobalVariable = 1229 + ErrNoDefault = 1230 + ErrWrongValueForVar = 1231 + ErrWrongTypeForVar = 1232 + ErrVarCantBeRead = 1233 + ErrCantUseOptionHere = 1234 + ErrNotSupportedYet = 1235 + ErrMasterFatalErrorReadingBinlog = 1236 + ErrSlaveIgnoredTable = 1237 + ErrIncorrectGlobalLocalVar = 1238 + ErrWrongFkDef = 1239 + ErrKeyRefDoNotMatchTableRef = 1240 + ErrOperandColumns = 1241 + ErrSubqueryNo1Row = 1242 + ErrUnknownStmtHandler = 1243 + ErrCorruptHelpDB = 1244 + ErrCyclicReference = 1245 + ErrAutoConvert = 1246 + ErrIllegalReference = 1247 + ErrDerivedMustHaveAlias = 1248 + ErrSelectReduced = 1249 + ErrTablenameNotAllowedHere = 1250 + ErrNotSupportedAuthMode = 1251 + ErrSpatialCantHaveNull = 1252 + ErrCollationCharsetMismatch = 1253 + ErrSlaveWasRunning = 1254 + ErrSlaveWasNotRunning = 1255 + ErrTooBigForUncompress = 1256 + ErrZlibZMem = 1257 + ErrZlibZBuf = 1258 + ErrZlibZData = 1259 + ErrCutValueGroupConcat = 1260 + ErrWarnTooFewRecords = 1261 + ErrWarnTooManyRecords = 1262 + ErrWarnNullToNotnull = 1263 + ErrWarnDataOutOfRange = 1264 + WarnDataTruncated = 1265 + ErrWarnUsingOtherHandler = 1266 + ErrCantAggregate2collations = 1267 + ErrDropUser = 1268 + ErrRevokeGrants = 1269 + ErrCantAggregate3collations = 1270 + ErrCantAggregateNcollations = 1271 + ErrVariableIsNotStruct = 1272 + ErrUnknownCollation = 1273 + ErrSlaveIgnoredSslParams = 1274 + ErrServerIsInSecureAuthMode = 1275 + ErrWarnFieldResolved = 1276 + ErrBadSlaveUntilCond = 1277 + ErrMissingSkipSlave = 1278 + ErrUntilCondIgnored = 1279 + ErrWrongNameForIndex = 1280 + ErrWrongNameForCatalog = 1281 + ErrWarnQcResize = 1282 + ErrBadFtColumn = 1283 + ErrUnknownKeyCache = 1284 + ErrWarnHostnameWontWork = 1285 + ErrUnknownStorageEngine = 1286 + ErrWarnDeprecatedSyntax = 1287 + ErrNonUpdatableTable = 1288 + ErrFeatureDisabled = 1289 + ErrOptionPreventsStatement = 1290 + ErrDuplicatedValueInType = 1291 + ErrTruncatedWrongValue = 1292 + ErrTooMuchAutoTimestampCols = 1293 + ErrInvalidOnUpdate = 1294 + ErrUnsupportedPs = 1295 + ErrGetErrmsg = 1296 + ErrGetTemporaryErrmsg = 1297 + ErrUnknownTimeZone = 1298 + ErrWarnInvalidTimestamp = 1299 + ErrInvalidCharacterString = 1300 + ErrWarnAllowedPacketOverflowed = 1301 + ErrConflictingDeclarations = 1302 + ErrSpNoRecursiveCreate = 1303 + ErrSpAlreadyExists = 1304 + ErrSpDoesNotExist = 1305 + ErrSpDropFailed = 1306 + ErrSpStoreFailed = 1307 + ErrSpLilabelMismatch = 1308 + ErrSpLabelRedefine = 1309 + ErrSpLabelMismatch = 1310 + ErrSpUninitVar = 1311 + ErrSpBadselect = 1312 + ErrSpBadreturn = 1313 + ErrSpBadstatement = 1314 + ErrUpdateLogDeprecatedIgnored = 1315 + ErrUpdateLogDeprecatedTranslated = 1316 + ErrQueryInterrupted = 1317 + ErrSpWrongNoOfArgs = 1318 + ErrSpCondMismatch = 1319 + ErrSpNoreturn = 1320 + ErrSpNoreturnend = 1321 + ErrSpBadCursorQuery = 1322 + ErrSpBadCursorSelect = 1323 + ErrSpCursorMismatch = 1324 + ErrSpCursorAlreadyOpen = 1325 + ErrSpCursorNotOpen = 1326 + ErrSpUndeclaredVar = 1327 + ErrSpWrongNoOfFetchArgs = 1328 + ErrSpFetchNoData = 1329 + ErrSpDupParam = 1330 + ErrSpDupVar = 1331 + ErrSpDupCond = 1332 + ErrSpDupCurs = 1333 + ErrSpCantAlter = 1334 + ErrSpSubselectNyi = 1335 + ErrStmtNotAllowedInSfOrTrg = 1336 + ErrSpVarcondAfterCurshndlr = 1337 + ErrSpCursorAfterHandler = 1338 + ErrSpCaseNotFound = 1339 + ErrFparserTooBigFile = 1340 + ErrFparserBadHeader = 1341 + ErrFparserEOFInComment = 1342 + ErrFparserErrorInParameter = 1343 + ErrFparserEOFInUnknownParameter = 1344 + ErrViewNoExplain = 1345 + ErrFrmUnknownType = 1346 + ErrWrongObject = 1347 + ErrNonupdateableColumn = 1348 + ErrViewSelectDerived = 1349 + ErrViewSelectClause = 1350 + ErrViewSelectVariable = 1351 + ErrViewSelectTmptable = 1352 + ErrViewWrongList = 1353 + ErrWarnViewMerge = 1354 + ErrWarnViewWithoutKey = 1355 + ErrViewInvalid = 1356 + ErrSpNoDropSp = 1357 + ErrSpGotoInHndlr = 1358 + ErrTrgAlreadyExists = 1359 + ErrTrgDoesNotExist = 1360 + ErrTrgOnViewOrTempTable = 1361 + ErrTrgCantChangeRow = 1362 + ErrTrgNoSuchRowInTrg = 1363 + ErrNoDefaultForField = 1364 + ErrDivisionByZero = 1365 + ErrTruncatedWrongValueForField = 1366 + ErrIllegalValueForType = 1367 + ErrViewNonupdCheck = 1368 + ErrViewCheckFailed = 1369 + ErrProcaccessDenied = 1370 + ErrRelayLogFail = 1371 + ErrPasswdLength = 1372 + ErrUnknownTargetBinlog = 1373 + ErrIoErrLogIndexRead = 1374 + ErrBinlogPurgeProhibited = 1375 + ErrFseekFail = 1376 + ErrBinlogPurgeFatalErr = 1377 + ErrLogInUse = 1378 + ErrLogPurgeUnknownErr = 1379 + ErrRelayLogInit = 1380 + ErrNoBinaryLogging = 1381 + ErrReservedSyntax = 1382 + ErrWsasFailed = 1383 + ErrDiffGroupsProc = 1384 + ErrNoGroupForProc = 1385 + ErrOrderWithProc = 1386 + ErrLoggingProhibitChangingOf = 1387 + ErrNoFileMapping = 1388 + ErrWrongMagic = 1389 + ErrPsManyParam = 1390 + ErrKeyPart0 = 1391 + ErrViewChecksum = 1392 + ErrViewMultiupdate = 1393 + ErrViewNoInsertFieldList = 1394 + ErrViewDeleteMergeView = 1395 + ErrCannotUser = 1396 + ErrXaerNota = 1397 + ErrXaerInval = 1398 + ErrXaerRmfail = 1399 + ErrXaerOutside = 1400 + ErrXaerRmerr = 1401 + ErrXaRbrollback = 1402 + ErrNonexistingProcGrant = 1403 + ErrProcAutoGrantFail = 1404 + ErrProcAutoRevokeFail = 1405 + ErrDataTooLong = 1406 + ErrSpBadSQLstate = 1407 + ErrStartup = 1408 + ErrLoadFromFixedSizeRowsToVar = 1409 + ErrCantCreateUserWithGrant = 1410 + ErrWrongValueForType = 1411 + ErrTableDefChanged = 1412 + ErrSpDupHandler = 1413 + ErrSpNotVarArg = 1414 + ErrSpNoRetset = 1415 + ErrCantCreateGeometryObject = 1416 + ErrFailedRoutineBreakBinlog = 1417 + ErrBinlogUnsafeRoutine = 1418 + ErrBinlogCreateRoutineNeedSuper = 1419 + ErrExecStmtWithOpenCursor = 1420 + ErrStmtHasNoOpenCursor = 1421 + ErrCommitNotAllowedInSfOrTrg = 1422 + ErrNoDefaultForViewField = 1423 + ErrSpNoRecursion = 1424 + ErrTooBigScale = 1425 + ErrTooBigPrecision = 1426 + ErrMBiggerThanD = 1427 + ErrWrongLockOfSystemTable = 1428 + ErrConnectToForeignDataSource = 1429 + ErrQueryOnForeignDataSource = 1430 + ErrForeignDataSourceDoesntExist = 1431 + ErrForeignDataStringInvalidCantCreate = 1432 + ErrForeignDataStringInvalid = 1433 + ErrCantCreateFederatedTable = 1434 + ErrTrgInWrongSchema = 1435 + ErrStackOverrunNeedMore = 1436 + ErrTooLongBody = 1437 + ErrWarnCantDropDefaultKeycache = 1438 + ErrTooBigDisplaywidth = 1439 + ErrXaerDupid = 1440 + ErrDatetimeFunctionOverflow = 1441 + ErrCantUpdateUsedTableInSfOrTrg = 1442 + ErrViewPreventUpdate = 1443 + ErrPsNoRecursion = 1444 + ErrSpCantSetAutocommit = 1445 + ErrMalformedDefiner = 1446 + ErrViewFrmNoUser = 1447 + ErrViewOtherUser = 1448 + ErrNoSuchUser = 1449 + ErrForbidSchemaChange = 1450 + ErrRowIsReferenced2 = 1451 + ErrNoReferencedRow2 = 1452 + ErrSpBadVarShadow = 1453 + ErrTrgNoDefiner = 1454 + ErrOldFileFormat = 1455 + ErrSpRecursionLimit = 1456 + ErrSpProcTableCorrupt = 1457 + ErrSpWrongName = 1458 + ErrTableNeedsUpgrade = 1459 + ErrSpNoAggregate = 1460 + ErrMaxPreparedStmtCountReached = 1461 + ErrViewRecursive = 1462 + ErrNonGroupingFieldUsed = 1463 + ErrTableCantHandleSpkeys = 1464 + ErrNoTriggersOnSystemSchema = 1465 + ErrRemovedSpaces = 1466 + ErrAutoincReadFailed = 1467 + ErrUsername = 1468 + ErrHostname = 1469 + ErrWrongStringLength = 1470 + ErrNonInsertableTable = 1471 + ErrAdminWrongMrgTable = 1472 + ErrTooHighLevelOfNestingForSelect = 1473 + ErrNameBecomesEmpty = 1474 + ErrAmbiguousFieldTerm = 1475 + ErrForeignServerExists = 1476 + ErrForeignServerDoesntExist = 1477 + ErrIllegalHaCreateOption = 1478 + ErrPartitionRequiresValues = 1479 + ErrPartitionWrongValues = 1480 + ErrPartitionMaxvalue = 1481 + ErrPartitionSubpartition = 1482 + ErrPartitionSubpartMix = 1483 + ErrPartitionWrongNoPart = 1484 + ErrPartitionWrongNoSubpart = 1485 + ErrWrongExprInPartitionFunc = 1486 + ErrNoConstExprInRangeOrList = 1487 + ErrFieldNotFoundPart = 1488 + ErrListOfFieldsOnlyInHash = 1489 + ErrInconsistentPartitionInfo = 1490 + ErrPartitionFuncNotAllowed = 1491 + ErrPartitionsMustBeDefined = 1492 + ErrRangeNotIncreasing = 1493 + ErrInconsistentTypeOfFunctions = 1494 + ErrMultipleDefConstInListPart = 1495 + ErrPartitionEntry = 1496 + ErrMixHandler = 1497 + ErrPartitionNotDefined = 1498 + ErrTooManyPartitions = 1499 + ErrSubpartition = 1500 + ErrCantCreateHandlerFile = 1501 + ErrBlobFieldInPartFunc = 1502 + ErrUniqueKeyNeedAllFieldsInPf = 1503 + ErrNoParts = 1504 + ErrPartitionMgmtOnNonpartitioned = 1505 + ErrForeignKeyOnPartitioned = 1506 + ErrDropPartitionNonExistent = 1507 + ErrDropLastPartition = 1508 + ErrCoalesceOnlyOnHashPartition = 1509 + ErrReorgHashOnlyOnSameNo = 1510 + ErrReorgNoParam = 1511 + ErrOnlyOnRangeListPartition = 1512 + ErrAddPartitionSubpart = 1513 + ErrAddPartitionNoNewPartition = 1514 + ErrCoalescePartitionNoPartition = 1515 + ErrReorgPartitionNotExist = 1516 + ErrSameNamePartition = 1517 + ErrNoBinlog = 1518 + ErrConsecutiveReorgPartitions = 1519 + ErrReorgOutsideRange = 1520 + ErrPartitionFunctionFailure = 1521 + ErrPartState = 1522 + ErrLimitedPartRange = 1523 + ErrPluginIsNotLoaded = 1524 + ErrWrongValue = 1525 + ErrNoPartitionForGivenValue = 1526 + ErrFilegroupOptionOnlyOnce = 1527 + ErrCreateFilegroupFailed = 1528 + ErrDropFilegroupFailed = 1529 + ErrTablespaceAutoExtend = 1530 + ErrWrongSizeNumber = 1531 + ErrSizeOverflow = 1532 + ErrAlterFilegroupFailed = 1533 + ErrBinlogRowLoggingFailed = 1534 + ErrBinlogRowWrongTableDef = 1535 + ErrBinlogRowRbrToSbr = 1536 + ErrEventAlreadyExists = 1537 + ErrEventStoreFailed = 1538 + ErrEventDoesNotExist = 1539 + ErrEventCantAlter = 1540 + ErrEventDropFailed = 1541 + ErrEventIntervalNotPositiveOrTooBig = 1542 + ErrEventEndsBeforeStarts = 1543 + ErrEventExecTimeInThePast = 1544 + ErrEventOpenTableFailed = 1545 + ErrEventNeitherMExprNorMAt = 1546 + ErrObsoleteColCountDoesntMatchCorrupted = 1547 + ErrObsoleteCannotLoadFromTable = 1548 + ErrEventCannotDelete = 1549 + ErrEventCompile = 1550 + ErrEventSameName = 1551 + ErrEventDataTooLong = 1552 + ErrDropIndexFk = 1553 + ErrWarnDeprecatedSyntaxWithVer = 1554 + ErrCantWriteLockLogTable = 1555 + ErrCantLockLogTable = 1556 + ErrForeignDuplicateKeyOldUnused = 1557 + ErrColCountDoesntMatchPleaseUpdate = 1558 + ErrTempTablePreventsSwitchOutOfRbr = 1559 + ErrStoredFunctionPreventsSwitchBinlogFormat = 1560 + ErrNdbCantSwitchBinlogFormat = 1561 + ErrPartitionNoTemporary = 1562 + ErrPartitionConstDomain = 1563 + ErrPartitionFunctionIsNotAllowed = 1564 + ErrDdlLog = 1565 + ErrNullInValuesLessThan = 1566 + ErrWrongPartitionName = 1567 + ErrCantChangeTxCharacteristics = 1568 + ErrDupEntryAutoincrementCase = 1569 + ErrEventModifyQueue = 1570 + ErrEventSetVar = 1571 + ErrPartitionMerge = 1572 + ErrCantActivateLog = 1573 + ErrRbrNotAvailable = 1574 + ErrBase64Decode = 1575 + ErrEventRecursionForbidden = 1576 + ErrEventsDB = 1577 + ErrOnlyIntegersAllowed = 1578 + ErrUnsuportedLogEngine = 1579 + ErrBadLogStatement = 1580 + ErrCantRenameLogTable = 1581 + ErrWrongParamcountToNativeFct = 1582 + ErrWrongParametersToNativeFct = 1583 + ErrWrongParametersToStoredFct = 1584 + ErrNativeFctNameCollision = 1585 + ErrDupEntryWithKeyName = 1586 + ErrBinlogPurgeEmFile = 1587 + ErrEventCannotCreateInThePast = 1588 + ErrEventCannotAlterInThePast = 1589 + ErrSlaveIncident = 1590 + ErrNoPartitionForGivenValueSilent = 1591 + ErrBinlogUnsafeStatement = 1592 + ErrSlaveFatal = 1593 + ErrSlaveRelayLogReadFailure = 1594 + ErrSlaveRelayLogWriteFailure = 1595 + ErrSlaveCreateEventFailure = 1596 + ErrSlaveMasterComFailure = 1597 + ErrBinlogLoggingImpossible = 1598 + ErrViewNoCreationCtx = 1599 + ErrViewInvalidCreationCtx = 1600 + ErrSrInvalidCreationCtx = 1601 + ErrTrgCorruptedFile = 1602 + ErrTrgNoCreationCtx = 1603 + ErrTrgInvalidCreationCtx = 1604 + ErrEventInvalidCreationCtx = 1605 + ErrTrgCantOpenTable = 1606 + ErrCantCreateSroutine = 1607 + ErrNeverUsed = 1608 + ErrNoFormatDescriptionEventBeforeBinlogStatement = 1609 + ErrSlaveCorruptEvent = 1610 + ErrLoadDataInvalidColumn = 1611 + ErrLogPurgeNoFile = 1612 + ErrXaRbtimeout = 1613 + ErrXaRbdeadlock = 1614 + ErrNeedReprepare = 1615 + ErrDelayedNotSupported = 1616 + WarnNoMasterInfo = 1617 + WarnOptionIgnored = 1618 + WarnPluginDeleteBuiltin = 1619 + WarnPluginBusy = 1620 + ErrVariableIsReadonly = 1621 + ErrWarnEngineTransactionRollback = 1622 + ErrSlaveHeartbeatFailure = 1623 + ErrSlaveHeartbeatValueOutOfRange = 1624 + ErrNdbReplicationSchema = 1625 + ErrConflictFnParse = 1626 + ErrExceptionsWrite = 1627 + ErrTooLongTableComment = 1628 + ErrTooLongFieldComment = 1629 + ErrFuncInexistentNameCollision = 1630 + ErrDatabaseName = 1631 + ErrTableName = 1632 + ErrPartitionName = 1633 + ErrSubpartitionName = 1634 + ErrTemporaryName = 1635 + ErrRenamedName = 1636 + ErrTooManyConcurrentTrxs = 1637 + WarnNonASCIISeparatorNotImplemented = 1638 + ErrDebugSyncTimeout = 1639 + ErrDebugSyncHitLimit = 1640 + ErrDupSignalSet = 1641 + ErrSignalWarn = 1642 + ErrSignalNotFound = 1643 + ErrSignalException = 1644 + ErrResignalWithoutActiveHandler = 1645 + ErrSignalBadConditionType = 1646 + WarnCondItemTruncated = 1647 + ErrCondItemTooLong = 1648 + ErrUnknownLocale = 1649 + ErrSlaveIgnoreServerIds = 1650 + ErrQueryCacheDisabled = 1651 + ErrSameNamePartitionField = 1652 + ErrPartitionColumnList = 1653 + ErrWrongTypeColumnValue = 1654 + ErrTooManyPartitionFuncFields = 1655 + ErrMaxvalueInValuesIn = 1656 + ErrTooManyValues = 1657 + ErrRowSinglePartitionField = 1658 + ErrFieldTypeNotAllowedAsPartitionField = 1659 + ErrPartitionFieldsTooLong = 1660 + ErrBinlogRowEngineAndStmtEngine = 1661 + ErrBinlogRowModeAndStmtEngine = 1662 + ErrBinlogUnsafeAndStmtEngine = 1663 + ErrBinlogRowInjectionAndStmtEngine = 1664 + ErrBinlogStmtModeAndRowEngine = 1665 + ErrBinlogRowInjectionAndStmtMode = 1666 + ErrBinlogMultipleEnginesAndSelfLoggingEngine = 1667 + ErrBinlogUnsafeLimit = 1668 + ErrBinlogUnsafeInsertDelayed = 1669 + ErrBinlogUnsafeSystemTable = 1670 + ErrBinlogUnsafeAutoincColumns = 1671 + ErrBinlogUnsafeUdf = 1672 + ErrBinlogUnsafeSystemVariable = 1673 + ErrBinlogUnsafeSystemFunction = 1674 + ErrBinlogUnsafeNontransAfterTrans = 1675 + ErrMessageAndStatement = 1676 + ErrSlaveConversionFailed = 1677 + ErrSlaveCantCreateConversion = 1678 + ErrInsideTransactionPreventsSwitchBinlogFormat = 1679 + ErrPathLength = 1680 + ErrWarnDeprecatedSyntaxNoReplacement = 1681 + ErrWrongNativeTableStructure = 1682 + ErrWrongPerfSchemaUsage = 1683 + ErrWarnISSkippedTable = 1684 + ErrInsideTransactionPreventsSwitchBinlogDirect = 1685 + ErrStoredFunctionPreventsSwitchBinlogDirect = 1686 + ErrSpatialMustHaveGeomCol = 1687 + ErrTooLongIndexComment = 1688 + ErrLockAborted = 1689 + ErrDataOutOfRange = 1690 + ErrWrongSpvarTypeInLimit = 1691 + ErrBinlogUnsafeMultipleEnginesAndSelfLoggingEngine = 1692 + ErrBinlogUnsafeMixedStatement = 1693 + ErrInsideTransactionPreventsSwitchSQLLogBin = 1694 + ErrStoredFunctionPreventsSwitchSQLLogBin = 1695 + ErrFailedReadFromParFile = 1696 + ErrValuesIsNotIntType = 1697 + ErrAccessDeniedNoPassword = 1698 + ErrSetPasswordAuthPlugin = 1699 + ErrGrantPluginUserExists = 1700 + ErrTruncateIllegalFk = 1701 + ErrPluginIsPermanent = 1702 + ErrSlaveHeartbeatValueOutOfRangeMin = 1703 + ErrSlaveHeartbeatValueOutOfRangeMax = 1704 + ErrStmtCacheFull = 1705 + ErrMultiUpdateKeyConflict = 1706 + ErrTableNeedsRebuild = 1707 + WarnOptionBelowLimit = 1708 + ErrIndexColumnTooLong = 1709 + ErrErrorInTriggerBody = 1710 + ErrErrorInUnknownTriggerBody = 1711 + ErrIndexCorrupt = 1712 + ErrUndoRecordTooBig = 1713 + ErrBinlogUnsafeInsertIgnoreSelect = 1714 + ErrBinlogUnsafeInsertSelectUpdate = 1715 + ErrBinlogUnsafeReplaceSelect = 1716 + ErrBinlogUnsafeCreateIgnoreSelect = 1717 + ErrBinlogUnsafeCreateReplaceSelect = 1718 + ErrBinlogUnsafeUpdateIgnore = 1719 + ErrPluginNoUninstall = 1720 + ErrPluginNoInstall = 1721 + ErrBinlogUnsafeWriteAutoincSelect = 1722 + ErrBinlogUnsafeCreateSelectAutoinc = 1723 + ErrBinlogUnsafeInsertTwoKeys = 1724 + ErrTableInFkCheck = 1725 + ErrUnsupportedEngine = 1726 + ErrBinlogUnsafeAutoincNotFirst = 1727 + ErrCannotLoadFromTableV2 = 1728 + ErrMasterDelayValueOutOfRange = 1729 + ErrOnlyFdAndRbrEventsAllowedInBinlogStatement = 1730 + ErrPartitionExchangeDifferentOption = 1731 + ErrPartitionExchangePartTable = 1732 + ErrPartitionExchangeTempTable = 1733 + ErrPartitionInsteadOfSubpartition = 1734 + ErrUnknownPartition = 1735 + ErrTablesDifferentMetadata = 1736 + ErrRowDoesNotMatchPartition = 1737 + ErrBinlogCacheSizeGreaterThanMax = 1738 + ErrWarnIndexNotApplicable = 1739 + ErrPartitionExchangeForeignKey = 1740 + ErrNoSuchKeyValue = 1741 + ErrRplInfoDataTooLong = 1742 + ErrNetworkReadEventChecksumFailure = 1743 + ErrBinlogReadEventChecksumFailure = 1744 + ErrBinlogStmtCacheSizeGreaterThanMax = 1745 + ErrCantUpdateTableInCreateTableSelect = 1746 + ErrPartitionClauseOnNonpartitioned = 1747 + ErrRowDoesNotMatchGivenPartitionSet = 1748 + ErrNoSuchPartitionunused = 1749 + ErrChangeRplInfoRepositoryFailure = 1750 + ErrWarningNotCompleteRollbackWithCreatedTempTable = 1751 + ErrWarningNotCompleteRollbackWithDroppedTempTable = 1752 + ErrMtsFeatureIsNotSupported = 1753 + ErrMtsUpdatedDBsGreaterMax = 1754 + ErrMtsCantParallel = 1755 + ErrMtsInconsistentData = 1756 + ErrFulltextNotSupportedWithPartitioning = 1757 + ErrDaInvalidConditionNumber = 1758 + ErrInsecurePlainText = 1759 + ErrInsecureChangeMaster = 1760 + ErrForeignDuplicateKeyWithChildInfo = 1761 + ErrForeignDuplicateKeyWithoutChildInfo = 1762 + ErrSQLthreadWithSecureSlave = 1763 + ErrTableHasNoFt = 1764 + ErrVariableNotSettableInSfOrTrigger = 1765 + ErrVariableNotSettableInTransaction = 1766 + ErrGtidNextIsNotInGtidNextList = 1767 + ErrCantChangeGtidNextInTransactionWhenGtidNextListIsNull = 1768 + ErrSetStatementCannotInvokeFunction = 1769 + ErrGtidNextCantBeAutomaticIfGtidNextListIsNonNull = 1770 + ErrSkippingLoggedTransaction = 1771 + ErrMalformedGtidSetSpecification = 1772 + ErrMalformedGtidSetEncoding = 1773 + ErrMalformedGtidSpecification = 1774 + ErrGnoExhausted = 1775 + ErrBadSlaveAutoPosition = 1776 + ErrAutoPositionRequiresGtidModeOn = 1777 + ErrCantDoImplicitCommitInTrxWhenGtidNextIsSet = 1778 + ErrGtidMode2Or3RequiresEnforceGtidConsistencyOn = 1779 + ErrGtidModeRequiresBinlog = 1780 + ErrCantSetGtidNextToGtidWhenGtidModeIsOff = 1781 + ErrCantSetGtidNextToAnonymousWhenGtidModeIsOn = 1782 + ErrCantSetGtidNextListToNonNullWhenGtidModeIsOff = 1783 + ErrFoundGtidEventWhenGtidModeIsOff = 1784 + ErrGtidUnsafeNonTransactionalTable = 1785 + ErrGtidUnsafeCreateSelect = 1786 + ErrGtidUnsafeCreateDropTemporaryTableInTransaction = 1787 + ErrGtidModeCanOnlyChangeOneStepAtATime = 1788 + ErrMasterHasPurgedRequiredGtids = 1789 + ErrCantSetGtidNextWhenOwningGtid = 1790 + ErrUnknownExplainFormat = 1791 + ErrCantExecuteInReadOnlyTransaction = 1792 + ErrTooLongTablePartitionComment = 1793 + ErrSlaveConfiguration = 1794 + ErrInnodbFtLimit = 1795 + ErrInnodbNoFtTempTable = 1796 + ErrInnodbFtWrongDocidColumn = 1797 + ErrInnodbFtWrongDocidIndex = 1798 + ErrInnodbOnlineLogTooBig = 1799 + ErrUnknownAlterAlgorithm = 1800 + ErrUnknownAlterLock = 1801 + ErrMtsChangeMasterCantRunWithGaps = 1802 + ErrMtsRecoveryFailure = 1803 + ErrMtsResetWorkers = 1804 + ErrColCountDoesntMatchCorruptedV2 = 1805 + ErrSlaveSilentRetryTransaction = 1806 + ErrDiscardFkChecksRunning = 1807 + ErrTableSchemaMismatch = 1808 + ErrTableInSystemTablespace = 1809 + ErrIoRead = 1810 + ErrIoWrite = 1811 + ErrTablespaceMissing = 1812 + ErrTablespaceExists = 1813 + ErrTablespaceDiscarded = 1814 + ErrInternal = 1815 + ErrInnodbImport = 1816 + ErrInnodbIndexCorrupt = 1817 + ErrInvalidYearColumnLength = 1818 + ErrNotValidPassword = 1819 + ErrMustChangePassword = 1820 + ErrFkNoIndexChild = 1821 + ErrFkNoIndexParent = 1822 + ErrFkFailAddSystem = 1823 + ErrFkCannotOpenParent = 1824 + ErrFkIncorrectOption = 1825 + ErrFkDupName = 1826 + ErrPasswordFormat = 1827 + ErrFkColumnCannotDrop = 1828 + ErrFkColumnCannotDropChild = 1829 + ErrFkColumnNotNull = 1830 + ErrDupIndex = 1831 + ErrFkColumnCannotChange = 1832 + ErrFkColumnCannotChangeChild = 1833 + ErrFkCannotDeleteParent = 1834 + ErrMalformedPacket = 1835 + ErrReadOnlyMode = 1836 + ErrGtidNextTypeUndefinedGroup = 1837 + ErrVariableNotSettableInSp = 1838 + ErrCantSetGtidPurgedWhenGtidModeIsOff = 1839 + ErrCantSetGtidPurgedWhenGtidExecutedIsNotEmpty = 1840 + ErrCantSetGtidPurgedWhenOwnedGtidsIsNotEmpty = 1841 + ErrGtidPurgedWasChanged = 1842 + ErrGtidExecutedWasChanged = 1843 + ErrBinlogStmtModeAndNoReplTables = 1844 + ErrAlterOperationNotSupported = 1845 + ErrAlterOperationNotSupportedReason = 1846 + ErrAlterOperationNotSupportedReasonCopy = 1847 + ErrAlterOperationNotSupportedReasonPartition = 1848 + ErrAlterOperationNotSupportedReasonFkRename = 1849 + ErrAlterOperationNotSupportedReasonColumnType = 1850 + ErrAlterOperationNotSupportedReasonFkCheck = 1851 + ErrAlterOperationNotSupportedReasonIgnore = 1852 + ErrAlterOperationNotSupportedReasonNopk = 1853 + ErrAlterOperationNotSupportedReasonAutoinc = 1854 + ErrAlterOperationNotSupportedReasonHiddenFts = 1855 + ErrAlterOperationNotSupportedReasonChangeFts = 1856 + ErrAlterOperationNotSupportedReasonFts = 1857 + ErrSQLSlaveSkipCounterNotSettableInGtidMode = 1858 + ErrDupUnknownInIndex = 1859 + ErrIdentCausesTooLongPath = 1860 + ErrAlterOperationNotSupportedReasonNotNull = 1861 + ErrMustChangePasswordLogin = 1862 + ErrRowInWrongPartition = 1863 + ErrErrorLast = 1863 + ErrMaxExecTimeExceeded = 1907 + ErrInvalidFieldSize = 3013 + ErrInvalidJSONData = 3069 + ErrGeneratedColumnFunctionIsNotAllowed = 3102 + ErrBadGeneratedColumn = 3105 + ErrUnsupportedOnGeneratedColumn = 3106 + ErrGeneratedColumnNonPrior = 3107 + ErrDependentByGeneratedColumn = 3108 + ErrGeneratedColumnRefAutoInc = 3109 + ErrInvalidJSONText = 3140 + ErrInvalidJSONPath = 3143 + ErrInvalidTypeForJSON = 3146 + ErrInvalidJSONPathWildcard = 3149 + ErrInvalidJSONContainsPathType = 3150 + ErrJSONUsedAsKey = 3152 + ErrInvalidJSONPathArrayCell = 3165 + ErrBadUser = 3162 + ErrInvalidEncryptionOption = 3184 + ErrRoleNotGranted = 3530 + ErrWindowNoSuchWindow = 3579 + ErrWindowCircularityInWindowGraph = 3580 + ErrWindowNoChildPartitioning = 3581 + ErrWindowNoInherentFrame = 3582 + ErrWindowNoRedefineOrderBy = 3583 + ErrWindowFrameStartIllegal = 3584 + ErrWindowFrameEndIllegal = 3585 + ErrWindowFrameIllegal = 3586 + ErrWindowRangeFrameOrderType = 3587 + ErrWindowRangeFrameTemporalType = 3588 + ErrWindowRangeFrameNumericType = 3589 + ErrWindowRangeBoundNotConstant = 3590 + ErrWindowDuplicateName = 3591 + ErrWindowIllegalOrderBy = 3592 + ErrWindowInvalidWindowFuncUse = 3593 + ErrWindowInvalidWindowFuncAliasUse = 3594 + ErrWindowNestedWindowFuncUseInWindowSpec = 3595 + ErrWindowRowsIntervalUse = 3596 + ErrWindowNoGroupOrderUnused = 3597 + ErrWindowExplainJson = 3598 + ErrWindowFunctionIgnoresFrame = 3599 + + // MariaDB errors. + ErrOnlyOneDefaultPartionAllowed = 4030 + ErrWrongPartitionTypeExpectedSystemTime = 4113 + ErrSystemVersioningWrongPartitions = 4128 + + // TiDB self-defined errors. + ErrMemExceedThreshold = 8001 + ErrForUpdateCantRetry = 8002 + ErrAdminCheckTable = 8003 + ErrTxnTooLarge = 8004 + ErrWriteConflictInTiDB = 8005 + ErrInvalidPluginID = 8101 + ErrInvalidPluginManifest = 8102 + ErrInvalidPluginName = 8103 + ErrInvalidPluginVersion = 8104 + ErrDuplicatePlugin = 8105 + ErrInvalidPluginSysVarName = 8106 + ErrRequireVersionCheckFail = 8107 + ErrUnsupportedReloadPlugin = 8018 + ErrUnsupportedReloadPluginVar = 8019 + ErrTableLocked = 8020 + + // TiKV/PD errors. + ErrPDServerTimeout = 9001 + ErrTiKVServerTimeout = 9002 + ErrTiKVServerBusy = 9003 + ErrResolveLockTimeout = 9004 + ErrRegionUnavailable = 9005 + ErrGCTooEarly = 9006 + ErrWriteConflict = 9007 +) diff --git a/vendor/github.com/pingcap/parser/mysql/errname.go b/vendor/github.com/pingcap/parser/mysql/errname.go new file mode 100644 index 0000000..52fa380 --- /dev/null +++ b/vendor/github.com/pingcap/parser/mysql/errname.go @@ -0,0 +1,952 @@ +// Copyright 2015 PingCAP, Inc. +// +// 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package mysql + +// MySQLErrName maps error code to MySQL error messages. +var MySQLErrName = map[uint16]string{ + ErrHashchk: "hashchk", + ErrNisamchk: "isamchk", + ErrNo: "NO", + ErrYes: "YES", + ErrCantCreateFile: "Can't create file '%-.200s' (errno: %d - %s)", + ErrCantCreateTable: "Can't create table '%-.200s' (errno: %d)", + ErrCantCreateDB: "Can't create database '%-.192s' (errno: %d)", + ErrDBCreateExists: "Can't create database '%-.192s'; database exists", + ErrDBDropExists: "Can't drop database '%-.192s'; database doesn't exist", + ErrDBDropDelete: "Error dropping database (can't delete '%-.192s', errno: %d)", + ErrDBDropRmdir: "Error dropping database (can't rmdir '%-.192s', errno: %d)", + ErrCantDeleteFile: "Error on delete of '%-.192s' (errno: %d - %s)", + ErrCantFindSystemRec: "Can't read record in system table", + ErrCantGetStat: "Can't get status of '%-.200s' (errno: %d - %s)", + ErrCantGetWd: "Can't get working directory (errno: %d - %s)", + ErrCantLock: "Can't lock file (errno: %d - %s)", + ErrCantOpenFile: "Can't open file: '%-.200s' (errno: %d - %s)", + ErrFileNotFound: "Can't find file: '%-.200s' (errno: %d - %s)", + ErrCantReadDir: "Can't read dir of '%-.192s' (errno: %d - %s)", + ErrCantSetWd: "Can't change dir to '%-.192s' (errno: %d - %s)", + ErrCheckread: "Record has changed since last read in table '%-.192s'", + ErrDiskFull: "Disk full (%s); waiting for someone to free some space... (errno: %d - %s)", + ErrDupKey: "Can't write; duplicate key in table '%-.192s'", + ErrErrorOnClose: "Error on close of '%-.192s' (errno: %d - %s)", + ErrErrorOnRead: "Error reading file '%-.200s' (errno: %d - %s)", + ErrErrorOnRename: "Error on rename of '%-.210s' to '%-.210s' (errno: %d - %s)", + ErrErrorOnWrite: "Error writing file '%-.200s' (errno: %d - %s)", + ErrFileUsed: "'%-.192s' is locked against change", + ErrFilsortAbort: "Sort aborted", + ErrFormNotFound: "View '%-.192s' doesn't exist for '%-.192s'", + ErrGetErrno: "Got error %d from storage engine", + ErrIllegalHa: "Table storage engine for '%-.192s' doesn't have this option", + ErrKeyNotFound: "Can't find record in '%-.192s'", + ErrNotFormFile: "Incorrect information in file: '%-.200s'", + ErrNotKeyFile: "Incorrect key file for table '%-.200s'; try to repair it", + ErrOldKeyFile: "Old key file for table '%-.192s'; repair it!", + ErrOpenAsReadonly: "Table '%-.192s' is read only", + ErrOutofMemory: "Out of memory; restart server and try again (needed %d bytes)", + ErrOutOfSortMemory: "Out of sort memory, consider increasing server sort buffer size", + ErrUnexpectedEOF: "Unexpected EOF found when reading file '%-.192s' (errno: %d - %s)", + ErrConCount: "Too many connections", + ErrOutOfResources: "Out of memory; check if mysqld or some other process uses all available memory; if not, you may have to use 'ulimit' to allow mysqld to use more memory or you can add more swap space", + ErrBadHost: "Can't get hostname for your address", + ErrHandshake: "Bad handshake", + ErrDBaccessDenied: "Access denied for user '%-.48s'@'%-.64s' to database '%-.192s'", + ErrAccessDenied: "Access denied for user '%-.48s'@'%-.64s' (using password: %s)", + ErrNoDB: "No database selected", + ErrUnknownCom: "Unknown command", + ErrBadNull: "Column '%-.192s' cannot be null", + ErrBadDB: "Unknown database '%-.192s'", + ErrTableExists: "Table '%-.192s' already exists", + ErrBadTable: "Unknown table '%-.100s'", + ErrNonUniq: "Column '%-.192s' in %-.192s is ambiguous", + ErrServerShutdown: "Server shutdown in progress", + ErrBadField: "Unknown column '%-.192s' in '%-.192s'", + ErrFieldNotInGroupBy: "Expression #%d of %s is not in GROUP BY clause and contains nonaggregated column '%s' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by", + ErrWrongGroupField: "Can't group on '%-.192s'", + ErrWrongSumSelect: "Statement has sum functions and columns in same statement", + ErrWrongValueCount: "Column count doesn't match value count", + ErrTooLongIdent: "Identifier name '%-.100s' is too long", + ErrDupFieldName: "Duplicate column name '%-.192s'", + ErrDupKeyName: "Duplicate key name '%-.192s'", + ErrDupEntry: "Duplicate entry '%-.192s' for key %d", + ErrWrongFieldSpec: "Incorrect column specifier for column '%-.192s'", + ErrParse: "%s %s", + ErrEmptyQuery: "Query was empty", + ErrNonuniqTable: "Not unique table/alias: '%-.192s'", + ErrInvalidDefault: "Invalid default value for '%-.192s'", + ErrMultiplePriKey: "Multiple primary key defined", + ErrTooManyKeys: "Too many keys specified; max %d keys allowed", + ErrTooManyKeyParts: "Too many key parts specified; max %d parts allowed", + ErrTooLongKey: "Specified key was too long; max key length is %d bytes", + ErrKeyColumnDoesNotExits: "Key column '%-.192s' doesn't exist in table", + ErrBlobUsedAsKey: "BLOB column '%-.192s' can't be used in key specification with the used table type", + ErrTooBigFieldlength: "Column length too big for column '%-.192s' (max = %d); use BLOB or TEXT instead", + ErrWrongAutoKey: "Incorrect table definition; there can be only one auto column and it must be defined as a key", + ErrReady: "%s: ready for connections.\nVersion: '%s' socket: '%s' port: %d", + ErrNormalShutdown: "%s: Normal shutdown\n", + ErrGotSignal: "%s: Got signal %d. Aborting!\n", + ErrShutdownComplete: "%s: Shutdown complete\n", + ErrForcingClose: "%s: Forcing close of thread %d user: '%-.48s'\n", + ErrIpsock: "Can't create IP socket", + ErrNoSuchIndex: "Table '%-.192s' has no index like the one used in CREATE INDEX; recreate the table", + ErrWrongFieldTerminators: "Field separator argument is not what is expected; check the manual", + ErrBlobsAndNoTerminated: "You can't use fixed rowlength with BLOBs; please use 'fields terminated by'", + ErrTextFileNotReadable: "The file '%-.128s' must be in the database directory or be readable by all", + ErrFileExists: "File '%-.200s' already exists", + ErrLoadInfo: "Records: %d Deleted: %d Skipped: %d Warnings: %d", + ErrAlterInfo: "Records: %d Duplicates: %d", + ErrWrongSubKey: "Incorrect prefix key; the used key part isn't a string, the used length is longer than the key part, or the storage engine doesn't support unique prefix keys", + ErrCantRemoveAllFields: "You can't delete all columns with ALTER TABLE; use DROP TABLE instead", + ErrCantDropFieldOrKey: "Can't DROP '%-.192s'; check that column/key exists", + ErrInsertInfo: "Records: %d Duplicates: %d Warnings: %d", + ErrUpdateTableUsed: "You can't specify target table '%-.192s' for update in FROM clause", + ErrNoSuchThread: "Unknown thread id: %d", + ErrKillDenied: "You are not owner of thread %d", + ErrNoTablesUsed: "No tables used", + ErrTooBigSet: "Too many strings for column %-.192s and SET", + ErrNoUniqueLogFile: "Can't generate a unique log-filename %-.200s.(1-999)\n", + ErrTableNotLockedForWrite: "Table '%-.192s' was locked with a READ lock and can't be updated", + ErrTableNotLocked: "Table '%-.192s' was not locked with LOCK TABLES", + ErrBlobCantHaveDefault: "BLOB/TEXT/JSON column '%-.192s' can't have a default value", + ErrWrongDBName: "Incorrect database name '%-.100s'", + ErrWrongTableName: "Incorrect table name '%-.100s'", + ErrTooBigSelect: "The SELECT would examine more than MAXJOINSIZE rows; check your WHERE and use SET SQLBIGSELECTS=1 or SET MAXJOINSIZE=# if the SELECT is okay", + ErrUnknown: "Unknown error", + ErrUnknownProcedure: "Unknown procedure '%-.192s'", + ErrWrongParamcountToProcedure: "Incorrect parameter count to procedure '%-.192s'", + ErrWrongParametersToProcedure: "Incorrect parameters to procedure '%-.192s'", + ErrUnknownTable: "Unknown table '%-.192s' in %-.32s", + ErrFieldSpecifiedTwice: "Column '%-.192s' specified twice", + ErrInvalidGroupFuncUse: "Invalid use of group function", + ErrUnsupportedExtension: "Table '%-.192s' uses an extension that doesn't exist in this MySQL version", + ErrTableMustHaveColumns: "A table must have at least 1 column", + ErrRecordFileFull: "The table '%-.192s' is full", + ErrUnknownCharacterSet: "Unknown character set: '%-.64s'", + ErrTooManyTables: "Too many tables; MySQL can only use %d tables in a join", + ErrTooManyFields: "Too many columns", + ErrTooBigRowsize: "Row size too large. The maximum row size for the used table type, not counting BLOBs, is %d. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs", + ErrStackOverrun: "Thread stack overrun: Used: %d of a %d stack. Use 'mysqld --threadStack=#' to specify a bigger stack if needed", + ErrWrongOuterJoin: "Cross dependency found in OUTER JOIN; examine your ON conditions", + ErrNullColumnInIndex: "Table handler doesn't support NULL in given index. Please change column '%-.192s' to be NOT NULL or use another handler", + ErrCantFindUdf: "Can't load function '%-.192s'", + ErrCantInitializeUdf: "Can't initialize function '%-.192s'; %-.80s", + ErrUdfNoPaths: "No paths allowed for shared library", + ErrUdfExists: "Function '%-.192s' already exists", + ErrCantOpenLibrary: "Can't open shared library '%-.192s' (errno: %d %-.128s)", + ErrCantFindDlEntry: "Can't find symbol '%-.128s' in library", + ErrFunctionNotDefined: "Function '%-.192s' is not defined", + ErrHostIsBlocked: "Host '%-.64s' is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts'", + ErrHostNotPrivileged: "Host '%-.64s' is not allowed to connect to this MySQL server", + ErrPasswordAnonymousUser: "You are using MySQL as an anonymous user and anonymous users are not allowed to change passwords", + ErrPasswordNotAllowed: "You must have privileges to update tables in the mysql database to be able to change passwords for others", + ErrPasswordNoMatch: "Can't find any matching row in the user table", + ErrUpdateInfo: "Rows matched: %d Changed: %d Warnings: %d", + ErrCantCreateThread: "Can't create a new thread (errno %d); if you are not out of available memory, you can consult the manual for a possible OS-dependent bug", + ErrWrongValueCountOnRow: "Column count doesn't match value count at row %d", + ErrCantReopenTable: "Can't reopen table: '%-.192s'", + ErrInvalidUseOfNull: "Invalid use of NULL value", + ErrRegexp: "Got error '%-.64s' from regexp", + ErrMixOfGroupFuncAndFields: "Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause", + ErrNonexistingGrant: "There is no such grant defined for user '%-.48s' on host '%-.64s'", + ErrTableaccessDenied: "%-.128s command denied to user '%-.48s'@'%-.64s' for table '%-.64s'", + ErrColumnaccessDenied: "%-.16s command denied to user '%-.48s'@'%-.64s' for column '%-.192s' in table '%-.192s'", + ErrIllegalGrantForTable: "Illegal GRANT/REVOKE command; please consult the manual to see which privileges can be used", + ErrGrantWrongHostOrUser: "The host or user argument to GRANT is too long", + ErrNoSuchTable: "Table '%-.192s.%-.192s' doesn't exist", + ErrNonexistingTableGrant: "There is no such grant defined for user '%-.48s' on host '%-.64s' on table '%-.192s'", + ErrNotAllowedCommand: "The used command is not allowed with this MySQL version", + ErrSyntax: "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use", + ErrDelayedCantChangeLock: "Delayed insert thread couldn't get requested lock for table %-.192s", + ErrTooManyDelayedThreads: "Too many delayed threads in use", + ErrAbortingConnection: "Aborted connection %d to db: '%-.192s' user: '%-.48s' (%-.64s)", + ErrNetPacketTooLarge: "Got a packet bigger than 'maxAllowedPacket' bytes", + ErrNetReadErrorFromPipe: "Got a read error from the connection pipe", + ErrNetFcntl: "Got an error from fcntl()", + ErrNetPacketsOutOfOrder: "Got packets out of order", + ErrNetUncompress: "Couldn't uncompress communication packet", + ErrNetRead: "Got an error reading communication packets", + ErrNetReadInterrupted: "Got timeout reading communication packets", + ErrNetErrorOnWrite: "Got an error writing communication packets", + ErrNetWriteInterrupted: "Got timeout writing communication packets", + ErrTooLongString: "Result string is longer than 'maxAllowedPacket' bytes", + ErrTableCantHandleBlob: "The used table type doesn't support BLOB/TEXT columns", + ErrTableCantHandleAutoIncrement: "The used table type doesn't support AUTOINCREMENT columns", + ErrDelayedInsertTableLocked: "INSERT DELAYED can't be used with table '%-.192s' because it is locked with LOCK TABLES", + ErrWrongColumnName: "Incorrect column name '%-.100s'", + ErrWrongKeyColumn: "The used storage engine can't index column '%-.192s'", + ErrWrongMrgTable: "Unable to open underlying table which is differently defined or of non-MyISAM type or doesn't exist", + ErrDupUnique: "Can't write, because of unique constraint, to table '%-.192s'", + ErrBlobKeyWithoutLength: "BLOB/TEXT column '%-.192s' used in key specification without a key length", + ErrPrimaryCantHaveNull: "All parts of a PRIMARY KEY must be NOT NULL; if you need NULL in a key, use UNIQUE instead", + ErrTooManyRows: "Result consisted of more than one row", + ErrRequiresPrimaryKey: "This table type requires a primary key", + ErrNoRaidCompiled: "This version of MySQL is not compiled with RAID support", + ErrUpdateWithoutKeyInSafeMode: "You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column", + ErrKeyDoesNotExist: "Key '%-.192s' doesn't exist in table '%-.192s'", + ErrCheckNoSuchTable: "Can't open table", + ErrCheckNotImplemented: "The storage engine for the table doesn't support %s", + ErrCantDoThisDuringAnTransaction: "You are not allowed to execute this command in a transaction", + ErrErrorDuringCommit: "Got error %d during COMMIT", + ErrErrorDuringRollback: "Got error %d during ROLLBACK", + ErrErrorDuringFlushLogs: "Got error %d during FLUSHLOGS", + ErrErrorDuringCheckpoint: "Got error %d during CHECKPOINT", + ErrNewAbortingConnection: "Aborted connection %d to db: '%-.192s' user: '%-.48s' host: '%-.64s' (%-.64s)", + ErrDumpNotImplemented: "The storage engine for the table does not support binary table dump", + ErrFlushMasterBinlogClosed: "Binlog closed, cannot RESET MASTER", + ErrIndexRebuild: "Failed rebuilding the index of dumped table '%-.192s'", + ErrMaster: "Error from master: '%-.64s'", + ErrMasterNetRead: "Net error reading from master", + ErrMasterNetWrite: "Net error writing to master", + ErrFtMatchingKeyNotFound: "Can't find FULLTEXT index matching the column list", + ErrLockOrActiveTransaction: "Can't execute the given command because you have active locked tables or an active transaction", + ErrUnknownSystemVariable: "Unknown system variable '%-.64s'", + ErrCrashedOnUsage: "Table '%-.192s' is marked as crashed and should be repaired", + ErrCrashedOnRepair: "Table '%-.192s' is marked as crashed and last (automatic?) repair failed", + ErrWarningNotCompleteRollback: "Some non-transactional changed tables couldn't be rolled back", + ErrTransCacheFull: "Multi-statement transaction required more than 'maxBinlogCacheSize' bytes of storage; increase this mysqld variable and try again", + ErrSlaveMustStop: "This operation cannot be performed with a running slave; run STOP SLAVE first", + ErrSlaveNotRunning: "This operation requires a running slave; configure slave and do START SLAVE", + ErrBadSlave: "The server is not configured as slave; fix in config file or with CHANGE MASTER TO", + ErrMasterInfo: "Could not initialize master info structure; more error messages can be found in the MySQL error log", + ErrSlaveThread: "Could not create slave thread; check system resources", + ErrTooManyUserConnections: "User %-.64s already has more than 'maxUserConnections' active connections", + ErrSetConstantsOnly: "You may only use constant expressions with SET", + ErrLockWaitTimeout: "Lock wait timeout exceeded; try restarting transaction", + ErrLockTableFull: "The total number of locks exceeds the lock table size", + ErrReadOnlyTransaction: "Update locks cannot be acquired during a READ UNCOMMITTED transaction", + ErrDropDBWithReadLock: "DROP DATABASE not allowed while thread is holding global read lock", + ErrCreateDBWithReadLock: "CREATE DATABASE not allowed while thread is holding global read lock", + ErrWrongArguments: "Incorrect arguments to %s", + ErrNoPermissionToCreateUser: "'%-.48s'@'%-.64s' is not allowed to create new users", + ErrUnionTablesInDifferentDir: "Incorrect table definition; all MERGE tables must be in the same database", + ErrLockDeadlock: "Deadlock found when trying to get lock; try restarting transaction", + ErrTableCantHandleFt: "The used table type doesn't support FULLTEXT indexes", + ErrCannotAddForeign: "Cannot add foreign key constraint", + ErrNoReferencedRow: "Cannot add or update a child row: a foreign key constraint fails", + ErrRowIsReferenced: "Cannot delete or update a parent row: a foreign key constraint fails", + ErrConnectToMaster: "Error connecting to master: %-.128s", + ErrQueryOnMaster: "Error running query on master: %-.128s", + ErrErrorWhenExecutingCommand: "Error when executing command %s: %-.128s", + ErrWrongUsage: "Incorrect usage of %s and %s", + ErrWrongNumberOfColumnsInSelect: "The used SELECT statements have a different number of columns", + ErrCantUpdateWithReadlock: "Can't execute the query because you have a conflicting read lock", + ErrMixingNotAllowed: "Mixing of transactional and non-transactional tables is disabled", + ErrDupArgument: "Option '%s' used twice in statement", + ErrUserLimitReached: "User '%-.64s' has exceeded the '%s' resource (current value: %d)", + ErrSpecificAccessDenied: "Access denied; you need (at least one of) the %-.128s privilege(s) for this operation", + ErrLocalVariable: "Variable '%-.64s' is a SESSION variable and can't be used with SET GLOBAL", + ErrGlobalVariable: "Variable '%-.64s' is a GLOBAL variable and should be set with SET GLOBAL", + ErrNoDefault: "Variable '%-.64s' doesn't have a default value", + ErrWrongValueForVar: "Variable '%-.64s' can't be set to the value of '%-.200s'", + ErrWrongTypeForVar: "Incorrect argument type to variable '%-.64s'", + ErrVarCantBeRead: "Variable '%-.64s' can only be set, not read", + ErrCantUseOptionHere: "Incorrect usage/placement of '%s'", + ErrNotSupportedYet: "This version of TiDB doesn't yet support '%s'", + ErrMasterFatalErrorReadingBinlog: "Got fatal error %d from master when reading data from binary log: '%-.320s'", + ErrSlaveIgnoredTable: "Slave SQL thread ignored the query because of replicate-*-table rules", + ErrIncorrectGlobalLocalVar: "Variable '%-.192s' is a %s variable", + ErrWrongFkDef: "Incorrect foreign key definition for '%-.192s': %s", + ErrKeyRefDoNotMatchTableRef: "Key reference and table reference don't match", + ErrOperandColumns: "Operand should contain %d column(s)", + ErrSubqueryNo1Row: "Subquery returns more than 1 row", + ErrUnknownStmtHandler: "Unknown prepared statement handler (%.*s) given to %s", + ErrCorruptHelpDB: "Help database is corrupt or does not exist", + ErrCyclicReference: "Cyclic reference on subqueries", + ErrAutoConvert: "Converting column '%s' from %s to %s", + ErrIllegalReference: "Reference '%-.64s' not supported (%s)", + ErrDerivedMustHaveAlias: "Every derived table must have its own alias", + ErrSelectReduced: "Select %d was reduced during optimization", + ErrTablenameNotAllowedHere: "Table '%-.192s' from one of the SELECTs cannot be used in %-.32s", + ErrNotSupportedAuthMode: "Client does not support authentication protocol requested by server; consider upgrading MySQL client", + ErrSpatialCantHaveNull: "All parts of a SPATIAL index must be NOT NULL", + ErrCollationCharsetMismatch: "COLLATION '%s' is not valid for CHARACTER SET '%s'", + ErrSlaveWasRunning: "Slave is already running", + ErrSlaveWasNotRunning: "Slave already has been stopped", + ErrTooBigForUncompress: "Uncompressed data size too large; the maximum size is %d (probably, length of uncompressed data was corrupted)", + ErrZlibZMem: "ZLIB: Not enough memory", + ErrZlibZBuf: "ZLIB: Not enough room in the output buffer (probably, length of uncompressed data was corrupted)", + ErrZlibZData: "ZLIB: Input data corrupted", + ErrCutValueGroupConcat: "Some rows were cut by GROUPCONCAT(%s)", + ErrWarnTooFewRecords: "Row %d doesn't contain data for all columns", + ErrWarnTooManyRecords: "Row %d was truncated; it contained more data than there were input columns", + ErrWarnNullToNotnull: "Column set to default value; NULL supplied to NOT NULL column '%s' at row %d", + ErrWarnDataOutOfRange: "Out of range value for column '%s' at row %d", + WarnDataTruncated: "Data truncated for column '%s' at row %d", + ErrWarnUsingOtherHandler: "Using storage engine %s for table '%s'", + ErrCantAggregate2collations: "Illegal mix of collations (%s,%s) and (%s,%s) for operation '%s'", + ErrDropUser: "Cannot drop one or more of the requested users", + ErrRevokeGrants: "Can't revoke all privileges for one or more of the requested users", + ErrCantAggregate3collations: "Illegal mix of collations (%s,%s), (%s,%s), (%s,%s) for operation '%s'", + ErrCantAggregateNcollations: "Illegal mix of collations for operation '%s'", + ErrVariableIsNotStruct: "Variable '%-.64s' is not a variable component (can't be used as XXXX.variableName)", + ErrUnknownCollation: "Unknown collation: '%-.64s'", + ErrSlaveIgnoredSslParams: "SSL parameters in CHANGE MASTER are ignored because this MySQL slave was compiled without SSL support; they can be used later if MySQL slave with SSL is started", + ErrServerIsInSecureAuthMode: "Server is running in --secure-auth mode, but '%s'@'%s' has a password in the old format; please change the password to the new format", + ErrWarnFieldResolved: "Field or reference '%-.192s%s%-.192s%s%-.192s' of SELECT #%d was resolved in SELECT #%d", + ErrBadSlaveUntilCond: "Incorrect parameter or combination of parameters for START SLAVE UNTIL", + ErrMissingSkipSlave: "It is recommended to use --skip-slave-start when doing step-by-step replication with START SLAVE UNTIL; otherwise, you will get problems if you get an unexpected slave's mysqld restart", + ErrUntilCondIgnored: "SQL thread is not to be started so UNTIL options are ignored", + ErrWrongNameForIndex: "Incorrect index name '%-.100s'", + ErrWrongNameForCatalog: "Incorrect catalog name '%-.100s'", + ErrWarnQcResize: "Query cache failed to set size %d; new query cache size is %d", + ErrBadFtColumn: "Column '%-.192s' cannot be part of FULLTEXT index", + ErrUnknownKeyCache: "Unknown key cache '%-.100s'", + ErrWarnHostnameWontWork: "MySQL is started in --skip-name-resolve mode; you must restart it without this switch for this grant to work", + ErrUnknownStorageEngine: "Unknown storage engine '%s'", + ErrWarnDeprecatedSyntax: "'%s' is deprecated and will be removed in a future release. Please use %s instead", + ErrNonUpdatableTable: "The target table %-.100s of the %s is not updatable", + ErrFeatureDisabled: "The '%s' feature is disabled; you need MySQL built with '%s' to have it working", + ErrOptionPreventsStatement: "The MySQL server is running with the %s option so it cannot execute this statement", + ErrDuplicatedValueInType: "Column '%-.100s' has duplicated value '%-.64s' in %s", + ErrTruncatedWrongValue: "Truncated incorrect %-.64s value: '%-.128s'", + ErrTooMuchAutoTimestampCols: "Incorrect table definition; there can be only one TIMESTAMP column with CURRENTTIMESTAMP in DEFAULT or ON UPDATE clause", + ErrInvalidOnUpdate: "Invalid ON UPDATE clause for '%-.192s' column", + ErrUnsupportedPs: "This command is not supported in the prepared statement protocol yet", + ErrGetErrmsg: "Got error %d '%-.100s' from %s", + ErrGetTemporaryErrmsg: "Got temporary error %d '%-.100s' from %s", + ErrUnknownTimeZone: "Unknown or incorrect time zone: '%-.64s'", + ErrWarnInvalidTimestamp: "Invalid TIMESTAMP value in column '%s' at row %d", + ErrInvalidCharacterString: "Invalid %s character string: '%.64s'", + ErrWarnAllowedPacketOverflowed: "Result of %s() was larger than max_allowed_packet (%d) - truncated", + ErrConflictingDeclarations: "Conflicting declarations: '%s%s' and '%s%s'", + ErrSpNoRecursiveCreate: "Can't create a %s from within another stored routine", + ErrSpAlreadyExists: "%s %s already exists", + ErrSpDoesNotExist: "%s %s does not exist", + ErrSpDropFailed: "Failed to DROP %s %s", + ErrSpStoreFailed: "Failed to CREATE %s %s", + ErrSpLilabelMismatch: "%s with no matching label: %s", + ErrSpLabelRedefine: "Redefining label %s", + ErrSpLabelMismatch: "End-label %s without match", + ErrSpUninitVar: "Referring to uninitialized variable %s", + ErrSpBadselect: "PROCEDURE %s can't return a result set in the given context", + ErrSpBadreturn: "RETURN is only allowed in a FUNCTION", + ErrSpBadstatement: "%s is not allowed in stored procedures", + ErrUpdateLogDeprecatedIgnored: "The update log is deprecated and replaced by the binary log; SET SQLLOGUPDATE has been ignored.", + ErrUpdateLogDeprecatedTranslated: "The update log is deprecated and replaced by the binary log; SET SQLLOGUPDATE has been translated to SET SQLLOGBIN.", + ErrQueryInterrupted: "Query execution was interrupted", + ErrSpWrongNoOfArgs: "Incorrect number of arguments for %s %s; expected %d, got %d", + ErrSpCondMismatch: "Undefined CONDITION: %s", + ErrSpNoreturn: "No RETURN found in FUNCTION %s", + ErrSpNoreturnend: "FUNCTION %s ended without RETURN", + ErrSpBadCursorQuery: "Cursor statement must be a SELECT", + ErrSpBadCursorSelect: "Cursor SELECT must not have INTO", + ErrSpCursorMismatch: "Undefined CURSOR: %s", + ErrSpCursorAlreadyOpen: "Cursor is already open", + ErrSpCursorNotOpen: "Cursor is not open", + ErrSpUndeclaredVar: "Undeclared variable: %s", + ErrSpWrongNoOfFetchArgs: "Incorrect number of FETCH variables", + ErrSpFetchNoData: "No data - zero rows fetched, selected, or processed", + ErrSpDupParam: "Duplicate parameter: %s", + ErrSpDupVar: "Duplicate variable: %s", + ErrSpDupCond: "Duplicate condition: %s", + ErrSpDupCurs: "Duplicate cursor: %s", + ErrSpCantAlter: "Failed to ALTER %s %s", + ErrSpSubselectNyi: "Subquery value not supported", + ErrStmtNotAllowedInSfOrTrg: "%s is not allowed in stored function or trigger", + ErrSpVarcondAfterCurshndlr: "Variable or condition declaration after cursor or handler declaration", + ErrSpCursorAfterHandler: "Cursor declaration after handler declaration", + ErrSpCaseNotFound: "Case not found for CASE statement", + ErrFparserTooBigFile: "Configuration file '%-.192s' is too big", + ErrFparserBadHeader: "Malformed file type header in file '%-.192s'", + ErrFparserEOFInComment: "Unexpected end of file while parsing comment '%-.200s'", + ErrFparserErrorInParameter: "Error while parsing parameter '%-.192s' (line: '%-.192s')", + ErrFparserEOFInUnknownParameter: "Unexpected end of file while skipping unknown parameter '%-.192s'", + ErrViewNoExplain: "EXPLAIN/SHOW can not be issued; lacking privileges for underlying table", + ErrFrmUnknownType: "File '%-.192s' has unknown type '%-.64s' in its header", + ErrWrongObject: "'%-.192s.%-.192s' is not %s", + ErrNonupdateableColumn: "Column '%-.192s' is not updatable", + ErrViewSelectDerived: "View's SELECT contains a subquery in the FROM clause", + ErrViewSelectClause: "View's SELECT contains a '%s' clause", + ErrViewSelectVariable: "View's SELECT contains a variable or parameter", + ErrViewSelectTmptable: "View's SELECT refers to a temporary table '%-.192s'", + ErrViewWrongList: "View's SELECT and view's field list have different column counts", + ErrWarnViewMerge: "View merge algorithm can't be used here for now (assumed undefined algorithm)", + ErrWarnViewWithoutKey: "View being updated does not have complete key of underlying table in it", + ErrViewInvalid: "View '%-.192s.%-.192s' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them", + ErrSpNoDropSp: "Can't drop or alter a %s from within another stored routine", + ErrSpGotoInHndlr: "GOTO is not allowed in a stored procedure handler", + ErrTrgAlreadyExists: "Trigger already exists", + ErrTrgDoesNotExist: "Trigger does not exist", + ErrTrgOnViewOrTempTable: "Trigger's '%-.192s' is view or temporary table", + ErrTrgCantChangeRow: "Updating of %s row is not allowed in %strigger", + ErrTrgNoSuchRowInTrg: "There is no %s row in %s trigger", + ErrNoDefaultForField: "Field '%-.192s' doesn't have a default value", + ErrDivisionByZero: "Division by 0", + ErrTruncatedWrongValueForField: "Incorrect %-.32s value: '%-.128s' for column '%.192s' at row %d", + ErrIllegalValueForType: "Illegal %s '%-.192s' value found during parsing", + ErrViewNonupdCheck: "CHECK OPTION on non-updatable view '%-.192s.%-.192s'", + ErrViewCheckFailed: "CHECK OPTION failed '%-.192s.%-.192s'", + ErrProcaccessDenied: "%-.16s command denied to user '%-.48s'@'%-.64s' for routine '%-.192s'", + ErrRelayLogFail: "Failed purging old relay logs: %s", + ErrPasswdLength: "Password hash should be a %d-digit hexadecimal number", + ErrUnknownTargetBinlog: "Target log not found in binlog index", + ErrIoErrLogIndexRead: "I/O error reading log index file", + ErrBinlogPurgeProhibited: "Server configuration does not permit binlog purge", + ErrFseekFail: "Failed on fseek()", + ErrBinlogPurgeFatalErr: "Fatal error during log purge", + ErrLogInUse: "A purgeable log is in use, will not purge", + ErrLogPurgeUnknownErr: "Unknown error during log purge", + ErrRelayLogInit: "Failed initializing relay log position: %s", + ErrNoBinaryLogging: "You are not using binary logging", + ErrReservedSyntax: "The '%-.64s' syntax is reserved for purposes internal to the MySQL server", + ErrWsasFailed: "WSAStartup Failed", + ErrDiffGroupsProc: "Can't handle procedures with different groups yet", + ErrNoGroupForProc: "Select must have a group with this procedure", + ErrOrderWithProc: "Can't use ORDER clause with this procedure", + ErrLoggingProhibitChangingOf: "Binary logging and replication forbid changing the global server %s", + ErrNoFileMapping: "Can't map file: %-.200s, errno: %d", + ErrWrongMagic: "Wrong magic in %-.64s", + ErrPsManyParam: "Prepared statement contains too many placeholders", + ErrKeyPart0: "Key part '%-.192s' length cannot be 0", + ErrViewChecksum: "View text checksum failed", + ErrViewMultiupdate: "Can not modify more than one base table through a join view '%-.192s.%-.192s'", + ErrViewNoInsertFieldList: "Can not insert into join view '%-.192s.%-.192s' without fields list", + ErrViewDeleteMergeView: "Can not delete from join view '%-.192s.%-.192s'", + ErrCannotUser: "Operation %s failed for %.256s", + ErrXaerNota: "XAERNOTA: Unknown XID", + ErrXaerInval: "XAERINVAL: Invalid arguments (or unsupported command)", + ErrXaerRmfail: "XAERRMFAIL: The command cannot be executed when global transaction is in the %.64s state", + ErrXaerOutside: "XAEROUTSIDE: Some work is done outside global transaction", + ErrXaerRmerr: "XAERRMERR: Fatal error occurred in the transaction branch - check your data for consistency", + ErrXaRbrollback: "XARBROLLBACK: Transaction branch was rolled back", + ErrNonexistingProcGrant: "There is no such grant defined for user '%-.48s' on host '%-.64s' on routine '%-.192s'", + ErrProcAutoGrantFail: "Failed to grant EXECUTE and ALTER ROUTINE privileges", + ErrProcAutoRevokeFail: "Failed to revoke all privileges to dropped routine", + ErrDataTooLong: "Data too long for column '%s' at row %d", + ErrSpBadSQLstate: "Bad SQLSTATE: '%s'", + ErrStartup: "%s: ready for connections.\nVersion: '%s' socket: '%s' port: %d %s", + ErrLoadFromFixedSizeRowsToVar: "Can't load value from file with fixed size rows to variable", + ErrCantCreateUserWithGrant: "You are not allowed to create a user with GRANT", + ErrWrongValueForType: "Incorrect %-.32s value: '%-.128s' for function %-.32s", + ErrTableDefChanged: "Table definition has changed, please retry transaction", + ErrSpDupHandler: "Duplicate handler declared in the same block", + ErrSpNotVarArg: "OUT or INOUT argument %d for routine %s is not a variable or NEW pseudo-variable in BEFORE trigger", + ErrSpNoRetset: "Not allowed to return a result set from a %s", + ErrCantCreateGeometryObject: "Cannot get geometry object from data you send to the GEOMETRY field", + ErrFailedRoutineBreakBinlog: "A routine failed and has neither NO SQL nor READS SQL DATA in its declaration and binary logging is enabled; if non-transactional tables were updated, the binary log will miss their changes", + ErrBinlogUnsafeRoutine: "This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the less safe logBinTrustFunctionCreators variable)", + ErrBinlogCreateRoutineNeedSuper: "You do not have the SUPER privilege and binary logging is enabled (you *might* want to use the less safe logBinTrustFunctionCreators variable)", + ErrExecStmtWithOpenCursor: "You can't execute a prepared statement which has an open cursor associated with it. Reset the statement to re-execute it.", + ErrStmtHasNoOpenCursor: "The statement (%d) has no open cursor.", + ErrCommitNotAllowedInSfOrTrg: "Explicit or implicit commit is not allowed in stored function or trigger.", + ErrNoDefaultForViewField: "Field of view '%-.192s.%-.192s' underlying table doesn't have a default value", + ErrSpNoRecursion: "Recursive stored functions and triggers are not allowed.", + ErrTooBigScale: "Too big scale %d specified for column '%-.192s'. Maximum is %d.", + ErrTooBigPrecision: "Too big precision %d specified for column '%-.192s'. Maximum is %d.", + ErrMBiggerThanD: "For float(M,D), double(M,D) or decimal(M,D), M must be >= D (column '%-.192s').", + ErrWrongLockOfSystemTable: "You can't combine write-locking of system tables with other tables or lock types", + ErrConnectToForeignDataSource: "Unable to connect to foreign data source: %.64s", + ErrQueryOnForeignDataSource: "There was a problem processing the query on the foreign data source. Data source : %-.64s", + ErrForeignDataSourceDoesntExist: "The foreign data source you are trying to reference does not exist. Data source : %-.64s", + ErrForeignDataStringInvalidCantCreate: "Can't create federated table. The data source connection string '%-.64s' is not in the correct format", + ErrForeignDataStringInvalid: "The data source connection string '%-.64s' is not in the correct format", + ErrCantCreateFederatedTable: "Can't create federated table. Foreign data src : %-.64s", + ErrTrgInWrongSchema: "Trigger in wrong schema", + ErrStackOverrunNeedMore: "Thread stack overrun: %d bytes used of a %d byte stack, and %d bytes needed. Use 'mysqld --threadStack=#' to specify a bigger stack.", + ErrTooLongBody: "Routine body for '%-.100s' is too long", + ErrWarnCantDropDefaultKeycache: "Cannot drop default keycache", + ErrTooBigDisplaywidth: "Display width out of range for column '%-.192s' (max = %d)", + ErrXaerDupid: "XAERDUPID: The XID already exists", + ErrDatetimeFunctionOverflow: "Datetime function: %-.32s field overflow", + ErrCantUpdateUsedTableInSfOrTrg: "Can't update table '%-.192s' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.", + ErrViewPreventUpdate: "The definition of table '%-.192s' prevents operation %.192s on table '%-.192s'.", + ErrPsNoRecursion: "The prepared statement contains a stored routine call that refers to that same statement. It's not allowed to execute a prepared statement in such a recursive manner", + ErrSpCantSetAutocommit: "Not allowed to set autocommit from a stored function or trigger", + ErrMalformedDefiner: "Definer is not fully qualified", + ErrViewFrmNoUser: "View '%-.192s'.'%-.192s' has no definer information (old table format). Current user is used as definer. Please recreate the view!", + ErrViewOtherUser: "You need the SUPER privilege for creation view with '%-.192s'@'%-.192s' definer", + ErrNoSuchUser: "The user specified as a definer ('%-.64s'@'%-.64s') does not exist", + ErrForbidSchemaChange: "Changing schema from '%-.192s' to '%-.192s' is not allowed.", + ErrRowIsReferenced2: "Cannot delete or update a parent row: a foreign key constraint fails (%.192s)", + ErrNoReferencedRow2: "Cannot add or update a child row: a foreign key constraint fails (%.192s)", + ErrSpBadVarShadow: "Variable '%-.64s' must be quoted with `...`, or renamed", + ErrTrgNoDefiner: "No definer attribute for trigger '%-.192s'.'%-.192s'. The trigger will be activated under the authorization of the invoker, which may have insufficient privileges. Please recreate the trigger.", + ErrOldFileFormat: "'%-.192s' has an old format, you should re-create the '%s' object(s)", + ErrSpRecursionLimit: "Recursive limit %d (as set by the maxSpRecursionDepth variable) was exceeded for routine %.192s", + ErrSpProcTableCorrupt: "Failed to load routine %-.192s. The table mysql.proc is missing, corrupt, or contains bad data (internal code %d)", + ErrSpWrongName: "Incorrect routine name '%-.192s'", + ErrTableNeedsUpgrade: "Table upgrade required. Please do \"REPAIR TABLE `%-.32s`\"", + ErrSpNoAggregate: "AGGREGATE is not supported for stored functions", + ErrMaxPreparedStmtCountReached: "Can't create more than maxPreparedStmtCount statements (current value: %d)", + ErrViewRecursive: "`%-.192s`.`%-.192s` contains view recursion", + ErrNonGroupingFieldUsed: "Non-grouping field '%-.192s' is used in %-.64s clause", + ErrTableCantHandleSpkeys: "The used table type doesn't support SPATIAL indexes", + ErrNoTriggersOnSystemSchema: "Triggers can not be created on system tables", + ErrRemovedSpaces: "Leading spaces are removed from name '%s'", + ErrAutoincReadFailed: "Failed to read auto-increment value from storage engine", + ErrUsername: "user name", + ErrHostname: "host name", + ErrWrongStringLength: "String '%-.70s' is too long for %s (should be no longer than %d)", + ErrNonInsertableTable: "The target table %-.100s of the %s is not insertable-into", + ErrAdminWrongMrgTable: "Table '%-.64s' is differently defined or of non-MyISAM type or doesn't exist", + ErrTooHighLevelOfNestingForSelect: "Too high level of nesting for select", + ErrNameBecomesEmpty: "Name '%-.64s' has become ''", + ErrAmbiguousFieldTerm: "First character of the FIELDS TERMINATED string is ambiguous; please use non-optional and non-empty FIELDS ENCLOSED BY", + ErrForeignServerExists: "The foreign server, %s, you are trying to create already exists.", + ErrForeignServerDoesntExist: "The foreign server name you are trying to reference does not exist. Data source : %-.64s", + ErrIllegalHaCreateOption: "Table storage engine '%-.64s' does not support the create option '%.64s'", + ErrPartitionRequiresValues: "Syntax : %-.64s PARTITIONING requires definition of VALUES %-.64s for each partition", + ErrPartitionWrongValues: "Only %-.64s PARTITIONING can use VALUES %-.64s in partition definition", + ErrPartitionMaxvalue: "MAXVALUE can only be used in last partition definition", + ErrPartitionSubpartition: "Subpartitions can only be hash partitions and by key", + ErrPartitionSubpartMix: "Must define subpartitions on all partitions if on one partition", + ErrPartitionWrongNoPart: "Wrong number of partitions defined, mismatch with previous setting", + ErrPartitionWrongNoSubpart: "Wrong number of subpartitions defined, mismatch with previous setting", + ErrWrongExprInPartitionFunc: "Constant, random or timezone-dependent expressions in (sub)partitioning function are not allowed", + ErrNoConstExprInRangeOrList: "Expression in RANGE/LIST VALUES must be constant", + ErrFieldNotFoundPart: "Field in list of fields for partition function not found in table", + ErrListOfFieldsOnlyInHash: "List of fields is only allowed in KEY partitions", + ErrInconsistentPartitionInfo: "The partition info in the frm file is not consistent with what can be written into the frm file", + ErrPartitionFuncNotAllowed: "The %-.192s function returns the wrong type", + ErrPartitionsMustBeDefined: "For %-.64s partitions each partition must be defined", + ErrRangeNotIncreasing: "VALUES LESS THAN value must be strictly increasing for each partition", + ErrInconsistentTypeOfFunctions: "VALUES value must be of same type as partition function", + ErrMultipleDefConstInListPart: "Multiple definition of same constant in list partitioning", + ErrPartitionEntry: "Partitioning can not be used stand-alone in query", + ErrMixHandler: "The mix of handlers in the partitions is not allowed in this version of MySQL", + ErrPartitionNotDefined: "For the partitioned engine it is necessary to define all %-.64s", + ErrTooManyPartitions: "Too many partitions (including subpartitions) were defined", + ErrSubpartition: "It is only possible to mix RANGE/LIST partitioning with HASH/KEY partitioning for subpartitioning", + ErrCantCreateHandlerFile: "Failed to create specific handler file", + ErrBlobFieldInPartFunc: "A BLOB field is not allowed in partition function", + ErrUniqueKeyNeedAllFieldsInPf: "A %-.192s must include all columns in the table's partitioning function", + ErrNoParts: "Number of %-.64s = 0 is not an allowed value", + ErrPartitionMgmtOnNonpartitioned: "Partition management on a not partitioned table is not possible", + ErrForeignKeyOnPartitioned: "Foreign key clause is not yet supported in conjunction with partitioning", + ErrDropPartitionNonExistent: "Error in list of partitions to %-.64s", + ErrDropLastPartition: "Cannot remove all partitions, use DROP TABLE instead", + ErrCoalesceOnlyOnHashPartition: "COALESCE PARTITION can only be used on HASH/KEY partitions", + ErrReorgHashOnlyOnSameNo: "REORGANIZE PARTITION can only be used to reorganize partitions not to change their numbers", + ErrReorgNoParam: "REORGANIZE PARTITION without parameters can only be used on auto-partitioned tables using HASH PARTITIONs", + ErrOnlyOnRangeListPartition: "%-.64s PARTITION can only be used on RANGE/LIST partitions", + ErrAddPartitionSubpart: "Trying to Add partition(s) with wrong number of subpartitions", + ErrAddPartitionNoNewPartition: "At least one partition must be added", + ErrCoalescePartitionNoPartition: "At least one partition must be coalesced", + ErrReorgPartitionNotExist: "More partitions to reorganize than there are partitions", + ErrSameNamePartition: "Duplicate partition name %-.192s", + ErrNoBinlog: "It is not allowed to shut off binlog on this command", + ErrConsecutiveReorgPartitions: "When reorganizing a set of partitions they must be in consecutive order", + ErrReorgOutsideRange: "Reorganize of range partitions cannot change total ranges except for last partition where it can extend the range", + ErrPartitionFunctionFailure: "Partition function not supported in this version for this handler", + ErrPartState: "Partition state cannot be defined from CREATE/ALTER TABLE", + ErrLimitedPartRange: "The %-.64s handler only supports 32 bit integers in VALUES", + ErrPluginIsNotLoaded: "Plugin '%-.192s' is not loaded", + ErrWrongValue: "Incorrect %-.32s value: '%-.128s'", + ErrNoPartitionForGivenValue: "Table has no partition for value %-.64s", + ErrFilegroupOptionOnlyOnce: "It is not allowed to specify %s more than once", + ErrCreateFilegroupFailed: "Failed to create %s", + ErrDropFilegroupFailed: "Failed to drop %s", + ErrTablespaceAutoExtend: "The handler doesn't support autoextend of tablespaces", + ErrWrongSizeNumber: "A size parameter was incorrectly specified, either number or on the form 10M", + ErrSizeOverflow: "The size number was correct but we don't allow the digit part to be more than 2 billion", + ErrAlterFilegroupFailed: "Failed to alter: %s", + ErrBinlogRowLoggingFailed: "Writing one row to the row-based binary log failed", + ErrBinlogRowWrongTableDef: "Table definition on master and slave does not match: %s", + ErrBinlogRowRbrToSbr: "Slave running with --log-slave-updates must use row-based binary logging to be able to replicate row-based binary log events", + ErrEventAlreadyExists: "Event '%-.192s' already exists", + ErrEventStoreFailed: "Failed to store event %s. Error code %d from storage engine.", + ErrEventDoesNotExist: "Unknown event '%-.192s'", + ErrEventCantAlter: "Failed to alter event '%-.192s'", + ErrEventDropFailed: "Failed to drop %s", + ErrEventIntervalNotPositiveOrTooBig: "INTERVAL is either not positive or too big", + ErrEventEndsBeforeStarts: "ENDS is either invalid or before STARTS", + ErrEventExecTimeInThePast: "Event execution time is in the past. Event has been disabled", + ErrEventOpenTableFailed: "Failed to open mysql.event", + ErrEventNeitherMExprNorMAt: "No datetime expression provided", + ErrObsoleteColCountDoesntMatchCorrupted: "Column count of mysql.%s is wrong. Expected %d, found %d. The table is probably corrupted", + ErrObsoleteCannotLoadFromTable: "Cannot load from mysql.%s. The table is probably corrupted", + ErrEventCannotDelete: "Failed to delete the event from mysql.event", + ErrEventCompile: "Error during compilation of event's body", + ErrEventSameName: "Same old and new event name", + ErrEventDataTooLong: "Data for column '%s' too long", + ErrDropIndexFk: "Cannot drop index '%-.192s': needed in a foreign key constraint", + ErrWarnDeprecatedSyntaxWithVer: "The syntax '%s' is deprecated and will be removed in MySQL %s. Please use %s instead", + ErrCantWriteLockLogTable: "You can't write-lock a log table. Only read access is possible", + ErrCantLockLogTable: "You can't use locks with log tables.", + ErrForeignDuplicateKeyOldUnused: "Upholding foreign key constraints for table '%.192s', entry '%-.192s', key %d would lead to a duplicate entry", + ErrColCountDoesntMatchPleaseUpdate: "Column count of mysql.%s is wrong. Expected %d, found %d. Created with MySQL %d, now running %d. Please use mysqlUpgrade to fix this error.", + ErrTempTablePreventsSwitchOutOfRbr: "Cannot switch out of the row-based binary log format when the session has open temporary tables", + ErrStoredFunctionPreventsSwitchBinlogFormat: "Cannot change the binary logging format inside a stored function or trigger", + ErrNdbCantSwitchBinlogFormat: "The NDB cluster engine does not support changing the binlog format on the fly yet", + ErrPartitionNoTemporary: "Cannot create temporary table with partitions", + ErrPartitionConstDomain: "Partition constant is out of partition function domain", + ErrPartitionFunctionIsNotAllowed: "This partition function is not allowed", + ErrDdlLog: "Error in DDL log", + ErrNullInValuesLessThan: "Not allowed to use NULL value in VALUES LESS THAN", + ErrWrongPartitionName: "Incorrect partition name", + ErrCantChangeTxCharacteristics: "Transaction characteristics can't be changed while a transaction is in progress", + ErrDupEntryAutoincrementCase: "ALTER TABLE causes autoIncrement resequencing, resulting in duplicate entry '%-.192s' for key '%-.192s'", + ErrEventModifyQueue: "Internal scheduler error %d", + ErrEventSetVar: "Error during starting/stopping of the scheduler. Error code %d", + ErrPartitionMerge: "Engine cannot be used in partitioned tables", + ErrCantActivateLog: "Cannot activate '%-.64s' log", + ErrRbrNotAvailable: "The server was not built with row-based replication", + ErrBase64Decode: "Decoding of base64 string failed", + ErrEventRecursionForbidden: "Recursion of EVENT DDL statements is forbidden when body is present", + ErrEventsDB: "Cannot proceed because system tables used by Event Scheduler were found damaged at server start", + ErrOnlyIntegersAllowed: "Only integers allowed as number here", + ErrUnsuportedLogEngine: "This storage engine cannot be used for log tables\"", + ErrBadLogStatement: "You cannot '%s' a log table if logging is enabled", + ErrCantRenameLogTable: "Cannot rename '%s'. When logging enabled, rename to/from log table must rename two tables: the log table to an archive table and another table back to '%s'", + ErrWrongParamcountToNativeFct: "Incorrect parameter count in the call to native function '%-.192s'", + ErrWrongParametersToNativeFct: "Incorrect parameters in the call to native function '%-.192s'", + ErrWrongParametersToStoredFct: "Incorrect parameters in the call to stored function '%-.192s'", + ErrNativeFctNameCollision: "This function '%-.192s' has the same name as a native function", + ErrDupEntryWithKeyName: "Duplicate entry '%-.64s' for key '%-.192s'", + ErrBinlogPurgeEmFile: "Too many files opened, please execute the command again", + ErrEventCannotCreateInThePast: "Event execution time is in the past and ON COMPLETION NOT PRESERVE is set. The event was dropped immediately after creation.", + ErrEventCannotAlterInThePast: "Event execution time is in the past and ON COMPLETION NOT PRESERVE is set. The event was not changed. Specify a time in the future.", + ErrSlaveIncident: "The incident %s occurred on the master. Message: %-.64s", + ErrNoPartitionForGivenValueSilent: "Table has no partition for some existing values", + ErrBinlogUnsafeStatement: "Unsafe statement written to the binary log using statement format since BINLOGFORMAT = STATEMENT. %s", + ErrSlaveFatal: "Fatal : %s", + ErrSlaveRelayLogReadFailure: "Relay log read failure: %s", + ErrSlaveRelayLogWriteFailure: "Relay log write failure: %s", + ErrSlaveCreateEventFailure: "Failed to create %s", + ErrSlaveMasterComFailure: "Master command %s failed: %s", + ErrBinlogLoggingImpossible: "Binary logging not possible. Message: %s", + ErrViewNoCreationCtx: "View `%-.64s`.`%-.64s` has no creation context", + ErrViewInvalidCreationCtx: "Creation context of view `%-.64s`.`%-.64s' is invalid", + ErrSrInvalidCreationCtx: "Creation context of stored routine `%-.64s`.`%-.64s` is invalid", + ErrTrgCorruptedFile: "Corrupted TRG file for table `%-.64s`.`%-.64s`", + ErrTrgNoCreationCtx: "Triggers for table `%-.64s`.`%-.64s` have no creation context", + ErrTrgInvalidCreationCtx: "Trigger creation context of table `%-.64s`.`%-.64s` is invalid", + ErrEventInvalidCreationCtx: "Creation context of event `%-.64s`.`%-.64s` is invalid", + ErrTrgCantOpenTable: "Cannot open table for trigger `%-.64s`.`%-.64s`", + ErrCantCreateSroutine: "Cannot create stored routine `%-.64s`. Check warnings", + ErrNeverUsed: "Ambiguous slave modes combination. %s", + ErrNoFormatDescriptionEventBeforeBinlogStatement: "The BINLOG statement of type `%s` was not preceded by a format description BINLOG statement.", + ErrSlaveCorruptEvent: "Corrupted replication event was detected", + ErrLoadDataInvalidColumn: "Invalid column reference (%-.64s) in LOAD DATA", + ErrLogPurgeNoFile: "Being purged log %s was not found", + ErrXaRbtimeout: "XARBTIMEOUT: Transaction branch was rolled back: took too long", + ErrXaRbdeadlock: "XARBDEADLOCK: Transaction branch was rolled back: deadlock was detected", + ErrNeedReprepare: "Prepared statement needs to be re-prepared", + ErrDelayedNotSupported: "DELAYED option not supported for table '%-.192s'", + WarnNoMasterInfo: "The master info structure does not exist", + WarnOptionIgnored: "<%-.64s> option ignored", + WarnPluginDeleteBuiltin: "Built-in plugins cannot be deleted", + WarnPluginBusy: "Plugin is busy and will be uninstalled on shutdown", + ErrVariableIsReadonly: "%s variable '%s' is read-only. Use SET %s to assign the value", + ErrWarnEngineTransactionRollback: "Storage engine %s does not support rollback for this statement. Transaction rolled back and must be restarted", + ErrSlaveHeartbeatFailure: "Unexpected master's heartbeat data: %s", + ErrSlaveHeartbeatValueOutOfRange: "The requested value for the heartbeat period is either negative or exceeds the maximum allowed (%s seconds).", + ErrNdbReplicationSchema: "Bad schema for mysql.ndbReplication table. Message: %-.64s", + ErrConflictFnParse: "Error in parsing conflict function. Message: %-.64s", + ErrExceptionsWrite: "Write to exceptions table failed. Message: %-.128s\"", + ErrTooLongTableComment: "Comment for table '%-.64s' is too long (max = %d)", + ErrTooLongFieldComment: "Comment for field '%-.64s' is too long (max = %d)", + ErrFuncInexistentNameCollision: "FUNCTION %s does not exist. Check the 'Function Name Parsing and Resolution' section in the Reference Manual", + ErrDatabaseName: "Database", + ErrTableName: "Table", + ErrPartitionName: "Partition", + ErrSubpartitionName: "Subpartition", + ErrTemporaryName: "Temporary", + ErrRenamedName: "Renamed", + ErrTooManyConcurrentTrxs: "Too many active concurrent transactions", + WarnNonASCIISeparatorNotImplemented: "Non-ASCII separator arguments are not fully supported", + ErrDebugSyncTimeout: "debug sync point wait timed out", + ErrDebugSyncHitLimit: "debug sync point hit limit reached", + ErrDupSignalSet: "Duplicate condition information item '%s'", + ErrSignalWarn: "Unhandled user-defined warning condition", + ErrSignalNotFound: "Unhandled user-defined not found condition", + ErrSignalException: "Unhandled user-defined exception condition", + ErrResignalWithoutActiveHandler: "RESIGNAL when handler not active", + ErrSignalBadConditionType: "SIGNAL/RESIGNAL can only use a CONDITION defined with SQLSTATE", + WarnCondItemTruncated: "Data truncated for condition item '%s'", + ErrCondItemTooLong: "Data too long for condition item '%s'", + ErrUnknownLocale: "Unknown locale: '%-.64s'", + ErrSlaveIgnoreServerIds: "The requested server id %d clashes with the slave startup option --replicate-same-server-id", + ErrQueryCacheDisabled: "Query cache is disabled; restart the server with queryCacheType=1 to enable it", + ErrSameNamePartitionField: "Duplicate partition field name '%-.192s'", + ErrPartitionColumnList: "Inconsistency in usage of column lists for partitioning", + ErrWrongTypeColumnValue: "Partition column values of incorrect type", + ErrTooManyPartitionFuncFields: "Too many fields in '%-.192s'", + ErrMaxvalueInValuesIn: "Cannot use MAXVALUE as value in VALUES IN", + ErrTooManyValues: "Cannot have more than one value for this type of %-.64s partitioning", + ErrRowSinglePartitionField: "Row expressions in VALUES IN only allowed for multi-field column partitioning", + ErrFieldTypeNotAllowedAsPartitionField: "Field '%-.192s' is of a not allowed type for this type of partitioning", + ErrPartitionFieldsTooLong: "The total length of the partitioning fields is too large", + ErrBinlogRowEngineAndStmtEngine: "Cannot execute statement: impossible to write to binary log since both row-incapable engines and statement-incapable engines are involved.", + ErrBinlogRowModeAndStmtEngine: "Cannot execute statement: impossible to write to binary log since BINLOGFORMAT = ROW and at least one table uses a storage engine limited to statement-based logging.", + ErrBinlogUnsafeAndStmtEngine: "Cannot execute statement: impossible to write to binary log since statement is unsafe, storage engine is limited to statement-based logging, and BINLOGFORMAT = MIXED. %s", + ErrBinlogRowInjectionAndStmtEngine: "Cannot execute statement: impossible to write to binary log since statement is in row format and at least one table uses a storage engine limited to statement-based logging.", + ErrBinlogStmtModeAndRowEngine: "Cannot execute statement: impossible to write to binary log since BINLOGFORMAT = STATEMENT and at least one table uses a storage engine limited to row-based logging.%s", + ErrBinlogRowInjectionAndStmtMode: "Cannot execute statement: impossible to write to binary log since statement is in row format and BINLOGFORMAT = STATEMENT.", + ErrBinlogMultipleEnginesAndSelfLoggingEngine: "Cannot execute statement: impossible to write to binary log since more than one engine is involved and at least one engine is self-logging.", + ErrBinlogUnsafeLimit: "The statement is unsafe because it uses a LIMIT clause. This is unsafe because the set of rows included cannot be predicted.", + ErrBinlogUnsafeInsertDelayed: "The statement is unsafe because it uses INSERT DELAYED. This is unsafe because the times when rows are inserted cannot be predicted.", + ErrBinlogUnsafeSystemTable: "The statement is unsafe because it uses the general log, slow query log, or performanceSchema table(s). This is unsafe because system tables may differ on slaves.", + ErrBinlogUnsafeAutoincColumns: "Statement is unsafe because it invokes a trigger or a stored function that inserts into an AUTOINCREMENT column. Inserted values cannot be logged correctly.", + ErrBinlogUnsafeUdf: "Statement is unsafe because it uses a UDF which may not return the same value on the slave.", + ErrBinlogUnsafeSystemVariable: "Statement is unsafe because it uses a system variable that may have a different value on the slave.", + ErrBinlogUnsafeSystemFunction: "Statement is unsafe because it uses a system function that may return a different value on the slave.", + ErrBinlogUnsafeNontransAfterTrans: "Statement is unsafe because it accesses a non-transactional table after accessing a transactional table within the same transaction.", + ErrMessageAndStatement: "%s Statement: %s", + ErrSlaveConversionFailed: "Column %d of table '%-.192s.%-.192s' cannot be converted from type '%-.32s' to type '%-.32s'", + ErrSlaveCantCreateConversion: "Can't create conversion table for table '%-.192s.%-.192s'", + ErrInsideTransactionPreventsSwitchBinlogFormat: "Cannot modify @@session.binlogFormat inside a transaction", + ErrPathLength: "The path specified for %.64s is too long.", + ErrWarnDeprecatedSyntaxNoReplacement: "'%s' is deprecated and will be removed in a future release.", + ErrWrongNativeTableStructure: "Native table '%-.64s'.'%-.64s' has the wrong structure", + ErrWrongPerfSchemaUsage: "Invalid performanceSchema usage.", + ErrWarnISSkippedTable: "Table '%s'.'%s' was skipped since its definition is being modified by concurrent DDL statement", + ErrInsideTransactionPreventsSwitchBinlogDirect: "Cannot modify @@session.binlogDirectNonTransactionalUpdates inside a transaction", + ErrStoredFunctionPreventsSwitchBinlogDirect: "Cannot change the binlog direct flag inside a stored function or trigger", + ErrSpatialMustHaveGeomCol: "A SPATIAL index may only contain a geometrical type column", + ErrTooLongIndexComment: "Comment for index '%-.64s' is too long (max = %d)", + ErrLockAborted: "Wait on a lock was aborted due to a pending exclusive lock", + ErrDataOutOfRange: "%s value is out of range in '%s'", + ErrWrongSpvarTypeInLimit: "A variable of a non-integer based type in LIMIT clause", + ErrBinlogUnsafeMultipleEnginesAndSelfLoggingEngine: "Mixing self-logging and non-self-logging engines in a statement is unsafe.", + ErrBinlogUnsafeMixedStatement: "Statement accesses nontransactional table as well as transactional or temporary table, and writes to any of them.", + ErrInsideTransactionPreventsSwitchSQLLogBin: "Cannot modify @@session.sqlLogBin inside a transaction", + ErrStoredFunctionPreventsSwitchSQLLogBin: "Cannot change the sqlLogBin inside a stored function or trigger", + ErrFailedReadFromParFile: "Failed to read from the .par file", + ErrValuesIsNotIntType: "VALUES value for partition '%-.64s' must have type INT", + ErrAccessDeniedNoPassword: "Access denied for user '%-.48s'@'%-.64s'", + ErrSetPasswordAuthPlugin: "SET PASSWORD has no significance for users authenticating via plugins", + ErrGrantPluginUserExists: "GRANT with IDENTIFIED WITH is illegal because the user %-.*s already exists", + ErrTruncateIllegalFk: "Cannot truncate a table referenced in a foreign key constraint (%.192s)", + ErrPluginIsPermanent: "Plugin '%s' is forcePlusPermanent and can not be unloaded", + ErrSlaveHeartbeatValueOutOfRangeMin: "The requested value for the heartbeat period is less than 1 millisecond. The value is reset to 0, meaning that heartbeating will effectively be disabled.", + ErrSlaveHeartbeatValueOutOfRangeMax: "The requested value for the heartbeat period exceeds the value of `slaveNetTimeout' seconds. A sensible value for the period should be less than the timeout.", + ErrStmtCacheFull: "Multi-row statements required more than 'maxBinlogStmtCacheSize' bytes of storage; increase this mysqld variable and try again", + ErrMultiUpdateKeyConflict: "Primary key/partition key update is not allowed since the table is updated both as '%-.192s' and '%-.192s'.", + ErrTableNeedsRebuild: "Table rebuild required. Please do \"ALTER TABLE `%-.32s` FORCE\" or dump/reload to fix it!", + WarnOptionBelowLimit: "The value of '%s' should be no less than the value of '%s'", + ErrIndexColumnTooLong: "Index column size too large. The maximum column size is %d bytes.", + ErrErrorInTriggerBody: "Trigger '%-.64s' has an error in its body: '%-.256s'", + ErrErrorInUnknownTriggerBody: "Unknown trigger has an error in its body: '%-.256s'", + ErrIndexCorrupt: "Index %s is corrupted", + ErrUndoRecordTooBig: "Undo log record is too big.", + ErrBinlogUnsafeInsertIgnoreSelect: "INSERT IGNORE... SELECT is unsafe because the order in which rows are retrieved by the SELECT determines which (if any) rows are ignored. This order cannot be predicted and may differ on master and the slave.", + ErrBinlogUnsafeInsertSelectUpdate: "INSERT... SELECT... ON DUPLICATE KEY UPDATE is unsafe because the order in which rows are retrieved by the SELECT determines which (if any) rows are updated. This order cannot be predicted and may differ on master and the slave.", + ErrBinlogUnsafeReplaceSelect: "REPLACE... SELECT is unsafe because the order in which rows are retrieved by the SELECT determines which (if any) rows are replaced. This order cannot be predicted and may differ on master and the slave.", + ErrBinlogUnsafeCreateIgnoreSelect: "CREATE... IGNORE SELECT is unsafe because the order in which rows are retrieved by the SELECT determines which (if any) rows are ignored. This order cannot be predicted and may differ on master and the slave.", + ErrBinlogUnsafeCreateReplaceSelect: "CREATE... REPLACE SELECT is unsafe because the order in which rows are retrieved by the SELECT determines which (if any) rows are replaced. This order cannot be predicted and may differ on master and the slave.", + ErrBinlogUnsafeUpdateIgnore: "UPDATE IGNORE is unsafe because the order in which rows are updated determines which (if any) rows are ignored. This order cannot be predicted and may differ on master and the slave.", + ErrPluginNoUninstall: "Plugin '%s' is marked as not dynamically uninstallable. You have to stop the server to uninstall it.", + ErrPluginNoInstall: "Plugin '%s' is marked as not dynamically installable. You have to stop the server to install it.", + ErrBinlogUnsafeWriteAutoincSelect: "Statements writing to a table with an auto-increment column after selecting from another table are unsafe because the order in which rows are retrieved determines what (if any) rows will be written. This order cannot be predicted and may differ on master and the slave.", + ErrBinlogUnsafeCreateSelectAutoinc: "CREATE TABLE... SELECT... on a table with an auto-increment column is unsafe because the order in which rows are retrieved by the SELECT determines which (if any) rows are inserted. This order cannot be predicted and may differ on master and the slave.", + ErrBinlogUnsafeInsertTwoKeys: "INSERT... ON DUPLICATE KEY UPDATE on a table with more than one UNIQUE KEY is unsafe", + ErrTableInFkCheck: "Table is being used in foreign key check.", + ErrUnsupportedEngine: "Storage engine '%s' does not support system tables. [%s.%s]", + ErrBinlogUnsafeAutoincNotFirst: "INSERT into autoincrement field which is not the first part in the composed primary key is unsafe.", + ErrCannotLoadFromTableV2: "Cannot load from %s.%s. The table is probably corrupted", + ErrMasterDelayValueOutOfRange: "The requested value %d for the master delay exceeds the maximum %d", + ErrOnlyFdAndRbrEventsAllowedInBinlogStatement: "Only FormatDescriptionLogEvent and row events are allowed in BINLOG statements (but %s was provided)", + ErrPartitionExchangeDifferentOption: "Non matching attribute '%-.64s' between partition and table", + ErrPartitionExchangePartTable: "Table to exchange with partition is partitioned: '%-.64s'", + ErrPartitionExchangeTempTable: "Table to exchange with partition is temporary: '%-.64s'", + ErrPartitionInsteadOfSubpartition: "Subpartitioned table, use subpartition instead of partition", + ErrUnknownPartition: "Unknown partition '%-.64s' in table '%-.64s'", + ErrTablesDifferentMetadata: "Tables have different definitions", + ErrRowDoesNotMatchPartition: "Found a row that does not match the partition", + ErrBinlogCacheSizeGreaterThanMax: "Option binlogCacheSize (%d) is greater than maxBinlogCacheSize (%d); setting binlogCacheSize equal to maxBinlogCacheSize.", + ErrWarnIndexNotApplicable: "Cannot use %-.64s access on index '%-.64s' due to type or collation conversion on field '%-.64s'", + ErrPartitionExchangeForeignKey: "Table to exchange with partition has foreign key references: '%-.64s'", + ErrNoSuchKeyValue: "Key value '%-.192s' was not found in table '%-.192s.%-.192s'", + ErrRplInfoDataTooLong: "Data for column '%s' too long", + ErrNetworkReadEventChecksumFailure: "Replication event checksum verification failed while reading from network.", + ErrBinlogReadEventChecksumFailure: "Replication event checksum verification failed while reading from a log file.", + ErrBinlogStmtCacheSizeGreaterThanMax: "Option binlogStmtCacheSize (%d) is greater than maxBinlogStmtCacheSize (%d); setting binlogStmtCacheSize equal to maxBinlogStmtCacheSize.", + ErrCantUpdateTableInCreateTableSelect: "Can't update table '%-.192s' while '%-.192s' is being created.", + ErrPartitionClauseOnNonpartitioned: "PARTITION () clause on non partitioned table", + ErrRowDoesNotMatchGivenPartitionSet: "Found a row not matching the given partition set", + ErrNoSuchPartitionunused: "partition '%-.64s' doesn't exist", + ErrChangeRplInfoRepositoryFailure: "Failure while changing the type of replication repository: %s.", + ErrWarningNotCompleteRollbackWithCreatedTempTable: "The creation of some temporary tables could not be rolled back.", + ErrWarningNotCompleteRollbackWithDroppedTempTable: "Some temporary tables were dropped, but these operations could not be rolled back.", + ErrMtsFeatureIsNotSupported: "%s is not supported in multi-threaded slave mode. %s", + ErrMtsUpdatedDBsGreaterMax: "The number of modified databases exceeds the maximum %d; the database names will not be included in the replication event metadata.", + ErrMtsCantParallel: "Cannot execute the current event group in the parallel mode. Encountered event %s, relay-log name %s, position %s which prevents execution of this event group in parallel mode. Reason: %s.", + ErrMtsInconsistentData: "%s", + ErrFulltextNotSupportedWithPartitioning: "FULLTEXT index is not supported for partitioned tables.", + ErrDaInvalidConditionNumber: "Invalid condition number", + ErrInsecurePlainText: "Sending passwords in plain text without SSL/TLS is extremely insecure.", + ErrInsecureChangeMaster: "Storing MySQL user name or password information in the master.info repository is not secure and is therefore not recommended. Please see the MySQL Manual for more about this issue and possible alternatives.", + ErrForeignDuplicateKeyWithChildInfo: "Foreign key constraint for table '%.192s', record '%-.192s' would lead to a duplicate entry in table '%.192s', key '%.192s'", + ErrForeignDuplicateKeyWithoutChildInfo: "Foreign key constraint for table '%.192s', record '%-.192s' would lead to a duplicate entry in a child table", + ErrSQLthreadWithSecureSlave: "Setting authentication options is not possible when only the Slave SQL Thread is being started.", + ErrTableHasNoFt: "The table does not have FULLTEXT index to support this query", + ErrVariableNotSettableInSfOrTrigger: "The system variable %.200s cannot be set in stored functions or triggers.", + ErrVariableNotSettableInTransaction: "The system variable %.200s cannot be set when there is an ongoing transaction.", + ErrGtidNextIsNotInGtidNextList: "The system variable @@SESSION.GTIDNEXT has the value %.200s, which is not listed in @@SESSION.GTIDNEXTLIST.", + ErrCantChangeGtidNextInTransactionWhenGtidNextListIsNull: "When @@SESSION.GTIDNEXTLIST == NULL, the system variable @@SESSION.GTIDNEXT cannot change inside a transaction.", + ErrSetStatementCannotInvokeFunction: "The statement 'SET %.200s' cannot invoke a stored function.", + ErrGtidNextCantBeAutomaticIfGtidNextListIsNonNull: "The system variable @@SESSION.GTIDNEXT cannot be 'AUTOMATIC' when @@SESSION.GTIDNEXTLIST is non-NULL.", + ErrSkippingLoggedTransaction: "Skipping transaction %.200s because it has already been executed and logged.", + ErrMalformedGtidSetSpecification: "Malformed GTID set specification '%.200s'.", + ErrMalformedGtidSetEncoding: "Malformed GTID set encoding.", + ErrMalformedGtidSpecification: "Malformed GTID specification '%.200s'.", + ErrGnoExhausted: "Impossible to generate Global Transaction Identifier: the integer component reached the maximal value. Restart the server with a new serverUuid.", + ErrBadSlaveAutoPosition: "Parameters MASTERLOGFILE, MASTERLOGPOS, RELAYLOGFILE and RELAYLOGPOS cannot be set when MASTERAUTOPOSITION is active.", + ErrAutoPositionRequiresGtidModeOn: "CHANGE MASTER TO MASTERAUTOPOSITION = 1 can only be executed when @@GLOBAL.GTIDMODE = ON.", + ErrCantDoImplicitCommitInTrxWhenGtidNextIsSet: "Cannot execute statements with implicit commit inside a transaction when @@SESSION.GTIDNEXT != AUTOMATIC or @@SESSION.GTIDNEXTLIST != NULL.", + ErrGtidMode2Or3RequiresEnforceGtidConsistencyOn: "@@GLOBAL.GTIDMODE = ON or UPGRADESTEP2 requires @@GLOBAL.ENFORCEGTIDCONSISTENCY = 1.", + ErrGtidModeRequiresBinlog: "@@GLOBAL.GTIDMODE = ON or UPGRADESTEP1 or UPGRADESTEP2 requires --log-bin and --log-slave-updates.", + ErrCantSetGtidNextToGtidWhenGtidModeIsOff: "@@SESSION.GTIDNEXT cannot be set to UUID:NUMBER when @@GLOBAL.GTIDMODE = OFF.", + ErrCantSetGtidNextToAnonymousWhenGtidModeIsOn: "@@SESSION.GTIDNEXT cannot be set to ANONYMOUS when @@GLOBAL.GTIDMODE = ON.", + ErrCantSetGtidNextListToNonNullWhenGtidModeIsOff: "@@SESSION.GTIDNEXTLIST cannot be set to a non-NULL value when @@GLOBAL.GTIDMODE = OFF.", + ErrFoundGtidEventWhenGtidModeIsOff: "Found a GtidLogEvent or PreviousGtidsLogEvent when @@GLOBAL.GTIDMODE = OFF.", + ErrGtidUnsafeNonTransactionalTable: "When @@GLOBAL.ENFORCEGTIDCONSISTENCY = 1, updates to non-transactional tables can only be done in either autocommitted statements or single-statement transactions, and never in the same statement as updates to transactional tables.", + ErrGtidUnsafeCreateSelect: "CREATE TABLE ... SELECT is forbidden when @@GLOBAL.ENFORCEGTIDCONSISTENCY = 1.", + ErrGtidUnsafeCreateDropTemporaryTableInTransaction: "When @@GLOBAL.ENFORCEGTIDCONSISTENCY = 1, the statements CREATE TEMPORARY TABLE and DROP TEMPORARY TABLE can be executed in a non-transactional context only, and require that AUTOCOMMIT = 1.", + ErrGtidModeCanOnlyChangeOneStepAtATime: "The value of @@GLOBAL.GTIDMODE can only change one step at a time: OFF <-> UPGRADESTEP1 <-> UPGRADESTEP2 <-> ON. Also note that this value must be stepped up or down simultaneously on all servers; see the Manual for instructions.", + ErrMasterHasPurgedRequiredGtids: "The slave is connecting using CHANGE MASTER TO MASTERAUTOPOSITION = 1, but the master has purged binary logs containing GTIDs that the slave requires.", + ErrCantSetGtidNextWhenOwningGtid: "@@SESSION.GTIDNEXT cannot be changed by a client that owns a GTID. The client owns %s. Ownership is released on COMMIT or ROLLBACK.", + ErrUnknownExplainFormat: "Unknown EXPLAIN format name: '%s'", + ErrCantExecuteInReadOnlyTransaction: "Cannot execute statement in a READ ONLY transaction.", + ErrTooLongTablePartitionComment: "Comment for table partition '%-.64s' is too long (max = %d)", + ErrSlaveConfiguration: "Slave is not configured or failed to initialize properly. You must at least set --server-id to enable either a master or a slave. Additional error messages can be found in the MySQL error log.", + ErrInnodbFtLimit: "InnoDB presently supports one FULLTEXT index creation at a time", + ErrInnodbNoFtTempTable: "Cannot create FULLTEXT index on temporary InnoDB table", + ErrInnodbFtWrongDocidColumn: "Column '%-.192s' is of wrong type for an InnoDB FULLTEXT index", + ErrInnodbFtWrongDocidIndex: "Index '%-.192s' is of wrong type for an InnoDB FULLTEXT index", + ErrInnodbOnlineLogTooBig: "Creating index '%-.192s' required more than 'innodbOnlineAlterLogMaxSize' bytes of modification log. Please try again.", + ErrUnknownAlterAlgorithm: "Unknown ALGORITHM '%s'", + ErrUnknownAlterLock: "Unknown LOCK type '%s'", + ErrMtsChangeMasterCantRunWithGaps: "CHANGE MASTER cannot be executed when the slave was stopped with an error or killed in MTS mode. Consider using RESET SLAVE or START SLAVE UNTIL.", + ErrMtsRecoveryFailure: "Cannot recover after SLAVE errored out in parallel execution mode. Additional error messages can be found in the MySQL error log.", + ErrMtsResetWorkers: "Cannot clean up worker info tables. Additional error messages can be found in the MySQL error log.", + ErrColCountDoesntMatchCorruptedV2: "Column count of %s.%s is wrong. Expected %d, found %d. The table is probably corrupted", + ErrSlaveSilentRetryTransaction: "Slave must silently retry current transaction", + ErrDiscardFkChecksRunning: "There is a foreign key check running on table '%-.192s'. Cannot discard the table.", + ErrTableSchemaMismatch: "Schema mismatch (%s)", + ErrTableInSystemTablespace: "Table '%-.192s' in system tablespace", + ErrIoRead: "IO Read : (%d, %s) %s", + ErrIoWrite: "IO Write : (%d, %s) %s", + ErrTablespaceMissing: "Tablespace is missing for table '%-.192s'", + ErrTablespaceExists: "Tablespace for table '%-.192s' exists. Please DISCARD the tablespace before IMPORT.", + ErrTablespaceDiscarded: "Tablespace has been discarded for table '%-.192s'", + ErrInternal: "Internal : %s", + ErrInnodbImport: "ALTER TABLE '%-.192s' IMPORT TABLESPACE failed with error %d : '%s'", + ErrInnodbIndexCorrupt: "Index corrupt: %s", + ErrInvalidYearColumnLength: "Supports only YEAR or YEAR(4) column", + ErrNotValidPassword: "Your password does not satisfy the current policy requirements", + ErrMustChangePassword: "You must SET PASSWORD before executing this statement", + ErrFkNoIndexChild: "Failed to add the foreign key constaint. Missing index for constraint '%s' in the foreign table '%s'", + ErrFkNoIndexParent: "Failed to add the foreign key constaint. Missing index for constraint '%s' in the referenced table '%s'", + ErrFkFailAddSystem: "Failed to add the foreign key constraint '%s' to system tables", + ErrFkCannotOpenParent: "Failed to open the referenced table '%s'", + ErrFkIncorrectOption: "Failed to add the foreign key constraint on table '%s'. Incorrect options in FOREIGN KEY constraint '%s'", + ErrFkDupName: "Duplicate foreign key constraint name '%s'", + ErrPasswordFormat: "The password hash doesn't have the expected format. Check if the correct password algorithm is being used with the PASSWORD() function.", + ErrFkColumnCannotDrop: "Cannot drop column '%-.192s': needed in a foreign key constraint '%-.192s'", + ErrFkColumnCannotDropChild: "Cannot drop column '%-.192s': needed in a foreign key constraint '%-.192s' of table '%-.192s'", + ErrFkColumnNotNull: "Column '%-.192s' cannot be NOT NULL: needed in a foreign key constraint '%-.192s' SET NULL", + ErrDupIndex: "Duplicate index '%-.64s' defined on the table '%-.64s.%-.64s'. This is deprecated and will be disallowed in a future release.", + ErrFkColumnCannotChange: "Cannot change column '%-.192s': used in a foreign key constraint '%-.192s'", + ErrFkColumnCannotChangeChild: "Cannot change column '%-.192s': used in a foreign key constraint '%-.192s' of table '%-.192s'", + ErrFkCannotDeleteParent: "Cannot delete rows from table which is parent in a foreign key constraint '%-.192s' of table '%-.192s'", + ErrMalformedPacket: "Malformed communication packet.", + ErrReadOnlyMode: "Running in read-only mode", + ErrGtidNextTypeUndefinedGroup: "When @@SESSION.GTIDNEXT is set to a GTID, you must explicitly set it again after a COMMIT or ROLLBACK. If you see this error message in the slave SQL thread, it means that a table in the current transaction is transactional on the master and non-transactional on the slave. In a client connection, it means that you executed SET @@SESSION.GTIDNEXT before a transaction and forgot to set @@SESSION.GTIDNEXT to a different identifier or to 'AUTOMATIC' after COMMIT or ROLLBACK. Current @@SESSION.GTIDNEXT is '%s'.", + ErrVariableNotSettableInSp: "The system variable %.200s cannot be set in stored procedures.", + ErrCantSetGtidPurgedWhenGtidModeIsOff: "@@GLOBAL.GTIDPURGED can only be set when @@GLOBAL.GTIDMODE = ON.", + ErrCantSetGtidPurgedWhenGtidExecutedIsNotEmpty: "@@GLOBAL.GTIDPURGED can only be set when @@GLOBAL.GTIDEXECUTED is empty.", + ErrCantSetGtidPurgedWhenOwnedGtidsIsNotEmpty: "@@GLOBAL.GTIDPURGED can only be set when there are no ongoing transactions (not even in other clients).", + ErrGtidPurgedWasChanged: "@@GLOBAL.GTIDPURGED was changed from '%s' to '%s'.", + ErrGtidExecutedWasChanged: "@@GLOBAL.GTIDEXECUTED was changed from '%s' to '%s'.", + ErrBinlogStmtModeAndNoReplTables: "Cannot execute statement: impossible to write to binary log since BINLOGFORMAT = STATEMENT, and both replicated and non replicated tables are written to.", + ErrAlterOperationNotSupported: "%s is not supported for this operation. Try %s.", + ErrAlterOperationNotSupportedReason: "%s is not supported. Reason: %s. Try %s.", + ErrAlterOperationNotSupportedReasonCopy: "COPY algorithm requires a lock", + ErrAlterOperationNotSupportedReasonPartition: "Partition specific operations do not yet support LOCK/ALGORITHM", + ErrAlterOperationNotSupportedReasonFkRename: "Columns participating in a foreign key are renamed", + ErrAlterOperationNotSupportedReasonColumnType: "Cannot change column type INPLACE", + ErrAlterOperationNotSupportedReasonFkCheck: "Adding foreign keys needs foreignKeyChecks=OFF", + ErrAlterOperationNotSupportedReasonIgnore: "Creating unique indexes with IGNORE requires COPY algorithm to remove duplicate rows", + ErrAlterOperationNotSupportedReasonNopk: "Dropping a primary key is not allowed without also adding a new primary key", + ErrAlterOperationNotSupportedReasonAutoinc: "Adding an auto-increment column requires a lock", + ErrAlterOperationNotSupportedReasonHiddenFts: "Cannot replace hidden FTSDOCID with a user-visible one", + ErrAlterOperationNotSupportedReasonChangeFts: "Cannot drop or rename FTSDOCID", + ErrAlterOperationNotSupportedReasonFts: "Fulltext index creation requires a lock", + ErrSQLSlaveSkipCounterNotSettableInGtidMode: "sqlSlaveSkipCounter can not be set when the server is running with @@GLOBAL.GTIDMODE = ON. Instead, for each transaction that you want to skip, generate an empty transaction with the same GTID as the transaction", + ErrDupUnknownInIndex: "Duplicate entry for key '%-.192s'", + ErrIdentCausesTooLongPath: "Long database name and identifier for object resulted in path length exceeding %d characters. Path: '%s'.", + ErrAlterOperationNotSupportedReasonNotNull: "cannot silently convert NULL values, as required in this SQLMODE", + ErrMustChangePasswordLogin: "Your password has expired. To log in you must change it using a client that supports expired passwords.", + ErrRowInWrongPartition: "Found a row in wrong partition %s", + ErrBadGeneratedColumn: "The value specified for generated column '%s' in table '%s' is not allowed.", + ErrUnsupportedOnGeneratedColumn: "'%s' is not supported for generated columns.", + ErrGeneratedColumnNonPrior: "Generated column can refer only to generated columns defined prior to it.", + ErrDependentByGeneratedColumn: "Column '%s' has a generated column dependency.", + ErrGeneratedColumnFunctionIsNotAllowed: "Expression of generated column '%s' contains a disallowed function.", + ErrGeneratedColumnRefAutoInc: "Generated column '%s' cannot refer to auto-increment column.", + ErrInvalidFieldSize: "Invalid size for column '%s'.", + ErrInvalidJSONData: "Invalid JSON data provided to function %s: %s", + ErrInvalidJSONText: "Invalid JSON text: %-.192s", + ErrInvalidJSONPath: "Invalid JSON path expression %s.", + ErrInvalidTypeForJSON: "Invalid data type for JSON data in argument %d to function %s; a JSON string or JSON type is required.", + ErrInvalidJSONPathWildcard: "In this situation, path expressions may not contain the * and ** tokens.", + ErrInvalidJSONContainsPathType: "The second argument can only be either 'one' or 'all'.", + ErrJSONUsedAsKey: "JSON column '%-.192s' cannot be used in key specification.", + ErrInvalidJSONPathArrayCell: "A path expression is not a path to a cell in an array.", + ErrInvalidEncryptionOption: "Invalid encryption option.", + ErrWindowNoSuchWindow: "Window name '%s' is not defined.", + ErrWindowCircularityInWindowGraph: "There is a circularity in the window dependency graph.", + ErrWindowNoChildPartitioning: "A window which depends on another cannot define partitioning.", + ErrWindowNoInherentFrame: "Window '%s' has a frame definition, so cannot be referenced by another window.", + ErrWindowNoRedefineOrderBy: "Window '%s' cannot inherit '%s' since both contain an ORDER BY clause.", + ErrWindowFrameStartIllegal: "Window '%s': frame start cannot be UNBOUNDED FOLLOWING.", + ErrWindowFrameEndIllegal: "Window '%s': frame end cannot be UNBOUNDED PRECEDING.", + ErrWindowFrameIllegal: "Window '%s': frame start or end is negative, NULL or of non-integral type", + ErrWindowRangeFrameOrderType: "Window '%s' with RANGE N PRECEDING/FOLLOWING frame requires exactly one ORDER BY expression, of numeric or temporal type", + ErrWindowRangeFrameTemporalType: "Window '%s' with RANGE frame has ORDER BY expression of datetime type. Only INTERVAL bound value allowed.", + ErrWindowRangeFrameNumericType: "Window '%s' with RANGE frame has ORDER BY expression of numeric type, INTERVAL bound value not allowed.", + ErrWindowRangeBoundNotConstant: "Window '%s' has a non-constant frame bound.", + ErrWindowDuplicateName: "Window '%s' is defined twice.", + ErrWindowIllegalOrderBy: "Window '%s': ORDER BY or PARTITION BY uses legacy position indication which is not supported, use expression.", + ErrWindowInvalidWindowFuncUse: "You cannot use the window function '%s' in this context.'", + ErrWindowInvalidWindowFuncAliasUse: "You cannot use the alias '%s' of an expression containing a window function in this context.'", + ErrWindowNestedWindowFuncUseInWindowSpec: "You cannot nest a window function in the specification of window '%s'.", + ErrWindowRowsIntervalUse: "Window '%s': INTERVAL can only be used with RANGE frames.", + ErrWindowNoGroupOrderUnused: "ASC or DESC with GROUP BY isn't allowed with window functions; put ASC or DESC in ORDER BY", + ErrWindowExplainJson: "To get information about window functions use EXPLAIN FORMAT=JSON", + ErrWindowFunctionIgnoresFrame: "Window function '%s' ignores the frame clause of window '%s' and aggregates over the whole partition", + ErrRoleNotGranted: "%s is is not granted to %s", + ErrMaxExecTimeExceeded: "Query execution was interrupted, max_execution_time exceeded.", + + // MariaDB errors. + ErrOnlyOneDefaultPartionAllowed: "Only one DEFAULT partition allowed", + ErrWrongPartitionTypeExpectedSystemTime: "Wrong partitioning type, expected type: `SYSTEM_TIME`", + ErrSystemVersioningWrongPartitions: "Wrong Partitions: must have at least one HISTORY and exactly one last CURRENT", + + // TiDB errors. + ErrMemExceedThreshold: "%s holds %dB memory, exceeds threshold %dB.%s", + ErrForUpdateCantRetry: "[%d] can not retry select for update statement", + ErrAdminCheckTable: "TiDB admin check table failed.", + ErrTxnTooLarge: "Transaction is too large", + ErrWriteConflictInTiDB: "Write conflict, txnStartTS %d is stale", + ErrInvalidPluginID: "Wrong plugin id: %s, valid plugin id is [name]-[version], both name and version should not contain '-'", + ErrInvalidPluginManifest: "Cannot read plugin %s's manifest", + ErrInvalidPluginName: "Plugin load with %s but got wrong name %s", + ErrInvalidPluginVersion: "Plugin load with %s but got %s", + ErrDuplicatePlugin: "Plugin [%s] is redeclared", + ErrInvalidPluginSysVarName: "Plugin %s's sysVar %s must start with its plugin name %s", + ErrRequireVersionCheckFail: "Plugin %s require %s be %v but got %v", + ErrUnsupportedReloadPlugin: "Plugin %s isn't loaded so cannot be reloaded", + ErrUnsupportedReloadPluginVar: "Reload plugin with different sysVar is unsupported %v", + ErrTableLocked: "Table '%s' was locked in %s by %v", + + // TiKV/PD errors. + ErrPDServerTimeout: "PD server timeout", + ErrTiKVServerTimeout: "TiKV server timeout", + ErrTiKVServerBusy: "TiKV server is busy", + ErrResolveLockTimeout: "Resolve lock timeout", + ErrRegionUnavailable: "Region is unavailable", + ErrGCTooEarly: "GC life time is shorter than transaction duration, transaction starts at %v, GC safe point is %v", + ErrWriteConflict: "Write conflict, txnStartTS=%d, conflictStartTS=%d, conflictCommitTS=%d, key=%s", +} diff --git a/vendor/github.com/pingcap/parser/mysql/error.go b/vendor/github.com/pingcap/parser/mysql/error.go new file mode 100644 index 0000000..fd6316c --- /dev/null +++ b/vendor/github.com/pingcap/parser/mysql/error.go @@ -0,0 +1,71 @@ +// Copyright 2015 PingCAP, Inc. +// +// 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package mysql + +import ( + "errors" + "fmt" +) + +// Portable analogs of some common call errors. +var ( + ErrBadConn = errors.New("connection was bad") + ErrMalformPacket = errors.New("malform packet error") +) + +// SQLError records an error information, from executing SQL. +type SQLError struct { + Code uint16 + Message string + State string +} + +// Error prints errors, with a formatted string. +func (e *SQLError) Error() string { + return fmt.Sprintf("ERROR %d (%s): %s", e.Code, e.State, e.Message) +} + +// NewErr generates a SQL error, with an error code and default format specifier defined in MySQLErrName. +func NewErr(errCode uint16, args ...interface{}) *SQLError { + e := &SQLError{Code: errCode} + + if s, ok := MySQLState[errCode]; ok { + e.State = s + } else { + e.State = DefaultMySQLState + } + + if format, ok := MySQLErrName[errCode]; ok { + e.Message = fmt.Sprintf(format, args...) + } else { + e.Message = fmt.Sprint(args...) + } + + return e +} + +// NewErrf creates a SQL error, with an error code and a format specifier. +func NewErrf(errCode uint16, format string, args ...interface{}) *SQLError { + e := &SQLError{Code: errCode} + + if s, ok := MySQLState[errCode]; ok { + e.State = s + } else { + e.State = DefaultMySQLState + } + + e.Message = fmt.Sprintf(format, args...) + + return e +} diff --git a/vendor/github.com/pingcap/parser/mysql/locale_format.go b/vendor/github.com/pingcap/parser/mysql/locale_format.go new file mode 100644 index 0000000..b483f94 --- /dev/null +++ b/vendor/github.com/pingcap/parser/mysql/locale_format.go @@ -0,0 +1,98 @@ +package mysql + +import ( + "bytes" + "strconv" + "strings" + "unicode" + + "github.com/pingcap/errors" +) + +func formatENUS(number string, precision string) (string, error) { + var buffer bytes.Buffer + if unicode.IsDigit(rune(precision[0])) { + for i, v := range precision { + if unicode.IsDigit(v) { + continue + } + precision = precision[:i] + break + } + } else { + precision = "0" + } + if number[0] == '-' && number[1] == '.' { + number = strings.Replace(number, "-", "-0", 1) + } else if number[0] == '.' { + number = strings.Replace(number, ".", "0.", 1) + } + + if (number[:1] == "-" && !unicode.IsDigit(rune(number[1]))) || + (!unicode.IsDigit(rune(number[0])) && number[:1] != "-") { + buffer.Write([]byte{'0'}) + position, err := strconv.ParseUint(precision, 10, 64) + if err == nil && position > 0 { + buffer.Write([]byte{'.'}) + buffer.WriteString(strings.Repeat("0", int(position))) + } + return buffer.String(), nil + } else if number[:1] == "-" { + buffer.Write([]byte{'-'}) + number = number[1:] + } + + for i, v := range number { + if unicode.IsDigit(v) { + continue + } else if i == 1 && number[1] == '.' { + continue + } else if v == '.' && number[1] != '.' { + continue + } else { + number = number[:i] + break + } + } + + comma := []byte{','} + parts := strings.Split(number, ".") + pos := 0 + if len(parts[0])%3 != 0 { + pos += len(parts[0]) % 3 + buffer.WriteString(parts[0][:pos]) + buffer.Write(comma) + } + for ; pos < len(parts[0]); pos += 3 { + buffer.WriteString(parts[0][pos : pos+3]) + buffer.Write(comma) + } + buffer.Truncate(buffer.Len() - 1) + + position, err := strconv.ParseUint(precision, 10, 64) + if err == nil { + if position > 0 { + buffer.Write([]byte{'.'}) + if len(parts) == 2 { + if uint64(len(parts[1])) >= position { + buffer.WriteString(parts[1][:position]) + } else { + buffer.WriteString(parts[1]) + buffer.WriteString(strings.Repeat("0", int(position)-len(parts[1]))) + } + } else { + buffer.WriteString(strings.Repeat("0", int(position))) + } + } + } + + return buffer.String(), nil +} + +func formatZHCN(number string, precision string) (string, error) { + return "", errors.New("not implemented") +} + +func formatNotSupport(number string, precision string) (string, error) { + return "", errors.New("not support for the specific locale") +} diff --git a/vendor/github.com/pingcap/parser/mysql/state.go b/vendor/github.com/pingcap/parser/mysql/state.go new file mode 100644 index 0000000..b3e8252 --- /dev/null +++ b/vendor/github.com/pingcap/parser/mysql/state.go @@ -0,0 +1,259 @@ +// Copyright 2015 PingCAP, Inc. +// +// 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package mysql + +const ( + // DefaultMySQLState is default state of the mySQL + DefaultMySQLState = "HY000" +) + +// MySQLState maps error code to MySQL SQLSTATE value. +// The values are taken from ANSI SQL and ODBC and are more standardized. +var MySQLState = map[uint16]string{ + ErrDupKey: "23000", + ErrOutofMemory: "HY001", + ErrOutOfSortMemory: "HY001", + ErrConCount: "08004", + ErrBadHost: "08S01", + ErrHandshake: "08S01", + ErrDBaccessDenied: "42000", + ErrAccessDenied: "28000", + ErrNoDB: "3D000", + ErrUnknownCom: "08S01", + ErrBadNull: "23000", + ErrBadDB: "42000", + ErrTableExists: "42S01", + ErrBadTable: "42S02", + ErrNonUniq: "23000", + ErrServerShutdown: "08S01", + ErrBadField: "42S22", + ErrFieldNotInGroupBy: "42000", + ErrWrongSumSelect: "42000", + ErrWrongGroupField: "42000", + ErrWrongValueCount: "21S01", + ErrTooLongIdent: "42000", + ErrDupFieldName: "42S21", + ErrDupKeyName: "42000", + ErrDupEntry: "23000", + ErrWrongFieldSpec: "42000", + ErrParse: "42000", + ErrEmptyQuery: "42000", + ErrNonuniqTable: "42000", + ErrInvalidDefault: "42000", + ErrMultiplePriKey: "42000", + ErrTooManyKeys: "42000", + ErrTooManyKeyParts: "42000", + ErrTooLongKey: "42000", + ErrKeyColumnDoesNotExits: "42000", + ErrBlobUsedAsKey: "42000", + ErrTooBigFieldlength: "42000", + ErrWrongAutoKey: "42000", + ErrForcingClose: "08S01", + ErrIpsock: "08S01", + ErrNoSuchIndex: "42S12", + ErrWrongFieldTerminators: "42000", + ErrBlobsAndNoTerminated: "42000", + ErrCantRemoveAllFields: "42000", + ErrCantDropFieldOrKey: "42000", + ErrBlobCantHaveDefault: "42000", + ErrWrongDBName: "42000", + ErrWrongTableName: "42000", + ErrTooBigSelect: "42000", + ErrUnknownProcedure: "42000", + ErrWrongParamcountToProcedure: "42000", + ErrUnknownTable: "42S02", + ErrFieldSpecifiedTwice: "42000", + ErrUnsupportedExtension: "42000", + ErrTableMustHaveColumns: "42000", + ErrUnknownCharacterSet: "42000", + ErrTooBigRowsize: "42000", + ErrWrongOuterJoin: "42000", + ErrNullColumnInIndex: "42000", + ErrPasswordAnonymousUser: "42000", + ErrPasswordNotAllowed: "42000", + ErrPasswordNoMatch: "42000", + ErrWrongValueCountOnRow: "21S01", + ErrInvalidUseOfNull: "22004", + ErrRegexp: "42000", + ErrMixOfGroupFuncAndFields: "42000", + ErrNonexistingGrant: "42000", + ErrTableaccessDenied: "42000", + ErrColumnaccessDenied: "42000", + ErrIllegalGrantForTable: "42000", + ErrGrantWrongHostOrUser: "42000", + ErrNoSuchTable: "42S02", + ErrNonexistingTableGrant: "42000", + ErrNotAllowedCommand: "42000", + ErrSyntax: "42000", + ErrAbortingConnection: "08S01", + ErrNetPacketTooLarge: "08S01", + ErrNetReadErrorFromPipe: "08S01", + ErrNetFcntl: "08S01", + ErrNetPacketsOutOfOrder: "08S01", + ErrNetUncompress: "08S01", + ErrNetRead: "08S01", + ErrNetReadInterrupted: "08S01", + ErrNetErrorOnWrite: "08S01", + ErrNetWriteInterrupted: "08S01", + ErrTooLongString: "42000", + ErrTableCantHandleBlob: "42000", + ErrTableCantHandleAutoIncrement: "42000", + ErrWrongColumnName: "42000", + ErrWrongKeyColumn: "42000", + ErrDupUnique: "23000", + ErrBlobKeyWithoutLength: "42000", + ErrPrimaryCantHaveNull: "42000", + ErrTooManyRows: "42000", + ErrRequiresPrimaryKey: "42000", + ErrKeyDoesNotExist: "42000", + ErrCheckNoSuchTable: "42000", + ErrCheckNotImplemented: "42000", + ErrCantDoThisDuringAnTransaction: "25000", + ErrNewAbortingConnection: "08S01", + ErrMasterNetRead: "08S01", + ErrMasterNetWrite: "08S01", + ErrTooManyUserConnections: "42000", + ErrReadOnlyTransaction: "25000", + ErrNoPermissionToCreateUser: "42000", + ErrLockDeadlock: "40001", + ErrNoReferencedRow: "23000", + ErrRowIsReferenced: "23000", + ErrConnectToMaster: "08S01", + ErrWrongNumberOfColumnsInSelect: "21000", + ErrUserLimitReached: "42000", + ErrSpecificAccessDenied: "42000", + ErrNoDefault: "42000", + ErrWrongValueForVar: "42000", + ErrWrongTypeForVar: "42000", + ErrCantUseOptionHere: "42000", + ErrNotSupportedYet: "42000", + ErrWrongFkDef: "42000", + ErrOperandColumns: "21000", + ErrSubqueryNo1Row: "21000", + ErrIllegalReference: "42S22", + ErrDerivedMustHaveAlias: "42000", + ErrSelectReduced: "01000", + ErrTablenameNotAllowedHere: "42000", + ErrNotSupportedAuthMode: "08004", + ErrSpatialCantHaveNull: "42000", + ErrCollationCharsetMismatch: "42000", + ErrWarnTooFewRecords: "01000", + ErrWarnTooManyRecords: "01000", + ErrWarnNullToNotnull: "22004", + ErrWarnDataOutOfRange: "22003", + WarnDataTruncated: "01000", + ErrWrongNameForIndex: "42000", + ErrWrongNameForCatalog: "42000", + ErrUnknownStorageEngine: "42000", + ErrTruncatedWrongValue: "22007", + ErrSpNoRecursiveCreate: "2F003", + ErrSpAlreadyExists: "42000", + ErrSpDoesNotExist: "42000", + ErrSpLilabelMismatch: "42000", + ErrSpLabelRedefine: "42000", + ErrSpLabelMismatch: "42000", + ErrSpUninitVar: "01000", + ErrSpBadselect: "0A000", + ErrSpBadreturn: "42000", + ErrSpBadstatement: "0A000", + ErrUpdateLogDeprecatedIgnored: "42000", + ErrUpdateLogDeprecatedTranslated: "42000", + ErrQueryInterrupted: "70100", + ErrSpWrongNoOfArgs: "42000", + ErrSpCondMismatch: "42000", + ErrSpNoreturn: "42000", + ErrSpNoreturnend: "2F005", + ErrSpBadCursorQuery: "42000", + ErrSpBadCursorSelect: "42000", + ErrSpCursorMismatch: "42000", + ErrSpCursorAlreadyOpen: "24000", + ErrSpCursorNotOpen: "24000", + ErrSpUndeclaredVar: "42000", + ErrSpFetchNoData: "02000", + ErrSpDupParam: "42000", + ErrSpDupVar: "42000", + ErrSpDupCond: "42000", + ErrSpDupCurs: "42000", + ErrSpSubselectNyi: "0A000", + ErrStmtNotAllowedInSfOrTrg: "0A000", + ErrSpVarcondAfterCurshndlr: "42000", + ErrSpCursorAfterHandler: "42000", + ErrSpCaseNotFound: "20000", + ErrDivisionByZero: "22012", + ErrIllegalValueForType: "22007", + ErrProcaccessDenied: "42000", + ErrXaerNota: "XAE04", + ErrXaerInval: "XAE05", + ErrXaerRmfail: "XAE07", + ErrXaerOutside: "XAE09", + ErrXaerRmerr: "XAE03", + ErrXaRbrollback: "XA100", + ErrNonexistingProcGrant: "42000", + ErrDataTooLong: "22001", + ErrSpBadSQLstate: "42000", + ErrCantCreateUserWithGrant: "42000", + ErrSpDupHandler: "42000", + ErrSpNotVarArg: "42000", + ErrSpNoRetset: "0A000", + ErrCantCreateGeometryObject: "22003", + ErrTooBigScale: "42000", + ErrTooBigPrecision: "42000", + ErrMBiggerThanD: "42000", + ErrTooLongBody: "42000", + ErrTooBigDisplaywidth: "42000", + ErrXaerDupid: "XAE08", + ErrDatetimeFunctionOverflow: "22008", + ErrRowIsReferenced2: "23000", + ErrNoReferencedRow2: "23000", + ErrSpBadVarShadow: "42000", + ErrSpWrongName: "42000", + ErrSpNoAggregate: "42000", + ErrMaxPreparedStmtCountReached: "42000", + ErrNonGroupingFieldUsed: "42000", + ErrForeignDuplicateKeyOldUnused: "23000", + ErrCantChangeTxCharacteristics: "25001", + ErrWrongParamcountToNativeFct: "42000", + ErrWrongParametersToNativeFct: "42000", + ErrWrongParametersToStoredFct: "42000", + ErrDupEntryWithKeyName: "23000", + ErrXaRbtimeout: "XA106", + ErrXaRbdeadlock: "XA102", + ErrFuncInexistentNameCollision: "42000", + ErrDupSignalSet: "42000", + ErrSignalWarn: "01000", + ErrSignalNotFound: "02000", + ErrSignalException: "HY000", + ErrResignalWithoutActiveHandler: "0K000", + ErrSpatialMustHaveGeomCol: "42000", + ErrDataOutOfRange: "22003", + ErrAccessDeniedNoPassword: "28000", + ErrTruncateIllegalFk: "42000", + ErrDaInvalidConditionNumber: "35000", + ErrForeignDuplicateKeyWithChildInfo: "23000", + ErrForeignDuplicateKeyWithoutChildInfo: "23000", + ErrCantExecuteInReadOnlyTransaction: "25006", + ErrAlterOperationNotSupported: "0A000", + ErrAlterOperationNotSupportedReason: "0A000", + ErrDupUnknownInIndex: "23000", + ErrBadGeneratedColumn: "HY000", + ErrUnsupportedOnGeneratedColumn: "HY000", + ErrGeneratedColumnNonPrior: "HY000", + ErrDependentByGeneratedColumn: "HY000", + ErrInvalidJSONText: "22032", + ErrInvalidJSONPath: "42000", + ErrInvalidJSONData: "22032", + ErrInvalidJSONPathWildcard: "42000", + ErrJSONUsedAsKey: "42000", + ErrInvalidJSONPathArrayCell: "42000", +} diff --git a/vendor/github.com/pingcap/parser/mysql/type.go b/vendor/github.com/pingcap/parser/mysql/type.go new file mode 100644 index 0000000..9ea32f9 --- /dev/null +++ b/vendor/github.com/pingcap/parser/mysql/type.go @@ -0,0 +1,155 @@ +// Copyright 2015 PingCAP, Inc. +// +// 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package mysql + +// MySQL type information. +const ( + TypeDecimal byte = 0 + TypeTiny byte = 1 + TypeShort byte = 2 + TypeLong byte = 3 + TypeFloat byte = 4 + TypeDouble byte = 5 + TypeNull byte = 6 + TypeTimestamp byte = 7 + TypeLonglong byte = 8 + TypeInt24 byte = 9 + TypeDate byte = 10 + /* TypeDuration original name was TypeTime, renamed to TypeDuration to resolve the conflict with Go type Time.*/ + TypeDuration byte = 11 + TypeDatetime byte = 12 + TypeYear byte = 13 + TypeNewDate byte = 14 + TypeVarchar byte = 15 + TypeBit byte = 16 + + TypeJSON byte = 0xf5 + TypeNewDecimal byte = 0xf6 + TypeEnum byte = 0xf7 + TypeSet byte = 0xf8 + TypeTinyBlob byte = 0xf9 + TypeMediumBlob byte = 0xfa + TypeLongBlob byte = 0xfb + TypeBlob byte = 0xfc + TypeVarString byte = 0xfd + TypeString byte = 0xfe + TypeGeometry byte = 0xff +) + +// TypeUnspecified is an uninitialized type. TypeDecimal is not used in MySQL. +const TypeUnspecified = TypeDecimal + +// Flag information. +const ( + NotNullFlag uint = 1 << 0 /* Field can't be NULL */ + PriKeyFlag uint = 1 << 1 /* Field is part of a primary key */ + UniqueKeyFlag uint = 1 << 2 /* Field is part of a unique key */ + MultipleKeyFlag uint = 1 << 3 /* Field is part of a key */ + BlobFlag uint = 1 << 4 /* Field is a blob */ + UnsignedFlag uint = 1 << 5 /* Field is unsigned */ + ZerofillFlag uint = 1 << 6 /* Field is zerofill */ + BinaryFlag uint = 1 << 7 /* Field is binary */ + EnumFlag uint = 1 << 8 /* Field is an enum */ + AutoIncrementFlag uint = 1 << 9 /* Field is an auto increment field */ + TimestampFlag uint = 1 << 10 /* Field is a timestamp */ + SetFlag uint = 1 << 11 /* Field is a set */ + NoDefaultValueFlag uint = 1 << 12 /* Field doesn't have a default value */ + OnUpdateNowFlag uint = 1 << 13 /* Field is set to NOW on UPDATE */ + PartKeyFlag uint = 1 << 14 /* Intern: Part of some keys */ + NumFlag uint = 1 << 15 /* Field is a num (for clients) */ + + GroupFlag uint = 1 << 15 /* Internal: Group field */ + UniqueFlag uint = 1 << 16 /* Internal: Used by sql_yacc */ + BinCmpFlag uint = 1 << 17 /* Internal: Used by sql_yacc */ + ParseToJSONFlag uint = 1 << 18 /* Internal: Used when we want to parse string to JSON in CAST */ + IsBooleanFlag uint = 1 << 19 /* Internal: Used for telling boolean literal from integer */ + PreventNullInsertFlag uint = 1 << 20 /* Prevent this Field from inserting NULL values */ +) + +// TypeInt24 bounds. +const ( + MaxUint24 = 1<<24 - 1 + MaxInt24 = 1<<23 - 1 + MinInt24 = -1 << 23 +) + +// HasNotNullFlag checks if NotNullFlag is set. +func HasNotNullFlag(flag uint) bool { + return (flag & NotNullFlag) > 0 +} + +// HasNoDefaultValueFlag checks if NoDefaultValueFlag is set. +func HasNoDefaultValueFlag(flag uint) bool { + return (flag & NoDefaultValueFlag) > 0 +} + +// HasAutoIncrementFlag checks if AutoIncrementFlag is set. +func HasAutoIncrementFlag(flag uint) bool { + return (flag & AutoIncrementFlag) > 0 +} + +// HasUnsignedFlag checks if UnsignedFlag is set. +func HasUnsignedFlag(flag uint) bool { + return (flag & UnsignedFlag) > 0 +} + +// HasZerofillFlag checks if ZerofillFlag is set. +func HasZerofillFlag(flag uint) bool { + return (flag & ZerofillFlag) > 0 +} + +// HasBinaryFlag checks if BinaryFlag is set. +func HasBinaryFlag(flag uint) bool { + return (flag & BinaryFlag) > 0 +} + +// HasPriKeyFlag checks if PriKeyFlag is set. +func HasPriKeyFlag(flag uint) bool { + return (flag & PriKeyFlag) > 0 +} + +// HasUniKeyFlag checks if UniqueKeyFlag is set. +func HasUniKeyFlag(flag uint) bool { + return (flag & UniqueKeyFlag) > 0 +} + +// HasMultipleKeyFlag checks if MultipleKeyFlag is set. +func HasMultipleKeyFlag(flag uint) bool { + return (flag & MultipleKeyFlag) > 0 +} + +// HasTimestampFlag checks if HasTimestampFlag is set. +func HasTimestampFlag(flag uint) bool { + return (flag & TimestampFlag) > 0 +} + +// HasOnUpdateNowFlag checks if OnUpdateNowFlag is set. +func HasOnUpdateNowFlag(flag uint) bool { + return (flag & OnUpdateNowFlag) > 0 +} + +// HasParseToJSONFlag checks if ParseToJSONFlag is set. +func HasParseToJSONFlag(flag uint) bool { + return (flag & ParseToJSONFlag) > 0 +} + +// HasIsBooleanFlag checks if IsBooleanFlag is set. +func HasIsBooleanFlag(flag uint) bool { + return (flag & IsBooleanFlag) > 0 +} + +// HasPreventNullInsertFlag checks if PreventNullInsertFlag is set. +func HasPreventNullInsertFlag(flag uint) bool { + return (flag & PreventNullInsertFlag) > 0 +} diff --git a/vendor/github.com/pingcap/parser/mysql/util.go b/vendor/github.com/pingcap/parser/mysql/util.go new file mode 100644 index 0000000..859519e --- /dev/null +++ b/vendor/github.com/pingcap/parser/mysql/util.go @@ -0,0 +1,95 @@ +// Copyright 2015 PingCAP, Inc. +// +// 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package mysql + +type lengthAndDecimal struct { + length int + decimal int +} + +// defaultLengthAndDecimal provides default Flen and Decimal for fields +// from CREATE TABLE when they are unspecified. +var defaultLengthAndDecimal = map[byte]lengthAndDecimal{ + TypeBit: {1, 0}, + TypeTiny: {4, 0}, + TypeShort: {6, 0}, + TypeInt24: {9, 0}, + TypeLong: {11, 0}, + TypeLonglong: {20, 0}, + TypeDouble: {22, -1}, + TypeFloat: {12, -1}, + TypeNewDecimal: {11, 0}, + TypeDuration: {10, 0}, + TypeDate: {10, 0}, + TypeTimestamp: {19, 0}, + TypeDatetime: {19, 0}, + TypeYear: {4, 0}, + TypeString: {1, 0}, + TypeVarchar: {5, 0}, + TypeVarString: {5, 0}, + TypeTinyBlob: {255, 0}, + TypeBlob: {65535, 0}, + TypeMediumBlob: {16777215, 0}, + TypeLongBlob: {4294967295, 0}, + TypeJSON: {4294967295, 0}, + TypeNull: {0, 0}, + TypeSet: {-1, 0}, + TypeEnum: {-1, 0}, +} + +// IsIntegerType indicate whether tp is an integer type. +func IsIntegerType(tp byte) bool { + switch tp { + case TypeTiny, TypeShort, TypeInt24, TypeLong, TypeLonglong: + return true + } + return false +} + +// GetDefaultFieldLengthAndDecimal returns the default display length (flen) and decimal length for column. +// Call this when no Flen assigned in ddl. +// or column value is calculated from an expression. +// For example: "select count(*) from t;", the column type is int64 and Flen in ResultField will be 21. +// See https://dev.mysql.com/doc/refman/5.7/en/storage-requirements.html +func GetDefaultFieldLengthAndDecimal(tp byte) (flen int, decimal int) { + val, ok := defaultLengthAndDecimal[tp] + if ok { + return val.length, val.decimal + } + return -1, -1 +} + +// defaultLengthAndDecimal provides default Flen and Decimal for fields +// from CAST when they are unspecified. +var defaultLengthAndDecimalForCast = map[byte]lengthAndDecimal{ + TypeString: {0, -1}, // Flen & Decimal differs. + TypeDate: {10, 0}, + TypeDatetime: {19, 0}, + TypeNewDecimal: {11, 0}, + TypeDuration: {10, 0}, + TypeLonglong: {22, 0}, + TypeDouble: {22, -1}, + TypeFloat: {12, -1}, + TypeJSON: {4194304, 0}, // Flen differs. +} + +// GetDefaultFieldLengthAndDecimalForCast returns the default display length (flen) and decimal length for casted column +// when flen or decimal is not specified. +func GetDefaultFieldLengthAndDecimalForCast(tp byte) (flen int, decimal int) { + val, ok := defaultLengthAndDecimalForCast[tp] + if ok { + return val.length, val.decimal + } + return -1, -1 +} diff --git a/vendor/github.com/pingcap/parser/opcode/opcode.go b/vendor/github.com/pingcap/parser/opcode/opcode.go new file mode 100644 index 0000000..4c17728 --- /dev/null +++ b/vendor/github.com/pingcap/parser/opcode/opcode.go @@ -0,0 +1,150 @@ +// Copyright 2015 PingCAP, Inc. +// +// 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package opcode + +import ( + "fmt" + "io" + + "github.com/pingcap/errors" + . "github.com/pingcap/parser/format" +) + +// Op is opcode type. +type Op int + +// List operators. +const ( + LogicAnd Op = iota + 1 + LeftShift + RightShift + LogicOr + GE + LE + EQ + NE + LT + GT + Plus + Minus + And + Or + Mod + Xor + Div + Mul + Not + BitNeg + IntDiv + LogicXor + NullEQ + In + Like + Case + Regexp + IsNull + IsTruth + IsFalsity +) + +// Ops maps opcode to string. +var Ops = map[Op]string{ + LogicAnd: "and", + LogicOr: "or", + LogicXor: "xor", + LeftShift: "leftshift", + RightShift: "rightshift", + GE: "ge", + LE: "le", + EQ: "eq", + NE: "ne", + LT: "lt", + GT: "gt", + Plus: "plus", + Minus: "minus", + And: "bitand", + Or: "bitor", + Mod: "mod", + Xor: "bitxor", + Div: "div", + Mul: "mul", + Not: "not", + BitNeg: "bitneg", + IntDiv: "intdiv", + NullEQ: "nulleq", + In: "in", + Like: "like", + Case: "case", + Regexp: "regexp", + IsNull: "isnull", + IsTruth: "istrue", + IsFalsity: "isfalse", +} + +// String implements Stringer interface. +func (o Op) String() string { + str, ok := Ops[o] + if !ok { + panic(fmt.Sprintf("%d", o)) + } + + return str +} + +var opsLiteral = map[Op]string{ + LogicAnd: " AND ", + LogicOr: " OR ", + LogicXor: " XOR ", + LeftShift: "<<", + RightShift: ">>", + GE: ">=", + LE: "<=", + EQ: "=", + NE: "!=", + LT: "<", + GT: ">", + Plus: "+", + Minus: "-", + And: "&", + Or: "|", + Mod: "%", + Xor: "^", + Div: "/", + Mul: "*", + Not: "!", + BitNeg: "~", + IntDiv: "DIV", + NullEQ: "<=>", + In: "IN", + Like: "LIKE", + Case: "CASE", + Regexp: "REGEXP", + IsNull: "IS NULL", + IsTruth: "IS TRUE", + IsFalsity: "IS FALSE", +} + +// Format the ExprNode into a Writer. +func (o Op) Format(w io.Writer) { + fmt.Fprintf(w, "%s", opsLiteral[o]) +} + +// Restore the Op into a Writer +func (o Op) Restore(ctx *RestoreCtx) error { + if v, ok := opsLiteral[o]; ok { + ctx.WriteKeyWord(v) + return nil + } + return errors.Errorf("Invalid opcode type %d during restoring AST to SQL text", o) +} diff --git a/vendor/github.com/pingcap/parser/parser.go b/vendor/github.com/pingcap/parser/parser.go new file mode 100644 index 0000000..be18297 --- /dev/null +++ b/vendor/github.com/pingcap/parser/parser.go @@ -0,0 +1,16615 @@ +// Code generated by goyacc DO NOT EDIT. +// CAUTION: Generated file - DO NOT EDIT. + +// Copyright 2013 The ql Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSES/QL-LICENSE file. + +// Copyright 2015 PingCAP, Inc. +// +// 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +// Initial yacc source generated by ebnf2y[1] +// at 2013-10-04 23:10:47.861401015 +0200 CEST +// +// $ ebnf2y -o ql.y -oe ql.ebnf -start StatementList -pkg ql -p _ +// +// [1]: http://github.com/cznic/ebnf2y + +package parser + +import __yyfmt__ "fmt" + +import ( + "strings" + + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/auth" + "github.com/pingcap/parser/charset" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/opcode" + "github.com/pingcap/parser/types" +) + +type yySymType struct { + yys int + offset int // offset + item interface{} + ident string + expr ast.ExprNode + statement ast.StmtNode +} + +type yyXError struct { + state, xsym int +} + +const ( + yyDefault = 57961 + yyEOFCode = 57344 + account = 57569 + action = 57570 + add = 57359 + addDate = 57803 + admin = 57850 + after = 57571 + algorithm = 57573 + all = 57360 + alter = 57361 + always = 57572 + analyze = 57362 + and = 57363 + andand = 57354 + andnot = 57926 + any = 57574 + as = 57364 + asc = 57365 + ascii = 57575 + assignmentEq = 57927 + autoIncrement = 57576 + avg = 57578 + avgRowLength = 57577 + begin = 57579 + between = 57366 + bigIntType = 57367 + binaryType = 57368 + binding = 57794 + bindings = 57795 + binlog = 57580 + bitAnd = 57804 + bitLit = 57925 + bitOr = 57805 + bitType = 57581 + bitXor = 57806 + blobType = 57369 + block = 57582 + boolType = 57584 + booleanType = 57583 + both = 57370 + btree = 57585 + buckets = 57851 + builtinAddDate = 57895 + builtinBitAnd = 57896 + builtinBitOr = 57897 + builtinBitXor = 57898 + builtinCast = 57899 + builtinCount = 57900 + builtinCurDate = 57901 + builtinCurTime = 57902 + builtinDateAdd = 57903 + builtinDateSub = 57904 + builtinExtract = 57905 + builtinGroupConcat = 57906 + builtinMax = 57907 + builtinMin = 57908 + builtinNow = 57909 + builtinPosition = 57910 + builtinStddevPop = 57915 + builtinStddevSamp = 57916 + builtinSubDate = 57911 + builtinSubstring = 57912 + builtinSum = 57913 + builtinSysDate = 57914 + builtinTrim = 57917 + builtinUser = 57918 + builtinVarPop = 57919 + builtinVarSamp = 57920 + by = 57371 + byteType = 57586 + cancel = 57852 + cascade = 57372 + cascaded = 57587 + caseKwd = 57373 + cast = 57807 + change = 57374 + charType = 57376 + character = 57375 + charsetKwd = 57588 + check = 57377 + checksum = 57589 + cipher = 57590 + cleanup = 57591 + client = 57592 + cmSketch = 57853 + coalesce = 57593 + collate = 57378 + collation = 57594 + column = 57379 + columnFormat = 57595 + columns = 57596 + comment = 57597 + commit = 57598 + committed = 57599 + compact = 57600 + compressed = 57601 + compression = 57602 + connection = 57603 + consistent = 57604 + constraint = 57380 + context = 57605 + convert = 57381 + copyKwd = 57808 + count = 57809 + cpu = 57606 + create = 57382 + createTableSelect = 57947 + cross = 57383 + cumeDist = 57384 + curTime = 57810 + current = 57607 + currentDate = 57385 + currentRole = 57389 + currentTime = 57386 + currentTs = 57387 + currentUser = 57388 + data = 57609 + database = 57390 + databases = 57391 + dateAdd = 57811 + dateSub = 57812 + dateType = 57610 + datetimeType = 57611 + day = 57608 + dayHour = 57392 + dayMicrosecond = 57393 + dayMinute = 57394 + daySecond = 57395 + ddl = 57854 + deallocate = 57612 + decLit = 57922 + decimalType = 57396 + defaultKwd = 57397 + definer = 57613 + delayKeyWrite = 57614 + delayed = 57398 + deleteKwd = 57399 + denseRank = 57400 + depth = 57855 + desc = 57401 + describe = 57402 + directory = 57615 + disable = 57616 + discard = 57617 + disk = 57618 + distinct = 57403 + distinctRow = 57404 + div = 57405 + do = 57619 + doubleAtIdentifier = 57350 + doubleType = 57406 + drainer = 57856 + drop = 57407 + dual = 57408 + duplicate = 57620 + dynamic = 57621 + elseKwd = 57409 + empty = 57940 + enable = 57622 + enclosed = 57410 + encryption = 57623 + end = 57624 + enforced = 57802 + engine = 57625 + engines = 57626 + enum = 57627 + eq = 57928 + yyErrCode = 57345 + escape = 57630 + escaped = 57411 + event = 57628 + events = 57629 + except = 57414 + exchange = 57631 + exclusive = 57632 + execute = 57633 + exists = 57412 + expire = 57634 + explain = 57413 + exprPushdownBlacklist = 57848 + extract = 57813 + falseKwd = 57415 + faultsSym = 57635 + fields = 57636 + first = 57637 + firstValue = 57416 + fixed = 57638 + floatLit = 57921 + floatType = 57417 + flush = 57639 + following = 57640 + forKwd = 57418 + force = 57419 + foreign = 57420 + format = 57641 + from = 57421 + full = 57642 + fulltext = 57422 + function = 57643 + ge = 57929 + generated = 57423 + getFormat = 57814 + global = 57768 + grant = 57424 + grants = 57644 + group = 57425 + groupConcat = 57815 + groups = 57426 + hash = 57645 + having = 57427 + hexLit = 57924 + highPriority = 57428 + higherThanComma = 57960 + hintAggToCop = 57871 + hintBegin = 57352 + hintEnablePlanCache = 57880 + hintEnd = 57353 + hintHASHAGG = 57875 + hintHJ = 57872 + hintINLJ = 57874 + hintMemoryQuota = 57886 + hintNoIndexMerge = 57878 + hintOLAP = 57887 + hintOLTP = 57888 + hintQBName = 57884 + hintQueryType = 57885 + hintReadConsistentReplica = 57882 + hintReadFromStorage = 57883 + hintSMJ = 57873 + hintSTREAMAGG = 57876 + hintTiFlash = 57890 + hintTiKV = 57889 + hintUseIndexMerge = 57877 + hintUsePlanCache = 57881 + hintUseToja = 57879 + history = 57646 + hour = 57647 + hourMicrosecond = 57429 + hourMinute = 57430 + hourSecond = 57431 + identSQLErrors = 57798 + identified = 57648 + identifier = 57346 + ifKwd = 57432 + ignore = 57433 + importKwd = 57649 + in = 57434 + incremental = 57653 + index = 57435 + indexes = 57654 + infile = 57436 + inner = 57437 + inplace = 57817 + insert = 57442 + insertMethod = 57650 + insertValues = 57945 + instant = 57818 + int1Type = 57444 + int2Type = 57445 + int3Type = 57446 + int4Type = 57447 + int8Type = 57448 + intLit = 57923 + intType = 57443 + integerType = 57438 + internal = 57819 + interval = 57439 + into = 57440 + invalid = 57351 + invisible = 57655 + invoker = 57656 + io = 57657 + ipc = 57658 + is = 57441 + isolation = 57651 + issuer = 57652 + job = 57858 + jobs = 57857 + join = 57449 + jsonType = 57659 + jss = 57931 + juss = 57932 + key = 57450 + keyBlockSize = 57660 + keys = 57451 + kill = 57452 + lag = 57453 + last = 57661 + lastValue = 57454 + le = 57930 + lead = 57455 + leading = 57456 + left = 57457 + less = 57662 + level = 57663 + like = 57458 + limit = 57459 + linear = 57461 + lines = 57460 + list = 57664 + load = 57462 + local = 57665 + localTime = 57463 + localTs = 57464 + lock = 57465 + long = 57554 + longblobType = 57466 + longtextType = 57467 + lowPriority = 57468 + lowerThanCharsetKwd = 57948 + lowerThanComma = 57959 + lowerThanCreateTableSelect = 57946 + lowerThanEq = 57955 + lowerThanInsertValues = 57944 + lowerThanIntervalKeyword = 57941 + lowerThanKey = 57949 + lowerThanLocal = 57950 + lowerThanNot = 57957 + lowerThanOn = 57954 + lowerThanRemove = 57951 + lowerThanSetKeyword = 57943 + lowerThanStringLitToken = 57942 + lowerThenOrder = 57952 + lsh = 57933 + master = 57666 + match = 57469 + max = 57821 + maxConnectionsPerHour = 57673 + maxExecutionTime = 57822 + maxQueriesPerHour = 57674 + maxRows = 57672 + maxUpdatesPerHour = 57675 + maxUserConnections = 57676 + maxValue = 57470 + mediumIntType = 57472 + mediumblobType = 57471 + mediumtextType = 57473 + memory = 57677 + merge = 57678 + microsecond = 57667 + min = 57820 + minRows = 57679 + minute = 57668 + minuteMicrosecond = 57474 + minuteSecond = 57475 + mod = 57476 + mode = 57669 + modify = 57670 + month = 57671 + names = 57680 + national = 57681 + natural = 57568 + ncharType = 57682 + neg = 57956 + neq = 57934 + neqSynonym = 57935 + never = 57683 + next_row_id = 57816 + no = 57684 + noWriteToBinLog = 57478 + nodeID = 57859 + nodeState = 57860 + nodegroup = 57685 + none = 57686 + not = 57477 + not2 = 57939 + now = 57823 + nthValue = 57479 + ntile = 57480 + null = 57481 + nulleq = 57936 + nulls = 57687 + numericType = 57482 + nvarcharType = 57483 + odbcDateType = 57356 + odbcTimeType = 57357 + odbcTimestampType = 57358 + offset = 57688 + on = 57484 + only = 57689 + open = 57761 + optRuleBlacklist = 57849 + optimistic = 57861 + optimize = 57485 + option = 57486 + optionally = 57487 + or = 57488 + order = 57489 + outer = 57490 + over = 57491 + packKeys = 57492 + pageSym = 57690 + paramMarker = 57937 + parser = 57494 + partial = 57692 + partition = 57493 + partitioning = 57693 + partitions = 57694 + password = 57691 + percentRank = 57495 + pessimistic = 57862 + pipes = 57355 + pipesAsOr = 57695 + plugins = 57696 + position = 57824 + preSplitRegions = 57500 + preceding = 57697 + precisionType = 57496 + prepare = 57698 + primary = 57497 + privileges = 57699 + procedure = 57498 + process = 57700 + processlist = 57701 + profile = 57702 + profiles = 57703 + pump = 57863 + quarter = 57704 + queries = 57706 + query = 57705 + quick = 57707 + rangeKwd = 57501 + rank = 57502 + read = 57503 + realType = 57504 + rebuild = 57708 + recent = 57825 + recover = 57709 + redundant = 57710 + references = 57505 + regexpKwd = 57506 + regions = 57894 + reload = 57711 + remove = 57712 + rename = 57507 + reorganize = 57713 + repair = 57714 + repeat = 57508 + repeatable = 57715 + replace = 57509 + replication = 57717 + require = 57510 + respect = 57716 + restrict = 57511 + reverse = 57718 + revoke = 57512 + right = 57513 + rlike = 57514 + role = 57719 + rollback = 57720 + routine = 57721 + row = 57515 + rowCount = 57722 + rowFormat = 57723 + rowNumber = 57517 + rows = 57516 + rsh = 57938 + rtree = 57724 + samples = 57864 + second = 57725 + secondMicrosecond = 57518 + secondaryEngine = 57726 + secondaryLoad = 57727 + secondaryUnload = 57728 + security = 57729 + selectKwd = 57519 + separator = 57730 + serial = 57731 + serializable = 57732 + session = 57733 + set = 57520 + shardRowIDBits = 57499 + share = 57734 + shared = 57735 + show = 57521 + signed = 57736 + simple = 57737 + singleAtIdentifier = 57349 + slave = 57738 + slow = 57739 + smallIntType = 57522 + snapshot = 57740 + some = 57767 + source = 57762 + spatial = 57523 + split = 57892 + splitOptionPriv = 57958 + sql = 57524 + sqlBigResult = 57525 + sqlBufferResult = 57741 + sqlCache = 57742 + sqlCalcFoundRows = 57526 + sqlNoCache = 57743 + sqlSmallResult = 57527 + sqlTsiDay = 57744 + sqlTsiHour = 57745 + sqlTsiMinute = 57746 + sqlTsiMonth = 57747 + sqlTsiQuarter = 57748 + sqlTsiSecond = 57749 + sqlTsiWeek = 57750 + sqlTsiYear = 57751 + ssl = 57528 + start = 57752 + starting = 57529 + stats = 57865 + statsAutoRecalc = 57753 + statsBuckets = 57868 + statsHealthy = 57869 + statsHistograms = 57867 + statsMeta = 57866 + statsPersistent = 57754 + statsSamplePages = 57755 + status = 57756 + std = 57826 + stddev = 57827 + stddevPop = 57828 + stddevSamp = 57829 + storage = 57757 + stored = 57532 + straightJoin = 57530 + stringLit = 57348 + subDate = 57830 + subject = 57763 + subpartition = 57764 + subpartitions = 57765 + substring = 57832 + sum = 57831 + super = 57766 + swaps = 57758 + switchesSym = 57759 + systemTime = 57760 + tableChecksum = 57769 + tableKwd = 57531 + tableRefPriority = 57953 + tables = 57770 + tablespace = 57771 + temporary = 57772 + temptable = 57773 + terminated = 57533 + textType = 57774 + than = 57775 + then = 57534 + tidb = 57870 + timeType = 57776 + timestampAdd = 57833 + timestampDiff = 57834 + timestampType = 57777 + tinyIntType = 57536 + tinyblobType = 57535 + tinytextType = 57537 + to = 57538 + tokudbDefault = 57835 + tokudbFast = 57836 + tokudbLzma = 57837 + tokudbQuickLZ = 57838 + tokudbSmall = 57840 + tokudbSnappy = 57839 + tokudbUncompressed = 57841 + tokudbZlib = 57842 + top = 57843 + topn = 57891 + tp = 57783 + trace = 57778 + traditional = 57779 + trailing = 57539 + transaction = 57780 + trigger = 57540 + triggers = 57781 + trim = 57844 + trueKwd = 57541 + truncate = 57782 + unbounded = 57784 + uncommitted = 57785 + undefined = 57788 + underscoreCS = 57347 + union = 57543 + unique = 57542 + unknown = 57786 + unlock = 57544 + unsigned = 57545 + update = 57546 + usage = 57547 + use = 57548 + user = 57787 + using = 57549 + utcDate = 57550 + utcTime = 57552 + utcTimestamp = 57551 + validation = 57789 + value = 57790 + values = 57553 + varPop = 57846 + varSamp = 57847 + varbinaryType = 57557 + varcharType = 57555 + varcharacter = 57556 + variables = 57791 + variance = 57845 + varying = 57558 + view = 57792 + virtual = 57559 + visible = 57793 + warnings = 57796 + week = 57799 + when = 57560 + where = 57561 + width = 57893 + window = 57563 + with = 57564 + without = 57797 + write = 57562 + x509 = 57801 + xor = 57565 + yearMonth = 57566 + yearType = 57800 + zerofill = 57567 + + yyMaxDepth = 200 + yyTabOfs = -1880 +) + +var ( + yyXLAT = map[int]int{ + 57344: 0, // $end (1613x) + 59: 1, // ';' (1612x) + 57712: 2, // remove (1504x) + 57597: 3, // comment (1431x) + 57576: 4, // autoIncrement (1396x) + 44: 5, // ',' (1379x) + 57637: 6, // first (1338x) + 57571: 7, // after (1337x) + 57731: 8, // serial (1333x) + 57595: 9, // columnFormat (1332x) + 57691: 10, // password (1276x) + 57588: 11, // charsetKwd (1268x) + 57660: 12, // keyBlockSize (1245x) + 57771: 13, // tablespace (1242x) + 57609: 14, // data (1236x) + 57623: 15, // encryption (1235x) + 57625: 16, // engine (1234x) + 57650: 17, // insertMethod (1234x) + 57672: 18, // maxRows (1234x) + 57679: 19, // minRows (1234x) + 57685: 20, // nodegroup (1234x) + 57603: 21, // connection (1228x) + 57589: 22, // checksum (1223x) + 57577: 23, // avgRowLength (1222x) + 57602: 24, // compression (1222x) + 57614: 25, // delayKeyWrite (1222x) + 57723: 26, // rowFormat (1222x) + 57726: 27, // secondaryEngine (1222x) + 57753: 28, // statsAutoRecalc (1222x) + 57754: 29, // statsPersistent (1222x) + 57755: 30, // statsSamplePages (1222x) + 57757: 31, // storage (1222x) + 57769: 32, // tableChecksum (1222x) + 41: 33, // ')' (1208x) + 57569: 34, // account (1206x) + 57736: 35, // signed (1199x) + 57871: 36, // hintAggToCop (1182x) + 57880: 37, // hintEnablePlanCache (1182x) + 57875: 38, // hintHASHAGG (1182x) + 57872: 39, // hintHJ (1182x) + 57874: 40, // hintINLJ (1182x) + 57886: 41, // hintMemoryQuota (1182x) + 57878: 42, // hintNoIndexMerge (1182x) + 57884: 43, // hintQBName (1182x) + 57885: 44, // hintQueryType (1182x) + 57882: 45, // hintReadConsistentReplica (1182x) + 57883: 46, // hintReadFromStorage (1182x) + 57873: 47, // hintSMJ (1182x) + 57876: 48, // hintSTREAMAGG (1182x) + 57877: 49, // hintUseIndexMerge (1182x) + 57881: 50, // hintUsePlanCache (1182x) + 57879: 51, // hintUseToja (1182x) + 57822: 52, // maxExecutionTime (1182x) + 57573: 53, // algorithm (1181x) + 57783: 54, // tp (1181x) + 57655: 55, // invisible (1180x) + 57793: 56, // visible (1180x) + 57792: 57, // view (1176x) + 57764: 58, // subpartition (1171x) + 57694: 59, // partitions (1170x) + 57770: 60, // tables (1168x) + 57730: 61, // separator (1167x) + 57756: 62, // status (1167x) + 57608: 63, // day (1166x) + 57697: 64, // preceding (1166x) + 57800: 65, // yearType (1166x) + 57596: 66, // columns (1165x) + 57636: 67, // fields (1165x) + 57647: 68, // hour (1165x) + 57667: 69, // microsecond (1165x) + 57668: 70, // minute (1165x) + 57671: 71, // month (1165x) + 57704: 72, // quarter (1165x) + 57725: 73, // second (1165x) + 57744: 74, // sqlTsiDay (1165x) + 57745: 75, // sqlTsiHour (1165x) + 57746: 76, // sqlTsiMinute (1165x) + 57747: 77, // sqlTsiMonth (1165x) + 57748: 78, // sqlTsiQuarter (1165x) + 57749: 79, // sqlTsiSecond (1165x) + 57750: 80, // sqlTsiWeek (1165x) + 57751: 81, // sqlTsiYear (1165x) + 57799: 82, // week (1165x) + 57673: 83, // maxConnectionsPerHour (1164x) + 57674: 84, // maxQueriesPerHour (1164x) + 57675: 85, // maxUpdatesPerHour (1164x) + 57676: 86, // maxUserConnections (1164x) + 57613: 87, // definer (1163x) + 57645: 88, // hash (1163x) + 57648: 89, // identified (1163x) + 57665: 90, // local (1163x) + 57716: 91, // respect (1163x) + 57607: 92, // current (1162x) + 57640: 93, // following (1162x) + 57794: 94, // binding (1161x) + 57624: 95, // end (1161x) + 57784: 96, // unbounded (1161x) + 57802: 97, // enforced (1160x) + 57698: 98, // prepare (1160x) + 57894: 99, // regions (1160x) + 57719: 100, // role (1160x) + 57787: 101, // user (1160x) + 57579: 102, // begin (1159x) + 57795: 103, // bindings (1159x) + 57585: 104, // btree (1159x) + 57598: 105, // commit (1159x) + 57611: 106, // datetimeType (1159x) + 57610: 107, // dateType (1159x) + 57651: 108, // isolation (1159x) + 57659: 109, // jsonType (1159x) + 57688: 110, // offset (1159x) + 57699: 111, // privileges (1159x) + 57705: 112, // query (1159x) + 57720: 113, // rollback (1159x) + 57724: 114, // rtree (1159x) + 57752: 115, // start (1159x) + 57776: 116, // timeType (1159x) + 57782: 117, // truncate (1159x) + 57789: 118, // validation (1159x) + 57790: 119, // value (1159x) + 57791: 120, // variables (1159x) + 57616: 121, // disable (1158x) + 57621: 122, // dynamic (1158x) + 57622: 123, // enable (1158x) + 57633: 124, // execute (1158x) + 57638: 125, // fixed (1158x) + 57768: 126, // global (1158x) + 57890: 127, // hintTiFlash (1158x) + 57889: 128, // hintTiKV (1158x) + 57677: 129, // memory (1158x) + 57683: 130, // never (1158x) + 57816: 131, // next_row_id (1158x) + 57696: 132, // plugins (1158x) + 57701: 133, // processlist (1158x) + 57709: 134, // recover (1158x) + 57733: 135, // session (1158x) + 57765: 136, // subpartitions (1158x) + 57772: 137, // temporary (1158x) + 57870: 138, // tidb (1158x) + 57786: 139, // unknown (1158x) + 57797: 140, // without (1158x) + 57850: 141, // admin (1157x) + 57580: 142, // binlog (1157x) + 57582: 143, // block (1157x) + 57590: 144, // cipher (1157x) + 57592: 145, // client (1157x) + 57593: 146, // coalesce (1157x) + 57600: 147, // compact (1157x) + 57601: 148, // compressed (1157x) + 57605: 149, // context (1157x) + 57808: 150, // copyKwd (1157x) + 57606: 151, // cpu (1157x) + 57612: 152, // deallocate (1157x) + 57615: 153, // directory (1157x) + 57617: 154, // discard (1157x) + 57619: 155, // do (1157x) + 57856: 156, // drainer (1157x) + 57631: 157, // exchange (1157x) + 57639: 158, // flush (1157x) + 57642: 159, // full (1157x) + 57887: 160, // hintOLAP (1157x) + 57888: 161, // hintOLTP (1157x) + 57346: 162, // identifier (1157x) + 57649: 163, // importKwd (1157x) + 57817: 164, // inplace (1157x) + 57818: 165, // instant (1157x) + 57658: 166, // ipc (1157x) + 57652: 167, // issuer (1157x) + 57858: 168, // job (1157x) + 57857: 169, // jobs (1157x) + 57670: 170, // modify (1157x) + 57684: 171, // no (1157x) + 57859: 172, // nodeID (1157x) + 57860: 173, // nodeState (1157x) + 57687: 174, // nulls (1157x) + 57690: 175, // pageSym (1157x) + 57863: 176, // pump (1157x) + 57708: 177, // rebuild (1157x) + 57710: 178, // redundant (1157x) + 57711: 179, // reload (1157x) + 57713: 180, // reorganize (1157x) + 57714: 181, // repair (1157x) + 57721: 182, // routine (1157x) + 57727: 183, // secondaryLoad (1157x) + 57728: 184, // secondaryUnload (1157x) + 57738: 185, // slave (1157x) + 57762: 186, // source (1157x) + 57892: 187, // split (1157x) + 57865: 188, // stats (1157x) + 57763: 189, // subject (1157x) + 57758: 190, // swaps (1157x) + 57777: 191, // timestampType (1157x) + 57835: 192, // tokudbDefault (1157x) + 57836: 193, // tokudbFast (1157x) + 57837: 194, // tokudbLzma (1157x) + 57838: 195, // tokudbQuickLZ (1157x) + 57840: 196, // tokudbSmall (1157x) + 57839: 197, // tokudbSnappy (1157x) + 57841: 198, // tokudbUncompressed (1157x) + 57842: 199, // tokudbZlib (1157x) + 57778: 200, // trace (1157x) + 57570: 201, // action (1156x) + 57572: 202, // always (1156x) + 57581: 203, // bitType (1156x) + 57583: 204, // booleanType (1156x) + 57584: 205, // boolType (1156x) + 57851: 206, // buckets (1156x) + 57852: 207, // cancel (1156x) + 57587: 208, // cascaded (1156x) + 57591: 209, // cleanup (1156x) + 57853: 210, // cmSketch (1156x) + 57594: 211, // collation (1156x) + 57599: 212, // committed (1156x) + 57604: 213, // consistent (1156x) + 57854: 214, // ddl (1156x) + 57855: 215, // depth (1156x) + 57618: 216, // disk (1156x) + 57620: 217, // duplicate (1156x) + 57626: 218, // engines (1156x) + 57627: 219, // enum (1156x) + 57628: 220, // event (1156x) + 57629: 221, // events (1156x) + 57634: 222, // expire (1156x) + 57848: 223, // exprPushdownBlacklist (1156x) + 57635: 224, // faultsSym (1156x) + 57641: 225, // format (1156x) + 57643: 226, // function (1156x) + 57644: 227, // grants (1156x) + 57646: 228, // history (1156x) + 57798: 229, // identSQLErrors (1156x) + 57653: 230, // incremental (1156x) + 57654: 231, // indexes (1156x) + 57819: 232, // internal (1156x) + 57656: 233, // invoker (1156x) + 57657: 234, // io (1156x) + 57661: 235, // last (1156x) + 57662: 236, // less (1156x) + 57663: 237, // level (1156x) + 57664: 238, // list (1156x) + 57666: 239, // master (1156x) + 57678: 240, // merge (1156x) + 57669: 241, // mode (1156x) + 57681: 242, // national (1156x) + 57682: 243, // ncharType (1156x) + 57686: 244, // none (1156x) + 57689: 245, // only (1156x) + 57761: 246, // open (1156x) + 57861: 247, // optimistic (1156x) + 57849: 248, // optRuleBlacklist (1156x) + 57692: 249, // partial (1156x) + 57693: 250, // partitioning (1156x) + 57862: 251, // pessimistic (1156x) + 57700: 252, // process (1156x) + 57702: 253, // profile (1156x) + 57703: 254, // profiles (1156x) + 57706: 255, // queries (1156x) + 57825: 256, // recent (1156x) + 57715: 257, // repeatable (1156x) + 57717: 258, // replication (1156x) + 57864: 259, // samples (1156x) + 57729: 260, // security (1156x) + 57732: 261, // serializable (1156x) + 57734: 262, // share (1156x) + 57737: 263, // simple (1156x) + 57740: 264, // snapshot (1156x) + 57868: 265, // statsBuckets (1156x) + 57869: 266, // statsHealthy (1156x) + 57867: 267, // statsHistograms (1156x) + 57866: 268, // statsMeta (1156x) + 57766: 269, // super (1156x) + 57759: 270, // switchesSym (1156x) + 57760: 271, // systemTime (1156x) + 57773: 272, // temptable (1156x) + 57774: 273, // textType (1156x) + 57775: 274, // than (1156x) + 57843: 275, // top (1156x) + 57891: 276, // topn (1156x) + 57779: 277, // traditional (1156x) + 57780: 278, // transaction (1156x) + 57781: 279, // triggers (1156x) + 57785: 280, // uncommitted (1156x) + 57788: 281, // undefined (1156x) + 57796: 282, // warnings (1156x) + 57893: 283, // width (1156x) + 57801: 284, // x509 (1156x) + 57803: 285, // addDate (1155x) + 57574: 286, // any (1155x) + 57575: 287, // ascii (1155x) + 57578: 288, // avg (1155x) + 57804: 289, // bitAnd (1155x) + 57805: 290, // bitOr (1155x) + 57806: 291, // bitXor (1155x) + 57586: 292, // byteType (1155x) + 57807: 293, // cast (1155x) + 57809: 294, // count (1155x) + 57810: 295, // curTime (1155x) + 57811: 296, // dateAdd (1155x) + 57812: 297, // dateSub (1155x) + 57630: 298, // escape (1155x) + 57632: 299, // exclusive (1155x) + 57813: 300, // extract (1155x) + 57814: 301, // getFormat (1155x) + 57815: 302, // groupConcat (1155x) + 57821: 303, // max (1155x) + 57820: 304, // min (1155x) + 57680: 305, // names (1155x) + 57823: 306, // now (1155x) + 57824: 307, // position (1155x) + 57707: 308, // quick (1155x) + 57718: 309, // reverse (1155x) + 57722: 310, // rowCount (1155x) + 57735: 311, // shared (1155x) + 57739: 312, // slow (1155x) + 57767: 313, // some (1155x) + 57741: 314, // sqlBufferResult (1155x) + 57742: 315, // sqlCache (1155x) + 57743: 316, // sqlNoCache (1155x) + 57826: 317, // std (1155x) + 57827: 318, // stddev (1155x) + 57828: 319, // stddevPop (1155x) + 57829: 320, // stddevSamp (1155x) + 57830: 321, // subDate (1155x) + 57832: 322, // substring (1155x) + 57831: 323, // sum (1155x) + 57833: 324, // timestampAdd (1155x) + 57834: 325, // timestampDiff (1155x) + 57844: 326, // trim (1155x) + 57845: 327, // variance (1155x) + 57846: 328, // varPop (1155x) + 57847: 329, // varSamp (1155x) + 40: 330, // '(' (1043x) + 57484: 331, // on (946x) + 57348: 332, // stringLit (916x) + 57477: 333, // not (906x) + 57364: 334, // as (867x) + 57397: 335, // defaultKwd (834x) + 57457: 336, // left (821x) + 57513: 337, // right (821x) + 57378: 338, // collate (787x) + 57543: 339, // union (777x) + 43: 340, // '+' (775x) + 45: 341, // '-' (775x) + 57476: 342, // mod (773x) + 57564: 343, // with (767x) + 57481: 344, // null (740x) + 57493: 345, // partition (732x) + 57549: 346, // using (730x) + 57418: 347, // forKwd (718x) + 57465: 348, // lock (715x) + 57459: 349, // limit (701x) + 57363: 350, // and (684x) + 57489: 351, // order (683x) + 57561: 352, // where (671x) + 57509: 353, // replace (669x) + 57488: 354, // or (667x) + 57354: 355, // andand (666x) + 57376: 356, // charType (666x) + 57695: 357, // pipesAsOr (666x) + 57565: 358, // xor (666x) + 57520: 359, // set (660x) + 57421: 360, // from (658x) + 57928: 361, // eq (654x) + 57923: 362, // intLit (641x) + 57530: 363, // straightJoin (639x) + 57563: 364, // window (630x) + 57427: 365, // having (628x) + 57449: 366, // join (625x) + 57425: 367, // group (620x) + 57383: 368, // cross (614x) + 57437: 369, // inner (614x) + 57568: 370, // natural (614x) + 125: 371, // '}' (613x) + 57458: 372, // like (612x) + 42: 373, // '*' (607x) + 46: 374, // '.' (596x) + 57501: 375, // rangeKwd (595x) + 57426: 376, // groups (594x) + 57516: 377, // rows (594x) + 57401: 378, // desc (592x) + 57365: 379, // asc (590x) + 57368: 380, // binaryType (590x) + 57392: 381, // dayHour (589x) + 57393: 382, // dayMicrosecond (589x) + 57394: 383, // dayMinute (589x) + 57395: 384, // daySecond (589x) + 57429: 385, // hourMicrosecond (589x) + 57430: 386, // hourMinute (589x) + 57431: 387, // hourSecond (589x) + 57474: 388, // minuteMicrosecond (589x) + 57475: 389, // minuteSecond (589x) + 57518: 390, // secondMicrosecond (589x) + 57566: 391, // yearMonth (589x) + 57560: 392, // when (588x) + 57409: 393, // elseKwd (585x) + 57434: 394, // in (585x) + 57534: 395, // then (582x) + 60: 396, // '<' (576x) + 62: 397, // '>' (576x) + 57929: 398, // ge (576x) + 57441: 399, // is (576x) + 57930: 400, // le (576x) + 57934: 401, // neq (576x) + 57935: 402, // neqSynonym (576x) + 57936: 403, // nulleq (576x) + 57349: 404, // singleAtIdentifier (575x) + 57366: 405, // between (573x) + 57432: 406, // ifKwd (568x) + 37: 407, // '%' (567x) + 38: 408, // '&' (567x) + 47: 409, // '/' (567x) + 94: 410, // '^' (567x) + 124: 411, // '|' (567x) + 57405: 412, // div (567x) + 57933: 413, // lsh (567x) + 57938: 414, // rsh (567x) + 57506: 415, // regexpKwd (564x) + 57514: 416, // rlike (564x) + 57388: 417, // currentUser (554x) + 57442: 418, // insert (551x) + 57450: 419, // key (548x) + 123: 420, // '{' (546x) + 57922: 421, // decLit (546x) + 57921: 422, // floatLit (546x) + 57439: 423, // interval (546x) + 57937: 424, // paramMarker (546x) + 57415: 425, // falseKwd (545x) + 57541: 426, // trueKwd (545x) + 57497: 427, // primary (542x) + 57553: 428, // values (542x) + 57925: 429, // bitLit (541x) + 57924: 430, // hexLit (541x) + 57381: 431, // convert (540x) + 57412: 432, // exists (540x) + 57390: 433, // database (539x) + 57350: 434, // doubleAtIdentifier (538x) + 57909: 435, // builtinNow (537x) + 57377: 436, // check (537x) + 57387: 437, // currentTs (537x) + 57463: 438, // localTime (537x) + 57464: 439, // localTs (537x) + 57347: 440, // underscoreCS (537x) + 57515: 441, // row (536x) + 33: 442, // '!' (535x) + 126: 443, // '~' (535x) + 57895: 444, // builtinAddDate (535x) + 57896: 445, // builtinBitAnd (535x) + 57897: 446, // builtinBitOr (535x) + 57898: 447, // builtinBitXor (535x) + 57899: 448, // builtinCast (535x) + 57900: 449, // builtinCount (535x) + 57901: 450, // builtinCurDate (535x) + 57902: 451, // builtinCurTime (535x) + 57903: 452, // builtinDateAdd (535x) + 57904: 453, // builtinDateSub (535x) + 57905: 454, // builtinExtract (535x) + 57906: 455, // builtinGroupConcat (535x) + 57907: 456, // builtinMax (535x) + 57908: 457, // builtinMin (535x) + 57910: 458, // builtinPosition (535x) + 57915: 459, // builtinStddevPop (535x) + 57916: 460, // builtinStddevSamp (535x) + 57911: 461, // builtinSubDate (535x) + 57912: 462, // builtinSubstring (535x) + 57913: 463, // builtinSum (535x) + 57914: 464, // builtinSysDate (535x) + 57917: 465, // builtinTrim (535x) + 57918: 466, // builtinUser (535x) + 57919: 467, // builtinVarPop (535x) + 57920: 468, // builtinVarSamp (535x) + 57373: 469, // caseKwd (535x) + 57384: 470, // cumeDist (535x) + 57385: 471, // currentDate (535x) + 57389: 472, // currentRole (535x) + 57386: 473, // currentTime (535x) + 57400: 474, // denseRank (535x) + 57416: 475, // firstValue (535x) + 57453: 476, // lag (535x) + 57454: 477, // lastValue (535x) + 57455: 478, // lead (535x) + 57939: 479, // not2 (535x) + 57479: 480, // nthValue (535x) + 57480: 481, // ntile (535x) + 57495: 482, // percentRank (535x) + 57502: 483, // rank (535x) + 57508: 484, // repeat (535x) + 57517: 485, // rowNumber (535x) + 57550: 486, // utcDate (535x) + 57552: 487, // utcTime (535x) + 57551: 488, // utcTimestamp (535x) + 57542: 489, // unique (531x) + 57505: 490, // references (527x) + 57355: 491, // pipes (524x) + 57423: 492, // generated (523x) + 57433: 493, // ignore (506x) + 57519: 494, // selectKwd (495x) + 57435: 495, // index (479x) + 57375: 496, // character (459x) + 58133: 497, // Identifier (404x) + 58197: 498, // NotKeywordToken (404x) + 58368: 499, // TiDBKeyword (404x) + 58378: 500, // UnReservedKeyword (404x) + 57492: 501, // packKeys (402x) + 57500: 502, // preSplitRegions (402x) + 57499: 503, // shardRowIDBits (402x) + 57931: 504, // jss (365x) + 57932: 505, // juss (365x) + 57538: 506, // to (362x) + 57371: 507, // by (355x) + 57460: 508, // lines (352x) + 57927: 509, // assignmentEq (351x) + 57510: 510, // require (351x) + 57419: 511, // force (347x) + 57548: 512, // use (347x) + 57524: 513, // sql (346x) + 57440: 514, // into (345x) + 64: 515, // '@' (343x) + 57372: 516, // cascade (343x) + 57407: 517, // drop (343x) + 57511: 518, // restrict (343x) + 57362: 519, // analyze (340x) + 57503: 520, // read (340x) + 57361: 521, // alter (339x) + 57420: 522, // foreign (337x) + 57422: 523, // fulltext (337x) + 57374: 524, // change (336x) + 57507: 525, // rename (336x) + 57556: 526, // varcharacter (336x) + 57555: 527, // varcharType (336x) + 93: 528, // ']' (335x) + 57396: 529, // decimalType (335x) + 57406: 530, // doubleType (335x) + 57417: 531, // floatType (335x) + 57438: 532, // integerType (335x) + 57443: 533, // intType (335x) + 57469: 534, // match (335x) + 57504: 535, // realType (335x) + 57359: 536, // add (334x) + 57485: 537, // optimize (334x) + 57557: 538, // varbinaryType (334x) + 57562: 539, // write (334x) + 57367: 540, // bigIntType (333x) + 57369: 541, // blobType (333x) + 57444: 542, // int1Type (333x) + 57445: 543, // int2Type (333x) + 57446: 544, // int3Type (333x) + 57447: 545, // int4Type (333x) + 57448: 546, // int8Type (333x) + 57554: 547, // long (333x) + 57466: 548, // longblobType (333x) + 57467: 549, // longtextType (333x) + 57471: 550, // mediumblobType (333x) + 57472: 551, // mediumIntType (333x) + 57473: 552, // mediumtextType (333x) + 57482: 553, // numericType (333x) + 57483: 554, // nvarcharType (333x) + 57522: 555, // smallIntType (333x) + 57535: 556, // tinyblobType (333x) + 57536: 557, // tinyIntType (333x) + 57537: 558, // tinytextType (333x) + 58341: 559, // SubSelect (148x) + 58388: 560, // UserVariable (147x) + 58322: 561, // SimpleIdent (146x) + 58179: 562, // Literal (144x) + 58332: 563, // StringLiteral (144x) + 58107: 564, // FunctionCallGeneric (142x) + 58108: 565, // FunctionCallKeyword (142x) + 58109: 566, // FunctionCallNonKeyword (142x) + 58110: 567, // FunctionNameConflict (142x) + 58111: 568, // FunctionNameDateArith (142x) + 58112: 569, // FunctionNameDateArithMultiForms (142x) + 58113: 570, // FunctionNameDatetimePrecision (142x) + 58114: 571, // FunctionNameOptionalBraces (142x) + 58321: 572, // SimpleExpr (142x) + 58342: 573, // SumExpr (142x) + 58344: 574, // SystemVariable (142x) + 58398: 575, // Variable (142x) + 58421: 576, // WindowFuncCall (142x) + 57989: 577, // BitExpr (130x) + 58255: 578, // PredicateExpr (114x) + 57992: 579, // BoolPri (111x) + 58081: 580, // Expression (111x) + 58431: 581, // logAnd (87x) + 58432: 582, // logOr (87x) + 58194: 583, // NUM (64x) + 58353: 584, // TableName (60x) + 57360: 585, // all (50x) + 58333: 586, // StringName (48x) + 57545: 587, // unsigned (44x) + 57567: 588, // zerofill (42x) + 58010: 589, // ColumnName (40x) + 57491: 590, // over (38x) + 58072: 591, // EqOpt (37x) + 57531: 592, // tableKwd (29x) + 58290: 593, // SelectStmt (28x) + 58291: 594, // SelectStmtBasic (28x) + 58294: 595, // SelectStmtFromDualTable (28x) + 58295: 596, // SelectStmtFromTable (28x) + 58426: 597, // WindowingClause (28x) + 57353: 598, // hintEnd (26x) + 58170: 599, // LengthNum (26x) + 58090: 600, // FieldLen (23x) + 57526: 601, // sqlCalcFoundRows (23x) + 57546: 602, // update (21x) + 58000: 603, // CharsetKw (20x) + 58381: 604, // UnionSelect (20x) + 58379: 605, // UnionClauseList (19x) + 58382: 606, // UnionStmt (19x) + 57399: 607, // deleteKwd (18x) + 58264: 608, // QueryBlockOpt (18x) + 58228: 609, // OptWindowingClause (17x) + 57398: 610, // delayed (16x) + 57428: 611, // highPriority (16x) + 57468: 612, // lowPriority (16x) + 57525: 613, // sqlBigResult (16x) + 57533: 614, // terminated (16x) + 57403: 615, // distinct (15x) + 57404: 616, // distinctRow (15x) + 58390: 617, // Username (15x) + 57410: 618, // enclosed (14x) + 58082: 619, // ExpressionList (14x) + 58215: 620, // OptFieldLen (14x) + 57527: 621, // sqlSmallResult (14x) + 57411: 622, // escaped (13x) + 58164: 623, // JoinTable (13x) + 57487: 624, // optionally (13x) + 58244: 625, // PartitionNameList (13x) + 58350: 626, // TableFactor (13x) + 58361: 627, // TableRef (13x) + 58051: 628, // DefaultKwdOpt (12x) + 58055: 629, // DistinctKwd (12x) + 58056: 630, // DistinctOpt (11x) + 58103: 631, // FromOrIn (11x) + 58284: 632, // Rolename (11x) + 58281: 633, // RoleNameString (11x) + 58354: 634, // TableNameList (11x) + 58001: 635, // CharsetName (10x) + 58050: 636, // DefaultFalseDistinctOpt (10x) + 58134: 637, // IfExists (10x) + 58135: 638, // IfNotExists (10x) + 58211: 639, // OptBinary (10x) + 58233: 640, // OrderBy (10x) + 58234: 641, // OrderByOptional (10x) + 58370: 642, // TimestampUnit (10x) + 57994: 643, // BuggyDefaultFalseDistinctOpt (9x) + 58165: 644, // JoinType (9x) + 57478: 645, // noWriteToBinLog (9x) + 57977: 646, // AnalyzeOptionListOpt (8x) + 58041: 647, // CrossOpt (8x) + 58054: 648, // DeleteFromStmt (8x) + 58139: 649, // IndexColName (8x) + 58152: 650, // IndexNameList (8x) + 58158: 651, // InsertIntoStmt (8x) + 58166: 652, // KeyOrIndex (8x) + 58236: 653, // PartDefOption (8x) + 58273: 654, // ReplaceIntoStmt (8x) + 58285: 655, // RolenameList (8x) + 58297: 656, // SelectStmtLimit (8x) + 58369: 657, // TimeUnit (8x) + 58384: 658, // UpdateStmt (8x) + 58401: 659, // VariableName (8x) + 57965: 660, // AllOrPartitionNameList (7x) + 58005: 661, // ColumnDef (7x) + 58011: 662, // ColumnNameList (7x) + 58074: 663, // EscapedTableRef (7x) + 58080: 664, // ExprOrDefault (7x) + 58130: 665, // HintTable (7x) + 58140: 666, // IndexColNameList (7x) + 58196: 667, // NoWriteToBinLogAliasOpt (7x) + 58310: 668, // ShowDatabaseNameOpt (7x) + 57558: 669, // varying (7x) + 58411: 670, // WhereClause (7x) + 58412: 671, // WhereClauseOptional (7x) + 57379: 672, // column (6x) + 57382: 673, // create (6x) + 58043: 674, // DatabaseOption (6x) + 58042: 675, // DBName (6x) + 58073: 676, // EqOrAssignmentEq (6x) + 57424: 677, // grant (6x) + 58147: 678, // IndexInvisible (6x) + 58155: 679, // IndexType (6x) + 58202: 680, // NumLiteral (6x) + 58287: 681, // RowFormat (6x) + 58288: 682, // RowValue (6x) + 58289: 683, // SelectLockOpt (6x) + 57521: 684, // show (6x) + 58312: 685, // ShowLikeOrWhereOpt (6x) + 58358: 686, // TableOption (6x) + 58362: 687, // TableRefs (6x) + 57964: 688, // AlgorithmClause (5x) + 57995: 689, // ByItem (5x) + 58008: 690, // ColumnKeywordOpt (5x) + 58083: 691, // ExpressionListOpt (5x) + 58092: 692, // FieldOpt (5x) + 58093: 693, // FieldOpts (5x) + 58150: 694, // IndexName (5x) + 58153: 695, // IndexOption (5x) + 58154: 696, // IndexOptionList (5x) + 58186: 697, // LockClause (5x) + 58222: 698, // OptNullTreatment (5x) + 58259: 699, // PriorityOpt (5x) + 58345: 700, // TableAsName (5x) + 58391: 701, // UsernameList (5x) + 58386: 702, // UserSpec (5x) + 57981: 703, // Assignment (4x) + 57985: 704, // AuthString (4x) + 57986: 705, // BeginTransactionStmt (4x) + 57996: 706, // ByList (4x) + 58004: 707, // CollationName (4x) + 58024: 708, // CommitStmt (4x) + 58079: 709, // ExplainableStmt (4x) + 58094: 710, // FieldTerminator (4x) + 58098: 711, // FloatOpt (4x) + 58131: 712, // HintTableList (4x) + 58137: 713, // IgnoreOptional (4x) + 58156: 714, // IndexTypeName (4x) + 58175: 715, // LimitOption (4x) + 57462: 716, // load (4x) + 58183: 717, // LoadDataStmt (4x) + 57486: 718, // option (4x) + 57490: 719, // outer (4x) + 58254: 720, // Precision (4x) + 58267: 721, // ReferDef (4x) + 58278: 722, // RestrictOrCascadeOpt (4x) + 58286: 723, // RollbackStmt (4x) + 58306: 724, // SetExpr (4x) + 58309: 725, // SetStmt (4x) + 58373: 726, // TransactionChar (4x) + 58387: 727, // UserSpecList (4x) + 58422: 728, // WindowName (4x) + 91: 729, // '[' (3x) + 57982: 730, // AssignmentList (3x) + 58017: 731, // ColumnOption (3x) + 58020: 732, // ColumnPosition (3x) + 58029: 733, // Constraint (3x) + 57380: 734, // constraint (3x) + 58031: 735, // ConstraintKeywordOpt (3x) + 58044: 736, // DatabaseOptionList (3x) + 58046: 737, // DatabaseSym (3x) + 58069: 738, // EnforcedOrNot (3x) + 58096: 739, // FieldsOrColumns (3x) + 58115: 740, // GeneratedAlways (3x) + 58117: 741, // GlobalScope (3x) + 57352: 742, // hintBegin (3x) + 58142: 743, // IndexHint (3x) + 58146: 744, // IndexHintType (3x) + 58151: 745, // IndexNameAndTypeOpt (3x) + 57436: 746, // infile (3x) + 57451: 747, // keys (3x) + 57470: 748, // maxValue (3x) + 58212: 749, // OptCharset (3x) + 58232: 750, // Order (3x) + 58239: 751, // PartitionDefinition (3x) + 58248: 752, // PasswordExpire (3x) + 58250: 753, // PasswordOrLockOption (3x) + 58253: 754, // PluginNameList (3x) + 58258: 755, // PrimaryOpt (3x) + 58260: 756, // PrivElem (3x) + 58263: 757, // PrivType (3x) + 58330: 758, // StorageOptimizerHintOpt (3x) + 58356: 759, // TableOptimizerHintOpt (3x) + 58357: 760, // TableOptimizerHints (3x) + 58359: 761, // TableOptionList (3x) + 58374: 762, // TransactionChars (3x) + 57540: 763, // trigger (3x) + 57544: 764, // unlock (3x) + 57547: 765, // usage (3x) + 58395: 766, // ValuesList (3x) + 58393: 767, // ValueSym (3x) + 58399: 768, // VariableAssignment (3x) + 58419: 769, // WindowFrameStart (3x) + 57963: 770, // AdminStmt (2x) + 57966: 771, // AlterDatabaseStmt (2x) + 57967: 772, // AlterOrderItem (2x) + 57970: 773, // AlterTableSpec (2x) + 57973: 774, // AlterTableStmt (2x) + 57974: 775, // AlterUserStmt (2x) + 57975: 776, // AnalyzeOption (2x) + 57978: 777, // AnalyzeTableStmt (2x) + 57988: 778, // BinlogStmt (2x) + 57997: 779, // CastType (2x) + 57998: 780, // ChangeStmt (2x) + 58012: 781, // ColumnNameListOpt (2x) + 58015: 782, // ColumnNameOrUserVariable (2x) + 58018: 783, // ColumnOptionList (2x) + 58019: 784, // ColumnOptionListOpt (2x) + 58021: 785, // ColumnSetValue (2x) + 58026: 786, // ConnectionOption (2x) + 58028: 787, // ConnectionOptions (2x) + 58032: 788, // CreateBindingStmt (2x) + 58033: 789, // CreateDatabaseStmt (2x) + 58034: 790, // CreateIndexStmt (2x) + 58035: 791, // CreateRoleStmt (2x) + 58038: 792, // CreateTableStmt (2x) + 58039: 793, // CreateUserStmt (2x) + 58040: 794, // CreateViewStmt (2x) + 57391: 795, // databases (2x) + 58048: 796, // DeallocateStmt (2x) + 58049: 797, // DeallocateSym (2x) + 57402: 798, // describe (2x) + 58057: 799, // DoStmt (2x) + 58058: 800, // DropBindingStmt (2x) + 58059: 801, // DropDatabaseStmt (2x) + 58060: 802, // DropIndexStmt (2x) + 58061: 803, // DropRoleStmt (2x) + 58062: 804, // DropStatsStmt (2x) + 58063: 805, // DropTableStmt (2x) + 58064: 806, // DropUserStmt (2x) + 58065: 807, // DropViewStmt (2x) + 58066: 808, // DuplicateOpt (2x) + 58068: 809, // EmptyStmt (2x) + 58070: 810, // EnforcedOrNotOpt (2x) + 58075: 811, // ExecuteStmt (2x) + 57413: 812, // explain (2x) + 58077: 813, // ExplainStmt (2x) + 58078: 814, // ExplainSym (2x) + 58085: 815, // Field (2x) + 58086: 816, // FieldAsName (2x) + 58087: 817, // FieldAsNameOpt (2x) + 58088: 818, // FieldItem (2x) + 58101: 819, // FlushStmt (2x) + 58102: 820, // FromDual (2x) + 58105: 821, // FuncDatetimePrecList (2x) + 58106: 822, // FuncDatetimePrecListOpt (2x) + 58118: 823, // GrantRoleStmt (2x) + 58119: 824, // GrantStmt (2x) + 58121: 825, // HandleRange (2x) + 58123: 826, // HashString (2x) + 58127: 827, // HintStorageType (2x) + 58128: 828, // HintStorageTypeAndTable (2x) + 58132: 829, // HintTrueOrFalse (2x) + 58143: 830, // IndexHintList (2x) + 58144: 831, // IndexHintListOpt (2x) + 58149: 832, // IndexLockAndAlgorithmOpt (2x) + 58159: 833, // InsertValues (2x) + 58161: 834, // IntoOpt (2x) + 58167: 835, // KeyOrIndexOpt (2x) + 57452: 836, // kill (2x) + 58168: 837, // KillOrKillTiDB (2x) + 58169: 838, // KillStmt (2x) + 58174: 839, // LimitClause (2x) + 57461: 840, // linear (2x) + 58176: 841, // LinearOpt (2x) + 58180: 842, // LoadDataSetItem (2x) + 58184: 843, // LoadStatsStmt (2x) + 58187: 844, // LockTablesStmt (2x) + 58191: 845, // MaxValueOrExpression (2x) + 58198: 846, // NowSym (2x) + 58199: 847, // NowSymFunc (2x) + 58200: 848, // NowSymOptionFraction (2x) + 58201: 849, // NumList (2x) + 58205: 850, // ObjectType (2x) + 58204: 851, // ODBCDateTimeType (2x) + 57356: 852, // odbcDateType (2x) + 57358: 853, // odbcTimestampType (2x) + 57357: 854, // odbcTimeType (2x) + 58206: 855, // OnDelete (2x) + 58209: 856, // OnUpdate (2x) + 58219: 857, // OptInteger (2x) + 58230: 858, // OptionalBraces (2x) + 58221: 859, // OptLeadLagInfo (2x) + 58220: 860, // OptLLDefault (2x) + 58225: 861, // OptTemporary (2x) + 58235: 862, // OuterOpt (2x) + 58237: 863, // PartDefOptionList (2x) + 58240: 864, // PartitionDefinitionList (2x) + 58241: 865, // PartitionDefinitionListOpt (2x) + 58247: 866, // PartitionOpt (2x) + 58249: 867, // PasswordOpt (2x) + 58251: 868, // PasswordOrLockOptionList (2x) + 58252: 869, // PasswordOrLockOptions (2x) + 58257: 870, // PreparedStmt (2x) + 58261: 871, // PrivElemList (2x) + 58262: 872, // PrivLevel (2x) + 58266: 873, // RecoverTableStmt (2x) + 58268: 874, // ReferOpt (2x) + 58270: 875, // RegexpSym (2x) + 58271: 876, // RenameTableStmt (2x) + 58274: 877, // RequireClause (2x) + 58275: 878, // RequireClauseOpt (2x) + 58276: 879, // RequireList (2x) + 58277: 880, // RequireListElement (2x) + 57512: 881, // revoke (2x) + 58279: 882, // RevokeRoleStmt (2x) + 58280: 883, // RevokeStmt (2x) + 58282: 884, // RoleSpec (2x) + 58304: 885, // SetDefaultRoleOpt (2x) + 58305: 886, // SetDefaultRoleStmt (2x) + 58308: 887, // SetRoleStmt (2x) + 58314: 888, // ShowProfileType (2x) + 58317: 889, // ShowStmt (2x) + 58318: 890, // ShowTableAliasOpt (2x) + 58320: 891, // SignedLiteral (2x) + 58323: 892, // SplitOption (2x) + 58324: 893, // SplitRegionStmt (2x) + 58327: 894, // Statement (2x) + 58329: 895, // StatsPersistentVal (2x) + 58331: 896, // StringList (2x) + 58335: 897, // SubPartDefinition (2x) + 58338: 898, // SubPartitionMethod (2x) + 58343: 899, // Symbol (2x) + 58346: 900, // TableAsNameOpt (2x) + 58347: 901, // TableElement (2x) + 58351: 902, // TableLock (2x) + 58355: 903, // TableNameListOpt (2x) + 58360: 904, // TableOrTables (2x) + 58366: 905, // TablesTerminalSym (2x) + 58364: 906, // TableToTable (2x) + 58372: 907, // TraceableStmt (2x) + 58371: 908, // TraceStmt (2x) + 58376: 909, // TruncateTableStmt (2x) + 58383: 910, // UnlockTablesStmt (2x) + 58385: 911, // UseStmt (2x) + 58397: 912, // Varchar (2x) + 58400: 913, // VariableAssignmentList (2x) + 58409: 914, // WhenClause (2x) + 58414: 915, // WindowDefinition (2x) + 58417: 916, // WindowFrameBound (2x) + 58424: 917, // WindowSpec (2x) + 61: 918, // '=' (1x) + 57962: 919, // AdminShowSlow (1x) + 57968: 920, // AlterOrderList (1x) + 57969: 921, // AlterTablePartitionOpt (1x) + 57971: 922, // AlterTableSpecList (1x) + 57972: 923, // AlterTableSpecListOpt (1x) + 57976: 924, // AnalyzeOptionList (1x) + 57979: 925, // AnyOrAll (1x) + 57980: 926, // AsOpt (1x) + 57984: 927, // AuthOption (1x) + 57987: 928, // BetweenOrNotOp (1x) + 57990: 929, // BitValueType (1x) + 57991: 930, // BlobType (1x) + 57993: 931, // BooleanType (1x) + 57370: 932, // both (1x) + 57999: 933, // Char (1x) + 58002: 934, // CharsetOpt (1x) + 58003: 935, // ClearPasswordExpireOptions (1x) + 58006: 936, // ColumnDefList (1x) + 58007: 937, // ColumnFormat (1x) + 58009: 938, // ColumnList (1x) + 58016: 939, // ColumnNameOrUserVariableList (1x) + 58013: 940, // ColumnNameOrUserVarListOpt (1x) + 58014: 941, // ColumnNameOrUserVarListOptWithBrackets (1x) + 58022: 942, // ColumnSetValueList (1x) + 58025: 943, // CompareOp (1x) + 58027: 944, // ConnectionOptionList (1x) + 58030: 945, // ConstraintElem (1x) + 58036: 946, // CreateTableOptionListOpt (1x) + 58037: 947, // CreateTableSelectOpt (1x) + 58045: 948, // DatabaseOptionListOpt (1x) + 58047: 949, // DateAndTimeType (1x) + 58052: 950, // DefaultTrueDistinctOpt (1x) + 58053: 951, // DefaultValueExpr (1x) + 57408: 952, // dual (1x) + 58067: 953, // ElseOpt (1x) + 58071: 954, // EnforcedOrNotOrNotNullOpt (1x) + 57345: 955, // error (1x) + 57414: 956, // except (1x) + 58076: 957, // ExplainFormatType (1x) + 58084: 958, // ExpressionOpt (1x) + 58089: 959, // FieldItemList (1x) + 58091: 960, // FieldList (1x) + 58095: 961, // Fields (1x) + 58097: 962, // FixedPointType (1x) + 58099: 963, // FloatingPointType (1x) + 58100: 964, // FlushOption (1x) + 58104: 965, // FuncDatetimePrec (1x) + 58116: 966, // GetFormatSelector (1x) + 58120: 967, // GroupByClause (1x) + 58122: 968, // HandleRangeList (1x) + 58124: 969, // HavingClause (1x) + 58125: 970, // HintMemoryQuota (1x) + 58126: 971, // HintQueryType (1x) + 58129: 972, // HintStorageTypeAndTableList (1x) + 58136: 973, // IgnoreLines (1x) + 58141: 974, // IndexColNameListOpt (1x) + 58145: 975, // IndexHintScope (1x) + 58148: 976, // IndexKeyTypeOpt (1x) + 58157: 977, // IndexTypeOpt (1x) + 58138: 978, // InOrNotOp (1x) + 58160: 979, // IntegerType (1x) + 58163: 980, // IsolationLevel (1x) + 58162: 981, // IsOrNotOp (1x) + 57456: 982, // leading (1x) + 58171: 983, // LikeEscapeOpt (1x) + 58172: 984, // LikeOrNotOp (1x) + 58173: 985, // LikeTableWithOrWithoutParen (1x) + 58177: 986, // Lines (1x) + 58178: 987, // LinesTerminated (1x) + 58181: 988, // LoadDataSetList (1x) + 58182: 989, // LoadDataSetSpecOpt (1x) + 58185: 990, // LocalOpt (1x) + 58188: 991, // LockType (1x) + 58189: 992, // Match (1x) + 58190: 993, // MatchOpt (1x) + 58192: 994, // MaxValueOrExpressionList (1x) + 58193: 995, // NChar (1x) + 58203: 996, // NumericType (1x) + 58195: 997, // NVarchar (1x) + 58207: 998, // OnDeleteUpdateOpt (1x) + 58208: 999, // OnDuplicateKeyUpdate (1x) + 58210: 1000, // OptBinMod (1x) + 58213: 1001, // OptCollate (1x) + 58214: 1002, // OptExistingWindowName (1x) + 58216: 1003, // OptFromFirstLast (1x) + 58217: 1004, // OptFull (1x) + 58218: 1005, // OptGConcatSeparator (1x) + 58229: 1006, // OptimizerHintList (1x) + 58223: 1007, // OptPartitionClause (1x) + 58224: 1008, // OptTable (1x) + 58226: 1009, // OptWindowFrameClause (1x) + 58227: 1010, // OptWindowOrderByClause (1x) + 58231: 1011, // OrReplace (1x) + 57494: 1012, // parser (1x) + 58238: 1013, // PartDefValuesOpt (1x) + 58242: 1014, // PartitionKeyAlgorithmOpt (1x) + 58243: 1015, // PartitionMethod (1x) + 58245: 1016, // PartitionNameListOpt (1x) + 58246: 1017, // PartitionNumOpt (1x) + 57496: 1018, // precisionType (1x) + 58256: 1019, // PrepareSQL (1x) + 57498: 1020, // procedure (1x) + 58265: 1021, // QuickOptional (1x) + 58269: 1022, // RegexpOrNotOp (1x) + 58272: 1023, // ReorganizePartitionRuleOpt (1x) + 58283: 1024, // RoleSpecList (1x) + 58292: 1025, // SelectStmtCalcFoundRows (1x) + 58293: 1026, // SelectStmtFieldList (1x) + 58296: 1027, // SelectStmtGroup (1x) + 58298: 1028, // SelectStmtOpts (1x) + 58299: 1029, // SelectStmtSQLBigResult (1x) + 58300: 1030, // SelectStmtSQLBufferResult (1x) + 58301: 1031, // SelectStmtSQLCache (1x) + 58302: 1032, // SelectStmtSQLSmallResult (1x) + 58303: 1033, // SelectStmtStraightJoin (1x) + 58307: 1034, // SetRoleOpt (1x) + 58311: 1035, // ShowIndexKwd (1x) + 58313: 1036, // ShowProfileArgsOpt (1x) + 58315: 1037, // ShowProfileTypes (1x) + 58316: 1038, // ShowProfileTypesOpt (1x) + 58319: 1039, // ShowTargetFilterable (1x) + 57523: 1040, // spatial (1x) + 57528: 1041, // ssl (1x) + 58325: 1042, // Start (1x) + 58326: 1043, // Starting (1x) + 57529: 1044, // starting (1x) + 58328: 1045, // StatementList (1x) + 57532: 1046, // stored (1x) + 58334: 1047, // StringType (1x) + 58336: 1048, // SubPartDefinitionList (1x) + 58337: 1049, // SubPartDefinitionListOpt (1x) + 58339: 1050, // SubPartitionNumOpt (1x) + 58340: 1051, // SubPartitionOpt (1x) + 58348: 1052, // TableElementList (1x) + 58349: 1053, // TableElementListOpt (1x) + 58352: 1054, // TableLockList (1x) + 58363: 1055, // TableRefsClause (1x) + 58365: 1056, // TableToTableList (1x) + 58367: 1057, // TextType (1x) + 57539: 1058, // trailing (1x) + 58375: 1059, // TrimDirection (1x) + 58377: 1060, // Type (1x) + 58380: 1061, // UnionOpt (1x) + 58389: 1062, // UserVariableList (1x) + 58392: 1063, // UsingRoles (1x) + 58394: 1064, // Values (1x) + 58396: 1065, // ValuesOpt (1x) + 58402: 1066, // ViewAlgorithm (1x) + 58403: 1067, // ViewCheckOption (1x) + 58404: 1068, // ViewDefiner (1x) + 58405: 1069, // ViewFieldList (1x) + 58406: 1070, // ViewName (1x) + 58407: 1071, // ViewSQLSecurity (1x) + 57559: 1072, // virtual (1x) + 58408: 1073, // VirtualOrStored (1x) + 58410: 1074, // WhenClauseList (1x) + 58413: 1075, // WindowClauseOptional (1x) + 58415: 1076, // WindowDefinitionList (1x) + 58416: 1077, // WindowFrameBetween (1x) + 58418: 1078, // WindowFrameExtent (1x) + 58420: 1079, // WindowFrameUnits (1x) + 58423: 1080, // WindowNameOrSpec (1x) + 58425: 1081, // WindowSpecDetails (1x) + 58427: 1082, // WithGrantOptionOpt (1x) + 58428: 1083, // WithReadLockOpt (1x) + 58429: 1084, // WithValidation (1x) + 58430: 1085, // WithValidationOpt (1x) + 57961: 1086, // $default (0x) + 57926: 1087, // andnot (0x) + 57983: 1088, // AssignmentListOpt (0x) + 58023: 1089, // CommaOpt (0x) + 57947: 1090, // createTableSelect (0x) + 57940: 1091, // empty (0x) + 57960: 1092, // higherThanComma (0x) + 57945: 1093, // insertValues (0x) + 57351: 1094, // invalid (0x) + 57948: 1095, // lowerThanCharsetKwd (0x) + 57959: 1096, // lowerThanComma (0x) + 57946: 1097, // lowerThanCreateTableSelect (0x) + 57955: 1098, // lowerThanEq (0x) + 57944: 1099, // lowerThanInsertValues (0x) + 57941: 1100, // lowerThanIntervalKeyword (0x) + 57949: 1101, // lowerThanKey (0x) + 57950: 1102, // lowerThanLocal (0x) + 57957: 1103, // lowerThanNot (0x) + 57954: 1104, // lowerThanOn (0x) + 57951: 1105, // lowerThanRemove (0x) + 57943: 1106, // lowerThanSetKeyword (0x) + 57942: 1107, // lowerThanStringLitToken (0x) + 57952: 1108, // lowerThenOrder (0x) + 57956: 1109, // neg (0x) + 57958: 1110, // splitOptionPriv (0x) + 57953: 1111, // tableRefPriority (0x) + } + + yySymNames = []string{ + "$end", + "';'", + "remove", + "comment", + "autoIncrement", + "','", + "first", + "after", + "serial", + "columnFormat", + "password", + "charsetKwd", + "keyBlockSize", + "tablespace", + "data", + "encryption", + "engine", + "insertMethod", + "maxRows", + "minRows", + "nodegroup", + "connection", + "checksum", + "avgRowLength", + "compression", + "delayKeyWrite", + "rowFormat", + "secondaryEngine", + "statsAutoRecalc", + "statsPersistent", + "statsSamplePages", + "storage", + "tableChecksum", + "')'", + "account", + "signed", + "hintAggToCop", + "hintEnablePlanCache", + "hintHASHAGG", + "hintHJ", + "hintINLJ", + "hintMemoryQuota", + "hintNoIndexMerge", + "hintQBName", + "hintQueryType", + "hintReadConsistentReplica", + "hintReadFromStorage", + "hintSMJ", + "hintSTREAMAGG", + "hintUseIndexMerge", + "hintUsePlanCache", + "hintUseToja", + "maxExecutionTime", + "algorithm", + "tp", + "invisible", + "visible", + "view", + "subpartition", + "partitions", + "tables", + "separator", + "status", + "day", + "preceding", + "yearType", + "columns", + "fields", + "hour", + "microsecond", + "minute", + "month", + "quarter", + "second", + "sqlTsiDay", + "sqlTsiHour", + "sqlTsiMinute", + "sqlTsiMonth", + "sqlTsiQuarter", + "sqlTsiSecond", + "sqlTsiWeek", + "sqlTsiYear", + "week", + "maxConnectionsPerHour", + "maxQueriesPerHour", + "maxUpdatesPerHour", + "maxUserConnections", + "definer", + "hash", + "identified", + "local", + "respect", + "current", + "following", + "binding", + "end", + "unbounded", + "enforced", + "prepare", + "regions", + "role", + "user", + "begin", + "bindings", + "btree", + "commit", + "datetimeType", + "dateType", + "isolation", + "jsonType", + "offset", + "privileges", + "query", + "rollback", + "rtree", + "start", + "timeType", + "truncate", + "validation", + "value", + "variables", + "disable", + "dynamic", + "enable", + "execute", + "fixed", + "global", + "hintTiFlash", + "hintTiKV", + "memory", + "never", + "next_row_id", + "plugins", + "processlist", + "recover", + "session", + "subpartitions", + "temporary", + "tidb", + "unknown", + "without", + "admin", + "binlog", + "block", + "cipher", + "client", + "coalesce", + "compact", + "compressed", + "context", + "copyKwd", + "cpu", + "deallocate", + "directory", + "discard", + "do", + "drainer", + "exchange", + "flush", + "full", + "hintOLAP", + "hintOLTP", + "identifier", + "importKwd", + "inplace", + "instant", + "ipc", + "issuer", + "job", + "jobs", + "modify", + "no", + "nodeID", + "nodeState", + "nulls", + "pageSym", + "pump", + "rebuild", + "redundant", + "reload", + "reorganize", + "repair", + "routine", + "secondaryLoad", + "secondaryUnload", + "slave", + "source", + "split", + "stats", + "subject", + "swaps", + "timestampType", + "tokudbDefault", + "tokudbFast", + "tokudbLzma", + "tokudbQuickLZ", + "tokudbSmall", + "tokudbSnappy", + "tokudbUncompressed", + "tokudbZlib", + "trace", + "action", + "always", + "bitType", + "booleanType", + "boolType", + "buckets", + "cancel", + "cascaded", + "cleanup", + "cmSketch", + "collation", + "committed", + "consistent", + "ddl", + "depth", + "disk", + "duplicate", + "engines", + "enum", + "event", + "events", + "expire", + "exprPushdownBlacklist", + "faultsSym", + "format", + "function", + "grants", + "history", + "identSQLErrors", + "incremental", + "indexes", + "internal", + "invoker", + "io", + "last", + "less", + "level", + "list", + "master", + "merge", + "mode", + "national", + "ncharType", + "none", + "only", + "open", + "optimistic", + "optRuleBlacklist", + "partial", + "partitioning", + "pessimistic", + "process", + "profile", + "profiles", + "queries", + "recent", + "repeatable", + "replication", + "samples", + "security", + "serializable", + "share", + "simple", + "snapshot", + "statsBuckets", + "statsHealthy", + "statsHistograms", + "statsMeta", + "super", + "switchesSym", + "systemTime", + "temptable", + "textType", + "than", + "top", + "topn", + "traditional", + "transaction", + "triggers", + "uncommitted", + "undefined", + "warnings", + "width", + "x509", + "addDate", + "any", + "ascii", + "avg", + "bitAnd", + "bitOr", + "bitXor", + "byteType", + "cast", + "count", + "curTime", + "dateAdd", + "dateSub", + "escape", + "exclusive", + "extract", + "getFormat", + "groupConcat", + "max", + "min", + "names", + "now", + "position", + "quick", + "reverse", + "rowCount", + "shared", + "slow", + "some", + "sqlBufferResult", + "sqlCache", + "sqlNoCache", + "std", + "stddev", + "stddevPop", + "stddevSamp", + "subDate", + "substring", + "sum", + "timestampAdd", + "timestampDiff", + "trim", + "variance", + "varPop", + "varSamp", + "'('", + "on", + "stringLit", + "not", + "as", + "defaultKwd", + "left", + "right", + "collate", + "union", + "'+'", + "'-'", + "mod", + "with", + "null", + "partition", + "using", + "forKwd", + "lock", + "limit", + "and", + "order", + "where", + "replace", + "or", + "andand", + "charType", + "pipesAsOr", + "xor", + "set", + "from", + "eq", + "intLit", + "straightJoin", + "window", + "having", + "join", + "group", + "cross", + "inner", + "natural", + "'}'", + "like", + "'*'", + "'.'", + "rangeKwd", + "groups", + "rows", + "desc", + "asc", + "binaryType", + "dayHour", + "dayMicrosecond", + "dayMinute", + "daySecond", + "hourMicrosecond", + "hourMinute", + "hourSecond", + "minuteMicrosecond", + "minuteSecond", + "secondMicrosecond", + "yearMonth", + "when", + "elseKwd", + "in", + "then", + "'<'", + "'>'", + "ge", + "is", + "le", + "neq", + "neqSynonym", + "nulleq", + "singleAtIdentifier", + "between", + "ifKwd", + "'%'", + "'&'", + "'/'", + "'^'", + "'|'", + "div", + "lsh", + "rsh", + "regexpKwd", + "rlike", + "currentUser", + "insert", + "key", + "'{'", + "decLit", + "floatLit", + "interval", + "paramMarker", + "falseKwd", + "trueKwd", + "primary", + "values", + "bitLit", + "hexLit", + "convert", + "exists", + "database", + "doubleAtIdentifier", + "builtinNow", + "check", + "currentTs", + "localTime", + "localTs", + "underscoreCS", + "row", + "'!'", + "'~'", + "builtinAddDate", + "builtinBitAnd", + "builtinBitOr", + "builtinBitXor", + "builtinCast", + "builtinCount", + "builtinCurDate", + "builtinCurTime", + "builtinDateAdd", + "builtinDateSub", + "builtinExtract", + "builtinGroupConcat", + "builtinMax", + "builtinMin", + "builtinPosition", + "builtinStddevPop", + "builtinStddevSamp", + "builtinSubDate", + "builtinSubstring", + "builtinSum", + "builtinSysDate", + "builtinTrim", + "builtinUser", + "builtinVarPop", + "builtinVarSamp", + "caseKwd", + "cumeDist", + "currentDate", + "currentRole", + "currentTime", + "denseRank", + "firstValue", + "lag", + "lastValue", + "lead", + "not2", + "nthValue", + "ntile", + "percentRank", + "rank", + "repeat", + "rowNumber", + "utcDate", + "utcTime", + "utcTimestamp", + "unique", + "references", + "pipes", + "generated", + "ignore", + "selectKwd", + "index", + "character", + "Identifier", + "NotKeywordToken", + "TiDBKeyword", + "UnReservedKeyword", + "packKeys", + "preSplitRegions", + "shardRowIDBits", + "jss", + "juss", + "to", + "by", + "lines", + "assignmentEq", + "require", + "force", + "use", + "sql", + "into", + "'@'", + "cascade", + "drop", + "restrict", + "analyze", + "read", + "alter", + "foreign", + "fulltext", + "change", + "rename", + "varcharacter", + "varcharType", + "']'", + "decimalType", + "doubleType", + "floatType", + "integerType", + "intType", + "match", + "realType", + "add", + "optimize", + "varbinaryType", + "write", + "bigIntType", + "blobType", + "int1Type", + "int2Type", + "int3Type", + "int4Type", + "int8Type", + "long", + "longblobType", + "longtextType", + "mediumblobType", + "mediumIntType", + "mediumtextType", + "numericType", + "nvarcharType", + "smallIntType", + "tinyblobType", + "tinyIntType", + "tinytextType", + "SubSelect", + "UserVariable", + "SimpleIdent", + "Literal", + "StringLiteral", + "FunctionCallGeneric", + "FunctionCallKeyword", + "FunctionCallNonKeyword", + "FunctionNameConflict", + "FunctionNameDateArith", + "FunctionNameDateArithMultiForms", + "FunctionNameDatetimePrecision", + "FunctionNameOptionalBraces", + "SimpleExpr", + "SumExpr", + "SystemVariable", + "Variable", + "WindowFuncCall", + "BitExpr", + "PredicateExpr", + "BoolPri", + "Expression", + "logAnd", + "logOr", + "NUM", + "TableName", + "all", + "StringName", + "unsigned", + "zerofill", + "ColumnName", + "over", + "EqOpt", + "tableKwd", + "SelectStmt", + "SelectStmtBasic", + "SelectStmtFromDualTable", + "SelectStmtFromTable", + "WindowingClause", + "hintEnd", + "LengthNum", + "FieldLen", + "sqlCalcFoundRows", + "update", + "CharsetKw", + "UnionSelect", + "UnionClauseList", + "UnionStmt", + "deleteKwd", + "QueryBlockOpt", + "OptWindowingClause", + "delayed", + "highPriority", + "lowPriority", + "sqlBigResult", + "terminated", + "distinct", + "distinctRow", + "Username", + "enclosed", + "ExpressionList", + "OptFieldLen", + "sqlSmallResult", + "escaped", + "JoinTable", + "optionally", + "PartitionNameList", + "TableFactor", + "TableRef", + "DefaultKwdOpt", + "DistinctKwd", + "DistinctOpt", + "FromOrIn", + "Rolename", + "RoleNameString", + "TableNameList", + "CharsetName", + "DefaultFalseDistinctOpt", + "IfExists", + "IfNotExists", + "OptBinary", + "OrderBy", + "OrderByOptional", + "TimestampUnit", + "BuggyDefaultFalseDistinctOpt", + "JoinType", + "noWriteToBinLog", + "AnalyzeOptionListOpt", + "CrossOpt", + "DeleteFromStmt", + "IndexColName", + "IndexNameList", + "InsertIntoStmt", + "KeyOrIndex", + "PartDefOption", + "ReplaceIntoStmt", + "RolenameList", + "SelectStmtLimit", + "TimeUnit", + "UpdateStmt", + "VariableName", + "AllOrPartitionNameList", + "ColumnDef", + "ColumnNameList", + "EscapedTableRef", + "ExprOrDefault", + "HintTable", + "IndexColNameList", + "NoWriteToBinLogAliasOpt", + "ShowDatabaseNameOpt", + "varying", + "WhereClause", + "WhereClauseOptional", + "column", + "create", + "DatabaseOption", + "DBName", + "EqOrAssignmentEq", + "grant", + "IndexInvisible", + "IndexType", + "NumLiteral", + "RowFormat", + "RowValue", + "SelectLockOpt", + "show", + "ShowLikeOrWhereOpt", + "TableOption", + "TableRefs", + "AlgorithmClause", + "ByItem", + "ColumnKeywordOpt", + "ExpressionListOpt", + "FieldOpt", + "FieldOpts", + "IndexName", + "IndexOption", + "IndexOptionList", + "LockClause", + "OptNullTreatment", + "PriorityOpt", + "TableAsName", + "UsernameList", + "UserSpec", + "Assignment", + "AuthString", + "BeginTransactionStmt", + "ByList", + "CollationName", + "CommitStmt", + "ExplainableStmt", + "FieldTerminator", + "FloatOpt", + "HintTableList", + "IgnoreOptional", + "IndexTypeName", + "LimitOption", + "load", + "LoadDataStmt", + "option", + "outer", + "Precision", + "ReferDef", + "RestrictOrCascadeOpt", + "RollbackStmt", + "SetExpr", + "SetStmt", + "TransactionChar", + "UserSpecList", + "WindowName", + "'['", + "AssignmentList", + "ColumnOption", + "ColumnPosition", + "Constraint", + "constraint", + "ConstraintKeywordOpt", + "DatabaseOptionList", + "DatabaseSym", + "EnforcedOrNot", + "FieldsOrColumns", + "GeneratedAlways", + "GlobalScope", + "hintBegin", + "IndexHint", + "IndexHintType", + "IndexNameAndTypeOpt", + "infile", + "keys", + "maxValue", + "OptCharset", + "Order", + "PartitionDefinition", + "PasswordExpire", + "PasswordOrLockOption", + "PluginNameList", + "PrimaryOpt", + "PrivElem", + "PrivType", + "StorageOptimizerHintOpt", + "TableOptimizerHintOpt", + "TableOptimizerHints", + "TableOptionList", + "TransactionChars", + "trigger", + "unlock", + "usage", + "ValuesList", + "ValueSym", + "VariableAssignment", + "WindowFrameStart", + "AdminStmt", + "AlterDatabaseStmt", + "AlterOrderItem", + "AlterTableSpec", + "AlterTableStmt", + "AlterUserStmt", + "AnalyzeOption", + "AnalyzeTableStmt", + "BinlogStmt", + "CastType", + "ChangeStmt", + "ColumnNameListOpt", + "ColumnNameOrUserVariable", + "ColumnOptionList", + "ColumnOptionListOpt", + "ColumnSetValue", + "ConnectionOption", + "ConnectionOptions", + "CreateBindingStmt", + "CreateDatabaseStmt", + "CreateIndexStmt", + "CreateRoleStmt", + "CreateTableStmt", + "CreateUserStmt", + "CreateViewStmt", + "databases", + "DeallocateStmt", + "DeallocateSym", + "describe", + "DoStmt", + "DropBindingStmt", + "DropDatabaseStmt", + "DropIndexStmt", + "DropRoleStmt", + "DropStatsStmt", + "DropTableStmt", + "DropUserStmt", + "DropViewStmt", + "DuplicateOpt", + "EmptyStmt", + "EnforcedOrNotOpt", + "ExecuteStmt", + "explain", + "ExplainStmt", + "ExplainSym", + "Field", + "FieldAsName", + "FieldAsNameOpt", + "FieldItem", + "FlushStmt", + "FromDual", + "FuncDatetimePrecList", + "FuncDatetimePrecListOpt", + "GrantRoleStmt", + "GrantStmt", + "HandleRange", + "HashString", + "HintStorageType", + "HintStorageTypeAndTable", + "HintTrueOrFalse", + "IndexHintList", + "IndexHintListOpt", + "IndexLockAndAlgorithmOpt", + "InsertValues", + "IntoOpt", + "KeyOrIndexOpt", + "kill", + "KillOrKillTiDB", + "KillStmt", + "LimitClause", + "linear", + "LinearOpt", + "LoadDataSetItem", + "LoadStatsStmt", + "LockTablesStmt", + "MaxValueOrExpression", + "NowSym", + "NowSymFunc", + "NowSymOptionFraction", + "NumList", + "ObjectType", + "ODBCDateTimeType", + "odbcDateType", + "odbcTimestampType", + "odbcTimeType", + "OnDelete", + "OnUpdate", + "OptInteger", + "OptionalBraces", + "OptLeadLagInfo", + "OptLLDefault", + "OptTemporary", + "OuterOpt", + "PartDefOptionList", + "PartitionDefinitionList", + "PartitionDefinitionListOpt", + "PartitionOpt", + "PasswordOpt", + "PasswordOrLockOptionList", + "PasswordOrLockOptions", + "PreparedStmt", + "PrivElemList", + "PrivLevel", + "RecoverTableStmt", + "ReferOpt", + "RegexpSym", + "RenameTableStmt", + "RequireClause", + "RequireClauseOpt", + "RequireList", + "RequireListElement", + "revoke", + "RevokeRoleStmt", + "RevokeStmt", + "RoleSpec", + "SetDefaultRoleOpt", + "SetDefaultRoleStmt", + "SetRoleStmt", + "ShowProfileType", + "ShowStmt", + "ShowTableAliasOpt", + "SignedLiteral", + "SplitOption", + "SplitRegionStmt", + "Statement", + "StatsPersistentVal", + "StringList", + "SubPartDefinition", + "SubPartitionMethod", + "Symbol", + "TableAsNameOpt", + "TableElement", + "TableLock", + "TableNameListOpt", + "TableOrTables", + "TablesTerminalSym", + "TableToTable", + "TraceableStmt", + "TraceStmt", + "TruncateTableStmt", + "UnlockTablesStmt", + "UseStmt", + "Varchar", + "VariableAssignmentList", + "WhenClause", + "WindowDefinition", + "WindowFrameBound", + "WindowSpec", + "'='", + "AdminShowSlow", + "AlterOrderList", + "AlterTablePartitionOpt", + "AlterTableSpecList", + "AlterTableSpecListOpt", + "AnalyzeOptionList", + "AnyOrAll", + "AsOpt", + "AuthOption", + "BetweenOrNotOp", + "BitValueType", + "BlobType", + "BooleanType", + "both", + "Char", + "CharsetOpt", + "ClearPasswordExpireOptions", + "ColumnDefList", + "ColumnFormat", + "ColumnList", + "ColumnNameOrUserVariableList", + "ColumnNameOrUserVarListOpt", + "ColumnNameOrUserVarListOptWithBrackets", + "ColumnSetValueList", + "CompareOp", + "ConnectionOptionList", + "ConstraintElem", + "CreateTableOptionListOpt", + "CreateTableSelectOpt", + "DatabaseOptionListOpt", + "DateAndTimeType", + "DefaultTrueDistinctOpt", + "DefaultValueExpr", + "dual", + "ElseOpt", + "EnforcedOrNotOrNotNullOpt", + "error", + "except", + "ExplainFormatType", + "ExpressionOpt", + "FieldItemList", + "FieldList", + "Fields", + "FixedPointType", + "FloatingPointType", + "FlushOption", + "FuncDatetimePrec", + "GetFormatSelector", + "GroupByClause", + "HandleRangeList", + "HavingClause", + "HintMemoryQuota", + "HintQueryType", + "HintStorageTypeAndTableList", + "IgnoreLines", + "IndexColNameListOpt", + "IndexHintScope", + "IndexKeyTypeOpt", + "IndexTypeOpt", + "InOrNotOp", + "IntegerType", + "IsolationLevel", + "IsOrNotOp", + "leading", + "LikeEscapeOpt", + "LikeOrNotOp", + "LikeTableWithOrWithoutParen", + "Lines", + "LinesTerminated", + "LoadDataSetList", + "LoadDataSetSpecOpt", + "LocalOpt", + "LockType", + "Match", + "MatchOpt", + "MaxValueOrExpressionList", + "NChar", + "NumericType", + "NVarchar", + "OnDeleteUpdateOpt", + "OnDuplicateKeyUpdate", + "OptBinMod", + "OptCollate", + "OptExistingWindowName", + "OptFromFirstLast", + "OptFull", + "OptGConcatSeparator", + "OptimizerHintList", + "OptPartitionClause", + "OptTable", + "OptWindowFrameClause", + "OptWindowOrderByClause", + "OrReplace", + "parser", + "PartDefValuesOpt", + "PartitionKeyAlgorithmOpt", + "PartitionMethod", + "PartitionNameListOpt", + "PartitionNumOpt", + "precisionType", + "PrepareSQL", + "procedure", + "QuickOptional", + "RegexpOrNotOp", + "ReorganizePartitionRuleOpt", + "RoleSpecList", + "SelectStmtCalcFoundRows", + "SelectStmtFieldList", + "SelectStmtGroup", + "SelectStmtOpts", + "SelectStmtSQLBigResult", + "SelectStmtSQLBufferResult", + "SelectStmtSQLCache", + "SelectStmtSQLSmallResult", + "SelectStmtStraightJoin", + "SetRoleOpt", + "ShowIndexKwd", + "ShowProfileArgsOpt", + "ShowProfileTypes", + "ShowProfileTypesOpt", + "ShowTargetFilterable", + "spatial", + "ssl", + "Start", + "Starting", + "starting", + "StatementList", + "stored", + "StringType", + "SubPartDefinitionList", + "SubPartDefinitionListOpt", + "SubPartitionNumOpt", + "SubPartitionOpt", + "TableElementList", + "TableElementListOpt", + "TableLockList", + "TableRefsClause", + "TableToTableList", + "TextType", + "trailing", + "TrimDirection", + "Type", + "UnionOpt", + "UserVariableList", + "UsingRoles", + "Values", + "ValuesOpt", + "ViewAlgorithm", + "ViewCheckOption", + "ViewDefiner", + "ViewFieldList", + "ViewName", + "ViewSQLSecurity", + "virtual", + "VirtualOrStored", + "WhenClauseList", + "WindowClauseOptional", + "WindowDefinitionList", + "WindowFrameBetween", + "WindowFrameExtent", + "WindowFrameUnits", + "WindowNameOrSpec", + "WindowSpecDetails", + "WithGrantOptionOpt", + "WithReadLockOpt", + "WithValidation", + "WithValidationOpt", + "$default", + "andnot", + "AssignmentListOpt", + "CommaOpt", + "createTableSelect", + "empty", + "higherThanComma", + "insertValues", + "invalid", + "lowerThanCharsetKwd", + "lowerThanComma", + "lowerThanCreateTableSelect", + "lowerThanEq", + "lowerThanInsertValues", + "lowerThanIntervalKeyword", + "lowerThanKey", + "lowerThanLocal", + "lowerThanNot", + "lowerThanOn", + "lowerThanRemove", + "lowerThanSetKeyword", + "lowerThanStringLitToken", + "lowerThenOrder", + "neg", + "splitOptionPriv", + "tableRefPriority", + } + + yyReductions = []struct{ xsym, components int }{ + {0, 1}, + {1042, 1}, + {774, 6}, + {774, 8}, + {774, 10}, + {921, 1}, + {921, 2}, + {773, 1}, + {773, 5}, + {773, 5}, + {773, 6}, + {773, 2}, + {773, 5}, + {773, 6}, + {773, 3}, + {773, 4}, + {773, 5}, + {773, 3}, + {773, 4}, + {773, 7}, + {773, 3}, + {773, 4}, + {773, 4}, + {773, 4}, + {773, 4}, + {773, 2}, + {773, 2}, + {773, 4}, + {773, 4}, + {773, 4}, + {773, 5}, + {773, 3}, + {773, 2}, + {773, 2}, + {773, 5}, + {773, 6}, + {773, 6}, + {773, 8}, + {773, 5}, + {773, 5}, + {773, 3}, + {773, 3}, + {773, 3}, + {773, 5}, + {773, 1}, + {773, 1}, + {773, 1}, + {773, 2}, + {773, 2}, + {773, 1}, + {773, 1}, + {773, 4}, + {773, 3}, + {773, 4}, + {1023, 0}, + {1023, 5}, + {660, 1}, + {660, 1}, + {1085, 0}, + {1085, 1}, + {1084, 2}, + {1084, 2}, + {688, 3}, + {688, 3}, + {688, 3}, + {688, 3}, + {688, 3}, + {697, 3}, + {697, 3}, + {652, 1}, + {652, 1}, + {835, 0}, + {835, 1}, + {690, 0}, + {690, 1}, + {732, 0}, + {732, 1}, + {732, 2}, + {923, 0}, + {923, 1}, + {922, 1}, + {922, 3}, + {625, 1}, + {625, 3}, + {735, 0}, + {735, 1}, + {735, 2}, + {899, 1}, + {876, 3}, + {1056, 1}, + {1056, 3}, + {906, 3}, + {873, 5}, + {873, 3}, + {873, 4}, + {893, 4}, + {893, 6}, + {892, 6}, + {892, 2}, + {777, 4}, + {777, 6}, + {777, 7}, + {777, 6}, + {777, 8}, + {777, 9}, + {646, 0}, + {646, 2}, + {924, 1}, + {924, 3}, + {776, 2}, + {776, 2}, + {776, 3}, + {776, 3}, + {776, 2}, + {703, 3}, + {730, 1}, + {730, 3}, + {1088, 0}, + {1088, 1}, + {705, 1}, + {705, 2}, + {705, 2}, + {705, 2}, + {705, 5}, + {778, 2}, + {936, 1}, + {936, 3}, + {661, 3}, + {661, 3}, + {589, 1}, + {589, 3}, + {589, 5}, + {662, 1}, + {662, 3}, + {781, 0}, + {781, 1}, + {940, 0}, + {940, 1}, + {939, 1}, + {939, 3}, + {782, 1}, + {782, 1}, + {941, 0}, + {941, 3}, + {708, 1}, + {755, 0}, + {755, 1}, + {738, 1}, + {738, 2}, + {810, 0}, + {810, 1}, + {954, 2}, + {954, 1}, + {731, 2}, + {731, 1}, + {731, 1}, + {731, 2}, + {731, 1}, + {731, 2}, + {731, 2}, + {731, 3}, + {731, 3}, + {731, 2}, + {731, 5}, + {731, 6}, + {731, 1}, + {731, 2}, + {731, 2}, + {937, 1}, + {937, 1}, + {937, 1}, + {740, 0}, + {740, 2}, + {1073, 0}, + {1073, 1}, + {1073, 1}, + {783, 1}, + {783, 2}, + {784, 0}, + {784, 1}, + {945, 7}, + {945, 7}, + {945, 7}, + {945, 7}, + {945, 8}, + {945, 5}, + {992, 2}, + {992, 2}, + {992, 2}, + {993, 0}, + {993, 1}, + {721, 5}, + {974, 0}, + {974, 3}, + {855, 3}, + {856, 3}, + {998, 0}, + {998, 1}, + {998, 1}, + {998, 2}, + {998, 2}, + {874, 1}, + {874, 1}, + {874, 2}, + {874, 2}, + {874, 2}, + {951, 1}, + {951, 1}, + {848, 1}, + {848, 3}, + {848, 4}, + {847, 1}, + {847, 1}, + {847, 1}, + {847, 1}, + {846, 1}, + {846, 1}, + {846, 1}, + {891, 1}, + {891, 2}, + {891, 2}, + {680, 1}, + {680, 1}, + {680, 1}, + {790, 13}, + {649, 3}, + {666, 1}, + {666, 3}, + {832, 0}, + {832, 1}, + {832, 1}, + {832, 2}, + {832, 2}, + {976, 0}, + {976, 1}, + {976, 1}, + {976, 1}, + {771, 4}, + {771, 3}, + {789, 5}, + {675, 1}, + {674, 4}, + {674, 4}, + {674, 4}, + {948, 0}, + {948, 1}, + {736, 1}, + {736, 2}, + {792, 11}, + {792, 6}, + {628, 0}, + {628, 1}, + {866, 0}, + {866, 6}, + {898, 6}, + {898, 5}, + {1014, 0}, + {1014, 3}, + {1015, 1}, + {1015, 4}, + {1015, 5}, + {1015, 4}, + {1015, 5}, + {1015, 4}, + {1015, 3}, + {1015, 1}, + {841, 0}, + {841, 1}, + {1051, 0}, + {1051, 4}, + {1050, 0}, + {1050, 2}, + {1017, 0}, + {1017, 2}, + {865, 0}, + {865, 3}, + {864, 1}, + {864, 3}, + {751, 5}, + {1049, 0}, + {1049, 3}, + {1048, 1}, + {1048, 3}, + {897, 3}, + {863, 0}, + {863, 2}, + {653, 3}, + {653, 3}, + {653, 3}, + {653, 4}, + {653, 4}, + {653, 3}, + {653, 3}, + {653, 3}, + {653, 3}, + {1013, 0}, + {1013, 4}, + {1013, 6}, + {1013, 1}, + {1013, 5}, + {1013, 1}, + {1013, 1}, + {808, 0}, + {808, 1}, + {808, 1}, + {926, 0}, + {926, 1}, + {947, 0}, + {947, 1}, + {947, 1}, + {947, 1}, + {985, 2}, + {985, 4}, + {794, 11}, + {1011, 0}, + {1011, 2}, + {1066, 0}, + {1066, 3}, + {1066, 3}, + {1066, 3}, + {1068, 0}, + {1068, 3}, + {1071, 0}, + {1071, 3}, + {1071, 3}, + {1070, 1}, + {1069, 0}, + {1069, 3}, + {938, 1}, + {938, 3}, + {1067, 0}, + {1067, 4}, + {1067, 4}, + {799, 2}, + {648, 12}, + {648, 9}, + {648, 10}, + {737, 1}, + {801, 4}, + {802, 7}, + {805, 6}, + {861, 0}, + {861, 1}, + {807, 4}, + {807, 6}, + {806, 3}, + {806, 5}, + {803, 3}, + {803, 5}, + {804, 3}, + {722, 0}, + {722, 1}, + {722, 1}, + {904, 1}, + {904, 1}, + {591, 0}, + {591, 1}, + {809, 0}, + {908, 2}, + {908, 5}, + {814, 1}, + {814, 1}, + {814, 1}, + {813, 2}, + {813, 3}, + {813, 2}, + {813, 4}, + {813, 7}, + {813, 5}, + {813, 7}, + {813, 5}, + {813, 3}, + {957, 1}, + {957, 1}, + {599, 1}, + {583, 1}, + {580, 3}, + {580, 3}, + {580, 3}, + {580, 3}, + {580, 2}, + {580, 3}, + {580, 3}, + {580, 3}, + {580, 1}, + {845, 1}, + {845, 1}, + {582, 1}, + {582, 1}, + {581, 1}, + {581, 1}, + {619, 1}, + {619, 3}, + {994, 1}, + {994, 3}, + {691, 0}, + {691, 1}, + {822, 0}, + {822, 1}, + {821, 1}, + {579, 3}, + {579, 3}, + {579, 4}, + {579, 5}, + {579, 1}, + {943, 1}, + {943, 1}, + {943, 1}, + {943, 1}, + {943, 1}, + {943, 1}, + {943, 1}, + {943, 1}, + {928, 1}, + {928, 2}, + {981, 1}, + {981, 2}, + {978, 1}, + {978, 2}, + {984, 1}, + {984, 2}, + {1022, 1}, + {1022, 2}, + {925, 1}, + {925, 1}, + {925, 1}, + {578, 5}, + {578, 3}, + {578, 5}, + {578, 4}, + {578, 3}, + {578, 1}, + {875, 1}, + {875, 1}, + {983, 0}, + {983, 2}, + {815, 1}, + {815, 3}, + {815, 5}, + {815, 2}, + {815, 5}, + {817, 0}, + {817, 1}, + {816, 1}, + {816, 2}, + {816, 1}, + {816, 2}, + {960, 1}, + {960, 3}, + {967, 3}, + {969, 0}, + {969, 2}, + {637, 0}, + {637, 2}, + {638, 0}, + {638, 3}, + {713, 0}, + {713, 1}, + {694, 0}, + {694, 1}, + {696, 0}, + {696, 2}, + {695, 3}, + {695, 1}, + {695, 3}, + {695, 2}, + {695, 1}, + {745, 1}, + {745, 3}, + {745, 3}, + {977, 0}, + {977, 1}, + {679, 2}, + {679, 2}, + {714, 1}, + {714, 1}, + {714, 1}, + {678, 1}, + {678, 1}, + {497, 1}, + {497, 1}, + {497, 1}, + {497, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {500, 1}, + {499, 1}, + {499, 1}, + {499, 1}, + {499, 1}, + {499, 1}, + {499, 1}, + {499, 1}, + {499, 1}, + {499, 1}, + {499, 1}, + {499, 1}, + {499, 1}, + {499, 1}, + {499, 1}, + {499, 1}, + {499, 1}, + {499, 1}, + {499, 1}, + {499, 1}, + {499, 1}, + {499, 1}, + {499, 1}, + {499, 1}, + {499, 1}, + {499, 1}, + {499, 1}, + {499, 1}, + {499, 1}, + {499, 1}, + {499, 1}, + {499, 1}, + {499, 1}, + {499, 1}, + {499, 1}, + {499, 1}, + {499, 1}, + {499, 1}, + {499, 1}, + {499, 1}, + {499, 1}, + {499, 1}, + {499, 1}, + {499, 1}, + {499, 1}, + {499, 1}, + {498, 1}, + {498, 1}, + {498, 1}, + {498, 1}, + {498, 1}, + {498, 1}, + {498, 1}, + {498, 1}, + {498, 1}, + {498, 1}, + {498, 1}, + {498, 1}, + {498, 1}, + {498, 1}, + {498, 1}, + {498, 1}, + {498, 1}, + {498, 1}, + {498, 1}, + {498, 1}, + {498, 1}, + {498, 1}, + {498, 1}, + {498, 1}, + {498, 1}, + {498, 1}, + {498, 1}, + {498, 1}, + {498, 1}, + {498, 1}, + {498, 1}, + {498, 1}, + {498, 1}, + {498, 1}, + {498, 1}, + {498, 1}, + {498, 1}, + {498, 1}, + {498, 1}, + {498, 1}, + {498, 1}, + {498, 1}, + {498, 1}, + {498, 1}, + {498, 1}, + {498, 1}, + {498, 1}, + {651, 7}, + {834, 0}, + {834, 1}, + {833, 5}, + {833, 4}, + {833, 6}, + {833, 4}, + {833, 2}, + {833, 3}, + {833, 1}, + {833, 1}, + {833, 2}, + {767, 1}, + {767, 1}, + {766, 1}, + {766, 3}, + {682, 3}, + {1065, 0}, + {1065, 1}, + {1064, 3}, + {1064, 1}, + {664, 1}, + {664, 1}, + {785, 3}, + {942, 0}, + {942, 1}, + {942, 3}, + {999, 0}, + {999, 5}, + {654, 5}, + {851, 1}, + {851, 1}, + {851, 1}, + {562, 1}, + {562, 1}, + {562, 1}, + {562, 1}, + {562, 1}, + {562, 1}, + {562, 1}, + {562, 2}, + {562, 1}, + {562, 1}, + {563, 1}, + {563, 2}, + {920, 1}, + {920, 3}, + {772, 2}, + {640, 3}, + {706, 1}, + {706, 3}, + {689, 2}, + {750, 0}, + {750, 1}, + {750, 1}, + {641, 0}, + {641, 1}, + {577, 3}, + {577, 3}, + {577, 3}, + {577, 3}, + {577, 3}, + {577, 3}, + {577, 5}, + {577, 5}, + {577, 3}, + {577, 3}, + {577, 3}, + {577, 3}, + {577, 3}, + {577, 3}, + {577, 1}, + {561, 1}, + {561, 3}, + {561, 4}, + {561, 5}, + {572, 1}, + {572, 1}, + {572, 1}, + {572, 1}, + {572, 3}, + {572, 1}, + {572, 1}, + {572, 1}, + {572, 1}, + {572, 1}, + {572, 2}, + {572, 2}, + {572, 2}, + {572, 2}, + {572, 3}, + {572, 2}, + {572, 1}, + {572, 3}, + {572, 5}, + {572, 6}, + {572, 2}, + {572, 2}, + {572, 6}, + {572, 5}, + {572, 6}, + {572, 6}, + {572, 4}, + {572, 4}, + {572, 3}, + {572, 3}, + {629, 1}, + {629, 1}, + {630, 1}, + {630, 1}, + {636, 0}, + {636, 1}, + {950, 0}, + {950, 1}, + {643, 1}, + {643, 2}, + {567, 1}, + {567, 1}, + {567, 1}, + {567, 1}, + {567, 1}, + {567, 1}, + {567, 1}, + {567, 1}, + {567, 1}, + {567, 1}, + {567, 1}, + {567, 1}, + {567, 1}, + {567, 1}, + {567, 1}, + {567, 1}, + {567, 1}, + {567, 1}, + {567, 1}, + {567, 1}, + {567, 1}, + {567, 1}, + {567, 1}, + {567, 1}, + {567, 1}, + {567, 1}, + {567, 1}, + {567, 1}, + {567, 1}, + {858, 0}, + {858, 2}, + {571, 1}, + {571, 1}, + {571, 1}, + {571, 1}, + {570, 1}, + {570, 1}, + {570, 1}, + {570, 1}, + {570, 1}, + {570, 1}, + {565, 4}, + {565, 4}, + {565, 2}, + {565, 3}, + {565, 2}, + {565, 4}, + {565, 6}, + {565, 2}, + {565, 2}, + {565, 2}, + {565, 4}, + {565, 6}, + {565, 4}, + {565, 4}, + {566, 4}, + {566, 4}, + {566, 6}, + {566, 8}, + {566, 8}, + {566, 6}, + {566, 6}, + {566, 6}, + {566, 6}, + {566, 6}, + {566, 8}, + {566, 8}, + {566, 8}, + {566, 8}, + {566, 4}, + {566, 6}, + {566, 6}, + {566, 7}, + {966, 1}, + {966, 1}, + {966, 1}, + {966, 1}, + {568, 1}, + {568, 1}, + {569, 1}, + {569, 1}, + {1059, 1}, + {1059, 1}, + {1059, 1}, + {573, 6}, + {573, 5}, + {573, 6}, + {573, 5}, + {573, 6}, + {573, 5}, + {573, 6}, + {573, 5}, + {573, 6}, + {573, 5}, + {573, 5}, + {573, 7}, + {573, 6}, + {573, 6}, + {573, 6}, + {573, 6}, + {573, 6}, + {573, 6}, + {573, 6}, + {1005, 0}, + {1005, 2}, + {564, 4}, + {965, 0}, + {965, 2}, + {965, 3}, + {657, 1}, + {657, 1}, + {657, 1}, + {657, 1}, + {657, 1}, + {657, 1}, + {657, 1}, + {657, 1}, + {657, 1}, + {657, 1}, + {657, 1}, + {657, 1}, + {642, 1}, + {642, 1}, + {642, 1}, + {642, 1}, + {642, 1}, + {642, 1}, + {642, 1}, + {642, 1}, + {642, 1}, + {642, 1}, + {642, 1}, + {642, 1}, + {642, 1}, + {642, 1}, + {642, 1}, + {642, 1}, + {642, 1}, + {958, 0}, + {958, 1}, + {1074, 1}, + {1074, 2}, + {914, 4}, + {953, 0}, + {953, 2}, + {779, 2}, + {779, 3}, + {779, 1}, + {779, 2}, + {779, 2}, + {779, 2}, + {779, 2}, + {779, 2}, + {779, 1}, + {779, 1}, + {779, 2}, + {779, 1}, + {699, 0}, + {699, 1}, + {699, 1}, + {699, 1}, + {584, 1}, + {584, 3}, + {584, 3}, + {634, 1}, + {634, 3}, + {1021, 0}, + {1021, 1}, + {870, 4}, + {1019, 1}, + {1019, 1}, + {811, 2}, + {811, 4}, + {1062, 1}, + {1062, 3}, + {796, 3}, + {797, 1}, + {797, 1}, + {723, 1}, + {594, 3}, + {595, 3}, + {596, 7}, + {593, 4}, + {593, 4}, + {593, 4}, + {820, 2}, + {1075, 0}, + {1075, 2}, + {1076, 1}, + {1076, 3}, + {915, 3}, + {728, 1}, + {917, 3}, + {1081, 4}, + {1002, 0}, + {1002, 1}, + {1007, 0}, + {1007, 3}, + {1010, 0}, + {1010, 3}, + {1009, 0}, + {1009, 2}, + {1079, 1}, + {1079, 1}, + {1079, 1}, + {1078, 1}, + {1078, 1}, + {769, 2}, + {769, 2}, + {769, 2}, + {769, 4}, + {769, 2}, + {1077, 4}, + {916, 1}, + {916, 2}, + {916, 2}, + {916, 2}, + {916, 4}, + {609, 0}, + {609, 1}, + {597, 2}, + {1080, 1}, + {1080, 1}, + {576, 4}, + {576, 4}, + {576, 4}, + {576, 4}, + {576, 4}, + {576, 5}, + {576, 7}, + {576, 7}, + {576, 6}, + {576, 6}, + {576, 9}, + {859, 0}, + {859, 3}, + {859, 3}, + {860, 0}, + {860, 2}, + {698, 0}, + {698, 2}, + {698, 2}, + {1003, 0}, + {1003, 2}, + {1003, 2}, + {1055, 1}, + {687, 1}, + {687, 3}, + {663, 1}, + {663, 4}, + {627, 1}, + {627, 1}, + {626, 4}, + {626, 4}, + {626, 4}, + {626, 3}, + {1016, 0}, + {1016, 4}, + {900, 0}, + {900, 1}, + {700, 1}, + {700, 2}, + {744, 2}, + {744, 2}, + {744, 2}, + {975, 0}, + {975, 2}, + {975, 3}, + {975, 3}, + {743, 5}, + {650, 0}, + {650, 1}, + {650, 3}, + {650, 1}, + {830, 1}, + {830, 2}, + {831, 0}, + {831, 1}, + {623, 3}, + {623, 5}, + {623, 7}, + {623, 7}, + {623, 9}, + {623, 4}, + {623, 6}, + {623, 3}, + {623, 5}, + {644, 1}, + {644, 1}, + {862, 0}, + {862, 1}, + {647, 1}, + {647, 2}, + {647, 2}, + {839, 0}, + {839, 2}, + {715, 1}, + {715, 1}, + {656, 0}, + {656, 2}, + {656, 4}, + {656, 4}, + {1028, 9}, + {760, 0}, + {760, 3}, + {760, 3}, + {1006, 1}, + {1006, 1}, + {1006, 2}, + {1006, 3}, + {1006, 2}, + {1006, 3}, + {759, 6}, + {759, 5}, + {759, 5}, + {759, 5}, + {759, 6}, + {759, 5}, + {759, 5}, + {759, 5}, + {759, 4}, + {759, 5}, + {759, 5}, + {759, 4}, + {759, 4}, + {759, 4}, + {759, 4}, + {759, 4}, + {759, 4}, + {758, 5}, + {972, 1}, + {972, 3}, + {828, 4}, + {608, 0}, + {608, 1}, + {665, 2}, + {712, 1}, + {712, 3}, + {829, 1}, + {829, 1}, + {827, 1}, + {827, 1}, + {971, 1}, + {971, 1}, + {970, 2}, + {1025, 0}, + {1025, 1}, + {1029, 0}, + {1029, 1}, + {1030, 0}, + {1030, 1}, + {1031, 0}, + {1031, 1}, + {1031, 1}, + {1032, 0}, + {1032, 1}, + {1033, 0}, + {1033, 1}, + {1026, 1}, + {1027, 0}, + {1027, 1}, + {559, 3}, + {559, 3}, + {683, 0}, + {683, 2}, + {683, 4}, + {606, 7}, + {606, 7}, + {606, 7}, + {606, 8}, + {605, 1}, + {605, 4}, + {604, 1}, + {604, 3}, + {1061, 1}, + {780, 9}, + {780, 9}, + {725, 2}, + {725, 4}, + {725, 6}, + {725, 4}, + {725, 4}, + {725, 3}, + {887, 3}, + {886, 6}, + {885, 1}, + {885, 1}, + {885, 1}, + {1034, 3}, + {1034, 1}, + {1034, 1}, + {762, 1}, + {762, 3}, + {726, 3}, + {726, 2}, + {726, 2}, + {980, 2}, + {980, 2}, + {980, 2}, + {980, 1}, + {724, 1}, + {724, 1}, + {676, 1}, + {676, 1}, + {659, 1}, + {659, 3}, + {768, 3}, + {768, 4}, + {768, 4}, + {768, 4}, + {768, 3}, + {768, 3}, + {768, 2}, + {768, 4}, + {768, 4}, + {768, 2}, + {635, 1}, + {635, 1}, + {707, 1}, + {913, 0}, + {913, 1}, + {913, 3}, + {575, 1}, + {575, 1}, + {574, 1}, + {560, 1}, + {617, 1}, + {617, 3}, + {617, 2}, + {617, 2}, + {701, 1}, + {701, 3}, + {867, 1}, + {867, 4}, + {704, 1}, + {633, 1}, + {633, 1}, + {632, 1}, + {632, 3}, + {632, 2}, + {655, 1}, + {655, 3}, + {770, 3}, + {770, 4}, + {770, 5}, + {770, 4}, + {770, 4}, + {770, 5}, + {770, 5}, + {770, 5}, + {770, 6}, + {770, 4}, + {770, 5}, + {770, 6}, + {770, 4}, + {770, 3}, + {770, 3}, + {770, 4}, + {770, 4}, + {770, 5}, + {919, 2}, + {919, 2}, + {919, 3}, + {919, 3}, + {968, 1}, + {968, 3}, + {825, 5}, + {849, 1}, + {849, 3}, + {889, 3}, + {889, 4}, + {889, 4}, + {889, 5}, + {889, 4}, + {889, 4}, + {889, 6}, + {889, 2}, + {889, 5}, + {889, 3}, + {889, 3}, + {889, 3}, + {889, 3}, + {889, 3}, + {889, 3}, + {889, 2}, + {889, 5}, + {889, 2}, + {889, 4}, + {1038, 0}, + {1038, 1}, + {1037, 1}, + {1037, 3}, + {888, 1}, + {888, 1}, + {888, 2}, + {888, 2}, + {888, 2}, + {888, 1}, + {888, 1}, + {888, 1}, + {888, 1}, + {1036, 0}, + {1036, 3}, + {1063, 0}, + {1063, 2}, + {1035, 1}, + {1035, 1}, + {1035, 1}, + {631, 1}, + {631, 1}, + {1039, 1}, + {1039, 1}, + {1039, 1}, + {1039, 3}, + {1039, 3}, + {1039, 3}, + {1039, 3}, + {1039, 5}, + {1039, 4}, + {1039, 4}, + {1039, 1}, + {1039, 1}, + {1039, 2}, + {1039, 2}, + {1039, 2}, + {1039, 1}, + {1039, 2}, + {1039, 2}, + {1039, 2}, + {1039, 2}, + {1039, 2}, + {1039, 2}, + {1039, 1}, + {685, 0}, + {685, 2}, + {685, 2}, + {741, 0}, + {741, 1}, + {741, 1}, + {1004, 0}, + {1004, 1}, + {668, 0}, + {668, 2}, + {890, 2}, + {819, 3}, + {754, 1}, + {754, 3}, + {964, 1}, + {964, 1}, + {964, 3}, + {964, 3}, + {667, 0}, + {667, 1}, + {667, 1}, + {903, 0}, + {903, 1}, + {1083, 0}, + {1083, 3}, + {894, 1}, + {894, 1}, + {894, 1}, + {894, 1}, + {894, 1}, + {894, 1}, + {894, 1}, + {894, 1}, + {894, 1}, + {894, 1}, + {894, 1}, + {894, 1}, + {894, 1}, + {894, 1}, + {894, 1}, + {894, 1}, + {894, 1}, + {894, 1}, + {894, 1}, + {894, 1}, + {894, 1}, + {894, 1}, + {894, 1}, + {894, 1}, + {894, 1}, + {894, 1}, + {894, 1}, + {894, 1}, + {894, 1}, + {894, 1}, + {894, 1}, + {894, 1}, + {894, 1}, + {894, 1}, + {894, 1}, + {894, 1}, + {894, 1}, + {894, 1}, + {894, 1}, + {894, 1}, + {894, 1}, + {894, 1}, + {894, 1}, + {894, 1}, + {894, 1}, + {894, 1}, + {894, 1}, + {894, 1}, + {894, 1}, + {894, 1}, + {894, 1}, + {894, 1}, + {894, 1}, + {894, 1}, + {894, 1}, + {894, 1}, + {894, 1}, + {894, 1}, + {907, 1}, + {907, 1}, + {907, 1}, + {907, 1}, + {907, 1}, + {907, 1}, + {907, 1}, + {907, 1}, + {907, 1}, + {907, 1}, + {907, 1}, + {709, 1}, + {709, 1}, + {709, 1}, + {709, 1}, + {709, 1}, + {709, 1}, + {1045, 1}, + {1045, 3}, + {733, 2}, + {901, 1}, + {901, 1}, + {1052, 1}, + {1052, 3}, + {1053, 0}, + {1053, 3}, + {686, 1}, + {686, 4}, + {686, 4}, + {686, 3}, + {686, 3}, + {686, 3}, + {686, 3}, + {686, 3}, + {686, 3}, + {686, 3}, + {686, 3}, + {686, 3}, + {686, 1}, + {686, 3}, + {686, 3}, + {686, 3}, + {686, 3}, + {686, 3}, + {686, 3}, + {686, 3}, + {686, 3}, + {686, 2}, + {686, 2}, + {686, 3}, + {686, 3}, + {686, 5}, + {686, 3}, + {895, 1}, + {895, 1}, + {946, 0}, + {946, 1}, + {761, 1}, + {761, 2}, + {761, 3}, + {1008, 0}, + {1008, 1}, + {909, 3}, + {681, 3}, + {681, 3}, + {681, 3}, + {681, 3}, + {681, 3}, + {681, 3}, + {681, 3}, + {681, 3}, + {681, 3}, + {681, 3}, + {681, 3}, + {681, 3}, + {681, 3}, + {681, 3}, + {1060, 1}, + {1060, 1}, + {1060, 1}, + {996, 3}, + {996, 2}, + {996, 3}, + {996, 3}, + {996, 2}, + {979, 1}, + {979, 1}, + {979, 1}, + {979, 1}, + {979, 1}, + {979, 1}, + {979, 1}, + {979, 1}, + {979, 1}, + {979, 1}, + {979, 1}, + {931, 1}, + {931, 1}, + {857, 0}, + {857, 1}, + {857, 1}, + {962, 1}, + {962, 1}, + {963, 1}, + {963, 1}, + {963, 1}, + {963, 2}, + {929, 1}, + {1047, 3}, + {1047, 2}, + {1047, 3}, + {1047, 2}, + {1047, 3}, + {1047, 3}, + {1047, 2}, + {1047, 2}, + {1047, 1}, + {1047, 2}, + {1047, 5}, + {1047, 5}, + {1047, 1}, + {1047, 3}, + {1047, 2}, + {933, 1}, + {933, 1}, + {995, 1}, + {995, 2}, + {995, 2}, + {912, 2}, + {912, 2}, + {912, 1}, + {912, 1}, + {997, 2}, + {997, 2}, + {997, 1}, + {997, 2}, + {997, 2}, + {997, 3}, + {997, 3}, + {997, 2}, + {930, 1}, + {930, 2}, + {930, 1}, + {930, 1}, + {930, 2}, + {1057, 1}, + {1057, 2}, + {1057, 1}, + {1057, 1}, + {949, 1}, + {949, 2}, + {949, 2}, + {949, 2}, + {949, 3}, + {600, 3}, + {620, 0}, + {620, 1}, + {692, 1}, + {692, 1}, + {692, 1}, + {693, 0}, + {693, 2}, + {711, 0}, + {711, 1}, + {711, 1}, + {720, 5}, + {1000, 0}, + {1000, 1}, + {639, 0}, + {639, 2}, + {639, 3}, + {749, 0}, + {749, 2}, + {603, 2}, + {603, 1}, + {603, 2}, + {1001, 0}, + {1001, 2}, + {896, 1}, + {896, 3}, + {586, 1}, + {586, 1}, + {658, 10}, + {658, 8}, + {911, 2}, + {670, 2}, + {671, 0}, + {671, 1}, + {1089, 0}, + {1089, 1}, + {793, 7}, + {791, 4}, + {775, 7}, + {775, 9}, + {702, 2}, + {727, 1}, + {727, 3}, + {787, 0}, + {787, 2}, + {944, 1}, + {944, 2}, + {786, 2}, + {786, 2}, + {786, 2}, + {786, 2}, + {878, 0}, + {878, 1}, + {877, 2}, + {877, 2}, + {877, 2}, + {877, 2}, + {879, 1}, + {879, 3}, + {880, 2}, + {880, 2}, + {880, 2}, + {869, 0}, + {869, 1}, + {868, 1}, + {868, 2}, + {753, 2}, + {753, 2}, + {753, 1}, + {753, 4}, + {753, 2}, + {753, 2}, + {752, 3}, + {935, 0}, + {927, 0}, + {927, 3}, + {927, 3}, + {927, 5}, + {927, 5}, + {927, 4}, + {826, 1}, + {884, 1}, + {1024, 1}, + {1024, 3}, + {788, 7}, + {800, 5}, + {824, 8}, + {823, 4}, + {1082, 0}, + {1082, 3}, + {1082, 3}, + {1082, 3}, + {1082, 3}, + {1082, 3}, + {756, 1}, + {756, 4}, + {871, 1}, + {871, 3}, + {757, 1}, + {757, 2}, + {757, 1}, + {757, 1}, + {757, 2}, + {757, 1}, + {757, 1}, + {757, 1}, + {757, 1}, + {757, 1}, + {757, 1}, + {757, 1}, + {757, 1}, + {757, 1}, + {757, 2}, + {757, 1}, + {757, 2}, + {757, 1}, + {757, 2}, + {757, 2}, + {757, 1}, + {757, 1}, + {757, 3}, + {757, 2}, + {757, 2}, + {757, 2}, + {757, 2}, + {757, 2}, + {757, 2}, + {757, 2}, + {757, 1}, + {850, 0}, + {850, 1}, + {872, 1}, + {872, 3}, + {872, 3}, + {872, 3}, + {872, 1}, + {883, 7}, + {882, 4}, + {717, 15}, + {973, 0}, + {973, 3}, + {934, 0}, + {934, 3}, + {990, 0}, + {990, 1}, + {961, 0}, + {961, 2}, + {739, 1}, + {739, 1}, + {959, 2}, + {959, 1}, + {818, 3}, + {818, 4}, + {818, 3}, + {818, 3}, + {710, 1}, + {710, 1}, + {710, 1}, + {986, 0}, + {986, 3}, + {1043, 0}, + {1043, 3}, + {987, 0}, + {987, 3}, + {989, 0}, + {989, 2}, + {988, 3}, + {988, 1}, + {842, 3}, + {910, 2}, + {844, 3}, + {905, 1}, + {905, 1}, + {902, 2}, + {991, 1}, + {991, 2}, + {991, 1}, + {991, 2}, + {1054, 1}, + {1054, 3}, + {838, 2}, + {838, 3}, + {838, 3}, + {837, 1}, + {837, 2}, + {843, 3}, + } + + yyXErrors = map[yyXError]string{} + + yyParseTab = [3252][]uint16{ + // 0 + {1523, 1523, 98: 1903, 102: 1888, 105: 1891, 113: 1907, 115: 1889, 117: 1979, 124: 1904, 134: 1885, 141: 1918, 1890, 152: 1906, 155: 1893, 158: 1920, 187: 1886, 200: 1896, 330: 1912, 348: 1986, 353: 1902, 359: 1917, 378: 1899, 418: 1901, 494: 1908, 512: 1981, 517: 1895, 519: 1887, 521: 1883, 524: 1916, 1884, 559: 1971, 593: 1915, 1909, 1910, 1911, 602: 1980, 604: 1914, 1913, 1965, 1894, 648: 1931, 651: 1954, 654: 1961, 658: 1974, 673: 1892, 677: 1982, 684: 1919, 705: 1927, 708: 1929, 716: 1984, 1956, 723: 1959, 725: 1966, 764: 1985, 770: 1922, 1923, 774: 1924, 1925, 777: 1926, 1928, 780: 1934, 788: 1941, 1935, 1936, 1940, 1937, 1939, 1938, 796: 1930, 1905, 1898, 1942, 1950, 1943, 1944, 1948, 1949, 1945, 1947, 1946, 809: 1921, 811: 1932, 1897, 1933, 1900, 819: 1951, 823: 1953, 1952, 836: 1988, 1987, 1955, 843: 1957, 1977, 870: 1958, 873: 1962, 876: 1960, 881: 1983, 1964, 1963, 886: 1968, 1967, 889: 1970, 893: 1969, 1978, 908: 1972, 1973, 1976, 1975, 1042: 1881, 1045: 1882}, + {1880}, + {1879, 5130}, + {101: 4929, 433: 4095, 493: 3309, 592: 1424, 713: 4927, 737: 4928}, + {592: 4919}, + // 5 + {592: 4913}, + {592: 4899}, + {230: 4864, 592: 4863}, + {1761, 1761, 247: 4862, 251: 4861}, + {278: 4857}, + // 10 + {332: 4856}, + {1736, 1736}, + {53: 1566, 57: 1566, 87: 1566, 94: 420, 100: 4184, 4183, 126: 3611, 135: 3612, 137: 4099, 354: 4182, 433: 4095, 489: 4176, 495: 1647, 513: 1566, 523: 4178, 592: 1539, 737: 4179, 741: 4185, 861: 4180, 976: 4175, 1011: 4181, 1040: 4177}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 2413, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 2765, 619: 4174}, + {2: 653, 653, 653, 6: 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 34: 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 360: 653, 493: 653, 610: 653, 653, 653, 742: 3303, 760: 4154}, + // 15 + {57: 4100, 60: 1539, 94: 420, 98: 779, 100: 4102, 4101, 126: 3611, 135: 3612, 137: 4099, 188: 4103, 433: 4095, 495: 4097, 592: 1539, 737: 4096, 741: 4104, 861: 4098}, + {102: 1888, 105: 1891, 113: 1907, 115: 1889, 225: 4078, 330: 3030, 353: 1902, 359: 4080, 418: 1901, 494: 1908, 593: 4079, 1909, 1910, 1911, 602: 1980, 604: 1914, 1913, 4085, 1894, 648: 4081, 651: 4083, 654: 4084, 658: 4082, 705: 4087, 708: 4088, 716: 4091, 4086, 723: 4089, 725: 4090, 907: 4077}, + {2: 1520, 1520, 1520, 6: 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 34: 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 347: 1520, 353: 1520, 418: 1520, 494: 1520, 519: 1520, 602: 1520, 607: 1520}, + {2: 1519, 1519, 1519, 6: 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 34: 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 347: 1519, 353: 1519, 418: 1519, 494: 1519, 519: 1519, 602: 1519, 607: 1519}, + {2: 1518, 1518, 1518, 6: 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 34: 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 347: 1518, 353: 1518, 418: 1518, 494: 1518, 519: 1518, 602: 1518, 607: 1518}, + // 20 + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 4052, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 3030, 347: 4051, 353: 1902, 418: 1901, 494: 1908, 497: 2328, 2001, 2002, 2000, 519: 4053, 584: 4049, 593: 4054, 1909, 1910, 1911, 602: 1980, 604: 1914, 1913, 4059, 1894, 648: 4055, 651: 4057, 654: 4058, 658: 4056, 709: 4050}, + {2: 799, 799, 799, 6: 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 34: 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 493: 799, 514: 799, 610: 3307, 3306, 3305, 699: 4038}, + {2: 799, 799, 799, 6: 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 34: 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 514: 799, 610: 3307, 3306, 3305, 699: 3996}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 3991, 2001, 2002, 2000}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 3985, 2001, 2002, 2000}, + // 25 + {98: 3983}, + {98: 780}, + {778, 778}, + {2: 653, 653, 653, 6: 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 34: 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 332: 653, 653, 335: 653, 653, 653, 340: 653, 653, 653, 344: 653, 353: 653, 356: 653, 362: 653, 653, 373: 653, 653, 380: 653, 404: 653, 406: 653, 417: 653, 653, 420: 653, 653, 653, 653, 653, 653, 653, 428: 653, 653, 653, 653, 653, 653, 653, 653, 437: 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 585: 653, 601: 653, 610: 653, 653, 653, 653, 615: 653, 653, 621: 653, 742: 3303, 760: 3942, 1028: 3941}, + {1017, 1017, 33: 1017, 331: 1017, 339: 1017, 343: 1017, 346: 1017, 1017, 1017, 1017, 351: 2768, 360: 3906, 640: 2769, 3938, 820: 3905}, + // 30 + {1017, 1017, 33: 1017, 331: 1017, 339: 1017, 343: 1017, 346: 1017, 1017, 1017, 1017, 351: 2768, 640: 2769, 3935}, + {1017, 1017, 33: 1017, 331: 1017, 339: 1017, 343: 1017, 346: 1017, 1017, 1017, 1017, 351: 2768, 640: 2769, 3932}, + {330: 3030, 494: 1908, 593: 3043, 1909, 1910, 1911, 604: 1914, 1913, 3029}, + {339: 3878}, + {339: 586}, + // 35 + {354, 354, 339: 584}, + {156: 3863, 176: 3862}, + {537, 537, 2208, 2093, 2005, 537, 2041, 2006, 2116, 2220, 3776, 3772, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 3774, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 3777, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 3773, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 3778, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 3779, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 3775, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 335: 3781, 356: 2996, 404: 3785, 434: 3784, 496: 2994, 3782, 2001, 2002, 2000, 603: 3786, 659: 3783, 768: 3787, 913: 3780}, + {22: 3713, 132: 3716, 134: 3711, 179: 3715, 207: 3714, 209: 3712, 436: 3710, 684: 3709}, + {11: 2995, 60: 417, 62: 420, 66: 417, 417, 103: 420, 111: 3590, 120: 420, 126: 3611, 132: 3610, 417, 135: 3612, 156: 3607, 159: 3613, 176: 3606, 211: 3603, 218: 3595, 221: 3609, 226: 3608, 3581, 229: 3601, 231: 3593, 239: 3582, 246: 3598, 253: 3589, 3588, 265: 3586, 3587, 3585, 3584, 279: 3604, 282: 3600, 356: 2996, 495: 3592, 2994, 519: 3591, 592: 3580, 603: 3597, 673: 3579, 741: 3602, 747: 3594, 795: 3596, 1004: 3583, 1020: 3605, 1035: 3599, 1039: 3578}, + // 40 + {60: 405, 62: 405, 90: 3556, 111: 405, 138: 405, 592: 405, 645: 3555, 667: 3554}, + {398, 398}, + {397, 397}, + {396, 396}, + {395, 395}, + // 45 + {394, 394}, + {393, 393}, + {392, 392}, + {391, 391}, + {390, 390}, + // 50 + {389, 389}, + {388, 388}, + {387, 387}, + {386, 386}, + {385, 385}, + // 55 + {384, 384}, + {383, 383}, + {382, 382}, + {381, 381}, + {380, 380}, + // 60 + {379, 379}, + {378, 378}, + {377, 377}, + {376, 376}, + {375, 375}, + // 65 + {374, 374}, + {373, 373}, + {372, 372}, + {371, 371}, + {370, 370}, + // 70 + {369, 369}, + {368, 368}, + {367, 367}, + {366, 366}, + {365, 365}, + // 75 + {364, 364}, + {363, 363}, + {362, 362}, + {361, 361}, + {360, 360}, + // 80 + {359, 359}, + {358, 358}, + {357, 357}, + {356, 356}, + {355, 355}, + // 85 + {353, 353}, + {352, 352}, + {351, 351}, + {350, 350}, + {349, 349}, + // 90 + {348, 348}, + {347, 347}, + {346, 346}, + {345, 345}, + {344, 344}, + // 95 + {343, 343}, + {342, 342}, + {341, 341}, + {323, 323}, + {2: 280, 280, 280, 6: 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 34: 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 592: 3551, 1008: 3552}, + // 100 + {2: 653, 653, 653, 6: 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 34: 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 420: 653, 493: 653, 610: 653, 653, 653, 742: 3303, 760: 3304}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 3301, 2001, 2002, 2000, 675: 3302}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 3175, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 3174, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 3179, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 3180, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 3177, 2147, 2148, 2154, 2301, 2111, 3178, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 3176, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 332: 3181, 348: 3203, 418: 3196, 490: 3201, 494: 3197, 3195, 497: 2362, 2001, 2002, 2000, 517: 3194, 521: 3190, 585: 3189, 3183, 602: 3199, 607: 3193, 632: 3184, 3182, 655: 3280, 673: 3191, 677: 3200, 684: 3198, 756: 3187, 3186, 763: 3192, 765: 3202, 871: 3281}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 3175, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 3174, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 3179, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 3180, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 3177, 2147, 2148, 2154, 2301, 2111, 3178, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 3176, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 332: 3181, 348: 3203, 418: 3196, 490: 3201, 494: 3197, 3195, 497: 2362, 2001, 2002, 2000, 517: 3194, 521: 3190, 585: 3189, 3183, 602: 3199, 607: 3193, 632: 3184, 3182, 655: 3185, 673: 3191, 677: 3200, 684: 3198, 756: 3187, 3186, 763: 3192, 765: 3202, 871: 3188}, + {14: 2343, 188: 2344}, + // 105 + {60: 1997, 592: 1998, 905: 2342}, + {60: 1997, 592: 1998, 905: 1996}, + {21: 1992, 112: 1993, 362: 1990, 583: 1991}, + {21: 3, 112: 3, 138: 1989, 362: 3}, + {21: 2, 112: 2, 362: 2}, + // 110 + {1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 334: 1505, 1505, 338: 1505, 1505, 343: 1505, 345: 1505, 1505, 1505, 1505, 1505, 353: 1505, 356: 1505, 493: 1505, 1505, 1505, 1505, 501: 1505, 1505, 1505, 508: 1505}, + {6, 6}, + {362: 1990, 583: 1995}, + {362: 1990, 583: 1994}, + {4, 4}, + // 115 + {5, 5}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 2328, 2001, 2002, 2000, 584: 2330, 902: 2331, 1054: 2329}, + {15, 15, 15, 15, 15, 6: 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 34: 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15}, + {14, 14, 14, 14, 14, 6: 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 34: 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14}, + {1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 501: 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401}, + // 120 + {1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 501: 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400}, + {1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 501: 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399}, + {1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 501: 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398}, + {1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 501: 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397}, + {1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 501: 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396}, + // 125 + {1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 501: 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395}, + {1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 501: 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394}, + {1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 501: 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393}, + {1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 501: 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392}, + {1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 501: 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391}, + // 130 + {1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 501: 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390}, + {1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 501: 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389}, + {1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 501: 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388}, + {1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 501: 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387}, + {1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 501: 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386}, + // 135 + {1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 501: 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385}, + {1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 501: 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384}, + {1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 501: 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383}, + {1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 501: 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382}, + {1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 501: 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381}, + // 140 + {1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 501: 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380}, + {1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 501: 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379}, + {1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 501: 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378}, + {1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 501: 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377}, + {1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 501: 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376}, + // 145 + {1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 501: 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375}, + {1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 501: 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374}, + {1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 501: 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373}, + {1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 501: 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372}, + {1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 501: 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371}, + // 150 + {1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 501: 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370}, + {1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 501: 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369}, + {1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 501: 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368}, + {1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 501: 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367}, + {1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 501: 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366}, + // 155 + {1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 501: 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365}, + {1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 501: 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364}, + {1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 501: 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363}, + {1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 501: 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362}, + {1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 501: 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361}, + // 160 + {1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 501: 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360}, + {1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 501: 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359}, + {1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 501: 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358}, + {1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 501: 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357}, + {1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 501: 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356}, + // 165 + {1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 501: 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355}, + {1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 501: 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354}, + {1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 501: 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353}, + {1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 501: 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352}, + {1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 501: 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351}, + // 170 + {1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 501: 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350}, + {1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 501: 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349}, + {1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 501: 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348}, + {1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 501: 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347}, + {1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 501: 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346}, + // 175 + {1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 501: 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345}, + {1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 501: 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344}, + {1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 501: 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343}, + {1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 501: 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342}, + {1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 501: 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341}, + // 180 + {1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 501: 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340}, + {1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 501: 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339}, + {1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 501: 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338}, + {1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 501: 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337}, + {1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 501: 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336}, + // 185 + {1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 501: 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335}, + {1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 501: 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334}, + {1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 501: 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333}, + {1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 501: 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332}, + {1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 501: 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331}, + // 190 + {1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 501: 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330}, + {1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 501: 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329}, + {1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 501: 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328}, + {1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 501: 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327}, + {1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 501: 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326}, + // 195 + {1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 501: 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325}, + {1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 501: 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324}, + {1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 501: 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323}, + {1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 501: 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322}, + {1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 501: 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321}, + // 200 + {1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 501: 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320}, + {1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 501: 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319}, + {1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 501: 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318}, + {1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 501: 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317}, + {1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 501: 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316}, + // 205 + {1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 501: 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315}, + {1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 501: 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314}, + {1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 501: 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313}, + {1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 501: 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312}, + {1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 501: 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311}, + // 210 + {1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 501: 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310}, + {1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 501: 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309}, + {1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 501: 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308}, + {1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 501: 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307}, + {1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 501: 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306}, + // 215 + {1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 501: 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305}, + {1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 501: 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304}, + {1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 501: 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303}, + {1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 501: 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302}, + {1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 501: 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301}, + // 220 + {1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 501: 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300}, + {1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 501: 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299}, + {1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 501: 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298}, + {1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 501: 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297}, + {1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 501: 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296}, + // 225 + {1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 501: 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295}, + {1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 501: 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294}, + {1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 501: 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293}, + {1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 501: 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292}, + {1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 501: 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291}, + // 230 + {1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 501: 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290}, + {1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 501: 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289}, + {1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 501: 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288}, + {1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 501: 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287}, + {1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 501: 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286}, + // 235 + {1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 501: 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285}, + {1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 501: 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284}, + {1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 501: 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283}, + {1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 501: 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282}, + {1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 501: 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281}, + // 240 + {1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 501: 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280}, + {1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 501: 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279}, + {1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 501: 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278}, + {1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 501: 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277}, + {1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 501: 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276}, + // 245 + {1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 501: 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275}, + {1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 501: 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274}, + {1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 501: 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273}, + {1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 501: 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272}, + {1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 501: 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271}, + // 250 + {1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 501: 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270}, + {1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 501: 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269}, + {1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 501: 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268}, + {1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 501: 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267}, + {1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 501: 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266}, + // 255 + {1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 501: 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265}, + {1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 501: 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264}, + {1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 501: 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263}, + {1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 501: 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262}, + {1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 501: 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1261}, + // 260 + {1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 501: 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260}, + {1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 501: 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259}, + {1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 501: 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258}, + {1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 501: 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257}, + {1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 501: 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256}, + // 265 + {1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 501: 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255}, + {1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 501: 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254}, + {1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 501: 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253}, + {1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 501: 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252}, + {1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 501: 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251}, + // 270 + {1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 501: 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250}, + {1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 501: 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249}, + {1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 501: 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248}, + {1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 501: 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247}, + {1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 501: 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246}, + // 275 + {1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 501: 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245}, + {1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 501: 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244}, + {1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 501: 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243}, + {1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 501: 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242}, + {1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 501: 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241}, + // 280 + {1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 501: 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240}, + {1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 501: 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239}, + {1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 501: 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238}, + {1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 501: 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237}, + {1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 501: 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236}, + // 285 + {1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 501: 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235}, + {1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 501: 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234}, + {1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 501: 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233}, + {1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 501: 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232}, + {1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 501: 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231}, + // 290 + {1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 501: 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230}, + {1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 501: 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229}, + {1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 501: 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228}, + {1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 501: 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227}, + {1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 501: 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226}, + // 295 + {1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 501: 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225}, + {1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 501: 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224}, + {1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 501: 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223}, + {1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 501: 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222}, + {1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 501: 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221}, + // 300 + {1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 501: 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220}, + {1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 501: 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219}, + {1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 501: 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218}, + {1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 501: 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217}, + {1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 501: 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216}, + // 305 + {1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 501: 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215}, + {1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 501: 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214}, + {1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 501: 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213}, + {1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 501: 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212}, + {1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 501: 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211}, + // 310 + {1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 501: 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210}, + {1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 501: 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209}, + {1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 501: 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208}, + {1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 501: 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207}, + {1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 501: 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206}, + // 315 + {1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 501: 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205}, + {1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 501: 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204}, + {1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 501: 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203}, + {1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 501: 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202}, + {1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 501: 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201}, + // 320 + {1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 501: 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200}, + {1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 501: 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199}, + {1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 501: 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198}, + {1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 501: 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197}, + {1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 501: 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196}, + // 325 + {1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 501: 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195}, + {1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 501: 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194}, + {1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 501: 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193}, + {1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 501: 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192}, + {1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 501: 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191}, + // 330 + {1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 501: 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190}, + {1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 501: 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189}, + {1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 501: 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188}, + {1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 501: 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187}, + {1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 501: 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186}, + // 335 + {1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 501: 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185}, + {1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 501: 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184}, + {1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 501: 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183}, + {1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 501: 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182}, + {1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 501: 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181}, + // 340 + {1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 501: 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180}, + {1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 501: 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179}, + {1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 501: 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178}, + {1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 501: 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177}, + {1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 501: 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176}, + // 345 + {1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 501: 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175}, + {1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 501: 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174}, + {1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 501: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173}, + {1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 501: 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172}, + {1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 501: 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171}, + // 350 + {1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 501: 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170}, + {1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 501: 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169}, + {1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 501: 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168}, + {1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 501: 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167}, + {1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 501: 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166}, + // 355 + {1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 501: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165}, + {1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 501: 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164}, + {1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 501: 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163}, + {1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 501: 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162}, + {1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 501: 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161}, + // 360 + {1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 501: 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160}, + {1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 501: 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159}, + {1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 501: 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158}, + {1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 501: 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157}, + {1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 501: 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156}, + // 365 + {1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 501: 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155}, + {1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 501: 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154}, + {1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 501: 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153}, + {1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 501: 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152}, + {1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 501: 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151}, + // 370 + {1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 501: 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150}, + {1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 501: 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149}, + {1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 501: 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148}, + {1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 501: 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147}, + {1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 501: 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146}, + // 375 + {1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 501: 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145}, + {1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 501: 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144}, + {1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 501: 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143}, + {1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 501: 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142}, + {1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 501: 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141}, + // 380 + {1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 501: 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140}, + {1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 501: 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139}, + {1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 501: 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138}, + {1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 501: 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137}, + {1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 501: 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136}, + // 385 + {1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 501: 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135}, + {1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 501: 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134}, + {1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 501: 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133}, + {1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 501: 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132}, + {1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 501: 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131}, + // 390 + {1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 501: 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130}, + {1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 501: 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129}, + {1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 501: 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128}, + {1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 501: 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127}, + {1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 501: 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126}, + // 395 + {1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 501: 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125}, + {1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 501: 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124}, + {1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 501: 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123}, + {1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 501: 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122}, + {1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 501: 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121}, + // 400 + {1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 501: 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120}, + {1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 501: 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119}, + {1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 501: 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118}, + {1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 501: 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117}, + {1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 501: 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116}, + // 405 + {1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 501: 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115}, + {1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 501: 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114}, + {1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 501: 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113}, + {1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 501: 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112}, + {1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 501: 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111}, + // 410 + {1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 501: 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110}, + {1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 501: 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109}, + {1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 501: 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108}, + {1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 501: 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107}, + {1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 501: 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106}, + // 415 + {1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 501: 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105}, + {1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 501: 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104}, + {1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 501: 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103}, + {1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 501: 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102}, + {1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 501: 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101}, + // 420 + {1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 501: 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100}, + {1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 501: 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099}, + {1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 501: 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098}, + {1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 501: 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097}, + {1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 501: 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096}, + // 425 + {1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 501: 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095}, + {1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 501: 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094}, + {1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 501: 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093}, + {1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 501: 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092}, + {1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 501: 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091}, + // 430 + {1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 501: 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090}, + {1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 501: 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089}, + {1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 501: 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088}, + {1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 501: 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087}, + {1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 501: 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086}, + // 435 + {1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 501: 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085}, + {1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 501: 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084}, + {1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 501: 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083}, + {1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 501: 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082}, + {1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 501: 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081}, + // 440 + {1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 501: 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080}, + {1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 501: 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079}, + {1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 501: 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078}, + {1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 501: 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077}, + {1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 501: 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076}, + // 445 + {1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 501: 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075}, + {1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 501: 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074}, + {1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 501: 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073}, + {795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 333: 795, 795, 795, 795, 795, 795, 795, 343: 795, 795, 795, 795, 795, 795, 795, 351: 795, 795, 795, 356: 795, 359: 795, 795, 362: 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 795, 374: 2339, 394: 795, 405: 795, 419: 795, 427: 795, 795, 431: 795, 436: 795, 489: 795, 795, 492: 795, 795, 795, 795, 795, 501: 795, 795, 795, 506: 795, 795, 795, 511: 795, 795, 516: 795, 795, 795, 795, 795, 795, 524: 795, 795, 534: 795, 536: 795, 795, 539: 795}, + {16, 16, 5: 2337}, + // 450 + {520: 2333, 539: 2334, 991: 2332}, + {8, 8, 5: 8}, + {13, 13, 5: 13}, + {12, 12, 5: 12, 90: 2336}, + {10, 10, 5: 10, 90: 2335}, + // 455 + {9, 9, 5: 9}, + {11, 11, 5: 11}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 2328, 2001, 2002, 2000, 584: 2330, 902: 2338}, + {7, 7, 5: 7}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 373: 2341, 497: 2340, 2001, 2002, 2000}, + // 460 + {794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 333: 794, 794, 794, 794, 794, 794, 794, 343: 794, 794, 794, 794, 794, 794, 794, 351: 794, 794, 794, 356: 794, 359: 794, 794, 362: 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, 394: 794, 405: 794, 419: 794, 427: 794, 794, 431: 794, 436: 794, 489: 794, 794, 492: 794, 794, 794, 794, 794, 501: 794, 794, 794, 506: 794, 794, 794, 511: 794, 794, 516: 794, 794, 794, 794, 794, 794, 524: 794, 794, 534: 794, 536: 794, 794, 539: 794}, + {793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 333: 793, 793, 793, 793, 793, 793, 793, 343: 793, 793, 793, 793, 793, 793, 793, 351: 793, 793, 793, 356: 793, 359: 793, 793, 362: 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 394: 793, 405: 793, 419: 793, 427: 793, 793, 431: 793, 436: 793, 489: 793, 793, 492: 793, 793, 793, 793, 793, 501: 793, 793, 793, 506: 793, 793, 793, 511: 793, 793, 516: 793, 793, 793, 793, 793, 793, 524: 793, 793, 534: 793, 536: 793, 793, 539: 793}, + {17, 17}, + {90: 2347, 746: 43, 990: 2346}, + {332: 2345}, + // 465 + {1, 1}, + {746: 2348}, + {746: 42}, + {332: 2349}, + {353: 2351, 493: 2350, 514: 1578, 808: 2352}, + // 470 + {1577, 1577, 330: 1577, 334: 1577, 494: 1577, 514: 1577}, + {1576, 1576, 330: 1576, 334: 1576, 494: 1576, 514: 1576}, + {514: 2353}, + {592: 2354}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 2328, 2001, 2002, 2000, 584: 2355}, + // 475 + {45, 45, 66: 45, 45, 330: 45, 359: 45, 493: 45, 496: 2357, 508: 45, 934: 2356}, + {41, 41, 66: 2367, 2366, 330: 41, 359: 41, 493: 41, 508: 41, 739: 2365, 961: 2364}, + {359: 2358}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 332: 2361, 380: 2360, 497: 2362, 2001, 2002, 2000, 586: 2359, 635: 2363}, + {540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 66: 540, 540, 330: 540, 540, 333: 540, 540, 540, 338: 540, 540, 344: 540, 540, 353: 540, 356: 540, 359: 540, 380: 540, 419: 540, 427: 540, 436: 540, 489: 540, 540, 492: 540, 540, 540, 540, 540, 501: 540, 540, 540, 508: 540}, + // 480 + {539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 66: 539, 539, 330: 539, 539, 333: 539, 539, 539, 338: 539, 539, 344: 539, 539, 353: 539, 356: 539, 359: 539, 380: 539, 419: 539, 427: 539, 436: 539, 489: 539, 539, 492: 539, 539, 539, 539, 539, 501: 539, 539, 539, 508: 539}, + {160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 363: 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 375: 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 407: 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 419: 160, 427: 160, 436: 160, 489: 160, 160, 160, 160, 160, 160, 160, 160, 501: 160, 160, 160, 506: 160, 160, 160, 510: 160, 513: 160, 515: 160}, + {159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 363: 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 375: 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 407: 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 419: 159, 427: 159, 436: 159, 489: 159, 159, 159, 159, 159, 159, 159, 159, 501: 159, 159, 159, 506: 159, 159, 159, 510: 159, 513: 159, 515: 159}, + {44, 44, 66: 44, 44, 330: 44, 359: 44, 493: 44, 508: 44}, + {28, 28, 330: 28, 359: 28, 493: 28, 508: 2388, 986: 2387}, + // 485 + {614: 2370, 618: 2372, 622: 2373, 624: 2371, 818: 2369, 959: 2368}, + {330: 39, 614: 39, 618: 39, 622: 39, 624: 39}, + {330: 38, 614: 38, 618: 38, 622: 38, 624: 38}, + {40, 40, 330: 40, 359: 40, 493: 40, 508: 40, 614: 2370, 618: 2372, 622: 2373, 624: 2371, 818: 2386}, + {36, 36, 330: 36, 359: 36, 493: 36, 508: 36, 614: 36, 618: 36, 622: 36, 624: 36}, + // 490 + {507: 2384}, + {618: 2381}, + {507: 2379}, + {507: 2374}, + {332: 2376, 429: 2378, 2377, 710: 2375}, + // 495 + {32, 32, 330: 32, 359: 32, 493: 32, 508: 32, 614: 32, 618: 32, 622: 32, 624: 32}, + {31, 31, 330: 31, 359: 31, 493: 31, 508: 31, 614: 31, 618: 31, 622: 31, 624: 31}, + {30, 30, 330: 30, 359: 30, 493: 30, 508: 30, 614: 30, 618: 30, 622: 30, 624: 30}, + {29, 29, 330: 29, 359: 29, 493: 29, 508: 29, 614: 29, 618: 29, 622: 29, 624: 29}, + {332: 2376, 429: 2378, 2377, 710: 2380}, + // 500 + {33, 33, 330: 33, 359: 33, 493: 33, 508: 33, 614: 33, 618: 33, 622: 33, 624: 33}, + {507: 2382}, + {332: 2376, 429: 2378, 2377, 710: 2383}, + {34, 34, 330: 34, 359: 34, 493: 34, 508: 34, 614: 34, 618: 34, 622: 34, 624: 34}, + {332: 2376, 429: 2378, 2377, 710: 2385}, + // 505 + {35, 35, 330: 35, 359: 35, 493: 35, 508: 35, 614: 35, 618: 35, 622: 35, 624: 35}, + {37, 37, 330: 37, 359: 37, 493: 37, 508: 37, 614: 37, 618: 37, 622: 37, 624: 37}, + {47, 47, 330: 47, 359: 47, 493: 2398, 973: 2397}, + {26, 26, 330: 26, 359: 26, 493: 26, 614: 26, 1043: 2389, 2390}, + {24, 24, 330: 24, 359: 24, 493: 24, 614: 2394, 987: 2393}, + // 510 + {507: 2391}, + {332: 2392}, + {25, 25, 330: 25, 359: 25, 493: 25, 614: 25}, + {27, 27, 330: 27, 359: 27, 493: 27}, + {507: 2395}, + // 515 + {332: 2396}, + {23, 23, 330: 23, 359: 23, 493: 23}, + {1738, 1738, 330: 2401, 359: 1738, 941: 2402}, + {362: 1990, 583: 2399}, + {508: 2400}, + // 520 + {46, 46, 330: 46, 359: 46}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 1744, 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 404: 2561, 497: 3161, 2001, 2002, 2000, 560: 3165, 589: 3164, 782: 3163, 939: 3162, 3166}, + {22, 22, 359: 2404, 989: 2403}, + {48, 48}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 374: 2406, 497: 2405, 2001, 2002, 2000, 561: 2409, 842: 2408, 988: 2407}, + // 525 + {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, 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, 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, 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, 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, 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, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 331: 1000, 1000, 1000, 1000, 336: 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 346: 1000, 1000, 1000, 1000, 1000, 1000, 1000, 354: 1000, 1000, 357: 1000, 1000, 1000, 1000, 1000, 363: 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 3157, 1000, 1000, 1000, 1000, 1000, 381: 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 405: 1000, 407: 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 491: 1000, 504: 1000, 1000}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 3154, 2001, 2002, 2000}, + {21, 21, 5: 3152}, + {19, 19, 5: 19}, + {361: 2410}, + // 530 + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 2413, 335: 2444, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 2412, 664: 2545}, + {531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 331: 531, 531, 531, 531, 336: 531, 531, 531, 531, 531, 531, 531, 531, 346: 531, 531, 531, 531, 531, 531, 531, 354: 531, 531, 357: 531, 531, 531, 531, 531, 363: 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 375: 531, 531, 531, 531, 531, 381: 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 405: 531, 407: 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 491: 531, 509: 3150}, + {1051, 1051, 5: 1051, 33: 1051, 350: 2558, 354: 2556, 2557, 357: 2555, 2553, 581: 2554, 2552}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 2413, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 3149}, + {1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 331: 1496, 1496, 334: 1496, 336: 1496, 1496, 339: 1496, 343: 1496, 346: 1496, 1496, 1496, 1496, 1496, 1496, 1496, 354: 1496, 1496, 357: 1496, 1496, 1496, 1496, 3132, 363: 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 375: 1496, 1496, 1496, 1496, 1496, 381: 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 395: 1496, 3129, 3127, 3126, 3134, 3128, 3130, 3131, 3133, 943: 3125, 981: 3124}, + // 535 + {1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 331: 1476, 1476, 334: 1476, 336: 1476, 1476, 339: 1476, 343: 1476, 346: 1476, 1476, 1476, 1476, 1476, 1476, 1476, 354: 1476, 1476, 357: 1476, 1476, 1476, 1476, 1476, 363: 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 375: 1476, 1476, 1476, 1476, 1476, 381: 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 395: 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476}, + {1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 331: 1449, 1449, 3098, 1449, 336: 1449, 1449, 339: 1449, 2853, 2854, 2859, 1449, 346: 1449, 1449, 1449, 1449, 1449, 1449, 1449, 354: 1449, 1449, 357: 1449, 1449, 1449, 1449, 1449, 363: 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 3100, 2855, 375: 1449, 1449, 1449, 1449, 1449, 381: 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 3099, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 405: 3097, 407: 2857, 2850, 2856, 2860, 2849, 2858, 2851, 2852, 3106, 3107, 875: 3101, 928: 3103, 978: 3102, 984: 3104, 1022: 3105}, + {1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 3094, 1401, 1401, 1401, 1401, 336: 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 346: 1401, 1401, 1401, 1401, 1401, 1401, 1401, 354: 1401, 1401, 357: 1401, 1401, 1401, 1401, 1401, 363: 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 381: 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 405: 1401, 407: 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 491: 1401, 504: 1401, 1401}, + {1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 956, 1396, 1396, 1396, 1396, 336: 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 346: 1396, 1396, 1396, 1396, 1396, 1396, 1396, 354: 1396, 1396, 357: 1396, 1396, 1396, 1396, 1396, 363: 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 381: 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 405: 1396, 407: 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 491: 1396, 504: 1396, 1396}, + {1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 3089, 1392, 1392, 1392, 1392, 336: 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 346: 1392, 1392, 1392, 1392, 1392, 1392, 1392, 354: 1392, 1392, 357: 1392, 1392, 1392, 1392, 1392, 363: 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 381: 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 405: 1392, 407: 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 491: 1392, 504: 1392, 1392}, + // 540 + {1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 955, 1384, 1384, 1384, 1384, 336: 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 346: 1384, 1384, 1384, 1384, 1384, 1384, 1384, 354: 1384, 1384, 357: 1384, 1384, 1384, 1384, 1384, 363: 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 381: 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 405: 1384, 407: 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 491: 1384, 504: 1384, 1384}, + {1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 952, 1376, 3088, 1376, 1376, 336: 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 346: 1376, 1376, 1376, 1376, 1376, 1376, 1376, 354: 1376, 1376, 357: 1376, 1376, 1376, 1376, 1376, 363: 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 381: 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 405: 1376, 407: 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 491: 1376, 504: 1376, 1376}, + {1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 950, 1374, 1374, 1374, 1374, 336: 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 346: 1374, 1374, 1374, 1374, 1374, 1374, 1374, 354: 1374, 1374, 357: 1374, 1374, 1374, 1374, 1374, 363: 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 381: 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 405: 1374, 407: 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 491: 1374, 504: 1374, 1374}, + {1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 946, 1355, 1355, 1355, 1355, 336: 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 346: 1355, 1355, 1355, 1355, 1355, 1355, 1355, 354: 1355, 1355, 357: 1355, 1355, 1355, 1355, 1355, 363: 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 381: 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 405: 1355, 407: 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 491: 1355, 504: 1355, 1355}, + {1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 949, 1351, 1351, 1351, 1351, 336: 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 346: 1351, 1351, 1351, 1351, 1351, 1351, 1351, 354: 1351, 1351, 357: 1351, 1351, 1351, 1351, 1351, 363: 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 381: 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 405: 1351, 407: 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 491: 1351, 504: 1351, 1351}, + // 545 + {1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 3085, 1344, 1344, 1344, 1344, 336: 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 346: 1344, 1344, 1344, 1344, 1344, 1344, 1344, 354: 1344, 1344, 357: 1344, 1344, 1344, 1344, 1344, 363: 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 381: 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 405: 1344, 407: 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 491: 1344, 504: 1344, 1344}, + {1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 933, 1324, 3084, 1324, 1324, 336: 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 346: 1324, 1324, 1324, 1324, 1324, 1324, 1324, 354: 1324, 1324, 357: 1324, 1324, 1324, 1324, 1324, 363: 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 381: 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 405: 1324, 407: 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 491: 1324, 504: 1324, 1324}, + {1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 932, 1323, 3083, 1323, 1323, 336: 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 346: 1323, 1323, 1323, 1323, 1323, 1323, 1323, 354: 1323, 1323, 357: 1323, 1323, 1323, 1323, 1323, 363: 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 381: 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 405: 1323, 407: 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 491: 1323, 504: 1323, 1323}, + {1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 931, 1320, 1320, 1320, 1320, 336: 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 346: 1320, 1320, 1320, 1320, 1320, 1320, 1320, 354: 1320, 1320, 357: 1320, 1320, 1320, 1320, 1320, 363: 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 381: 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 405: 1320, 407: 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 491: 1320, 504: 1320, 1320}, + {1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 928, 1315, 1315, 1315, 1315, 336: 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 346: 1315, 1315, 1315, 1315, 1315, 1315, 1315, 354: 1315, 1315, 357: 1315, 1315, 1315, 1315, 1315, 363: 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 381: 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 405: 1315, 407: 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 491: 1315, 504: 1315, 1315}, + // 550 + {1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 929, 1313, 1313, 1313, 1313, 336: 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 346: 1313, 1313, 1313, 1313, 1313, 1313, 1313, 354: 1313, 1313, 357: 1313, 1313, 1313, 1313, 1313, 363: 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 381: 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 405: 1313, 407: 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 491: 1313, 504: 1313, 1313}, + {1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 930, 1310, 1310, 1310, 1310, 336: 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 346: 1310, 1310, 1310, 1310, 1310, 1310, 1310, 354: 1310, 1310, 357: 1310, 1310, 1310, 1310, 1310, 363: 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 381: 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 405: 1310, 407: 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 491: 1310, 504: 1310, 1310}, + {1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 953, 1308, 1308, 1308, 1308, 336: 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 346: 1308, 1308, 1308, 1308, 1308, 1308, 1308, 354: 1308, 1308, 357: 1308, 1308, 1308, 1308, 1308, 363: 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 381: 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 405: 1308, 407: 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 491: 1308, 504: 1308, 1308}, + {1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 940, 1295, 1295, 1295, 1295, 336: 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 346: 1295, 1295, 1295, 1295, 1295, 1295, 1295, 354: 1295, 1295, 357: 1295, 1295, 1295, 1295, 1295, 363: 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 381: 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 405: 1295, 407: 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 491: 1295, 504: 1295, 1295}, + {1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 937, 1274, 1274, 1274, 1274, 336: 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 346: 1274, 1274, 1274, 1274, 1274, 1274, 1274, 354: 1274, 1274, 357: 1274, 1274, 1274, 1274, 1274, 363: 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 381: 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 405: 1274, 407: 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 491: 1274, 504: 1274, 1274}, + // 555 + {1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 935, 1257, 1257, 1257, 1257, 336: 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 346: 1257, 1257, 1257, 1257, 1257, 1257, 1257, 354: 1257, 1257, 357: 1257, 1257, 1257, 1257, 1257, 363: 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 381: 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 405: 1257, 407: 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 491: 1257, 504: 1257, 1257}, + {1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 954, 1256, 1256, 1256, 1256, 336: 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 346: 1256, 1256, 1256, 1256, 1256, 1256, 1256, 354: 1256, 1256, 357: 1256, 1256, 1256, 1256, 1256, 363: 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 381: 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 405: 1256, 407: 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 491: 1256, 504: 1256, 1256}, + {1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 942, 1255, 1255, 1255, 1255, 336: 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 346: 1255, 1255, 1255, 1255, 1255, 1255, 1255, 354: 1255, 1255, 357: 1255, 1255, 1255, 1255, 1255, 363: 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 381: 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 405: 1255, 407: 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 491: 1255, 504: 1255, 1255}, + {1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 944, 1251, 1251, 1251, 1251, 336: 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 346: 1251, 1251, 1251, 1251, 1251, 1251, 1251, 354: 1251, 1251, 357: 1251, 1251, 1251, 1251, 1251, 363: 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 381: 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 405: 1251, 407: 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 491: 1251, 504: 1251, 1251}, + {1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 943, 1250, 1250, 1250, 1250, 336: 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 346: 1250, 1250, 1250, 1250, 1250, 1250, 1250, 354: 1250, 1250, 357: 1250, 1250, 1250, 1250, 1250, 363: 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 381: 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 405: 1250, 407: 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 491: 1250, 504: 1250, 1250}, + // 560 + {1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 934, 1245, 1245, 1245, 1245, 336: 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 346: 1245, 1245, 1245, 1245, 1245, 1245, 1245, 354: 1245, 1245, 357: 1245, 1245, 1245, 1245, 1245, 363: 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 381: 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 405: 1245, 407: 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 491: 1245, 504: 1245, 1245}, + {1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 3074, 1108, 1108, 1108, 1108, 336: 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 346: 1108, 1108, 1108, 1108, 1108, 1108, 1108, 354: 1108, 1108, 357: 1108, 1108, 1108, 1108, 1108, 363: 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 381: 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 405: 1108, 407: 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 491: 1108, 504: 1108, 1108}, + {1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 3067, 1087, 1087, 1087, 1087, 336: 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 346: 1087, 1087, 1087, 1087, 1087, 1087, 1087, 354: 1087, 1087, 357: 1087, 1087, 1087, 1087, 1087, 363: 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 381: 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 405: 1087, 407: 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 491: 1087, 504: 1087, 1087}, + {1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 3060, 1086, 1086, 1086, 1086, 336: 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 346: 1086, 1086, 1086, 1086, 1086, 1086, 1086, 354: 1086, 1086, 357: 1086, 1086, 1086, 1086, 1086, 363: 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 381: 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 405: 1086, 407: 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 491: 1086, 504: 1086, 1086}, + {1050, 1050, 5: 1050, 33: 1050, 330: 2549}, + // 565 + {1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 331: 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 354: 1039, 1039, 357: 1039, 1039, 1039, 1039, 1039, 363: 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 375: 1039, 1039, 1039, 1039, 1039, 381: 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 405: 1039, 407: 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 419: 1039, 427: 1039, 436: 1039, 489: 1039, 1039, 1039, 1039}, + {1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 331: 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 354: 1038, 1038, 357: 1038, 1038, 1038, 1038, 1038, 363: 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 375: 1038, 1038, 1038, 1038, 1038, 381: 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 405: 1038, 407: 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 419: 1038, 427: 1038, 436: 1038, 489: 1038, 1038, 1038, 1038}, + {1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 331: 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 354: 1037, 1037, 357: 1037, 1037, 1037, 1037, 1037, 363: 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 375: 1037, 1037, 1037, 1037, 1037, 381: 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 405: 1037, 407: 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 419: 1037, 427: 1037, 436: 1037, 489: 1037, 1037, 1037, 1037}, + {1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 331: 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 354: 1036, 1036, 357: 1036, 1036, 1036, 1036, 1036, 363: 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 375: 1036, 1036, 1036, 1036, 1036, 381: 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 405: 1036, 407: 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 419: 1036, 427: 1036, 436: 1036, 489: 1036, 1036, 1036, 1036}, + {1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 331: 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 354: 1035, 1035, 357: 1035, 1035, 1035, 1035, 1035, 363: 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 375: 1035, 1035, 1035, 1035, 1035, 381: 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 405: 1035, 407: 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 419: 1035, 427: 1035, 436: 1035, 489: 1035, 1035, 1035, 1035}, + // 570 + {1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 331: 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 354: 1034, 1034, 357: 1034, 1034, 1034, 1034, 1034, 363: 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 375: 1034, 1034, 1034, 1034, 1034, 381: 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 405: 1034, 407: 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 419: 1034, 427: 1034, 436: 1034, 489: 1034, 1034, 1034, 1034}, + {1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 331: 1033, 3059, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 354: 1033, 1033, 357: 1033, 1033, 1033, 1033, 1033, 363: 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 375: 1033, 1033, 1033, 1033, 1033, 381: 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 405: 1033, 407: 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 419: 1033, 427: 1033, 436: 1033, 489: 1033, 1033, 1033, 1033}, + {332: 3058}, + {1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 331: 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 354: 1031, 1031, 357: 1031, 1031, 1031, 1031, 1031, 363: 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 375: 1031, 1031, 1031, 1031, 1031, 381: 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 405: 1031, 407: 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 419: 1031, 427: 1031, 436: 1031, 489: 1031, 1031, 1031, 1031}, + {1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 331: 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 354: 1030, 1030, 357: 1030, 1030, 1030, 1030, 1030, 363: 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 375: 1030, 1030, 1030, 1030, 1030, 381: 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 405: 1030, 407: 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 419: 1030, 427: 1030, 436: 1030, 489: 1030, 1030, 1030, 1030}, + // 575 + {1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 331: 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 354: 1029, 1029, 357: 1029, 1029, 1029, 1029, 1029, 363: 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 375: 1029, 1029, 1029, 1029, 1029, 381: 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 405: 1029, 407: 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 419: 1029, 427: 1029, 436: 1029, 489: 1029, 1029, 1029, 1029}, + {1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 331: 1001, 1001, 1001, 1001, 336: 1001, 1001, 2562, 1001, 1001, 1001, 1001, 1001, 346: 1001, 1001, 1001, 1001, 1001, 1001, 1001, 354: 1001, 1001, 357: 1001, 1001, 1001, 1001, 1001, 363: 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 375: 1001, 1001, 1001, 1001, 1001, 381: 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 405: 1001, 407: 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 491: 2563}, + {996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 331: 996, 996, 996, 996, 336: 996, 996, 996, 996, 996, 996, 996, 996, 346: 996, 996, 996, 996, 996, 996, 996, 354: 996, 996, 357: 996, 996, 996, 996, 996, 363: 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 375: 996, 996, 996, 996, 996, 381: 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 405: 996, 407: 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 491: 996, 504: 3054, 3055}, + {995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 331: 995, 995, 995, 995, 336: 995, 995, 995, 995, 995, 995, 995, 995, 346: 995, 995, 995, 995, 995, 995, 995, 354: 995, 995, 357: 995, 995, 995, 995, 995, 363: 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 375: 995, 995, 995, 995, 995, 381: 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 405: 995, 407: 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 491: 995}, + {994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 331: 994, 994, 994, 994, 336: 994, 994, 994, 994, 994, 994, 994, 994, 346: 994, 994, 994, 994, 994, 994, 994, 354: 994, 994, 357: 994, 994, 994, 994, 994, 363: 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 375: 994, 994, 994, 994, 994, 381: 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 405: 994, 407: 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 491: 994}, + // 580 + {993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 331: 993, 993, 993, 993, 336: 993, 993, 993, 993, 993, 993, 993, 993, 346: 993, 993, 993, 993, 993, 993, 993, 354: 993, 993, 357: 993, 993, 993, 993, 993, 363: 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 375: 993, 993, 993, 993, 993, 381: 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 405: 993, 407: 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 491: 993}, + {991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 331: 991, 991, 991, 991, 336: 991, 991, 991, 991, 991, 991, 991, 991, 346: 991, 991, 991, 991, 991, 991, 991, 354: 991, 991, 357: 991, 991, 991, 991, 991, 363: 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 375: 991, 991, 991, 991, 991, 381: 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 405: 991, 407: 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 491: 991}, + {990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 331: 990, 990, 990, 990, 336: 990, 990, 990, 990, 990, 990, 990, 990, 346: 990, 990, 990, 990, 990, 990, 990, 354: 990, 990, 357: 990, 990, 990, 990, 990, 363: 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 375: 990, 990, 990, 990, 990, 381: 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 405: 990, 407: 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 491: 990}, + {989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 331: 989, 989, 989, 989, 336: 989, 989, 989, 989, 989, 989, 989, 989, 346: 989, 989, 989, 989, 989, 989, 989, 354: 989, 989, 357: 989, 989, 989, 989, 989, 363: 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 375: 989, 989, 989, 989, 989, 381: 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 405: 989, 407: 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 491: 989}, + {988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 331: 988, 988, 988, 988, 336: 988, 988, 988, 988, 988, 988, 988, 988, 346: 988, 988, 988, 988, 988, 988, 988, 354: 988, 988, 357: 988, 988, 988, 988, 988, 363: 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 375: 988, 988, 988, 988, 988, 381: 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 405: 988, 407: 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 491: 988}, + // 585 + {987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 331: 987, 987, 987, 987, 336: 987, 987, 987, 987, 987, 987, 987, 987, 346: 987, 987, 987, 987, 987, 987, 987, 354: 987, 987, 357: 987, 987, 987, 987, 987, 363: 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 375: 987, 987, 987, 987, 987, 381: 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 405: 987, 407: 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 491: 987}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2561, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 3053, 2465, 2542, 2464, 2461}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2561, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 3052, 2465, 2542, 2464, 2461}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2561, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 3051, 2465, 2542, 2464, 2461}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2561, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 3050, 2465, 2542, 2464, 2461}, + // 590 + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2561, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 3049, 2465, 2542, 2464, 2461}, + {980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 331: 980, 980, 980, 980, 336: 980, 980, 980, 980, 980, 980, 980, 980, 346: 980, 980, 980, 980, 980, 980, 980, 354: 980, 980, 357: 980, 980, 980, 980, 980, 363: 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 375: 980, 980, 980, 980, 980, 381: 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 405: 980, 407: 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 491: 980}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 3042, 332: 2455, 2413, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 494: 1908, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 3040, 593: 3028, 1909, 1910, 1911, 604: 1914, 1913, 3029, 619: 3041}, + {330: 3035}, + {330: 3027, 559: 3026}, + // 595 + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2561, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 3025, 2465, 2542, 2464, 2461}, + {330: 3020}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 2413, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 392: 818, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 3007, 958: 3008}, + {330: 2951}, + {330: 2948}, + // 600 + {330: 951}, + {330: 948}, + {330: 947}, + {330: 945}, + {330: 941}, + // 605 + {330: 939}, + {330: 938}, + {330: 936}, + {925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 336: 925, 925, 925, 925, 925, 925, 925, 925, 346: 925, 925, 925, 925, 925, 925, 925, 354: 925, 925, 357: 925, 925, 925, 925, 925, 363: 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 375: 925, 925, 925, 925, 925, 381: 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 405: 925, 407: 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 491: 925}, + {924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 336: 924, 924, 924, 924, 924, 924, 924, 924, 346: 924, 924, 924, 924, 924, 924, 924, 354: 924, 924, 357: 924, 924, 924, 924, 924, 363: 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 375: 924, 924, 924, 924, 924, 381: 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 405: 924, 407: 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 491: 924}, + // 610 + {923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 336: 923, 923, 923, 923, 923, 923, 923, 923, 346: 923, 923, 923, 923, 923, 923, 923, 354: 923, 923, 357: 923, 923, 923, 923, 923, 363: 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 375: 923, 923, 923, 923, 923, 381: 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 405: 923, 407: 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 491: 923}, + {922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 336: 922, 922, 922, 922, 922, 922, 922, 922, 346: 922, 922, 922, 922, 922, 922, 922, 354: 922, 922, 357: 922, 922, 922, 922, 922, 363: 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 375: 922, 922, 922, 922, 922, 381: 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 405: 922, 407: 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 491: 922}, + {921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 336: 921, 921, 921, 921, 921, 921, 921, 921, 346: 921, 921, 921, 921, 921, 921, 921, 354: 921, 921, 357: 921, 921, 921, 921, 921, 363: 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 375: 921, 921, 921, 921, 921, 381: 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 405: 921, 407: 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 491: 921}, + {920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 336: 920, 920, 920, 920, 920, 920, 920, 920, 346: 920, 920, 920, 920, 920, 920, 920, 354: 920, 920, 357: 920, 920, 920, 920, 920, 363: 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 375: 920, 920, 920, 920, 920, 381: 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 405: 920, 407: 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 491: 920}, + {919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 336: 919, 919, 919, 919, 919, 919, 919, 919, 346: 919, 919, 919, 919, 919, 919, 919, 354: 919, 919, 357: 919, 919, 919, 919, 919, 363: 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 375: 919, 919, 919, 919, 919, 381: 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 405: 919, 407: 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 491: 919}, + // 615 + {918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 336: 918, 918, 918, 918, 918, 918, 918, 918, 346: 918, 918, 918, 918, 918, 918, 918, 354: 918, 918, 357: 918, 918, 918, 918, 918, 363: 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 375: 918, 918, 918, 918, 918, 381: 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 405: 918, 407: 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 491: 918}, + {917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 336: 917, 917, 917, 917, 917, 917, 917, 917, 346: 917, 917, 917, 917, 917, 917, 917, 354: 917, 917, 357: 917, 917, 917, 917, 917, 363: 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 375: 917, 917, 917, 917, 917, 381: 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 405: 917, 407: 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 491: 917}, + {916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 336: 916, 916, 916, 916, 916, 916, 916, 916, 346: 916, 916, 916, 916, 916, 916, 916, 354: 916, 916, 357: 916, 916, 916, 916, 916, 363: 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 375: 916, 916, 916, 916, 916, 381: 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 405: 916, 407: 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 491: 916}, + {330: 2945}, + {330: 2942}, + // 620 + {927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 2939, 927, 927, 927, 927, 336: 927, 927, 927, 927, 927, 927, 927, 927, 346: 927, 927, 927, 927, 927, 927, 927, 354: 927, 927, 357: 927, 927, 927, 927, 927, 363: 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 375: 927, 927, 927, 927, 927, 381: 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 405: 927, 407: 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 491: 927, 858: 2940}, + {330: 2937}, + {850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 2933, 850, 850, 850, 850, 336: 850, 850, 850, 850, 850, 850, 850, 850, 346: 850, 850, 850, 850, 850, 850, 850, 354: 850, 850, 357: 850, 850, 850, 850, 850, 363: 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 375: 850, 850, 850, 850, 850, 381: 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 405: 850, 407: 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 491: 850, 965: 2932}, + {330: 2926}, + {330: 2922}, + // 625 + {330: 2917}, + {851: 2914, 2911, 2913, 2912}, + {330: 2908}, + {330: 2903}, + {330: 2894}, + // 630 + {330: 2887}, + {330: 2882}, + {330: 2847}, + {330: 2833}, + {330: 2816}, + // 635 + {330: 879}, + {330: 878}, + {330: 877}, + {330: 876}, + {330: 2808}, + // 640 + {330: 2800}, + {330: 2792}, + {330: 2778}, + {330: 2763}, + {330: 2758}, + // 645 + {330: 2753}, + {330: 2748}, + {330: 2743}, + {330: 2738}, + {330: 2733}, + // 650 + {330: 2720}, + {330: 2717}, + {330: 2714}, + {330: 2711}, + {330: 2708}, + // 655 + {330: 2705}, + {330: 2701}, + {330: 2695}, + {330: 2682}, + {330: 2677}, + // 660 + {330: 2672}, + {330: 2546}, + {534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 331: 534, 534, 534, 534, 336: 534, 534, 534, 534, 534, 534, 534, 534, 346: 534, 534, 534, 534, 534, 534, 534, 354: 534, 534, 357: 534, 534, 534, 534, 534, 363: 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 375: 534, 534, 534, 534, 534, 381: 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 405: 534, 407: 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 491: 534}, + {533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 331: 533, 533, 533, 533, 336: 533, 533, 533, 533, 533, 533, 533, 533, 346: 533, 533, 533, 533, 533, 533, 533, 354: 533, 533, 357: 533, 533, 533, 533, 533, 363: 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 375: 533, 533, 533, 533, 533, 381: 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 405: 533, 407: 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 491: 533}, + {532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 331: 532, 532, 532, 532, 336: 532, 532, 532, 532, 532, 532, 532, 532, 346: 532, 532, 532, 532, 532, 532, 532, 354: 532, 532, 357: 532, 532, 532, 532, 532, 363: 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 375: 532, 532, 532, 532, 532, 381: 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 405: 532, 407: 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 491: 532}, + // 665 + {18, 18, 5: 18}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 2413, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 2547}, + {5: 2559, 350: 2558, 354: 2556, 2557, 357: 2555, 2553, 581: 2554, 2552}, + {330: 2549}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 374: 2406, 497: 2405, 2001, 2002, 2000, 561: 2550}, + // 670 + {33: 2551}, + {970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 331: 970, 970, 970, 970, 336: 970, 970, 970, 970, 970, 970, 970, 970, 346: 970, 970, 970, 970, 970, 970, 970, 354: 970, 970, 357: 970, 970, 970, 970, 970, 363: 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 375: 970, 970, 970, 970, 970, 381: 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 405: 970, 407: 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 491: 970}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 2413, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 2671}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 2413, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 2670}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 2413, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 2669}, + // 675 + {2: 1493, 1493, 1493, 6: 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 34: 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 332: 1493, 1493, 335: 1493, 1493, 1493, 340: 1493, 1493, 1493, 344: 1493, 353: 1493, 356: 1493, 362: 1493, 374: 1493, 380: 1493, 404: 1493, 406: 1493, 417: 1493, 1493, 420: 1493, 1493, 1493, 1493, 1493, 1493, 1493, 428: 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 437: 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493}, + {2: 1492, 1492, 1492, 6: 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 34: 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 332: 1492, 1492, 335: 1492, 1492, 1492, 340: 1492, 1492, 1492, 344: 1492, 353: 1492, 356: 1492, 362: 1492, 374: 1492, 380: 1492, 404: 1492, 406: 1492, 417: 1492, 1492, 420: 1492, 1492, 1492, 1492, 1492, 1492, 1492, 428: 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 437: 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492}, + {2: 1491, 1491, 1491, 6: 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 34: 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 332: 1491, 1491, 335: 1491, 1491, 1491, 340: 1491, 1491, 1491, 344: 1491, 353: 1491, 356: 1491, 362: 1491, 374: 1491, 380: 1491, 404: 1491, 406: 1491, 417: 1491, 1491, 420: 1491, 1491, 1491, 1491, 1491, 1491, 1491, 428: 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 437: 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491}, + {2: 1490, 1490, 1490, 6: 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 34: 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 332: 1490, 1490, 335: 1490, 1490, 1490, 340: 1490, 1490, 1490, 344: 1490, 353: 1490, 356: 1490, 362: 1490, 374: 1490, 380: 1490, 404: 1490, 406: 1490, 417: 1490, 1490, 420: 1490, 1490, 1490, 1490, 1490, 1490, 1490, 428: 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 437: 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2561, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2560, 2465, 2542, 2464, 2461}, + // 680 + {33: 2564, 338: 2562, 491: 2563}, + {531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 331: 531, 531, 531, 531, 336: 531, 531, 531, 531, 531, 531, 531, 531, 346: 531, 531, 531, 531, 531, 531, 531, 354: 531, 531, 357: 531, 531, 531, 531, 531, 363: 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 375: 531, 531, 531, 531, 531, 381: 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 405: 531, 407: 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 491: 531}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 332: 2361, 497: 2362, 2001, 2002, 2000, 586: 2668}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2561, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2667, 2465, 2542, 2464, 2461}, + {91: 714, 360: 2566, 493: 714, 590: 714, 1003: 2565}, + // 685 + {91: 2570, 493: 2571, 590: 717, 698: 2569}, + {6: 2567, 235: 2568}, + {91: 713, 493: 713, 590: 713}, + {91: 712, 493: 712, 590: 712}, + {590: 2574, 597: 2575}, + // 690 + {174: 2573}, + {174: 2572}, + {590: 715}, + {590: 716}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 2577, 497: 2576, 2001, 2002, 2000, 728: 2579, 917: 2580, 1080: 2578}, + // 695 + {723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 331: 723, 723, 723, 723, 336: 723, 723, 723, 723, 723, 723, 723, 723, 346: 723, 723, 723, 723, 723, 723, 723, 354: 723, 723, 357: 723, 723, 723, 723, 723, 363: 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 375: 723, 723, 723, 723, 723, 381: 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 405: 723, 407: 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 491: 723}, + {765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 331: 765, 765, 765, 765, 336: 765, 765, 765, 765, 765, 765, 765, 765, 345: 765, 765, 765, 765, 765, 765, 765, 765, 354: 765, 765, 357: 765, 765, 765, 765, 765, 363: 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 375: 765, 765, 765, 765, 765, 381: 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 405: 765, 407: 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 491: 765}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 762, 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 345: 762, 351: 762, 375: 762, 762, 762, 497: 2576, 2001, 2002, 2000, 728: 2583, 1002: 2582, 1081: 2581}, + {736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 331: 736, 736, 736, 736, 336: 736, 736, 736, 736, 736, 736, 736, 736, 346: 736, 736, 736, 736, 736, 736, 736, 354: 736, 736, 357: 736, 736, 736, 736, 736, 363: 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 375: 736, 736, 736, 736, 736, 381: 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 405: 736, 407: 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 491: 736}, + {735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 331: 735, 735, 735, 735, 336: 735, 735, 735, 735, 735, 735, 735, 735, 346: 735, 735, 735, 735, 735, 735, 735, 354: 735, 735, 357: 735, 735, 735, 735, 735, 363: 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 375: 735, 735, 735, 735, 735, 381: 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 405: 735, 407: 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 491: 735}, + // 700 + {734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 331: 734, 734, 734, 734, 336: 734, 734, 734, 734, 734, 734, 734, 734, 346: 734, 734, 734, 734, 734, 734, 734, 354: 734, 734, 357: 734, 734, 734, 734, 734, 363: 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 375: 734, 734, 734, 734, 734, 381: 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 405: 734, 407: 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 491: 734}, + {33: 2666}, + {33: 760, 345: 2585, 351: 760, 375: 760, 760, 760, 1007: 2584}, + {33: 761, 345: 761, 351: 761, 375: 761, 761, 761}, + {33: 758, 351: 2596, 375: 758, 758, 758, 1010: 2595}, + // 705 + {507: 2586}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 2413, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 2587, 689: 2588, 706: 2589}, + {1020, 1020, 5: 1020, 33: 1020, 61: 1020, 331: 1020, 339: 1020, 343: 1020, 346: 1020, 1020, 1020, 1020, 2558, 1020, 354: 2556, 2557, 357: 2555, 2553, 364: 1020, 1020, 375: 1020, 1020, 1020, 2594, 2593, 581: 2554, 2552, 750: 2592}, + {1023, 1023, 5: 1023, 33: 1023, 61: 1023, 331: 1023, 339: 1023, 343: 1023, 346: 1023, 1023, 1023, 1023, 351: 1023, 364: 1023, 1023, 375: 1023, 1023, 1023}, + {5: 2590, 33: 759, 351: 759, 375: 759, 759, 759}, + // 710 + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 2413, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 2587, 689: 2591}, + {1022, 1022, 5: 1022, 33: 1022, 61: 1022, 331: 1022, 339: 1022, 343: 1022, 346: 1022, 1022, 1022, 1022, 351: 1022, 364: 1022, 1022, 375: 1022, 1022, 1022}, + {1021, 1021, 5: 1021, 33: 1021, 61: 1021, 331: 1021, 339: 1021, 343: 1021, 346: 1021, 1021, 1021, 1021, 351: 1021, 364: 1021, 1021, 375: 1021, 1021, 1021}, + {1019, 1019, 1019, 5: 1019, 33: 1019, 61: 1019, 331: 1019, 339: 1019, 343: 1019, 345: 1019, 1019, 1019, 1019, 1019, 351: 1019, 364: 1019, 1019, 375: 1019, 1019, 1019}, + {1018, 1018, 1018, 5: 1018, 33: 1018, 61: 1018, 331: 1018, 339: 1018, 343: 1018, 345: 1018, 1018, 1018, 1018, 1018, 351: 1018, 364: 1018, 1018, 375: 1018, 1018, 1018}, + // 715 + {33: 756, 375: 2602, 2603, 2601, 1009: 2599, 1079: 2600}, + {507: 2597}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 2413, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 2587, 689: 2588, 706: 2598}, + {5: 2590, 33: 757, 375: 757, 757, 757}, + {33: 763}, + // 720 + {92: 2614, 96: 2610, 362: 2604, 405: 2615, 421: 2606, 2605, 2613, 2612, 680: 2611, 769: 2608, 1077: 2609, 2607}, + {92: 754, 96: 754, 362: 754, 405: 754, 421: 754, 754, 754, 754}, + {92: 753, 96: 753, 362: 753, 405: 753, 421: 753, 753, 753, 753}, + {92: 752, 96: 752, 362: 752, 405: 752, 421: 752, 752, 752, 752}, + {1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 33: 1659, 64: 1659, 93: 1659, 331: 1659, 333: 1659, 1659, 1659, 338: 1659, 344: 1659, 1659, 419: 1659, 427: 1659, 436: 1659, 489: 1659, 1659, 492: 1659}, + // 725 + {1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 33: 1658, 64: 1658, 93: 1658, 331: 1658, 333: 1658, 1658, 1658, 338: 1658, 344: 1658, 1658, 419: 1658, 427: 1658, 436: 1658, 489: 1658, 1658, 492: 1658}, + {1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 33: 1657, 64: 1657, 93: 1657, 331: 1657, 333: 1657, 1657, 1657, 338: 1657, 344: 1657, 1657, 419: 1657, 427: 1657, 436: 1657, 489: 1657, 1657, 492: 1657}, + {33: 755}, + {33: 751}, + {33: 750}, + // 730 + {64: 2661}, + {64: 2659}, + {64: 2657}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 2413, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 2664}, + {441: 2663}, + // 735 + {92: 2614, 96: 2616, 362: 2604, 421: 2606, 2605, 2619, 2618, 680: 2617, 769: 2621, 916: 2620}, + {64: 2661, 93: 2662}, + {64: 2659, 93: 2660}, + {64: 2657, 93: 2658}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 2413, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 2624}, + // 740 + {350: 2622}, + {33: 743, 350: 743}, + {92: 2614, 96: 2616, 362: 2604, 421: 2606, 2605, 2619, 2618, 680: 2617, 769: 2621, 916: 2623}, + {33: 744}, + {63: 2641, 65: 2645, 68: 2640, 2637, 2639, 2643, 2644, 2638, 2649, 2648, 2647, 2651, 2652, 2646, 2650, 2653, 2642, 350: 2558, 354: 2556, 2557, 357: 2555, 2553, 381: 2635, 2632, 2634, 2633, 2629, 2631, 2630, 2627, 2628, 2626, 2636, 581: 2554, 2552, 642: 2625, 657: 2654}, + // 745 + {847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 336: 847, 847, 339: 847, 847, 847, 847, 847, 346: 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 357: 847, 847, 847, 847, 847, 363: 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 375: 847, 847, 847, 847, 847, 381: 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 405: 847, 407: 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 493: 847, 847}, + {846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 336: 846, 846, 339: 846, 846, 846, 846, 846, 346: 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 357: 846, 846, 846, 846, 846, 363: 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 375: 846, 846, 846, 846, 846, 381: 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 405: 846, 407: 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 493: 846, 846}, + {845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 336: 845, 845, 339: 845, 845, 845, 845, 845, 346: 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 357: 845, 845, 845, 845, 845, 363: 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 375: 845, 845, 845, 845, 845, 381: 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 405: 845, 407: 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 493: 845, 845}, + {844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 336: 844, 844, 339: 844, 844, 844, 844, 844, 346: 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 357: 844, 844, 844, 844, 844, 363: 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 375: 844, 844, 844, 844, 844, 381: 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 405: 844, 407: 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 493: 844, 844}, + {843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 336: 843, 843, 339: 843, 843, 843, 843, 843, 346: 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 357: 843, 843, 843, 843, 843, 363: 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 375: 843, 843, 843, 843, 843, 381: 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 405: 843, 407: 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 493: 843, 843}, + // 750 + {842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 336: 842, 842, 339: 842, 842, 842, 842, 842, 346: 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 357: 842, 842, 842, 842, 842, 363: 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 375: 842, 842, 842, 842, 842, 381: 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 405: 842, 407: 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 493: 842, 842}, + {841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 336: 841, 841, 339: 841, 841, 841, 841, 841, 346: 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 357: 841, 841, 841, 841, 841, 363: 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 375: 841, 841, 841, 841, 841, 381: 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 405: 841, 407: 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 493: 841, 841}, + {840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 336: 840, 840, 339: 840, 840, 840, 840, 840, 346: 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 357: 840, 840, 840, 840, 840, 363: 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 375: 840, 840, 840, 840, 840, 381: 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 405: 840, 407: 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 493: 840, 840}, + {839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 336: 839, 839, 339: 839, 839, 839, 839, 839, 346: 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 357: 839, 839, 839, 839, 839, 363: 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 375: 839, 839, 839, 839, 839, 381: 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 405: 839, 407: 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 493: 839, 839}, + {838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 336: 838, 838, 339: 838, 838, 838, 838, 838, 346: 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 357: 838, 838, 838, 838, 838, 363: 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 375: 838, 838, 838, 838, 838, 381: 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 405: 838, 407: 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 493: 838, 838}, + // 755 + {837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 336: 837, 837, 339: 837, 837, 837, 837, 837, 346: 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 357: 837, 837, 837, 837, 837, 363: 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 375: 837, 837, 837, 837, 837, 381: 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 405: 837, 407: 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 493: 837, 837}, + {836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 336: 836, 836, 339: 836, 836, 836, 836, 836, 346: 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 357: 836, 836, 836, 836, 836, 363: 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 375: 836, 836, 836, 836, 836, 381: 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 405: 836, 407: 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 493: 836, 836}, + {835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 336: 835, 835, 339: 835, 835, 835, 835, 835, 346: 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 357: 835, 835, 835, 835, 835, 363: 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 375: 835, 835, 835, 835, 835, 381: 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 405: 835, 407: 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 493: 835, 835}, + {834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 336: 834, 834, 339: 834, 834, 834, 834, 834, 346: 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 357: 834, 834, 834, 834, 834, 363: 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 375: 834, 834, 834, 834, 834, 381: 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 405: 834, 407: 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 493: 834, 834}, + {833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 336: 833, 833, 339: 833, 833, 833, 833, 833, 346: 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 357: 833, 833, 833, 833, 833, 363: 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 375: 833, 833, 833, 833, 833, 381: 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 405: 833, 407: 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 493: 833, 833}, + // 760 + {832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 336: 832, 832, 339: 832, 832, 832, 832, 832, 346: 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 357: 832, 832, 832, 832, 832, 363: 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 375: 832, 832, 832, 832, 832, 381: 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 405: 832, 407: 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 493: 832, 832}, + {831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 336: 831, 831, 339: 831, 831, 831, 831, 831, 346: 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 357: 831, 831, 831, 831, 831, 363: 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 375: 831, 831, 831, 831, 831, 381: 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 405: 831, 407: 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 493: 831, 831}, + {830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 336: 830, 830, 339: 830, 830, 830, 830, 830, 346: 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 357: 830, 830, 830, 830, 830, 363: 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 375: 830, 830, 830, 830, 830, 381: 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 405: 830, 407: 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 493: 830, 830}, + {829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 336: 829, 829, 339: 829, 829, 829, 829, 829, 346: 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 357: 829, 829, 829, 829, 829, 363: 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 375: 829, 829, 829, 829, 829, 381: 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 405: 829, 407: 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 493: 829, 829}, + {828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 336: 828, 828, 339: 828, 828, 828, 828, 828, 346: 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 357: 828, 828, 828, 828, 828, 363: 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 375: 828, 828, 828, 828, 828, 381: 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 405: 828, 407: 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 493: 828, 828}, + // 765 + {827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 336: 827, 827, 339: 827, 827, 827, 827, 827, 346: 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 357: 827, 827, 827, 827, 827, 363: 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 375: 827, 827, 827, 827, 827, 381: 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 405: 827, 407: 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 493: 827, 827}, + {826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 336: 826, 826, 339: 826, 826, 826, 826, 826, 346: 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 357: 826, 826, 826, 826, 826, 363: 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 375: 826, 826, 826, 826, 826, 381: 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 405: 826, 407: 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 493: 826, 826}, + {825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 336: 825, 825, 339: 825, 825, 825, 825, 825, 346: 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 357: 825, 825, 825, 825, 825, 363: 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 375: 825, 825, 825, 825, 825, 381: 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 405: 825, 407: 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 493: 825, 825}, + {824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 336: 824, 824, 339: 824, 824, 824, 824, 824, 346: 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 357: 824, 824, 824, 824, 824, 363: 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 375: 824, 824, 824, 824, 824, 381: 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 405: 824, 407: 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 493: 824, 824}, + {823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 336: 823, 823, 339: 823, 823, 823, 823, 823, 346: 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 357: 823, 823, 823, 823, 823, 363: 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 375: 823, 823, 823, 823, 823, 381: 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 405: 823, 407: 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 493: 823, 823}, + // 770 + {822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 336: 822, 822, 339: 822, 822, 822, 822, 822, 346: 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 357: 822, 822, 822, 822, 822, 363: 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 375: 822, 822, 822, 822, 822, 381: 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 405: 822, 407: 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 493: 822, 822}, + {821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 336: 821, 821, 339: 821, 821, 821, 821, 821, 346: 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 357: 821, 821, 821, 821, 821, 363: 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 375: 821, 821, 821, 821, 821, 381: 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 405: 821, 407: 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 493: 821, 821}, + {820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 336: 820, 820, 339: 820, 820, 820, 820, 820, 346: 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 357: 820, 820, 820, 820, 820, 363: 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 375: 820, 820, 820, 820, 820, 381: 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 405: 820, 407: 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 493: 820, 820}, + {819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 336: 819, 819, 339: 819, 819, 819, 819, 819, 346: 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 357: 819, 819, 819, 819, 819, 363: 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 375: 819, 819, 819, 819, 819, 381: 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 405: 819, 407: 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 493: 819, 819}, + {64: 2655, 93: 2656}, + // 775 + {33: 746, 350: 746}, + {33: 739, 350: 739}, + {33: 747, 350: 747}, + {33: 740, 350: 740}, + {33: 748, 350: 748}, + // 780 + {33: 741, 350: 741}, + {33: 749, 350: 749}, + {33: 742, 350: 742}, + {33: 745, 350: 745}, + {63: 2641, 65: 2645, 68: 2640, 2637, 2639, 2643, 2644, 2638, 2649, 2648, 2647, 2651, 2652, 2646, 2650, 2653, 2642, 350: 2558, 354: 2556, 2557, 357: 2555, 2553, 381: 2635, 2632, 2634, 2633, 2629, 2631, 2630, 2627, 2628, 2626, 2636, 581: 2554, 2552, 642: 2625, 657: 2665}, + // 785 + {64: 2655}, + {764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 331: 764, 764, 764, 764, 336: 764, 764, 764, 764, 764, 764, 764, 764, 346: 764, 764, 764, 764, 764, 764, 764, 354: 764, 764, 357: 764, 764, 764, 764, 764, 363: 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 375: 764, 764, 764, 764, 764, 381: 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 405: 764, 407: 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 491: 764}, + {982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 331: 982, 982, 982, 982, 336: 982, 982, 2562, 982, 982, 982, 982, 982, 346: 982, 982, 982, 982, 982, 982, 982, 354: 982, 982, 357: 982, 982, 982, 982, 982, 363: 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 375: 982, 982, 982, 982, 982, 381: 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 405: 982, 407: 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 491: 982}, + {992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 331: 992, 992, 992, 992, 336: 992, 992, 992, 992, 992, 992, 992, 992, 346: 992, 992, 992, 992, 992, 992, 992, 354: 992, 992, 357: 992, 992, 992, 992, 992, 363: 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 375: 992, 992, 992, 992, 992, 381: 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 405: 992, 407: 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 491: 992}, + {1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 331: 1501, 1501, 334: 1501, 336: 1501, 1501, 339: 1501, 343: 1501, 346: 1501, 1501, 1501, 1501, 1501, 1501, 1501, 354: 1501, 1501, 357: 1501, 1501, 1501, 1501, 363: 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 375: 1501, 1501, 1501, 1501, 1501, 381: 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 395: 1501, 581: 2554, 2552}, + // 790 + {1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 331: 1502, 1502, 334: 1502, 336: 1502, 1502, 339: 1502, 343: 1502, 346: 1502, 1502, 1502, 1502, 2558, 1502, 1502, 354: 1502, 2557, 357: 1502, 1502, 1502, 1502, 363: 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 375: 1502, 1502, 1502, 1502, 1502, 381: 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 395: 1502, 581: 2554, 2552}, + {1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 331: 1503, 1503, 334: 1503, 336: 1503, 1503, 339: 1503, 343: 1503, 346: 1503, 1503, 1503, 1503, 2558, 1503, 1503, 354: 1503, 2557, 357: 1503, 2553, 1503, 1503, 363: 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 375: 1503, 1503, 1503, 1503, 1503, 381: 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 395: 1503, 581: 2554, 2552}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 2413, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 2673}, + {33: 2674, 350: 2558, 354: 2556, 2557, 357: 2555, 2553, 581: 2554, 2552}, + {91: 2570, 493: 2571, 590: 717, 698: 2675}, + // 795 + {590: 2574, 597: 2676}, + {724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 331: 724, 724, 724, 724, 336: 724, 724, 724, 724, 724, 724, 724, 724, 346: 724, 724, 724, 724, 724, 724, 724, 354: 724, 724, 357: 724, 724, 724, 724, 724, 363: 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 375: 724, 724, 724, 724, 724, 381: 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 405: 724, 407: 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 491: 724}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 2413, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 2678}, + {33: 2679, 350: 2558, 354: 2556, 2557, 357: 2555, 2553, 581: 2554, 2552}, + {91: 2570, 493: 2571, 590: 717, 698: 2680}, + // 800 + {590: 2574, 597: 2681}, + {725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 331: 725, 725, 725, 725, 336: 725, 725, 725, 725, 725, 725, 725, 725, 346: 725, 725, 725, 725, 725, 725, 725, 354: 725, 725, 357: 725, 725, 725, 725, 725, 363: 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 375: 725, 725, 725, 725, 725, 381: 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 405: 725, 407: 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 491: 725}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 2413, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 2683}, + {5: 2685, 33: 722, 350: 2558, 354: 2556, 2557, 357: 2555, 2553, 581: 2554, 2552, 859: 2684}, + {33: 2692}, + // 805 + {362: 2604, 421: 2606, 2605, 424: 2687, 680: 2686}, + {5: 2689, 33: 719, 860: 2691}, + {5: 2689, 33: 719, 860: 2688}, + {33: 720}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 2413, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 2690}, + // 810 + {33: 718, 350: 2558, 354: 2556, 2557, 357: 2555, 2553, 581: 2554, 2552}, + {33: 721}, + {91: 2570, 493: 2571, 590: 717, 698: 2693}, + {590: 2574, 597: 2694}, + {726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 331: 726, 726, 726, 726, 336: 726, 726, 726, 726, 726, 726, 726, 726, 346: 726, 726, 726, 726, 726, 726, 726, 354: 726, 726, 357: 726, 726, 726, 726, 726, 363: 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 375: 726, 726, 726, 726, 726, 381: 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 405: 726, 407: 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 491: 726}, + // 815 + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 2413, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 2696}, + {5: 2685, 33: 722, 350: 2558, 354: 2556, 2557, 357: 2555, 2553, 581: 2554, 2552, 859: 2697}, + {33: 2698}, + {91: 2570, 493: 2571, 590: 717, 698: 2699}, + {590: 2574, 597: 2700}, + // 820 + {727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 331: 727, 727, 727, 727, 336: 727, 727, 727, 727, 727, 727, 727, 727, 346: 727, 727, 727, 727, 727, 727, 727, 354: 727, 727, 357: 727, 727, 727, 727, 727, 363: 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 375: 727, 727, 727, 727, 727, 381: 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 405: 727, 407: 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 491: 727}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2561, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2702, 2465, 2542, 2464, 2461}, + {33: 2703, 338: 2562, 491: 2563}, + {590: 2574, 597: 2704}, + {728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 331: 728, 728, 728, 728, 336: 728, 728, 728, 728, 728, 728, 728, 728, 346: 728, 728, 728, 728, 728, 728, 728, 354: 728, 728, 357: 728, 728, 728, 728, 728, 363: 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 375: 728, 728, 728, 728, 728, 381: 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 405: 728, 407: 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 491: 728}, + // 825 + {33: 2706}, + {590: 2574, 597: 2707}, + {729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 331: 729, 729, 729, 729, 336: 729, 729, 729, 729, 729, 729, 729, 729, 346: 729, 729, 729, 729, 729, 729, 729, 354: 729, 729, 357: 729, 729, 729, 729, 729, 363: 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 375: 729, 729, 729, 729, 729, 381: 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 405: 729, 407: 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 491: 729}, + {33: 2709}, + {590: 2574, 597: 2710}, + // 830 + {730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 331: 730, 730, 730, 730, 336: 730, 730, 730, 730, 730, 730, 730, 730, 346: 730, 730, 730, 730, 730, 730, 730, 354: 730, 730, 357: 730, 730, 730, 730, 730, 363: 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 375: 730, 730, 730, 730, 730, 381: 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 405: 730, 407: 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 491: 730}, + {33: 2712}, + {590: 2574, 597: 2713}, + {731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 331: 731, 731, 731, 731, 336: 731, 731, 731, 731, 731, 731, 731, 731, 346: 731, 731, 731, 731, 731, 731, 731, 354: 731, 731, 357: 731, 731, 731, 731, 731, 363: 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 375: 731, 731, 731, 731, 731, 381: 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 405: 731, 407: 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 491: 731}, + {33: 2715}, + // 835 + {590: 2574, 597: 2716}, + {732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 331: 732, 732, 732, 732, 336: 732, 732, 732, 732, 732, 732, 732, 732, 346: 732, 732, 732, 732, 732, 732, 732, 354: 732, 732, 357: 732, 732, 732, 732, 732, 363: 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 375: 732, 732, 732, 732, 732, 381: 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 405: 732, 407: 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 491: 732}, + {33: 2718}, + {590: 2574, 597: 2719}, + {733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 331: 733, 733, 733, 733, 336: 733, 733, 733, 733, 733, 733, 733, 733, 346: 733, 733, 733, 733, 733, 733, 733, 354: 733, 733, 357: 733, 733, 733, 733, 733, 363: 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 375: 733, 733, 733, 733, 733, 381: 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 405: 733, 407: 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 491: 733}, + // 840 + {2: 962, 962, 962, 6: 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 34: 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 332: 962, 962, 335: 962, 962, 962, 340: 962, 962, 962, 344: 962, 353: 962, 356: 962, 362: 962, 374: 962, 380: 962, 404: 962, 406: 962, 417: 962, 962, 420: 962, 962, 962, 962, 962, 962, 962, 428: 962, 962, 962, 962, 962, 962, 962, 962, 437: 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 585: 2723, 615: 2721, 2722, 629: 2724, 2725, 636: 2726, 643: 2727}, + {2: 966, 966, 966, 6: 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 34: 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 332: 966, 966, 335: 966, 966, 966, 340: 966, 966, 966, 344: 966, 353: 966, 356: 966, 362: 966, 966, 373: 966, 966, 380: 966, 404: 966, 406: 966, 417: 966, 966, 420: 966, 966, 966, 966, 966, 966, 966, 428: 966, 966, 966, 966, 966, 966, 966, 966, 437: 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 494: 966, 585: 966, 601: 966, 610: 966, 966, 966, 966, 621: 966}, + {2: 965, 965, 965, 6: 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 34: 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 332: 965, 965, 335: 965, 965, 965, 340: 965, 965, 965, 344: 965, 353: 965, 356: 965, 362: 965, 965, 373: 965, 965, 380: 965, 404: 965, 406: 965, 417: 965, 965, 420: 965, 965, 965, 965, 965, 965, 965, 428: 965, 965, 965, 965, 965, 965, 965, 965, 437: 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 494: 965, 585: 965, 601: 965, 610: 965, 965, 965, 965, 621: 965}, + {2: 964, 964, 964, 6: 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 34: 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 332: 964, 964, 335: 964, 964, 964, 340: 964, 964, 964, 344: 964, 353: 964, 356: 964, 362: 964, 964, 373: 964, 964, 380: 964, 404: 964, 406: 964, 417: 964, 964, 420: 964, 964, 964, 964, 964, 964, 964, 428: 964, 964, 964, 964, 964, 964, 964, 964, 437: 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 494: 964, 601: 964, 610: 964, 964, 964, 964, 621: 964}, + {2: 963, 963, 963, 6: 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 34: 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 332: 963, 963, 335: 963, 963, 963, 340: 963, 963, 963, 344: 963, 353: 963, 356: 963, 362: 963, 374: 963, 380: 963, 404: 963, 406: 963, 417: 963, 963, 420: 963, 963, 963, 963, 963, 963, 963, 428: 963, 963, 963, 963, 963, 963, 963, 963, 437: 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 585: 2732}, + // 845 + {2: 961, 961, 961, 6: 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 34: 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 332: 961, 961, 335: 961, 961, 961, 340: 961, 961, 961, 344: 961, 353: 961, 356: 961, 362: 961, 961, 373: 961, 961, 380: 961, 404: 961, 406: 961, 417: 961, 961, 420: 961, 961, 961, 961, 961, 961, 961, 428: 961, 961, 961, 961, 961, 961, 961, 961, 437: 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 601: 961, 610: 961, 961, 961, 961, 621: 961}, + {2: 958, 958, 958, 6: 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 34: 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 332: 958, 958, 335: 958, 958, 958, 340: 958, 958, 958, 344: 958, 353: 958, 356: 958, 362: 958, 374: 958, 380: 958, 404: 958, 406: 958, 417: 958, 958, 420: 958, 958, 958, 958, 958, 958, 958, 428: 958, 958, 958, 958, 958, 958, 958, 958, 437: 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 2413, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 2728}, + {33: 2729, 350: 2558, 354: 2556, 2557, 357: 2555, 2553, 581: 2554, 2552}, + {738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 331: 738, 738, 738, 738, 336: 738, 738, 738, 738, 738, 738, 738, 738, 346: 738, 738, 738, 738, 738, 738, 738, 354: 738, 738, 357: 738, 738, 738, 738, 738, 363: 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 375: 738, 738, 738, 738, 738, 381: 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 405: 738, 407: 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 491: 738, 590: 2574, 597: 2731, 609: 2730}, + // 850 + {854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 331: 854, 854, 854, 854, 336: 854, 854, 854, 854, 854, 854, 854, 854, 346: 854, 854, 854, 854, 854, 854, 854, 354: 854, 854, 357: 854, 854, 854, 854, 854, 363: 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 375: 854, 854, 854, 854, 854, 381: 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 405: 854, 407: 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 491: 854}, + {737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 331: 737, 737, 737, 737, 336: 737, 737, 737, 737, 737, 737, 737, 737, 346: 737, 737, 737, 737, 737, 737, 737, 354: 737, 737, 357: 737, 737, 737, 737, 737, 363: 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 375: 737, 737, 737, 737, 737, 381: 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 405: 737, 407: 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 491: 737}, + {2: 957, 957, 957, 6: 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 34: 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 332: 957, 957, 335: 957, 957, 957, 340: 957, 957, 957, 344: 957, 353: 957, 356: 957, 362: 957, 374: 957, 380: 957, 404: 957, 406: 957, 417: 957, 957, 420: 957, 957, 957, 957, 957, 957, 957, 428: 957, 957, 957, 957, 957, 957, 957, 957, 437: 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957}, + {2: 962, 962, 962, 6: 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 34: 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 332: 962, 962, 335: 962, 962, 962, 340: 962, 962, 962, 344: 962, 353: 962, 356: 962, 362: 962, 374: 962, 380: 962, 404: 962, 406: 962, 417: 962, 962, 420: 962, 962, 962, 962, 962, 962, 962, 428: 962, 962, 962, 962, 962, 962, 962, 962, 437: 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 585: 2723, 615: 2721, 2722, 629: 2724, 2725, 636: 2726, 643: 2734}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 2413, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 2735}, + // 855 + {33: 2736, 350: 2558, 354: 2556, 2557, 357: 2555, 2553, 581: 2554, 2552}, + {738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 331: 738, 738, 738, 738, 336: 738, 738, 738, 738, 738, 738, 738, 738, 346: 738, 738, 738, 738, 738, 738, 738, 354: 738, 738, 357: 738, 738, 738, 738, 738, 363: 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 375: 738, 738, 738, 738, 738, 381: 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 405: 738, 407: 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 491: 738, 590: 2574, 597: 2731, 609: 2737}, + {855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 331: 855, 855, 855, 855, 336: 855, 855, 855, 855, 855, 855, 855, 855, 346: 855, 855, 855, 855, 855, 855, 855, 354: 855, 855, 357: 855, 855, 855, 855, 855, 363: 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 375: 855, 855, 855, 855, 855, 381: 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 405: 855, 407: 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 491: 855}, + {2: 962, 962, 962, 6: 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 34: 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 332: 962, 962, 335: 962, 962, 962, 340: 962, 962, 962, 344: 962, 353: 962, 356: 962, 362: 962, 374: 962, 380: 962, 404: 962, 406: 962, 417: 962, 962, 420: 962, 962, 962, 962, 962, 962, 962, 428: 962, 962, 962, 962, 962, 962, 962, 962, 437: 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 585: 2723, 615: 2721, 2722, 629: 2724, 2725, 636: 2726, 643: 2739}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 2413, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 2740}, + // 860 + {33: 2741, 350: 2558, 354: 2556, 2557, 357: 2555, 2553, 581: 2554, 2552}, + {738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 331: 738, 738, 738, 738, 336: 738, 738, 738, 738, 738, 738, 738, 738, 346: 738, 738, 738, 738, 738, 738, 738, 354: 738, 738, 357: 738, 738, 738, 738, 738, 363: 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 375: 738, 738, 738, 738, 738, 381: 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 405: 738, 407: 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 491: 738, 590: 2574, 597: 2731, 609: 2742}, + {856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 331: 856, 856, 856, 856, 336: 856, 856, 856, 856, 856, 856, 856, 856, 346: 856, 856, 856, 856, 856, 856, 856, 354: 856, 856, 357: 856, 856, 856, 856, 856, 363: 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 375: 856, 856, 856, 856, 856, 381: 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 405: 856, 407: 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 491: 856}, + {2: 962, 962, 962, 6: 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 34: 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 332: 962, 962, 335: 962, 962, 962, 340: 962, 962, 962, 344: 962, 353: 962, 356: 962, 362: 962, 374: 962, 380: 962, 404: 962, 406: 962, 417: 962, 962, 420: 962, 962, 962, 962, 962, 962, 962, 428: 962, 962, 962, 962, 962, 962, 962, 962, 437: 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 585: 2723, 615: 2721, 2722, 629: 2724, 2725, 636: 2726, 643: 2744}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 2413, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 2745}, + // 865 + {33: 2746, 350: 2558, 354: 2556, 2557, 357: 2555, 2553, 581: 2554, 2552}, + {738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 331: 738, 738, 738, 738, 336: 738, 738, 738, 738, 738, 738, 738, 738, 346: 738, 738, 738, 738, 738, 738, 738, 354: 738, 738, 357: 738, 738, 738, 738, 738, 363: 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 375: 738, 738, 738, 738, 738, 381: 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 405: 738, 407: 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 491: 738, 590: 2574, 597: 2731, 609: 2747}, + {857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 331: 857, 857, 857, 857, 336: 857, 857, 857, 857, 857, 857, 857, 857, 346: 857, 857, 857, 857, 857, 857, 857, 354: 857, 857, 357: 857, 857, 857, 857, 857, 363: 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 375: 857, 857, 857, 857, 857, 381: 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 405: 857, 407: 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 491: 857}, + {2: 962, 962, 962, 6: 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 34: 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 332: 962, 962, 335: 962, 962, 962, 340: 962, 962, 962, 344: 962, 353: 962, 356: 962, 362: 962, 374: 962, 380: 962, 404: 962, 406: 962, 417: 962, 962, 420: 962, 962, 962, 962, 962, 962, 962, 428: 962, 962, 962, 962, 962, 962, 962, 962, 437: 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 585: 2723, 615: 2721, 2722, 629: 2724, 2725, 636: 2726, 643: 2749}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 2413, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 2750}, + // 870 + {33: 2751, 350: 2558, 354: 2556, 2557, 357: 2555, 2553, 581: 2554, 2552}, + {738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 331: 738, 738, 738, 738, 336: 738, 738, 738, 738, 738, 738, 738, 738, 346: 738, 738, 738, 738, 738, 738, 738, 354: 738, 738, 357: 738, 738, 738, 738, 738, 363: 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 375: 738, 738, 738, 738, 738, 381: 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 405: 738, 407: 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 491: 738, 590: 2574, 597: 2731, 609: 2752}, + {858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 331: 858, 858, 858, 858, 336: 858, 858, 858, 858, 858, 858, 858, 858, 346: 858, 858, 858, 858, 858, 858, 858, 354: 858, 858, 357: 858, 858, 858, 858, 858, 363: 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 375: 858, 858, 858, 858, 858, 381: 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 405: 858, 407: 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 491: 858}, + {2: 962, 962, 962, 6: 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 34: 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 332: 962, 962, 335: 962, 962, 962, 340: 962, 962, 962, 344: 962, 353: 962, 356: 962, 362: 962, 374: 962, 380: 962, 404: 962, 406: 962, 417: 962, 962, 420: 962, 962, 962, 962, 962, 962, 962, 428: 962, 962, 962, 962, 962, 962, 962, 962, 437: 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 585: 2723, 615: 2721, 2722, 629: 2724, 2725, 636: 2726, 643: 2754}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 2413, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 2755}, + // 875 + {33: 2756, 350: 2558, 354: 2556, 2557, 357: 2555, 2553, 581: 2554, 2552}, + {738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 331: 738, 738, 738, 738, 336: 738, 738, 738, 738, 738, 738, 738, 738, 346: 738, 738, 738, 738, 738, 738, 738, 354: 738, 738, 357: 738, 738, 738, 738, 738, 363: 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 375: 738, 738, 738, 738, 738, 381: 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 405: 738, 407: 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 491: 738, 590: 2574, 597: 2731, 609: 2757}, + {859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 331: 859, 859, 859, 859, 336: 859, 859, 859, 859, 859, 859, 859, 859, 346: 859, 859, 859, 859, 859, 859, 859, 354: 859, 859, 357: 859, 859, 859, 859, 859, 363: 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 375: 859, 859, 859, 859, 859, 381: 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 405: 859, 407: 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 491: 859}, + {2: 962, 962, 962, 6: 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 34: 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 332: 962, 962, 335: 962, 962, 962, 340: 962, 962, 962, 344: 962, 353: 962, 356: 962, 362: 962, 374: 962, 380: 962, 404: 962, 406: 962, 417: 962, 962, 420: 962, 962, 962, 962, 962, 962, 962, 428: 962, 962, 962, 962, 962, 962, 962, 962, 437: 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 585: 2723, 615: 2721, 2722, 629: 2724, 2725, 636: 2726, 643: 2759}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 2413, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 2760}, + // 880 + {33: 2761, 350: 2558, 354: 2556, 2557, 357: 2555, 2553, 581: 2554, 2552}, + {738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 331: 738, 738, 738, 738, 336: 738, 738, 738, 738, 738, 738, 738, 738, 346: 738, 738, 738, 738, 738, 738, 738, 354: 738, 738, 357: 738, 738, 738, 738, 738, 363: 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 375: 738, 738, 738, 738, 738, 381: 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 405: 738, 407: 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 491: 738, 590: 2574, 597: 2731, 609: 2762}, + {860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 331: 860, 860, 860, 860, 336: 860, 860, 860, 860, 860, 860, 860, 860, 346: 860, 860, 860, 860, 860, 860, 860, 354: 860, 860, 357: 860, 860, 860, 860, 860, 363: 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 375: 860, 860, 860, 860, 860, 381: 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 405: 860, 407: 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 491: 860}, + {2: 962, 962, 962, 6: 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 34: 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 332: 962, 962, 335: 962, 962, 962, 340: 962, 962, 962, 344: 962, 353: 962, 356: 962, 362: 962, 374: 962, 380: 962, 404: 962, 406: 962, 417: 962, 962, 420: 962, 962, 962, 962, 962, 962, 962, 428: 962, 962, 962, 962, 962, 962, 962, 962, 437: 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 585: 2723, 615: 2721, 2722, 629: 2724, 2725, 636: 2726, 643: 2764}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 2413, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 2765, 619: 2766}, + // 885 + {1489, 1489, 5: 1489, 33: 1489, 61: 1489, 346: 1489, 350: 2558, 1489, 354: 2556, 2557, 357: 2555, 2553, 581: 2554, 2552}, + {5: 2767, 33: 1017, 61: 1017, 351: 2768, 640: 2769, 2770}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 2413, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 2777}, + {507: 2775}, + {1016, 1016, 33: 1016, 61: 1016, 331: 1016, 339: 1016, 343: 1016, 346: 1016, 1016, 1016, 1016}, + // 890 + {33: 853, 61: 2772, 1005: 2771}, + {33: 2774}, + {332: 2773}, + {33: 852}, + {861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 331: 861, 861, 861, 861, 336: 861, 861, 861, 861, 861, 861, 861, 861, 346: 861, 861, 861, 861, 861, 861, 861, 354: 861, 861, 357: 861, 861, 861, 861, 861, 363: 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 375: 861, 861, 861, 861, 861, 381: 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 405: 861, 407: 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 491: 861}, + // 895 + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 2413, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 2587, 689: 2588, 706: 2776}, + {1024, 1024, 5: 2590, 33: 1024, 61: 1024, 331: 1024, 339: 1024, 343: 1024, 346: 1024, 1024, 1024, 1024}, + {1488, 1488, 5: 1488, 33: 1488, 61: 1488, 346: 1488, 350: 2558, 1488, 354: 2556, 2557, 357: 2555, 2553, 581: 2554, 2552}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 2413, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 373: 2782, 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 2779, 585: 2781, 615: 2721, 2722, 629: 2780}, + {33: 2790, 350: 2558, 354: 2556, 2557, 357: 2555, 2553, 581: 2554, 2552}, + // 900 + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 2413, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 2765, 619: 2788}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 2413, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 2785}, + {33: 2783}, + {738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 331: 738, 738, 738, 738, 336: 738, 738, 738, 738, 738, 738, 738, 738, 346: 738, 738, 738, 738, 738, 738, 738, 354: 738, 738, 357: 738, 738, 738, 738, 738, 363: 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 375: 738, 738, 738, 738, 738, 381: 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 405: 738, 407: 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 491: 738, 590: 2574, 597: 2731, 609: 2784}, + {862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 331: 862, 862, 862, 862, 336: 862, 862, 862, 862, 862, 862, 862, 862, 346: 862, 862, 862, 862, 862, 862, 862, 354: 862, 862, 357: 862, 862, 862, 862, 862, 363: 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 375: 862, 862, 862, 862, 862, 381: 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 405: 862, 407: 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 491: 862}, + // 905 + {33: 2786, 350: 2558, 354: 2556, 2557, 357: 2555, 2553, 581: 2554, 2552}, + {738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 331: 738, 738, 738, 738, 336: 738, 738, 738, 738, 738, 738, 738, 738, 346: 738, 738, 738, 738, 738, 738, 738, 354: 738, 738, 357: 738, 738, 738, 738, 738, 363: 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 375: 738, 738, 738, 738, 738, 381: 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 405: 738, 407: 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 491: 738, 590: 2574, 597: 2731, 609: 2787}, + {864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 331: 864, 864, 864, 864, 336: 864, 864, 864, 864, 864, 864, 864, 864, 346: 864, 864, 864, 864, 864, 864, 864, 354: 864, 864, 357: 864, 864, 864, 864, 864, 363: 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 375: 864, 864, 864, 864, 864, 381: 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 405: 864, 407: 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 491: 864}, + {5: 2767, 33: 2789}, + {865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 331: 865, 865, 865, 865, 336: 865, 865, 865, 865, 865, 865, 865, 865, 346: 865, 865, 865, 865, 865, 865, 865, 354: 865, 865, 357: 865, 865, 865, 865, 865, 363: 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 375: 865, 865, 865, 865, 865, 381: 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 405: 865, 407: 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 491: 865}, + // 910 + {738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 331: 738, 738, 738, 738, 336: 738, 738, 738, 738, 738, 738, 738, 738, 346: 738, 738, 738, 738, 738, 738, 738, 354: 738, 738, 357: 738, 738, 738, 738, 738, 363: 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 375: 738, 738, 738, 738, 738, 381: 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 405: 738, 407: 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 491: 738, 590: 2574, 597: 2731, 609: 2791}, + {863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 331: 863, 863, 863, 863, 336: 863, 863, 863, 863, 863, 863, 863, 863, 346: 863, 863, 863, 863, 863, 863, 863, 354: 863, 863, 357: 863, 863, 863, 863, 863, 363: 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 375: 863, 863, 863, 863, 863, 381: 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 405: 863, 407: 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 491: 863}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 2413, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 2793, 585: 2794}, + {33: 2798, 350: 2558, 354: 2556, 2557, 357: 2555, 2553, 581: 2554, 2552}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 2413, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 2795}, + // 915 + {33: 2796, 350: 2558, 354: 2556, 2557, 357: 2555, 2553, 581: 2554, 2552}, + {738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 331: 738, 738, 738, 738, 336: 738, 738, 738, 738, 738, 738, 738, 738, 346: 738, 738, 738, 738, 738, 738, 738, 354: 738, 738, 357: 738, 738, 738, 738, 738, 363: 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 375: 738, 738, 738, 738, 738, 381: 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 405: 738, 407: 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 491: 738, 590: 2574, 597: 2731, 609: 2797}, + {866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 331: 866, 866, 866, 866, 336: 866, 866, 866, 866, 866, 866, 866, 866, 346: 866, 866, 866, 866, 866, 866, 866, 354: 866, 866, 357: 866, 866, 866, 866, 866, 363: 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 375: 866, 866, 866, 866, 866, 381: 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 405: 866, 407: 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 491: 866}, + {738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 331: 738, 738, 738, 738, 336: 738, 738, 738, 738, 738, 738, 738, 738, 346: 738, 738, 738, 738, 738, 738, 738, 354: 738, 738, 357: 738, 738, 738, 738, 738, 363: 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 375: 738, 738, 738, 738, 738, 381: 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 405: 738, 407: 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 491: 738, 590: 2574, 597: 2731, 609: 2799}, + {867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 331: 867, 867, 867, 867, 336: 867, 867, 867, 867, 867, 867, 867, 867, 346: 867, 867, 867, 867, 867, 867, 867, 354: 867, 867, 357: 867, 867, 867, 867, 867, 363: 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 375: 867, 867, 867, 867, 867, 381: 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 405: 867, 407: 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 491: 867}, + // 920 + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 2413, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 2801, 585: 2802}, + {33: 2806, 350: 2558, 354: 2556, 2557, 357: 2555, 2553, 581: 2554, 2552}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 2413, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 2803}, + {33: 2804, 350: 2558, 354: 2556, 2557, 357: 2555, 2553, 581: 2554, 2552}, + {738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 331: 738, 738, 738, 738, 336: 738, 738, 738, 738, 738, 738, 738, 738, 346: 738, 738, 738, 738, 738, 738, 738, 354: 738, 738, 357: 738, 738, 738, 738, 738, 363: 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 375: 738, 738, 738, 738, 738, 381: 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 405: 738, 407: 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 491: 738, 590: 2574, 597: 2731, 609: 2805}, + // 925 + {868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 331: 868, 868, 868, 868, 336: 868, 868, 868, 868, 868, 868, 868, 868, 346: 868, 868, 868, 868, 868, 868, 868, 354: 868, 868, 357: 868, 868, 868, 868, 868, 363: 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 375: 868, 868, 868, 868, 868, 381: 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 405: 868, 407: 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 491: 868}, + {738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 331: 738, 738, 738, 738, 336: 738, 738, 738, 738, 738, 738, 738, 738, 346: 738, 738, 738, 738, 738, 738, 738, 354: 738, 738, 357: 738, 738, 738, 738, 738, 363: 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 375: 738, 738, 738, 738, 738, 381: 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 405: 738, 407: 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 491: 738, 590: 2574, 597: 2731, 609: 2807}, + {869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 331: 869, 869, 869, 869, 336: 869, 869, 869, 869, 869, 869, 869, 869, 346: 869, 869, 869, 869, 869, 869, 869, 354: 869, 869, 357: 869, 869, 869, 869, 869, 363: 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 375: 869, 869, 869, 869, 869, 381: 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 405: 869, 407: 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 491: 869}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 2413, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 2809, 585: 2810}, + {33: 2814, 350: 2558, 354: 2556, 2557, 357: 2555, 2553, 581: 2554, 2552}, + // 930 + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 2413, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 2811}, + {33: 2812, 350: 2558, 354: 2556, 2557, 357: 2555, 2553, 581: 2554, 2552}, + {738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 331: 738, 738, 738, 738, 336: 738, 738, 738, 738, 738, 738, 738, 738, 346: 738, 738, 738, 738, 738, 738, 738, 354: 738, 738, 357: 738, 738, 738, 738, 738, 363: 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 375: 738, 738, 738, 738, 738, 381: 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 405: 738, 407: 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 491: 738, 590: 2574, 597: 2731, 609: 2813}, + {870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 331: 870, 870, 870, 870, 336: 870, 870, 870, 870, 870, 870, 870, 870, 346: 870, 870, 870, 870, 870, 870, 870, 354: 870, 870, 357: 870, 870, 870, 870, 870, 363: 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 375: 870, 870, 870, 870, 870, 381: 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 405: 870, 407: 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 491: 870}, + {738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 331: 738, 738, 738, 738, 336: 738, 738, 738, 738, 738, 738, 738, 738, 346: 738, 738, 738, 738, 738, 738, 738, 354: 738, 738, 357: 738, 738, 738, 738, 738, 363: 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 375: 738, 738, 738, 738, 738, 381: 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 405: 738, 407: 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 491: 738, 590: 2574, 597: 2731, 609: 2815}, + // 935 + {871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 331: 871, 871, 871, 871, 336: 871, 871, 871, 871, 871, 871, 871, 871, 346: 871, 871, 871, 871, 871, 871, 871, 354: 871, 871, 357: 871, 871, 871, 871, 871, 363: 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 375: 871, 871, 871, 871, 871, 381: 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 405: 871, 407: 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 491: 871}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 2413, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 2817, 932: 2819, 982: 2820, 1058: 2821, 2818}, + {33: 2829, 350: 2558, 354: 2556, 2557, 357: 2555, 2553, 360: 2830, 581: 2554, 2552}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 2413, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 360: 2823, 362: 2450, 374: 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 2822}, + {2: 875, 875, 875, 6: 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 34: 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 332: 875, 875, 335: 875, 875, 875, 340: 875, 875, 875, 344: 875, 353: 875, 356: 875, 360: 875, 362: 875, 374: 875, 380: 875, 404: 875, 406: 875, 417: 875, 875, 420: 875, 875, 875, 875, 875, 875, 875, 428: 875, 875, 875, 875, 875, 875, 875, 875, 437: 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875}, + // 940 + {2: 874, 874, 874, 6: 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 34: 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 332: 874, 874, 335: 874, 874, 874, 340: 874, 874, 874, 344: 874, 353: 874, 356: 874, 360: 874, 362: 874, 374: 874, 380: 874, 404: 874, 406: 874, 417: 874, 874, 420: 874, 874, 874, 874, 874, 874, 874, 428: 874, 874, 874, 874, 874, 874, 874, 874, 437: 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874}, + {2: 873, 873, 873, 6: 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 34: 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 332: 873, 873, 335: 873, 873, 873, 340: 873, 873, 873, 344: 873, 353: 873, 356: 873, 360: 873, 362: 873, 374: 873, 380: 873, 404: 873, 406: 873, 417: 873, 873, 420: 873, 873, 873, 873, 873, 873, 873, 428: 873, 873, 873, 873, 873, 873, 873, 873, 437: 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873}, + {350: 2558, 354: 2556, 2557, 357: 2555, 2553, 360: 2826, 581: 2554, 2552}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 2413, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 2824}, + {33: 2825, 350: 2558, 354: 2556, 2557, 357: 2555, 2553, 581: 2554, 2552}, + // 945 + {885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 331: 885, 885, 885, 885, 336: 885, 885, 885, 885, 885, 885, 885, 885, 346: 885, 885, 885, 885, 885, 885, 885, 354: 885, 885, 357: 885, 885, 885, 885, 885, 363: 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 375: 885, 885, 885, 885, 885, 381: 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 405: 885, 407: 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 491: 885}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 2413, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 2827}, + {33: 2828, 350: 2558, 354: 2556, 2557, 357: 2555, 2553, 581: 2554, 2552}, + {884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 331: 884, 884, 884, 884, 336: 884, 884, 884, 884, 884, 884, 884, 884, 346: 884, 884, 884, 884, 884, 884, 884, 354: 884, 884, 357: 884, 884, 884, 884, 884, 363: 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 375: 884, 884, 884, 884, 884, 381: 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 405: 884, 407: 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 491: 884}, + {887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 331: 887, 887, 887, 887, 336: 887, 887, 887, 887, 887, 887, 887, 887, 346: 887, 887, 887, 887, 887, 887, 887, 354: 887, 887, 357: 887, 887, 887, 887, 887, 363: 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 375: 887, 887, 887, 887, 887, 381: 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 405: 887, 407: 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 491: 887}, + // 950 + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 2413, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 2831}, + {33: 2832, 350: 2558, 354: 2556, 2557, 357: 2555, 2553, 581: 2554, 2552}, + {886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 331: 886, 886, 886, 886, 336: 886, 886, 886, 886, 886, 886, 886, 886, 346: 886, 886, 886, 886, 886, 886, 886, 354: 886, 886, 357: 886, 886, 886, 886, 886, 363: 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 375: 886, 886, 886, 886, 886, 381: 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 405: 886, 407: 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 491: 886}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 2413, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 2834}, + {5: 2835, 350: 2558, 354: 2556, 2557, 357: 2555, 2553, 360: 2836, 581: 2554, 2552}, + // 955 + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 2413, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 2842}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 2413, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 2837}, + {33: 2838, 347: 2839, 350: 2558, 354: 2556, 2557, 357: 2555, 2553, 581: 2554, 2552}, + {892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 331: 892, 892, 892, 892, 336: 892, 892, 892, 892, 892, 892, 892, 892, 346: 892, 892, 892, 892, 892, 892, 892, 354: 892, 892, 357: 892, 892, 892, 892, 892, 363: 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 375: 892, 892, 892, 892, 892, 381: 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 405: 892, 407: 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 491: 892}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 2413, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 2840}, + // 960 + {33: 2841, 350: 2558, 354: 2556, 2557, 357: 2555, 2553, 581: 2554, 2552}, + {890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 331: 890, 890, 890, 890, 336: 890, 890, 890, 890, 890, 890, 890, 890, 346: 890, 890, 890, 890, 890, 890, 890, 354: 890, 890, 357: 890, 890, 890, 890, 890, 363: 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 375: 890, 890, 890, 890, 890, 381: 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 405: 890, 407: 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 491: 890}, + {5: 2844, 33: 2843, 350: 2558, 354: 2556, 2557, 357: 2555, 2553, 581: 2554, 2552}, + {893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 331: 893, 893, 893, 893, 336: 893, 893, 893, 893, 893, 893, 893, 893, 346: 893, 893, 893, 893, 893, 893, 893, 354: 893, 893, 357: 893, 893, 893, 893, 893, 363: 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 375: 893, 893, 893, 893, 893, 381: 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 405: 893, 407: 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 491: 893}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 2413, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 2845}, + // 965 + {33: 2846, 350: 2558, 354: 2556, 2557, 357: 2555, 2553, 581: 2554, 2552}, + {891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 331: 891, 891, 891, 891, 336: 891, 891, 891, 891, 891, 891, 891, 891, 346: 891, 891, 891, 891, 891, 891, 891, 354: 891, 891, 357: 891, 891, 891, 891, 891, 363: 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 375: 891, 891, 891, 891, 891, 381: 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 405: 891, 407: 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 491: 891}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2561, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2848}, + {340: 2853, 2854, 2859, 373: 2855, 394: 2861, 407: 2857, 2850, 2856, 2860, 2849, 2858, 2851, 2852}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2561, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2881}, + // 970 + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2561, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2880}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2561, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2879}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2561, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2878}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2561, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2875, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2874}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2561, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2871, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2870}, + // 975 + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2561, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2869}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2561, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2868}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2561, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2867}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2561, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2866}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2561, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2865}, + // 980 + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2561, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2864}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 2413, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 2862}, + {33: 2863, 350: 2558, 354: 2556, 2557, 357: 2555, 2553, 581: 2554, 2552}, + {894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 331: 894, 894, 894, 894, 336: 894, 894, 894, 894, 894, 894, 894, 894, 346: 894, 894, 894, 894, 894, 894, 894, 354: 894, 894, 357: 894, 894, 894, 894, 894, 363: 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 375: 894, 894, 894, 894, 894, 381: 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 405: 894, 407: 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 491: 894}, + {1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 331: 1002, 1002, 1002, 1002, 336: 1002, 1002, 339: 1002, 1002, 1002, 1002, 1002, 346: 1002, 1002, 1002, 1002, 1002, 1002, 1002, 354: 1002, 1002, 357: 1002, 1002, 1002, 1002, 1002, 363: 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 375: 1002, 1002, 1002, 1002, 1002, 381: 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 405: 1002, 407: 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002}, + // 985 + {1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 331: 1003, 1003, 1003, 1003, 336: 1003, 1003, 339: 1003, 1003, 1003, 1003, 1003, 346: 1003, 1003, 1003, 1003, 1003, 1003, 1003, 354: 1003, 1003, 357: 1003, 1003, 1003, 1003, 1003, 363: 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 375: 1003, 1003, 1003, 1003, 1003, 381: 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 405: 1003, 407: 1003, 1003, 1003, 2860, 1003, 1003, 1003, 1003, 1003, 1003}, + {1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 331: 1004, 1004, 1004, 1004, 336: 1004, 1004, 339: 1004, 1004, 1004, 1004, 1004, 346: 1004, 1004, 1004, 1004, 1004, 1004, 1004, 354: 1004, 1004, 357: 1004, 1004, 1004, 1004, 1004, 363: 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 375: 1004, 1004, 1004, 1004, 1004, 381: 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 405: 1004, 407: 1004, 1004, 1004, 2860, 1004, 1004, 1004, 1004, 1004, 1004}, + {1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 331: 1005, 1005, 1005, 1005, 336: 1005, 1005, 339: 1005, 1005, 1005, 1005, 1005, 346: 1005, 1005, 1005, 1005, 1005, 1005, 1005, 354: 1005, 1005, 357: 1005, 1005, 1005, 1005, 1005, 363: 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 375: 1005, 1005, 1005, 1005, 1005, 381: 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 405: 1005, 407: 1005, 1005, 1005, 2860, 1005, 1005, 1005, 1005, 1005, 1005}, + {1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 331: 1006, 1006, 1006, 1006, 336: 1006, 1006, 339: 1006, 1006, 1006, 1006, 1006, 346: 1006, 1006, 1006, 1006, 1006, 1006, 1006, 354: 1006, 1006, 357: 1006, 1006, 1006, 1006, 1006, 363: 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 375: 1006, 1006, 1006, 1006, 1006, 381: 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 405: 1006, 407: 1006, 1006, 1006, 2860, 1006, 1006, 1006, 1006, 1006, 1006}, + {1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 331: 1007, 1007, 1007, 1007, 336: 1007, 1007, 339: 1007, 1007, 1007, 1007, 1007, 346: 1007, 1007, 1007, 1007, 1007, 1007, 1007, 354: 1007, 1007, 357: 1007, 1007, 1007, 1007, 1007, 363: 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 375: 1007, 1007, 1007, 1007, 1007, 381: 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 405: 1007, 407: 1007, 1007, 1007, 2860, 1007, 1007, 1007, 1007, 1007, 1007}, + // 990 + {1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 331: 1010, 1010, 1010, 1010, 336: 1010, 1010, 339: 1010, 1010, 1010, 2859, 1010, 346: 1010, 1010, 1010, 1010, 1010, 1010, 1010, 354: 1010, 1010, 357: 1010, 1010, 1010, 1010, 1010, 363: 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 2855, 375: 1010, 1010, 1010, 1010, 1010, 381: 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 405: 1010, 407: 2857, 1010, 2856, 2860, 1010, 2858, 1010, 1010, 1010, 1010}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 2413, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 2872}, + {63: 2641, 65: 2645, 68: 2640, 2637, 2639, 2643, 2644, 2638, 2649, 2648, 2647, 2651, 2652, 2646, 2650, 2653, 2642, 350: 2558, 354: 2556, 2557, 357: 2555, 2553, 381: 2635, 2632, 2634, 2633, 2629, 2631, 2630, 2627, 2628, 2626, 2636, 581: 2554, 2552, 642: 2625, 657: 2873}, + {1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 331: 1008, 1008, 1008, 1008, 336: 1008, 1008, 339: 1008, 1008, 1008, 1008, 1008, 346: 1008, 1008, 1008, 1008, 1008, 1008, 1008, 354: 1008, 1008, 357: 1008, 1008, 1008, 1008, 1008, 363: 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 375: 1008, 1008, 1008, 1008, 1008, 381: 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 405: 1008, 407: 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008}, + {1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 331: 1011, 1011, 1011, 1011, 336: 1011, 1011, 339: 1011, 1011, 1011, 2859, 1011, 346: 1011, 1011, 1011, 1011, 1011, 1011, 1011, 354: 1011, 1011, 357: 1011, 1011, 1011, 1011, 1011, 363: 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 2855, 375: 1011, 1011, 1011, 1011, 1011, 381: 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 1011, 405: 1011, 407: 2857, 1011, 2856, 2860, 1011, 2858, 1011, 1011, 1011, 1011}, + // 995 + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 2413, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 2876}, + {63: 2641, 65: 2645, 68: 2640, 2637, 2639, 2643, 2644, 2638, 2649, 2648, 2647, 2651, 2652, 2646, 2650, 2653, 2642, 350: 2558, 354: 2556, 2557, 357: 2555, 2553, 381: 2635, 2632, 2634, 2633, 2629, 2631, 2630, 2627, 2628, 2626, 2636, 581: 2554, 2552, 642: 2625, 657: 2877}, + {1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 331: 1009, 1009, 1009, 1009, 336: 1009, 1009, 339: 1009, 1009, 1009, 1009, 1009, 346: 1009, 1009, 1009, 1009, 1009, 1009, 1009, 354: 1009, 1009, 357: 1009, 1009, 1009, 1009, 1009, 363: 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 375: 1009, 1009, 1009, 1009, 1009, 381: 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 405: 1009, 407: 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009}, + {1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 331: 1012, 1012, 1012, 1012, 336: 1012, 1012, 339: 1012, 2853, 2854, 2859, 1012, 346: 1012, 1012, 1012, 1012, 1012, 1012, 1012, 354: 1012, 1012, 357: 1012, 1012, 1012, 1012, 1012, 363: 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 2855, 375: 1012, 1012, 1012, 1012, 1012, 381: 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 405: 1012, 407: 2857, 1012, 2856, 2860, 1012, 2858, 1012, 1012, 1012, 1012}, + {1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 331: 1013, 1013, 1013, 1013, 336: 1013, 1013, 339: 1013, 2853, 2854, 2859, 1013, 346: 1013, 1013, 1013, 1013, 1013, 1013, 1013, 354: 1013, 1013, 357: 1013, 1013, 1013, 1013, 1013, 363: 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 2855, 375: 1013, 1013, 1013, 1013, 1013, 381: 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 405: 1013, 407: 2857, 1013, 2856, 2860, 1013, 2858, 1013, 1013, 1013, 1013}, + // 1000 + {1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 331: 1014, 1014, 1014, 1014, 336: 1014, 1014, 339: 1014, 2853, 2854, 2859, 1014, 346: 1014, 1014, 1014, 1014, 1014, 1014, 1014, 354: 1014, 1014, 357: 1014, 1014, 1014, 1014, 1014, 363: 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 2855, 375: 1014, 1014, 1014, 1014, 1014, 381: 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 405: 1014, 407: 2857, 1014, 2856, 2860, 1014, 2858, 2851, 2852, 1014, 1014}, + {1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 331: 1015, 1015, 1015, 1015, 336: 1015, 1015, 339: 1015, 2853, 2854, 2859, 1015, 346: 1015, 1015, 1015, 1015, 1015, 1015, 1015, 354: 1015, 1015, 357: 1015, 1015, 1015, 1015, 1015, 363: 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 2855, 375: 1015, 1015, 1015, 1015, 1015, 381: 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 405: 1015, 407: 2857, 2850, 2856, 2860, 1015, 2858, 2851, 2852, 1015, 1015}, + {63: 2641, 65: 2645, 68: 2640, 2637, 2639, 2643, 2644, 2638, 2649, 2648, 2647, 2651, 2652, 2646, 2650, 2653, 2642, 381: 2635, 2632, 2634, 2633, 2629, 2631, 2630, 2627, 2628, 2626, 2636, 642: 2625, 657: 2883}, + {360: 2884}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 2413, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 2885}, + // 1005 + {33: 2886, 350: 2558, 354: 2556, 2557, 357: 2555, 2553, 581: 2554, 2552}, + {896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 331: 896, 896, 896, 896, 336: 896, 896, 896, 896, 896, 896, 896, 896, 346: 896, 896, 896, 896, 896, 896, 896, 354: 896, 896, 357: 896, 896, 896, 896, 896, 363: 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 375: 896, 896, 896, 896, 896, 381: 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 405: 896, 407: 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 491: 896}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 2413, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 2888}, + {5: 2889, 350: 2558, 354: 2556, 2557, 357: 2555, 2553, 581: 2554, 2552}, + {423: 2890}, + // 1010 + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 2413, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 2891}, + {63: 2641, 65: 2645, 68: 2640, 2637, 2639, 2643, 2644, 2638, 2649, 2648, 2647, 2651, 2652, 2646, 2650, 2653, 2642, 350: 2558, 354: 2556, 2557, 357: 2555, 2553, 381: 2635, 2632, 2634, 2633, 2629, 2631, 2630, 2627, 2628, 2626, 2636, 581: 2554, 2552, 642: 2625, 657: 2892}, + {33: 2893}, + {897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 331: 897, 897, 897, 897, 336: 897, 897, 897, 897, 897, 897, 897, 897, 346: 897, 897, 897, 897, 897, 897, 897, 354: 897, 897, 357: 897, 897, 897, 897, 897, 363: 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 375: 897, 897, 897, 897, 897, 381: 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 405: 897, 407: 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 491: 897}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 2413, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 2895}, + // 1015 + {5: 2896, 350: 2558, 354: 2556, 2557, 357: 2555, 2553, 581: 2554, 2552}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 2413, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2898, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 2897}, + {33: 2902, 350: 2558, 354: 2556, 2557, 357: 2555, 2553, 581: 2554, 2552}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 2413, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 2899}, + {63: 2641, 65: 2645, 68: 2640, 2637, 2639, 2643, 2644, 2638, 2649, 2648, 2647, 2651, 2652, 2646, 2650, 2653, 2642, 350: 2558, 354: 2556, 2557, 357: 2555, 2553, 381: 2635, 2632, 2634, 2633, 2629, 2631, 2630, 2627, 2628, 2626, 2636, 581: 2554, 2552, 642: 2625, 657: 2900}, + // 1020 + {33: 2901}, + {898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 331: 898, 898, 898, 898, 336: 898, 898, 898, 898, 898, 898, 898, 898, 346: 898, 898, 898, 898, 898, 898, 898, 354: 898, 898, 357: 898, 898, 898, 898, 898, 363: 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 375: 898, 898, 898, 898, 898, 381: 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 405: 898, 407: 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 491: 898}, + {899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 331: 899, 899, 899, 899, 336: 899, 899, 899, 899, 899, 899, 899, 899, 346: 899, 899, 899, 899, 899, 899, 899, 354: 899, 899, 357: 899, 899, 899, 899, 899, 363: 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 375: 899, 899, 899, 899, 899, 381: 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 405: 899, 407: 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 491: 899}, + {33: 1483, 362: 2905, 821: 2904, 2906}, + {33: 1482}, + // 1025 + {33: 1481}, + {33: 2907}, + {900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 331: 900, 900, 900, 900, 336: 900, 900, 900, 900, 900, 900, 900, 900, 346: 900, 900, 900, 900, 900, 900, 900, 354: 900, 900, 357: 900, 900, 900, 900, 900, 363: 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 375: 900, 900, 900, 900, 900, 381: 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 405: 900, 407: 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 491: 900}, + {33: 1483, 362: 2905, 821: 2904, 2909}, + {33: 2910}, + // 1030 + {901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 331: 901, 901, 901, 901, 336: 901, 901, 901, 901, 901, 901, 901, 901, 346: 901, 901, 901, 901, 901, 901, 901, 354: 901, 901, 357: 901, 901, 901, 901, 901, 363: 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 375: 901, 901, 901, 901, 901, 381: 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 405: 901, 407: 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 491: 901}, + {332: 1042}, + {332: 1041}, + {332: 1040}, + {332: 2915}, + // 1035 + {371: 2916}, + {902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 331: 902, 902, 902, 902, 336: 902, 902, 902, 902, 902, 902, 902, 902, 346: 902, 902, 902, 902, 902, 902, 902, 354: 902, 902, 357: 902, 902, 902, 902, 902, 363: 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 375: 902, 902, 902, 902, 902, 381: 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 405: 902, 407: 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 491: 902}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2561, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2918}, + {5: 2919, 340: 2853, 2854, 2859, 373: 2855, 407: 2857, 2850, 2856, 2860, 2849, 2858, 2851, 2852}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2561, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2920}, + // 1040 + {33: 2921, 340: 2853, 2854, 2859, 373: 2855, 407: 2857, 2850, 2856, 2860, 2849, 2858, 2851, 2852}, + {904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 331: 904, 904, 904, 904, 336: 904, 904, 904, 904, 904, 904, 904, 904, 346: 904, 904, 904, 904, 904, 904, 904, 354: 904, 904, 357: 904, 904, 904, 904, 904, 363: 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 375: 904, 904, 904, 904, 904, 381: 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 405: 904, 407: 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 491: 904}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 1485, 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 2413, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 2765, 619: 2923, 691: 2924}, + {5: 2767, 33: 1484}, + {33: 2925}, + // 1045 + {905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 331: 905, 905, 905, 905, 336: 905, 905, 905, 905, 905, 905, 905, 905, 346: 905, 905, 905, 905, 905, 905, 905, 354: 905, 905, 357: 905, 905, 905, 905, 905, 363: 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 375: 905, 905, 905, 905, 905, 381: 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 405: 905, 407: 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 491: 905}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 2413, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 2765, 619: 2927}, + {5: 2767, 33: 2928, 346: 2929}, + {910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 331: 910, 910, 910, 910, 336: 910, 910, 910, 910, 910, 910, 910, 910, 346: 910, 910, 910, 910, 910, 910, 910, 354: 910, 910, 357: 910, 910, 910, 910, 910, 363: 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 375: 910, 910, 910, 910, 910, 381: 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 405: 910, 407: 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 491: 910}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 332: 2361, 380: 2360, 497: 2362, 2001, 2002, 2000, 586: 2359, 635: 2930}, + // 1050 + {33: 2931}, + {909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 331: 909, 909, 909, 909, 336: 909, 909, 909, 909, 909, 909, 909, 909, 346: 909, 909, 909, 909, 909, 909, 909, 354: 909, 909, 357: 909, 909, 909, 909, 909, 363: 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 375: 909, 909, 909, 909, 909, 381: 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 405: 909, 407: 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 491: 909}, + {911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 331: 911, 911, 911, 911, 336: 911, 911, 911, 911, 911, 911, 911, 911, 346: 911, 911, 911, 911, 911, 911, 911, 354: 911, 911, 357: 911, 911, 911, 911, 911, 363: 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 375: 911, 911, 911, 911, 911, 381: 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 405: 911, 407: 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 491: 911}, + {33: 2934, 362: 2935}, + {849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 331: 849, 849, 849, 849, 336: 849, 849, 849, 849, 849, 849, 849, 849, 346: 849, 849, 849, 849, 849, 849, 849, 354: 849, 849, 357: 849, 849, 849, 849, 849, 363: 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 375: 849, 849, 849, 849, 849, 381: 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 405: 849, 407: 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 491: 849}, + // 1055 + {33: 2936}, + {848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 331: 848, 848, 848, 848, 336: 848, 848, 848, 848, 848, 848, 848, 848, 346: 848, 848, 848, 848, 848, 848, 848, 354: 848, 848, 357: 848, 848, 848, 848, 848, 363: 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 375: 848, 848, 848, 848, 848, 381: 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 405: 848, 407: 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 491: 848}, + {33: 2938}, + {912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 331: 912, 912, 912, 912, 336: 912, 912, 912, 912, 912, 912, 912, 912, 346: 912, 912, 912, 912, 912, 912, 912, 354: 912, 912, 357: 912, 912, 912, 912, 912, 363: 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 375: 912, 912, 912, 912, 912, 381: 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 405: 912, 407: 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 491: 912}, + {33: 2941}, + // 1060 + {913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 331: 913, 913, 913, 913, 336: 913, 913, 913, 913, 913, 913, 913, 913, 346: 913, 913, 913, 913, 913, 913, 913, 354: 913, 913, 357: 913, 913, 913, 913, 913, 363: 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 375: 913, 913, 913, 913, 913, 381: 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 405: 913, 407: 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 491: 913}, + {926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 331: 926, 926, 926, 926, 336: 926, 926, 926, 926, 926, 926, 926, 926, 346: 926, 926, 926, 926, 926, 926, 926, 354: 926, 926, 357: 926, 926, 926, 926, 926, 363: 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 375: 926, 926, 926, 926, 926, 381: 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 405: 926, 407: 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 491: 926, 510: 926, 513: 926}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 1485, 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 2413, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 2765, 619: 2923, 691: 2943}, + {33: 2944}, + {914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 331: 914, 914, 914, 914, 336: 914, 914, 914, 914, 914, 914, 914, 914, 346: 914, 914, 914, 914, 914, 914, 914, 354: 914, 914, 357: 914, 914, 914, 914, 914, 363: 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 375: 914, 914, 914, 914, 914, 381: 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 405: 914, 407: 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 491: 914}, + // 1065 + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 1485, 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 2413, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 2765, 619: 2923, 691: 2946}, + {33: 2947}, + {915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 331: 915, 915, 915, 915, 336: 915, 915, 915, 915, 915, 915, 915, 915, 346: 915, 915, 915, 915, 915, 915, 915, 354: 915, 915, 357: 915, 915, 915, 915, 915, 363: 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 375: 915, 915, 915, 915, 915, 381: 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 405: 915, 407: 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 491: 915}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 374: 2406, 497: 2405, 2001, 2002, 2000, 561: 2949}, + {33: 2950}, + // 1070 + {969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 331: 969, 969, 969, 969, 336: 969, 969, 969, 969, 969, 969, 969, 969, 346: 969, 969, 969, 969, 969, 969, 969, 354: 969, 969, 357: 969, 969, 969, 969, 969, 363: 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 375: 969, 969, 969, 969, 969, 381: 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 405: 969, 407: 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 491: 969}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 2413, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 2952}, + {5: 2953, 346: 2954, 350: 2558, 354: 2556, 2557, 357: 2555, 2553, 581: 2554, 2552}, + {35: 2964, 106: 2961, 2960, 109: 2966, 116: 2963, 356: 2959, 380: 2958, 529: 2962, 2967, 2968, 535: 2969, 587: 2965, 779: 2957}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 332: 2361, 380: 2360, 497: 2362, 2001, 2002, 2000, 586: 2359, 635: 2955}, + // 1075 + {33: 2956}, + {971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 331: 971, 971, 971, 971, 336: 971, 971, 971, 971, 971, 971, 971, 971, 346: 971, 971, 971, 971, 971, 971, 971, 354: 971, 971, 357: 971, 971, 971, 971, 971, 363: 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 375: 971, 971, 971, 971, 971, 381: 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 405: 971, 407: 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 491: 971}, + {33: 3006}, + {33: 185, 330: 2985, 600: 2986, 620: 3005}, + {11: 185, 33: 185, 330: 2985, 356: 185, 380: 185, 496: 185, 600: 2986, 620: 2990}, + // 1080 + {33: 809}, + {33: 185, 330: 2985, 600: 2986, 620: 2989}, + {33: 178, 330: 2971, 600: 2972, 711: 2988, 720: 2973}, + {33: 185, 330: 2985, 600: 2986, 620: 2984}, + {33: 242, 532: 2981, 2982, 857: 2983}, + // 1085 + {33: 242, 532: 2981, 2982, 857: 2980}, + {33: 803}, + {33: 802}, + {33: 178, 330: 2971, 600: 2972, 711: 2970, 720: 2973}, + {33: 800}, + // 1090 + {33: 801}, + {362: 1990, 583: 2974, 599: 2975}, + {177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 33: 177, 35: 177, 331: 177, 333: 177, 177, 177, 338: 177, 344: 177, 177, 419: 177, 427: 177, 436: 177, 489: 177, 177, 492: 177, 587: 177, 177}, + {176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 33: 176, 35: 176, 331: 176, 333: 176, 176, 176, 338: 176, 344: 176, 176, 419: 176, 427: 176, 436: 176, 489: 176, 176, 492: 176, 587: 176, 176}, + {1506, 1506, 1506, 1506, 1506, 1506, 10: 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 53: 1506, 1506, 1506, 1506, 58: 1506, 1506, 110: 1506, 330: 1506, 1506, 334: 1506, 1506, 338: 1506, 1506, 343: 1506, 345: 1506, 1506, 1506, 1506, 353: 1506, 356: 1506, 493: 1506, 1506, 1506, 1506, 501: 1506, 1506, 1506}, + // 1095 + {5: 2977, 33: 2976}, + {186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 11: 186, 33: 186, 35: 186, 331: 186, 333: 186, 186, 186, 338: 186, 344: 186, 186, 356: 186, 378: 186, 186, 186, 419: 186, 427: 186, 436: 186, 489: 186, 186, 492: 186, 496: 186, 587: 186, 186}, + {362: 1990, 583: 2974, 599: 2978}, + {33: 2979}, + {175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 33: 175, 35: 175, 331: 175, 333: 175, 175, 175, 338: 175, 344: 175, 175, 419: 175, 427: 175, 436: 175, 489: 175, 175, 492: 175, 587: 175, 175}, + // 1100 + {33: 804}, + {33: 241}, + {33: 240}, + {33: 805}, + {33: 806}, + // 1105 + {362: 1990, 583: 2974, 599: 2987}, + {184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 11: 184, 33: 184, 35: 184, 331: 184, 333: 184, 184, 184, 338: 184, 344: 184, 184, 356: 184, 378: 184, 184, 184, 419: 184, 427: 184, 436: 184, 489: 184, 184, 492: 184, 496: 184, 587: 184, 184}, + {33: 2976}, + {33: 807}, + {33: 808}, + // 1110 + {11: 2995, 33: 172, 356: 2996, 380: 2992, 496: 2994, 603: 2993, 639: 2991}, + {33: 810}, + {169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 11: 2995, 33: 169, 331: 169, 333: 169, 169, 169, 338: 169, 344: 169, 169, 356: 2996, 419: 169, 427: 169, 436: 169, 489: 169, 169, 492: 169, 496: 2994, 603: 3003, 749: 3002}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 332: 2361, 380: 2360, 497: 2362, 2001, 2002, 2000, 586: 2359, 635: 2999}, + {359: 2998}, + // 1115 + {166, 166, 166, 166, 166, 6: 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 34: 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 332: 166, 352: 166, 361: 166, 372: 166, 380: 166}, + {359: 2997}, + {165, 165, 165, 165, 165, 6: 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 34: 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 332: 165, 352: 165, 361: 165, 372: 165, 380: 165}, + {167, 167, 167, 167, 167, 6: 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 34: 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 332: 167, 352: 167, 361: 167, 372: 167, 380: 167}, + {174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 33: 174, 331: 174, 333: 174, 174, 174, 338: 174, 344: 174, 174, 380: 3000, 419: 174, 427: 174, 436: 174, 489: 174, 174, 492: 174, 1000: 3001}, + // 1120 + {173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 33: 173, 331: 173, 333: 173, 173, 173, 338: 173, 344: 173, 173, 419: 173, 427: 173, 436: 173, 489: 173, 173, 492: 173}, + {170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 33: 170, 331: 170, 333: 170, 170, 170, 338: 170, 344: 170, 170, 419: 170, 427: 170, 436: 170, 489: 170, 170, 492: 170}, + {171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 33: 171, 331: 171, 333: 171, 171, 171, 338: 171, 344: 171, 171, 419: 171, 427: 171, 436: 171, 489: 171, 171, 492: 171}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 332: 2361, 380: 2360, 497: 2362, 2001, 2002, 2000, 586: 2359, 635: 3004}, + {168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 33: 168, 331: 168, 333: 168, 168, 168, 338: 168, 344: 168, 168, 419: 168, 427: 168, 436: 168, 489: 168, 168, 492: 168}, + // 1125 + {33: 811}, + {972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 331: 972, 972, 972, 972, 336: 972, 972, 972, 972, 972, 972, 972, 972, 346: 972, 972, 972, 972, 972, 972, 972, 354: 972, 972, 357: 972, 972, 972, 972, 972, 363: 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 375: 972, 972, 972, 972, 972, 381: 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 405: 972, 407: 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 491: 972}, + {350: 2558, 354: 2556, 2557, 357: 2555, 2553, 392: 817, 581: 2554, 2552}, + {392: 3011, 914: 3010, 1074: 3009}, + {95: 813, 392: 3011, 3017, 914: 3016, 953: 3015}, + // 1130 + {95: 816, 392: 816, 816}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 2413, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 3012}, + {350: 2558, 354: 2556, 2557, 357: 2555, 2553, 395: 3013, 581: 2554, 2552}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 2413, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 3014}, + {95: 814, 350: 2558, 354: 2556, 2557, 357: 2555, 2553, 392: 814, 814, 581: 2554, 2552}, + // 1135 + {95: 3019}, + {95: 815, 392: 815, 815}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 2413, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 3018}, + {95: 812, 350: 2558, 354: 2556, 2557, 357: 2555, 2553, 581: 2554, 2552}, + {973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 331: 973, 973, 973, 973, 336: 973, 973, 973, 973, 973, 973, 973, 973, 346: 973, 973, 973, 973, 973, 973, 973, 354: 973, 973, 357: 973, 973, 973, 973, 973, 363: 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 375: 973, 973, 973, 973, 973, 381: 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 405: 973, 407: 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 491: 973}, + // 1140 + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 2413, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 3021}, + {334: 3022, 350: 2558, 354: 2556, 2557, 357: 2555, 2553, 581: 2554, 2552}, + {35: 2964, 106: 2961, 2960, 109: 2966, 116: 2963, 356: 2959, 380: 2958, 529: 2962, 2967, 2968, 535: 2969, 587: 2965, 779: 3023}, + {33: 3024}, + {974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 331: 974, 974, 974, 974, 336: 974, 974, 974, 974, 974, 974, 974, 974, 346: 974, 974, 974, 974, 974, 974, 974, 354: 974, 974, 357: 974, 974, 974, 974, 974, 363: 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 375: 974, 974, 974, 974, 974, 381: 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 405: 974, 407: 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 491: 974}, + // 1145 + {975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 331: 975, 975, 975, 975, 336: 975, 975, 2562, 975, 975, 975, 975, 975, 346: 975, 975, 975, 975, 975, 975, 975, 354: 975, 975, 357: 975, 975, 975, 975, 975, 363: 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 375: 975, 975, 975, 975, 975, 381: 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 405: 975, 407: 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 491: 975}, + {976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 331: 976, 976, 976, 976, 336: 976, 976, 976, 976, 976, 976, 976, 976, 346: 976, 976, 976, 976, 976, 976, 976, 354: 976, 976, 357: 976, 976, 976, 976, 976, 363: 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 375: 976, 976, 976, 976, 976, 381: 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 405: 976, 407: 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 491: 976}, + {330: 3030, 494: 1908, 593: 3028, 1909, 1910, 1911, 604: 1914, 1913, 3029}, + {33: 3034, 339: 584}, + {33: 3033}, + // 1150 + {494: 1908, 593: 3031, 1909, 1910, 1911}, + {33: 3032}, + {339: 583}, + {594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 331: 594, 594, 594, 594, 336: 594, 594, 594, 594, 594, 594, 594, 594, 346: 594, 594, 594, 594, 594, 594, 594, 354: 594, 594, 357: 594, 594, 594, 594, 594, 363: 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 375: 594, 594, 594, 594, 594, 381: 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 405: 594, 407: 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 491: 594}, + {595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 331: 595, 595, 595, 595, 336: 595, 595, 595, 595, 595, 595, 595, 595, 346: 595, 595, 595, 595, 595, 595, 595, 354: 595, 595, 357: 595, 595, 595, 595, 595, 363: 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 375: 595, 595, 595, 595, 595, 381: 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 405: 595, 407: 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 491: 595}, + // 1155 + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 2413, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 2765, 619: 3036}, + {5: 3037}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 2413, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 3038}, + {5: 1488, 33: 3039, 350: 2558, 354: 2556, 2557, 357: 2555, 2553, 581: 2554, 2552}, + {977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 331: 977, 977, 977, 977, 336: 977, 977, 977, 977, 977, 977, 977, 977, 346: 977, 977, 977, 977, 977, 977, 977, 354: 977, 977, 357: 977, 977, 977, 977, 977, 363: 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 375: 977, 977, 977, 977, 977, 381: 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 405: 977, 407: 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 491: 977}, + // 1160 + {5: 1489, 33: 3048, 350: 2558, 354: 2556, 2557, 357: 2555, 2553, 581: 2554, 2552}, + {5: 3045}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 3042, 332: 2455, 2413, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 494: 1908, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 3040, 593: 3043, 1909, 1910, 1911, 604: 1914, 1913, 3029, 619: 3041}, + {33: 3044, 339: 584}, + {595, 595, 5: 595, 33: 595, 333: 595, 338: 595, 583, 595, 595, 595, 350: 595, 354: 595, 595, 357: 595, 595, 361: 595, 372: 595, 595, 394: 595, 396: 595, 595, 595, 595, 595, 595, 595, 595, 405: 595, 407: 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 491: 595}, + // 1165 + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 2413, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 3046}, + {5: 1488, 33: 3047, 350: 2558, 354: 2556, 2557, 357: 2555, 2553, 581: 2554, 2552}, + {978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 331: 978, 978, 978, 978, 336: 978, 978, 978, 978, 978, 978, 978, 978, 346: 978, 978, 978, 978, 978, 978, 978, 354: 978, 978, 357: 978, 978, 978, 978, 978, 363: 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 375: 978, 978, 978, 978, 978, 381: 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 405: 978, 407: 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 491: 978}, + {979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 331: 979, 979, 979, 979, 336: 979, 979, 979, 979, 979, 979, 979, 979, 346: 979, 979, 979, 979, 979, 979, 979, 354: 979, 979, 357: 979, 979, 979, 979, 979, 363: 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 375: 979, 979, 979, 979, 979, 381: 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 405: 979, 407: 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 491: 979}, + {981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 331: 981, 981, 981, 981, 336: 981, 981, 2562, 981, 981, 981, 981, 981, 346: 981, 981, 981, 981, 981, 981, 981, 354: 981, 981, 357: 981, 981, 981, 981, 981, 363: 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 375: 981, 981, 981, 981, 981, 381: 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 405: 981, 407: 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 491: 981}, + // 1170 + {983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 331: 983, 983, 983, 983, 336: 983, 983, 2562, 983, 983, 983, 983, 983, 346: 983, 983, 983, 983, 983, 983, 983, 354: 983, 983, 357: 983, 983, 983, 983, 983, 363: 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 375: 983, 983, 983, 983, 983, 381: 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 405: 983, 407: 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 491: 983}, + {984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 331: 984, 984, 984, 984, 336: 984, 984, 2562, 984, 984, 984, 984, 984, 346: 984, 984, 984, 984, 984, 984, 984, 354: 984, 984, 357: 984, 984, 984, 984, 984, 363: 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 375: 984, 984, 984, 984, 984, 381: 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 405: 984, 407: 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 491: 984}, + {985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 331: 985, 985, 985, 985, 336: 985, 985, 2562, 985, 985, 985, 985, 985, 346: 985, 985, 985, 985, 985, 985, 985, 354: 985, 985, 357: 985, 985, 985, 985, 985, 363: 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 375: 985, 985, 985, 985, 985, 381: 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 405: 985, 407: 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 491: 985}, + {986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 331: 986, 986, 986, 986, 336: 986, 986, 2562, 986, 986, 986, 986, 986, 346: 986, 986, 986, 986, 986, 986, 986, 354: 986, 986, 357: 986, 986, 986, 986, 986, 363: 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 375: 986, 986, 986, 986, 986, 381: 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 405: 986, 407: 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 491: 986}, + {332: 3057}, + // 1175 + {332: 3056}, + {967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 331: 967, 967, 967, 967, 336: 967, 967, 967, 967, 967, 967, 967, 967, 346: 967, 967, 967, 967, 967, 967, 967, 354: 967, 967, 357: 967, 967, 967, 967, 967, 363: 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 375: 967, 967, 967, 967, 967, 381: 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 405: 967, 407: 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 491: 967}, + {968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 331: 968, 968, 968, 968, 336: 968, 968, 968, 968, 968, 968, 968, 968, 346: 968, 968, 968, 968, 968, 968, 968, 354: 968, 968, 357: 968, 968, 968, 968, 968, 363: 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 375: 968, 968, 968, 968, 968, 381: 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 405: 968, 407: 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 491: 968}, + {1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 331: 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 354: 1032, 1032, 357: 1032, 1032, 1032, 1032, 1032, 363: 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 375: 1032, 1032, 1032, 1032, 1032, 381: 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 405: 1032, 407: 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 419: 1032, 427: 1032, 436: 1032, 489: 1032, 1032, 1032, 1032}, + {1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 331: 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 354: 1028, 1028, 357: 1028, 1028, 1028, 1028, 1028, 363: 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 375: 1028, 1028, 1028, 1028, 1028, 381: 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 405: 1028, 407: 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 419: 1028, 427: 1028, 436: 1028, 489: 1028, 1028, 1028, 1028}, + // 1180 + {63: 2641, 65: 2645, 68: 2640, 2637, 2639, 2643, 2644, 2638, 2649, 2648, 2647, 2651, 2652, 2646, 2650, 2653, 2642, 642: 3061}, + {5: 3062}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 2413, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 3063}, + {5: 3064, 350: 2558, 354: 2556, 2557, 357: 2555, 2553, 581: 2554, 2552}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 2413, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 3065}, + // 1185 + {33: 3066, 350: 2558, 354: 2556, 2557, 357: 2555, 2553, 581: 2554, 2552}, + {888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 331: 888, 888, 888, 888, 336: 888, 888, 888, 888, 888, 888, 888, 888, 346: 888, 888, 888, 888, 888, 888, 888, 354: 888, 888, 357: 888, 888, 888, 888, 888, 363: 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 375: 888, 888, 888, 888, 888, 381: 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 405: 888, 407: 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 491: 888}, + {63: 2641, 65: 2645, 68: 2640, 2637, 2639, 2643, 2644, 2638, 2649, 2648, 2647, 2651, 2652, 2646, 2650, 2653, 2642, 642: 3068}, + {5: 3069}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 2413, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 3070}, + // 1190 + {5: 3071, 350: 2558, 354: 2556, 2557, 357: 2555, 2553, 581: 2554, 2552}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 2413, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 3072}, + {33: 3073, 350: 2558, 354: 2556, 2557, 357: 2555, 2553, 581: 2554, 2552}, + {889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 331: 889, 889, 889, 889, 336: 889, 889, 889, 889, 889, 889, 889, 889, 346: 889, 889, 889, 889, 889, 889, 889, 354: 889, 889, 357: 889, 889, 889, 889, 889, 363: 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 375: 889, 889, 889, 889, 889, 381: 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 405: 889, 407: 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 491: 889}, + {106: 3077, 3076, 116: 3078, 191: 3079, 966: 3075}, + // 1195 + {5: 3080}, + {5: 883}, + {5: 882}, + {5: 881}, + {5: 880}, + // 1200 + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 2413, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 3081}, + {33: 3082, 350: 2558, 354: 2556, 2557, 357: 2555, 2553, 581: 2554, 2552}, + {895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 331: 895, 895, 895, 895, 336: 895, 895, 895, 895, 895, 895, 895, 895, 346: 895, 895, 895, 895, 895, 895, 895, 354: 895, 895, 357: 895, 895, 895, 895, 895, 363: 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 375: 895, 895, 895, 895, 895, 381: 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 405: 895, 407: 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 491: 895}, + {906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 331: 906, 906, 906, 906, 336: 906, 906, 906, 906, 906, 906, 906, 906, 346: 906, 906, 906, 906, 906, 906, 906, 354: 906, 906, 357: 906, 906, 906, 906, 906, 363: 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 375: 906, 906, 906, 906, 906, 381: 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 405: 906, 407: 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 491: 906}, + {907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 331: 907, 907, 907, 907, 336: 907, 907, 907, 907, 907, 907, 907, 907, 346: 907, 907, 907, 907, 907, 907, 907, 354: 907, 907, 357: 907, 907, 907, 907, 907, 363: 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 375: 907, 907, 907, 907, 907, 381: 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 405: 907, 407: 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 491: 907}, + // 1205 + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 1485, 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 2413, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 2765, 619: 2923, 691: 3086}, + {33: 3087}, + {903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 331: 903, 903, 903, 903, 336: 903, 903, 903, 903, 903, 903, 903, 903, 346: 903, 903, 903, 903, 903, 903, 903, 354: 903, 903, 357: 903, 903, 903, 903, 903, 363: 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 375: 903, 903, 903, 903, 903, 381: 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 405: 903, 407: 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 491: 903}, + {908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 331: 908, 908, 908, 908, 336: 908, 908, 908, 908, 908, 908, 908, 908, 346: 908, 908, 908, 908, 908, 908, 908, 354: 908, 908, 357: 908, 908, 908, 908, 908, 363: 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 375: 908, 908, 908, 908, 908, 381: 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 405: 908, 407: 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 491: 908}, + {2: 962, 962, 962, 6: 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 34: 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 332: 962, 962, 335: 962, 962, 962, 340: 962, 962, 962, 344: 962, 353: 962, 356: 962, 362: 962, 374: 962, 380: 962, 404: 962, 406: 962, 417: 962, 962, 420: 962, 962, 962, 962, 962, 962, 962, 428: 962, 962, 962, 962, 962, 962, 962, 962, 437: 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 585: 2723, 615: 2721, 2722, 629: 2724, 2725, 636: 2726, 643: 3090}, + // 1210 + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 2413, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 3091}, + {33: 3092, 350: 2558, 354: 2556, 2557, 357: 2555, 2553, 581: 2554, 2552}, + {738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 331: 738, 738, 738, 738, 336: 738, 738, 738, 738, 738, 738, 738, 738, 346: 738, 738, 738, 738, 738, 738, 738, 354: 738, 738, 357: 738, 738, 738, 738, 738, 363: 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 375: 738, 738, 738, 738, 738, 381: 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 405: 738, 407: 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 491: 738, 590: 2574, 597: 2731, 609: 3093}, + {872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 331: 872, 872, 872, 872, 336: 872, 872, 872, 872, 872, 872, 872, 872, 346: 872, 872, 872, 872, 872, 872, 872, 354: 872, 872, 357: 872, 872, 872, 872, 872, 363: 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 375: 872, 872, 872, 872, 872, 381: 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 405: 872, 407: 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 491: 872}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 1485, 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 2413, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 2765, 619: 2923, 691: 3095}, + // 1215 + {33: 3096}, + {851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 331: 851, 851, 851, 851, 336: 851, 851, 851, 851, 851, 851, 851, 851, 346: 851, 851, 851, 851, 851, 851, 851, 354: 851, 851, 357: 851, 851, 851, 851, 851, 363: 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 375: 851, 851, 851, 851, 851, 381: 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 405: 851, 407: 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 491: 851}, + {2: 1467, 1467, 1467, 6: 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 34: 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 332: 1467, 335: 1467, 1467, 1467, 340: 1467, 1467, 1467, 344: 1467, 353: 1467, 356: 1467, 362: 1467, 374: 1467, 380: 1467, 404: 1467, 406: 1467, 417: 1467, 1467, 420: 1467, 1467, 1467, 1467, 1467, 1467, 1467, 428: 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 437: 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467}, + {372: 3122, 394: 3121, 405: 3120, 415: 3106, 3107, 875: 3123}, + {330: 1463}, + // 1220 + {2: 1461, 1461, 1461, 6: 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 34: 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 332: 1461, 335: 1461, 1461, 1461, 340: 1461, 1461, 1461, 344: 1461, 353: 1461, 356: 1461, 362: 1461, 374: 1461, 380: 1461, 404: 1461, 406: 1461, 417: 1461, 1461, 420: 1461, 1461, 1461, 1461, 1461, 1461, 1461, 428: 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 437: 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461}, + {2: 1459, 1459, 1459, 6: 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 34: 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 332: 1459, 335: 1459, 1459, 1459, 340: 1459, 1459, 1459, 344: 1459, 353: 1459, 356: 1459, 362: 1459, 374: 1459, 380: 1459, 404: 1459, 406: 1459, 417: 1459, 1459, 420: 1459, 1459, 1459, 1459, 1459, 1459, 1459, 428: 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 437: 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459}, + {330: 3116, 559: 3117}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2561, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 3113}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2561, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 3109, 2465, 2542, 2464, 2461}, + // 1225 + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2561, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 3108, 2465, 2542, 2464, 2461}, + {2: 1448, 1448, 1448, 6: 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 34: 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 332: 1448, 335: 1448, 1448, 1448, 340: 1448, 1448, 1448, 344: 1448, 353: 1448, 356: 1448, 362: 1448, 374: 1448, 380: 1448, 404: 1448, 406: 1448, 417: 1448, 1448, 420: 1448, 1448, 1448, 1448, 1448, 1448, 1448, 428: 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 437: 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448}, + {2: 1447, 1447, 1447, 6: 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 34: 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 332: 1447, 335: 1447, 1447, 1447, 340: 1447, 1447, 1447, 344: 1447, 353: 1447, 356: 1447, 362: 1447, 374: 1447, 380: 1447, 404: 1447, 406: 1447, 417: 1447, 1447, 420: 1447, 1447, 1447, 1447, 1447, 1447, 1447, 428: 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 437: 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447}, + {1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 331: 1450, 1450, 334: 1450, 336: 1450, 1450, 2562, 1450, 343: 1450, 346: 1450, 1450, 1450, 1450, 1450, 1450, 1450, 354: 1450, 1450, 357: 1450, 1450, 1450, 1450, 1450, 363: 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 375: 1450, 1450, 1450, 1450, 1450, 381: 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 395: 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 491: 2563}, + {1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 3111, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 331: 1446, 1446, 334: 1446, 336: 1446, 1446, 2562, 1446, 343: 1446, 346: 1446, 1446, 1446, 1446, 1446, 1446, 1446, 354: 1446, 1446, 357: 1446, 1446, 1446, 1446, 1446, 363: 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 375: 1446, 1446, 1446, 1446, 1446, 381: 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 395: 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 491: 2563, 983: 3110}, + // 1230 + {1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 331: 1451, 1451, 334: 1451, 336: 1451, 1451, 339: 1451, 343: 1451, 346: 1451, 1451, 1451, 1451, 1451, 1451, 1451, 354: 1451, 1451, 357: 1451, 1451, 1451, 1451, 1451, 363: 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 375: 1451, 1451, 1451, 1451, 1451, 381: 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 395: 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451}, + {332: 3112}, + {1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 331: 1445, 1445, 334: 1445, 336: 1445, 1445, 339: 1445, 343: 1445, 346: 1445, 1445, 1445, 1445, 1445, 1445, 1445, 354: 1445, 1445, 357: 1445, 1445, 1445, 1445, 1445, 363: 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 375: 1445, 1445, 1445, 1445, 1445, 381: 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 395: 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445}, + {340: 2853, 2854, 2859, 350: 3114, 373: 2855, 407: 2857, 2850, 2856, 2860, 2849, 2858, 2851, 2852}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2561, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 3115}, + // 1235 + {1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 331: 1452, 1452, 334: 1452, 336: 1452, 1452, 339: 1452, 343: 1452, 346: 1452, 1452, 1452, 1452, 1452, 1452, 1452, 354: 1452, 1452, 357: 1452, 1452, 1452, 1452, 1452, 363: 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 375: 1452, 1452, 1452, 1452, 1452, 381: 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 395: 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 3042, 332: 2455, 2413, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 494: 1908, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 2765, 593: 3028, 1909, 1910, 1911, 604: 1914, 1913, 3029, 619: 3118}, + {1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 331: 1453, 1453, 334: 1453, 336: 1453, 1453, 339: 1453, 343: 1453, 346: 1453, 1453, 1453, 1453, 1453, 1453, 1453, 354: 1453, 1453, 357: 1453, 1453, 1453, 1453, 1453, 363: 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 375: 1453, 1453, 1453, 1453, 1453, 381: 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 395: 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453}, + {5: 2767, 33: 3119}, + {1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 331: 1454, 1454, 334: 1454, 336: 1454, 1454, 339: 1454, 343: 1454, 346: 1454, 1454, 1454, 1454, 1454, 1454, 1454, 354: 1454, 1454, 357: 1454, 1454, 1454, 1454, 1454, 363: 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 375: 1454, 1454, 1454, 1454, 1454, 381: 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 395: 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454}, + // 1240 + {2: 1466, 1466, 1466, 6: 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 34: 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 332: 1466, 335: 1466, 1466, 1466, 340: 1466, 1466, 1466, 344: 1466, 353: 1466, 356: 1466, 362: 1466, 374: 1466, 380: 1466, 404: 1466, 406: 1466, 417: 1466, 1466, 420: 1466, 1466, 1466, 1466, 1466, 1466, 1466, 428: 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 437: 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466}, + {330: 1462}, + {2: 1460, 1460, 1460, 6: 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 34: 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 332: 1460, 335: 1460, 1460, 1460, 340: 1460, 1460, 1460, 344: 1460, 353: 1460, 356: 1460, 362: 1460, 374: 1460, 380: 1460, 404: 1460, 406: 1460, 417: 1460, 1460, 420: 1460, 1460, 1460, 1460, 1460, 1460, 1460, 428: 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 437: 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460}, + {2: 1458, 1458, 1458, 6: 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 34: 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 332: 1458, 335: 1458, 1458, 1458, 340: 1458, 1458, 1458, 344: 1458, 353: 1458, 356: 1458, 362: 1458, 374: 1458, 380: 1458, 404: 1458, 406: 1458, 417: 1458, 1458, 420: 1458, 1458, 1458, 1458, 1458, 1458, 1458, 428: 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 437: 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458}, + {139: 3147, 344: 3148, 425: 3146, 3145}, + // 1245 + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 3139, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 3140, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 3138, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 3136, 585: 3141, 925: 3137}, + {2: 1475, 1475, 1475, 6: 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 34: 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 332: 1475, 335: 1475, 1475, 1475, 340: 1475, 1475, 1475, 344: 1475, 353: 1475, 356: 1475, 362: 1475, 374: 1475, 380: 1475, 404: 1475, 406: 1475, 417: 1475, 1475, 420: 1475, 1475, 1475, 1475, 1475, 1475, 1475, 428: 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 437: 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 585: 1475}, + {2: 1474, 1474, 1474, 6: 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 34: 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 332: 1474, 335: 1474, 1474, 1474, 340: 1474, 1474, 1474, 344: 1474, 353: 1474, 356: 1474, 362: 1474, 374: 1474, 380: 1474, 404: 1474, 406: 1474, 417: 1474, 1474, 420: 1474, 1474, 1474, 1474, 1474, 1474, 1474, 428: 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 437: 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 585: 1474}, + {2: 1473, 1473, 1473, 6: 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 34: 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 332: 1473, 335: 1473, 1473, 1473, 340: 1473, 1473, 1473, 344: 1473, 353: 1473, 356: 1473, 362: 1473, 374: 1473, 380: 1473, 404: 1473, 406: 1473, 417: 1473, 1473, 420: 1473, 1473, 1473, 1473, 1473, 1473, 1473, 428: 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 437: 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 585: 1473}, + {2: 1472, 1472, 1472, 6: 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 34: 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 332: 1472, 335: 1472, 1472, 1472, 340: 1472, 1472, 1472, 344: 1472, 353: 1472, 356: 1472, 362: 1472, 374: 1472, 380: 1472, 404: 1472, 406: 1472, 417: 1472, 1472, 420: 1472, 1472, 1472, 1472, 1472, 1472, 1472, 428: 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 437: 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 585: 1472}, + // 1250 + {2: 1471, 1471, 1471, 6: 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 34: 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 332: 1471, 335: 1471, 1471, 1471, 340: 1471, 1471, 1471, 344: 1471, 353: 1471, 356: 1471, 362: 1471, 374: 1471, 380: 1471, 404: 1471, 406: 1471, 417: 1471, 1471, 420: 1471, 1471, 1471, 1471, 1471, 1471, 1471, 428: 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 437: 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 585: 1471}, + {2: 1470, 1470, 1470, 6: 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 34: 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 332: 1470, 335: 1470, 1470, 1470, 340: 1470, 1470, 1470, 344: 1470, 353: 1470, 356: 1470, 362: 1470, 374: 1470, 380: 1470, 404: 1470, 406: 1470, 417: 1470, 1470, 420: 1470, 1470, 1470, 1470, 1470, 1470, 1470, 428: 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 437: 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 585: 1470}, + {2: 1469, 1469, 1469, 6: 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 34: 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 332: 1469, 335: 1469, 1469, 1469, 340: 1469, 1469, 1469, 344: 1469, 353: 1469, 356: 1469, 362: 1469, 374: 1469, 380: 1469, 404: 1469, 406: 1469, 417: 1469, 1469, 420: 1469, 1469, 1469, 1469, 1469, 1469, 1469, 428: 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 437: 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 585: 1469}, + {2: 1468, 1468, 1468, 6: 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 34: 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 332: 1468, 335: 1468, 1468, 1468, 340: 1468, 1468, 1468, 344: 1468, 353: 1468, 356: 1468, 362: 1468, 374: 1468, 380: 1468, 404: 1468, 406: 1468, 417: 1468, 1468, 420: 1468, 1468, 1468, 1468, 1468, 1468, 1468, 428: 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 437: 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 585: 1468}, + {139: 1465, 333: 3135, 344: 1465, 425: 1465, 1465}, + // 1255 + {139: 1464, 344: 1464, 425: 1464, 1464}, + {1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 331: 1479, 1479, 334: 1479, 336: 1479, 1479, 339: 1479, 343: 1479, 346: 1479, 1479, 1479, 1479, 1479, 1479, 1479, 354: 1479, 1479, 357: 1479, 1479, 1479, 1479, 1479, 363: 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 375: 1479, 1479, 1479, 1479, 1479, 381: 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 395: 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479}, + {330: 3027, 559: 3144}, + {531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 331: 531, 531, 531, 531, 336: 531, 531, 531, 531, 531, 531, 531, 531, 346: 531, 531, 531, 531, 531, 531, 531, 354: 531, 531, 357: 531, 531, 531, 531, 531, 363: 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 375: 531, 531, 531, 531, 531, 381: 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 405: 531, 407: 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 491: 531, 509: 3142}, + {1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1457, 1312, 1312, 1312, 1312, 336: 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 346: 1312, 1312, 1312, 1312, 1312, 1312, 1312, 354: 1312, 1312, 357: 1312, 1312, 1312, 1312, 1312, 363: 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 381: 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 405: 1312, 407: 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 491: 1312, 504: 1312, 1312}, + // 1260 + {1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1456, 1311, 1311, 1311, 1311, 336: 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 346: 1311, 1311, 1311, 1311, 1311, 1311, 1311, 354: 1311, 1311, 357: 1311, 1311, 1311, 1311, 1311, 363: 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 381: 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 405: 1311, 407: 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 491: 1311, 504: 1311, 1311}, + {330: 1455}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2561, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 3143}, + {1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 331: 1477, 1477, 334: 1477, 336: 1477, 1477, 339: 1477, 343: 1477, 346: 1477, 1477, 1477, 1477, 1477, 1477, 1477, 354: 1477, 1477, 357: 1477, 1477, 1477, 1477, 1477, 363: 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 375: 1477, 1477, 1477, 1477, 1477, 381: 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 395: 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477}, + {1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 331: 1478, 1478, 334: 1478, 336: 1478, 1478, 339: 1478, 343: 1478, 346: 1478, 1478, 1478, 1478, 1478, 1478, 1478, 354: 1478, 1478, 357: 1478, 1478, 1478, 1478, 1478, 363: 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 375: 1478, 1478, 1478, 1478, 1478, 381: 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 395: 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478}, + // 1265 + {1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 331: 1499, 1499, 334: 1499, 336: 1499, 1499, 339: 1499, 343: 1499, 346: 1499, 1499, 1499, 1499, 1499, 1499, 1499, 354: 1499, 1499, 357: 1499, 1499, 1499, 1499, 363: 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 375: 1499, 1499, 1499, 1499, 1499, 381: 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 395: 1499}, + {1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 331: 1498, 1498, 334: 1498, 336: 1498, 1498, 339: 1498, 343: 1498, 346: 1498, 1498, 1498, 1498, 1498, 1498, 1498, 354: 1498, 1498, 357: 1498, 1498, 1498, 1498, 363: 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 375: 1498, 1498, 1498, 1498, 1498, 381: 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 395: 1498}, + {1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 331: 1497, 1497, 334: 1497, 336: 1497, 1497, 339: 1497, 343: 1497, 346: 1497, 1497, 1497, 1497, 1497, 1497, 1497, 354: 1497, 1497, 357: 1497, 1497, 1497, 1497, 363: 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 375: 1497, 1497, 1497, 1497, 1497, 381: 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 395: 1497}, + {1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 331: 1480, 1480, 334: 1480, 336: 1480, 1480, 339: 1480, 343: 1480, 346: 1480, 1480, 1480, 1480, 1480, 1480, 1480, 354: 1480, 1480, 357: 1480, 1480, 1480, 1480, 1480, 363: 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 375: 1480, 1480, 1480, 1480, 1480, 381: 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 395: 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480}, + {1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 331: 1500, 1500, 334: 1500, 336: 1500, 1500, 339: 1500, 343: 1500, 346: 1500, 1500, 1500, 1500, 1500, 1500, 1500, 354: 1500, 1500, 357: 1500, 1500, 1500, 1500, 363: 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 375: 1500, 1500, 1500, 1500, 1500, 381: 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 395: 1500, 581: 2554, 2552}, + // 1270 + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 2413, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 3151}, + {1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 331: 1504, 1504, 334: 1504, 336: 1504, 1504, 339: 1504, 343: 1504, 346: 1504, 1504, 1504, 1504, 2558, 1504, 1504, 354: 2556, 2557, 357: 2555, 2553, 1504, 1504, 363: 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 375: 1504, 1504, 1504, 1504, 1504, 381: 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 395: 1504, 581: 2554, 2552}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 374: 2406, 497: 2405, 2001, 2002, 2000, 561: 2409, 842: 3153}, + {20, 20, 5: 20}, + {374: 3155}, + // 1275 + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 3156, 2001, 2002, 2000}, + {998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 331: 998, 998, 998, 998, 336: 998, 998, 998, 998, 998, 998, 998, 998, 346: 998, 998, 998, 998, 998, 998, 998, 354: 998, 998, 357: 998, 998, 998, 998, 998, 363: 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 375: 998, 998, 998, 998, 998, 381: 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 405: 998, 407: 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 491: 998, 504: 998, 998}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 3158, 2001, 2002, 2000}, + {999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 331: 999, 999, 999, 999, 336: 999, 999, 999, 999, 999, 999, 999, 999, 346: 999, 999, 999, 999, 999, 999, 999, 354: 999, 999, 357: 999, 999, 999, 999, 999, 363: 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 3159, 999, 999, 999, 999, 999, 381: 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 405: 999, 407: 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 491: 999, 504: 999, 999}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 3160, 2001, 2002, 2000}, + // 1280 + {997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 331: 997, 997, 997, 997, 336: 997, 997, 997, 997, 997, 997, 997, 997, 346: 997, 997, 997, 997, 997, 997, 997, 354: 997, 997, 357: 997, 997, 997, 997, 997, 363: 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 375: 997, 997, 997, 997, 997, 381: 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 405: 997, 407: 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 491: 997, 504: 997, 997}, + {1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 345: 1751, 356: 1751, 359: 1751, 361: 1751, 374: 3170, 378: 1751, 1751, 1751, 496: 1751, 506: 1751, 516: 1751, 1751, 1751, 526: 1751, 1751, 529: 1751, 1751, 1751, 1751, 1751, 535: 1751, 538: 1751, 540: 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751}, + {5: 3168, 33: 1743}, + {5: 1742, 33: 1742}, + {5: 1740, 33: 1740}, + // 1285 + {5: 1739, 33: 1739}, + {33: 3167}, + {1737, 1737, 359: 1737}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 404: 2561, 497: 3161, 2001, 2002, 2000, 560: 3165, 589: 3164, 782: 3169}, + {5: 1741, 33: 1741}, + // 1290 + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 3171, 2001, 2002, 2000}, + {1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 345: 1750, 356: 1750, 359: 1750, 361: 1750, 374: 3172, 378: 1750, 1750, 1750, 496: 1750, 506: 1750, 516: 1750, 1750, 1750, 526: 1750, 1750, 529: 1750, 1750, 1750, 1750, 1750, 535: 1750, 538: 1750, 540: 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 3173, 2001, 2002, 2000}, + {1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 345: 1749, 356: 1749, 359: 1749, 361: 1749, 378: 1749, 1749, 1749, 496: 1749, 506: 1749, 516: 1749, 1749, 1749, 526: 1749, 1749, 529: 1749, 1749, 1749, 1749, 1749, 535: 1749, 538: 1749, 540: 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749}, + {520, 520, 5: 520, 360: 520, 404: 1401, 506: 520, 515: 1401}, + // 1295 + {5: 79, 330: 79, 79, 404: 1361, 515: 1361}, + {5: 75, 330: 75, 75, 404: 1261, 515: 1261}, + {5: 80, 330: 80, 80, 404: 1254, 515: 1254}, + {145: 3263, 185: 3262, 404: 1236, 515: 1236}, + {5: 67, 330: 67, 67, 404: 1233, 515: 1233}, + // 1300 + {5: 58, 330: 58, 58, 404: 1230, 515: 1230}, + {521, 521, 5: 521, 360: 521, 404: 160, 506: 521, 515: 160}, + {519, 519, 5: 519, 360: 519, 506: 519}, + {404: 3278, 515: 3277}, + {516, 516, 5: 516, 360: 516, 506: 516}, + // 1305 + {5: 3270, 360: 3271}, + {5: 92, 330: 3264, 92}, + {5: 90, 331: 90}, + {5: 3217, 331: 3218}, + {5: 88, 111: 3216, 330: 88, 88}, + // 1310 + {5: 86, 182: 3215, 330: 86, 86}, + {5: 85, 57: 3211, 100: 3212, 3209, 137: 3210, 182: 3213, 330: 85, 85}, + {5: 83, 330: 83, 83}, + {5: 82, 330: 82, 82}, + {5: 81, 100: 3208, 330: 81, 81}, + // 1315 + {5: 78, 330: 78, 78}, + {5: 77, 330: 77, 77}, + {5: 76, 330: 76, 76}, + {57: 3207, 795: 3206}, + {5: 73, 330: 73, 73}, + // 1320 + {718: 3205}, + {5: 71, 330: 71, 71}, + {5: 68, 330: 68, 68}, + {60: 3204}, + {5: 65, 330: 65, 65}, + // 1325 + {5: 72, 330: 72, 72}, + {5: 74, 330: 74, 74}, + {5: 63, 330: 63, 63}, + {5: 61, 330: 61, 61}, + {5: 84, 330: 84, 84}, + // 1330 + {60: 3214}, + {5: 64, 330: 64, 64}, + {5: 62, 330: 62, 62}, + {5: 60, 330: 60, 60}, + {5: 66, 330: 66, 66}, + // 1335 + {5: 59, 330: 59, 59}, + {5: 87, 330: 87, 87}, + {124: 3257, 179: 3260, 220: 3261, 252: 3256, 258: 3259, 269: 3258, 348: 3203, 418: 3196, 490: 3201, 494: 3197, 3195, 517: 3194, 521: 3190, 585: 3189, 602: 3199, 607: 3193, 673: 3191, 677: 3200, 684: 3198, 756: 3255, 3186, 763: 3192, 765: 3202}, + {2: 57, 57, 57, 6: 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 34: 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 373: 57, 592: 3219, 850: 3220}, + {2: 56, 56, 56, 6: 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 34: 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 373: 56}, + // 1340 + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 373: 3221, 497: 3222, 2001, 2002, 2000, 872: 3223}, + {360: 55, 374: 3253, 506: 55}, + {360: 51, 374: 3250, 506: 51}, + {360: 3224}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 332: 2361, 417: 3226, 497: 2362, 2001, 2002, 2000, 586: 3225, 617: 3227, 702: 3228, 727: 3229}, + // 1345 + {530, 530, 5: 530, 10: 530, 34: 530, 57: 530, 89: 530, 343: 530, 346: 530, 361: 530, 404: 3248, 510: 530, 513: 530, 515: 3247}, + {927, 927, 5: 927, 10: 927, 34: 927, 57: 927, 89: 927, 330: 2939, 343: 927, 346: 927, 361: 927, 510: 927, 513: 927, 858: 3246}, + {112, 112, 5: 112, 10: 112, 34: 112, 89: 3233, 343: 112, 510: 112, 927: 3232}, + {145, 145, 5: 145, 10: 145, 34: 145, 343: 145, 510: 145}, + {50, 50, 5: 3230}, + // 1350 + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 332: 2361, 417: 3226, 497: 2362, 2001, 2002, 2000, 586: 3225, 617: 3227, 702: 3231}, + {144, 144, 5: 144, 10: 144, 34: 144, 343: 144, 510: 144}, + {146, 146, 5: 146, 10: 146, 34: 146, 343: 146, 510: 146}, + {343: 3235, 507: 3234}, + {10: 3244, 332: 3241, 704: 3243}, + // 1355 + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 332: 2361, 497: 2362, 2001, 2002, 2000, 586: 3236}, + {110, 110, 5: 110, 10: 110, 34: 110, 334: 3238, 343: 110, 507: 3237, 510: 110}, + {332: 3241, 704: 3242}, + {332: 3240, 826: 3239}, + {108, 108, 5: 108, 10: 108, 34: 108, 343: 108, 510: 108}, + // 1360 + {106, 106, 5: 106, 10: 106, 34: 106, 343: 106, 510: 106}, + {522, 522, 5: 522, 10: 522, 33: 522, 522, 343: 522, 510: 522}, + {109, 109, 5: 109, 10: 109, 34: 109, 343: 109, 510: 109}, + {111, 111, 5: 111, 10: 111, 34: 111, 343: 111, 510: 111}, + {332: 3240, 826: 3245}, + // 1365 + {107, 107, 5: 107, 10: 107, 34: 107, 343: 107, 510: 107}, + {527, 527, 5: 527, 10: 527, 34: 527, 57: 527, 89: 527, 343: 527, 346: 527, 361: 527, 510: 527, 513: 527}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 332: 2361, 497: 2362, 2001, 2002, 2000, 586: 3249}, + {528, 528, 5: 528, 10: 528, 34: 528, 57: 528, 89: 528, 343: 528, 346: 528, 361: 528, 510: 528, 513: 528}, + {529, 529, 5: 529, 10: 529, 34: 529, 57: 529, 89: 529, 343: 529, 346: 529, 361: 529, 510: 529, 513: 529}, + // 1370 + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 373: 3251, 497: 3252, 2001, 2002, 2000}, + {360: 53, 506: 53}, + {360: 52, 506: 52}, + {373: 3254}, + {360: 54, 506: 54}, + // 1375 + {5: 89, 331: 89}, + {5: 80, 330: 80, 80}, + {5: 79, 330: 79, 79}, + {5: 75, 330: 75, 75}, + {145: 3263, 185: 3262}, + // 1380 + {5: 67, 330: 67, 67}, + {5: 58, 330: 58, 58}, + {5: 70, 330: 70, 70}, + {5: 69, 330: 69, 69}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 3161, 2001, 2002, 2000, 589: 3265, 662: 3266}, + // 1385 + {5: 1748, 33: 1748}, + {5: 3267, 33: 3268}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 3161, 2001, 2002, 2000, 589: 3269}, + {5: 91, 331: 91}, + {5: 1747, 33: 1747}, + // 1390 + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 3174, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 332: 3181, 497: 2362, 2001, 2002, 2000, 586: 3183, 632: 3276, 3182}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 332: 2361, 417: 3226, 497: 2362, 2001, 2002, 2000, 586: 3225, 617: 3272, 701: 3273}, + {526, 526, 5: 526}, + {49, 49, 5: 3274}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 332: 2361, 417: 3226, 497: 2362, 2001, 2002, 2000, 586: 3225, 617: 3275}, + // 1395 + {525, 525, 5: 525}, + {515, 515, 5: 515, 360: 515, 506: 515}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 332: 2361, 497: 2362, 2001, 2002, 2000, 586: 3279}, + {517, 517, 5: 517, 360: 517, 506: 517}, + {518, 518, 5: 518, 360: 518, 506: 518}, + // 1400 + {5: 3270, 506: 3299}, + {5: 3217, 331: 3282}, + {2: 57, 57, 57, 6: 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 34: 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 373: 57, 592: 3219, 850: 3283}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 373: 3221, 497: 3222, 2001, 2002, 2000, 872: 3284}, + {506: 3285}, + // 1405 + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 332: 2361, 417: 3226, 497: 2362, 2001, 2002, 2000, 586: 3225, 617: 3227, 702: 3228, 727: 3286}, + {98, 98, 5: 3230, 343: 3288, 1082: 3287}, + {100, 100}, + {83: 3292, 3290, 3291, 3293, 677: 3289}, + {718: 3298}, + // 1410 + {362: 1990, 583: 3297}, + {362: 1990, 583: 3296}, + {362: 1990, 583: 3295}, + {362: 1990, 583: 3294}, + {93, 93}, + // 1415 + {94, 94}, + {95, 95}, + {96, 96}, + {97, 97}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 332: 2361, 417: 3226, 497: 2362, 2001, 2002, 2000, 586: 3225, 617: 3272, 701: 3300}, + // 1420 + {99, 99, 5: 3274}, + {1640, 1640, 11: 1640, 15: 1640, 335: 1640, 338: 1640, 352: 1640, 356: 1640, 372: 1640, 496: 1640}, + {156, 156}, + {36: 3451, 3444, 3449, 3441, 3440, 3448, 3452, 3454, 3447, 3453, 3455, 3439, 3450, 3442, 3446, 3443, 3445, 495: 3438, 758: 3437, 3436, 955: 3435, 1006: 3434}, + {2: 799, 799, 799, 6: 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 34: 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 420: 799, 493: 799, 610: 3307, 3306, 3305, 699: 3308}, + // 1425 + {2: 798, 798, 798, 6: 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 34: 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 332: 798, 798, 335: 798, 798, 798, 340: 798, 798, 798, 344: 798, 353: 798, 356: 798, 360: 798, 362: 798, 798, 373: 798, 798, 380: 798, 404: 798, 406: 798, 417: 798, 798, 420: 798, 798, 798, 798, 798, 798, 798, 428: 798, 798, 798, 798, 798, 798, 798, 798, 437: 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 493: 798, 514: 798, 601: 798, 613: 798, 621: 798}, + {2: 797, 797, 797, 6: 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 34: 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 332: 797, 797, 335: 797, 797, 797, 340: 797, 797, 797, 344: 797, 353: 797, 356: 797, 360: 797, 362: 797, 797, 373: 797, 797, 380: 797, 404: 797, 406: 797, 417: 797, 797, 420: 797, 797, 797, 797, 797, 797, 797, 428: 797, 797, 797, 797, 797, 797, 797, 797, 437: 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 493: 797, 514: 797, 601: 797, 613: 797, 621: 797}, + {2: 796, 796, 796, 6: 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 34: 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 332: 796, 796, 335: 796, 796, 796, 340: 796, 796, 796, 344: 796, 353: 796, 356: 796, 360: 796, 362: 796, 796, 373: 796, 796, 380: 796, 404: 796, 406: 796, 417: 796, 796, 420: 796, 796, 796, 796, 796, 796, 796, 428: 796, 796, 796, 796, 796, 796, 796, 796, 437: 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 493: 796, 514: 796, 601: 796, 613: 796, 621: 796}, + {2: 1424, 1424, 1424, 6: 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 34: 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 420: 1424, 493: 3309, 713: 3310}, + {2: 1423, 1423, 1423, 6: 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 34: 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 360: 1423, 420: 1423, 514: 1423, 592: 1423}, + // 1430 + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 3318, 420: 3314, 497: 2328, 2001, 2002, 2000, 584: 3317, 623: 3316, 626: 3315, 3313, 663: 3311, 687: 3312}, + {710, 710, 5: 710, 33: 710, 331: 710, 339: 710, 343: 710, 346: 710, 710, 710, 710, 351: 710, 710, 359: 710, 364: 710, 710, 367: 710}, + {5: 3370, 359: 3431}, + {5: 708, 336: 3337, 3338, 359: 3413, 363: 3336, 366: 3339, 368: 3340, 3341, 3335, 644: 3334, 647: 3333}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 3410, 2001, 2002, 2000}, + // 1435 + {706, 706, 5: 706, 33: 706, 331: 706, 336: 706, 706, 339: 706, 343: 706, 346: 706, 706, 706, 706, 351: 706, 706, 359: 706, 363: 706, 706, 706, 706, 706, 706, 706, 706, 706}, + {705, 705, 5: 705, 33: 705, 331: 705, 336: 705, 705, 339: 705, 343: 705, 346: 705, 705, 705, 705, 351: 705, 705, 359: 705, 363: 705, 705, 705, 705, 705, 705, 705, 705, 705}, + {700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 331: 700, 334: 700, 336: 700, 700, 339: 700, 343: 700, 345: 3374, 700, 700, 700, 700, 351: 700, 700, 359: 700, 363: 700, 700, 700, 700, 700, 700, 700, 700, 700, 493: 700, 511: 700, 700, 1016: 3373}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 3321, 420: 3314, 494: 1908, 497: 2328, 2001, 2002, 2000, 584: 3317, 593: 3322, 1909, 1910, 1911, 604: 1914, 1913, 3323, 623: 3316, 626: 3315, 3320, 663: 3311, 687: 3319}, + {5: 3370, 33: 3371}, + // 1440 + {708, 708, 5: 708, 33: 708, 331: 708, 336: 3337, 3338, 339: 708, 343: 708, 346: 708, 708, 708, 708, 351: 708, 708, 359: 708, 363: 3336, 708, 708, 3339, 708, 3340, 3341, 3335, 644: 3334, 647: 3333}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 3321, 420: 3314, 494: 1908, 497: 2328, 2001, 2002, 2000, 584: 3317, 593: 3331, 1909, 1910, 1911, 604: 1914, 1913, 3323, 623: 3316, 626: 3315, 3320, 663: 3311, 687: 3319}, + {33: 3329, 339: 584}, + {33: 3324}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 334: 3327, 497: 3326, 2001, 2002, 2000, 700: 3325}, + // 1445 + {702, 702, 5: 702, 33: 702, 331: 702, 336: 702, 702, 339: 702, 343: 702, 346: 702, 702, 702, 702, 351: 702, 702, 359: 702, 363: 702, 702, 702, 702, 702, 702, 702, 702, 702}, + {696, 696, 5: 696, 33: 696, 331: 696, 336: 696, 696, 339: 696, 343: 696, 346: 696, 696, 696, 696, 351: 696, 696, 359: 696, 363: 696, 696, 696, 696, 696, 696, 696, 696, 696, 493: 696, 511: 696, 696}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 3328, 2001, 2002, 2000}, + {695, 695, 5: 695, 33: 695, 331: 695, 336: 695, 695, 339: 695, 343: 695, 346: 695, 695, 695, 695, 351: 695, 695, 359: 695, 363: 695, 695, 695, 695, 695, 695, 695, 695, 695, 493: 695, 511: 695, 695}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 334: 3327, 497: 3326, 2001, 2002, 2000, 700: 3330}, + // 1450 + {703, 703, 5: 703, 33: 703, 331: 703, 336: 703, 703, 339: 703, 343: 703, 346: 703, 703, 703, 703, 351: 703, 703, 359: 703, 363: 703, 703, 703, 703, 703, 703, 703, 703, 703}, + {33: 3332, 339: 584}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 334: 3327, 339: 583, 497: 3326, 2001, 2002, 2000, 700: 3330}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 3318, 497: 2328, 2001, 2002, 2000, 584: 3317, 623: 3316, 626: 3315, 3363}, + {366: 667, 719: 3350, 862: 3354}, + // 1455 + {336: 3337, 3338, 366: 3347, 644: 3348}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 3318, 497: 2328, 2001, 2002, 2000, 584: 3317, 623: 3316, 626: 3315, 3344}, + {366: 669, 719: 669}, + {366: 668, 719: 668}, + {2: 665, 665, 665, 6: 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 34: 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665}, + // 1460 + {366: 3343}, + {366: 3342}, + {2: 663, 663, 663, 6: 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 34: 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663}, + {2: 664, 664, 664, 6: 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 34: 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664}, + {671, 671, 5: 671, 33: 671, 331: 3345, 336: 671, 671, 339: 671, 343: 671, 346: 671, 671, 671, 671, 351: 671, 671, 359: 671, 363: 671, 671, 671, 671, 671, 671, 671, 671, 671, 644: 3334, 647: 3333}, + // 1465 + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 2413, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 3346}, + {670, 670, 5: 670, 33: 670, 331: 670, 336: 670, 670, 339: 670, 343: 670, 346: 670, 670, 670, 670, 2558, 670, 670, 354: 2556, 2557, 357: 2555, 2553, 670, 363: 670, 670, 670, 670, 670, 670, 670, 670, 670, 581: 2554, 2552}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 3318, 497: 2328, 2001, 2002, 2000, 584: 3317, 623: 3316, 626: 3315, 3353}, + {366: 667, 719: 3350, 862: 3349}, + {366: 3351}, + // 1470 + {366: 666}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 3318, 497: 2328, 2001, 2002, 2000, 584: 3317, 623: 3316, 626: 3315, 3352}, + {672, 672, 5: 672, 33: 672, 331: 672, 336: 672, 672, 339: 672, 343: 672, 346: 672, 672, 672, 672, 351: 672, 672, 359: 672, 363: 672, 672, 672, 672, 672, 672, 672, 672, 672, 644: 3334, 647: 3333}, + {673, 673, 5: 673, 33: 673, 331: 673, 336: 673, 673, 339: 673, 343: 673, 346: 673, 673, 673, 673, 351: 673, 673, 359: 673, 363: 673, 673, 673, 673, 673, 673, 673, 673, 673, 644: 3334, 647: 3333}, + {366: 3355}, + // 1475 + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 3318, 497: 2328, 2001, 2002, 2000, 584: 3317, 623: 3316, 626: 3315, 3356}, + {331: 3357, 336: 3337, 3338, 346: 3358, 363: 3336, 366: 3339, 368: 3340, 3341, 3335, 644: 3334, 647: 3333}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 2413, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 3362}, + {330: 3359}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 3161, 2001, 2002, 2000, 589: 3265, 662: 3360}, + // 1480 + {5: 3267, 33: 3361}, + {674, 674, 5: 674, 33: 674, 331: 674, 336: 674, 674, 339: 674, 343: 674, 346: 674, 674, 674, 674, 351: 674, 674, 359: 674, 363: 674, 674, 674, 674, 674, 674, 674, 674, 674}, + {675, 675, 5: 675, 33: 675, 331: 675, 336: 675, 675, 339: 675, 343: 675, 346: 675, 675, 675, 675, 2558, 675, 675, 354: 2556, 2557, 357: 2555, 2553, 675, 363: 675, 675, 675, 675, 675, 675, 675, 675, 675, 581: 2554, 2552}, + {678, 678, 5: 678, 33: 678, 331: 3364, 336: 678, 678, 339: 678, 343: 678, 346: 3365, 678, 678, 678, 351: 678, 678, 359: 678, 363: 678, 678, 678, 678, 678, 678, 678, 678, 678, 644: 3334, 647: 3333}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 2413, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 3369}, + // 1485 + {330: 3366}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 3161, 2001, 2002, 2000, 589: 3265, 662: 3367}, + {5: 3267, 33: 3368}, + {676, 676, 5: 676, 33: 676, 331: 676, 336: 676, 676, 339: 676, 343: 676, 346: 676, 676, 676, 676, 351: 676, 676, 359: 676, 363: 676, 676, 676, 676, 676, 676, 676, 676, 676}, + {677, 677, 5: 677, 33: 677, 331: 677, 336: 677, 677, 339: 677, 343: 677, 346: 677, 677, 677, 677, 2558, 677, 677, 354: 2556, 2557, 357: 2555, 2553, 677, 363: 677, 677, 677, 677, 677, 677, 677, 677, 677, 581: 2554, 2552}, + // 1490 + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 3318, 420: 3314, 497: 2328, 2001, 2002, 2000, 584: 3317, 623: 3316, 626: 3315, 3320, 663: 3372}, + {701, 701, 5: 701, 33: 701, 331: 701, 336: 701, 701, 339: 701, 343: 701, 346: 701, 701, 701, 701, 351: 701, 701, 359: 701, 363: 701, 701, 701, 701, 701, 701, 701, 701, 701}, + {709, 709, 5: 709, 33: 709, 331: 709, 339: 709, 343: 709, 346: 709, 709, 709, 709, 351: 709, 709, 359: 709, 364: 709, 709, 367: 709}, + {698, 698, 2208, 2093, 2005, 698, 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 698, 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 331: 698, 334: 3327, 336: 698, 698, 339: 698, 343: 698, 346: 698, 698, 698, 698, 351: 698, 698, 359: 698, 363: 698, 698, 698, 698, 698, 698, 698, 698, 698, 493: 698, 497: 3326, 2001, 2002, 2000, 511: 698, 698, 700: 3382, 900: 3381}, + {330: 3375}, + // 1495 + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 3376, 2001, 2002, 2000, 625: 3377}, + {1798, 1798, 1798, 5: 1798, 13: 1798, 33: 1798, 343: 1798, 345: 1798, 495: 1798, 514: 1798}, + {5: 3378, 33: 3379}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 3380, 2001, 2002, 2000}, + {699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 331: 699, 334: 699, 336: 699, 699, 339: 699, 343: 699, 346: 699, 699, 699, 699, 351: 699, 699, 359: 699, 363: 699, 699, 699, 699, 699, 699, 699, 699, 699, 493: 699, 511: 699, 699}, + // 1500 + {1797, 1797, 1797, 5: 1797, 13: 1797, 33: 1797, 343: 1797, 345: 1797, 495: 1797, 514: 1797}, + {680, 680, 5: 680, 33: 680, 331: 680, 336: 680, 680, 339: 680, 343: 680, 346: 680, 680, 680, 680, 351: 680, 680, 359: 680, 363: 680, 680, 680, 680, 680, 680, 680, 680, 680, 493: 3385, 511: 3386, 3384, 743: 3388, 3387, 830: 3389, 3383}, + {697, 697, 5: 697, 33: 697, 331: 697, 336: 697, 697, 339: 697, 343: 697, 346: 697, 697, 697, 697, 351: 697, 697, 359: 697, 363: 697, 697, 697, 697, 697, 697, 697, 697, 697, 493: 697, 511: 697, 697}, + {704, 704, 5: 704, 33: 704, 331: 704, 336: 704, 704, 339: 704, 343: 704, 346: 704, 704, 704, 704, 351: 704, 704, 359: 704, 363: 704, 704, 704, 704, 704, 704, 704, 704, 704}, + {419: 3405, 495: 3406, 652: 3409}, + // 1505 + {419: 3405, 495: 3406, 652: 3408}, + {419: 3405, 495: 3406, 652: 3407}, + {330: 691, 347: 3391, 975: 3392}, + {682, 682, 5: 682, 33: 682, 331: 682, 336: 682, 682, 339: 682, 343: 682, 346: 682, 682, 682, 682, 351: 682, 682, 359: 682, 363: 682, 682, 682, 682, 682, 682, 682, 682, 682, 493: 682, 511: 682, 682}, + {679, 679, 5: 679, 33: 679, 331: 679, 336: 679, 679, 339: 679, 343: 679, 346: 679, 679, 679, 679, 351: 679, 679, 359: 679, 363: 679, 679, 679, 679, 679, 679, 679, 679, 679, 493: 3385, 511: 3386, 3384, 743: 3390, 3387}, + // 1510 + {681, 681, 5: 681, 33: 681, 331: 681, 336: 681, 681, 339: 681, 343: 681, 346: 681, 681, 681, 681, 351: 681, 681, 359: 681, 363: 681, 681, 681, 681, 681, 681, 681, 681, 681, 493: 681, 511: 681, 681}, + {351: 3401, 366: 3400, 3402}, + {330: 3393}, + {2: 2208, 2093, 2005, 686, 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 686, 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 427: 3396, 497: 3395, 2001, 2002, 2000, 650: 3394}, + {5: 3398, 33: 3397}, + // 1515 + {685, 685, 5: 685, 33: 685, 343: 685}, + {683, 683, 5: 683, 33: 683, 343: 683}, + {687, 687, 5: 687, 33: 687, 331: 687, 336: 687, 687, 339: 687, 343: 687, 346: 687, 687, 687, 687, 351: 687, 687, 359: 687, 363: 687, 687, 687, 687, 687, 687, 687, 687, 687, 493: 687, 511: 687, 687}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 3399, 2001, 2002, 2000}, + {684, 684, 5: 684, 33: 684, 343: 684}, + // 1520 + {330: 690}, + {507: 3404}, + {507: 3403}, + {330: 688}, + {330: 689}, + // 1525 + {2: 1811, 1811, 1811, 6: 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 34: 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 346: 1811, 1811, 406: 1811}, + {2: 1810, 1810, 1810, 6: 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 34: 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 346: 1810, 1810, 406: 1810}, + {330: 692, 347: 692}, + {330: 693, 347: 693}, + {330: 694, 347: 694}, + // 1530 + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 3318, 497: 2328, 2001, 2002, 2000, 584: 3317, 623: 3316, 626: 3315, 3411}, + {336: 3337, 3338, 363: 3336, 366: 3339, 368: 3340, 3341, 3335, 3412, 644: 3334, 647: 3333}, + {707, 707, 5: 707, 33: 707, 331: 707, 339: 707, 343: 707, 346: 707, 707, 707, 707, 351: 707, 707, 359: 707, 364: 707, 707, 367: 707}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 3161, 2001, 2002, 2000, 589: 3414, 703: 3415, 730: 3416}, + {361: 3429}, + // 1535 + {1765, 1765, 5: 1765, 349: 1765, 351: 1765, 1765}, + {154, 154, 5: 3417, 349: 154, 351: 154, 3419, 670: 3420, 3418}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 3161, 2001, 2002, 2000, 589: 3414, 703: 3428}, + {1017, 1017, 349: 1017, 351: 2768, 640: 2769, 3422}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 2413, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 3421}, + // 1540 + {153, 153, 33: 153, 331: 153, 339: 153, 343: 153, 346: 153, 153, 153, 153, 351: 153, 364: 153, 153, 367: 153}, + {155, 155, 33: 155, 331: 155, 339: 155, 343: 155, 346: 155, 155, 155, 155, 2558, 155, 354: 2556, 2557, 357: 2555, 2553, 364: 155, 155, 367: 155, 581: 2554, 2552}, + {662, 662, 349: 3423, 839: 3424}, + {362: 1990, 424: 3427, 583: 2974, 599: 3426, 715: 3425}, + {158, 158}, + // 1545 + {661, 661}, + {660, 660, 5: 660, 33: 660, 110: 660, 331: 660, 339: 660, 343: 660, 346: 660, 660, 660}, + {659, 659, 5: 659, 33: 659, 110: 659, 331: 659, 339: 659, 343: 659, 346: 659, 659, 659}, + {1764, 1764, 5: 1764, 349: 1764, 351: 1764, 1764}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 2413, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 3430}, + // 1550 + {1766, 1766, 5: 1766, 349: 1766, 2558, 1766, 1766, 354: 2556, 2557, 357: 2555, 2553, 581: 2554, 2552}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 3161, 2001, 2002, 2000, 589: 3414, 703: 3415, 730: 3432}, + {154, 154, 5: 3417, 352: 3419, 670: 3420, 3433}, + {157, 157}, + {5: 3547, 36: 3451, 3444, 3449, 3441, 3440, 3448, 3452, 3454, 3447, 3453, 3455, 3439, 3450, 3442, 3446, 3443, 3445, 495: 3438, 598: 3545, 758: 3548, 3546}, + // 1555 + {598: 3544}, + {5: 650, 36: 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 495: 650, 598: 650}, + {5: 649, 36: 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 495: 649, 598: 649}, + {330: 3539}, + {330: 3535}, + // 1560 + {330: 3531}, + {330: 3527}, + {330: 3522}, + {330: 3518}, + {330: 3512}, + // 1565 + {330: 3508}, + {330: 3505}, + {330: 3499}, + {330: 3493}, + {330: 3490}, + // 1570 + {330: 3487}, + {330: 3484}, + {330: 3481}, + {330: 3478}, + {330: 3475}, + // 1575 + {330: 3456}, + {127: 623, 623, 404: 3458, 608: 3457}, + {127: 3463, 3462, 827: 3461, 3460, 972: 3459}, + {2: 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 362: 622, 425: 622, 622, 622, 528: 622}, + {5: 3473, 33: 3472}, + // 1580 + {5: 626, 33: 626}, + {729: 3464}, + {729: 616}, + {729: 615}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 3466, 2001, 2002, 2000, 665: 3467, 712: 3465}, + // 1585 + {5: 3470, 528: 3469}, + {2: 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 404: 3458, 427: 623, 528: 623, 608: 3468}, + {5: 620, 33: 620, 528: 620}, + {2: 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 427: 621, 528: 621}, + {5: 624, 33: 624}, + // 1590 + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 3466, 2001, 2002, 2000, 665: 3471}, + {5: 619, 33: 619, 528: 619}, + {5: 627, 36: 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 495: 627, 598: 627}, + {127: 3463, 3462, 827: 3461, 3474}, + {5: 625, 33: 625}, + // 1595 + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 3476, 2001, 2002, 2000}, + {33: 3477}, + {5: 628, 36: 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 495: 628, 598: 628}, + {33: 623, 404: 3458, 608: 3479}, + {33: 3480}, + // 1600 + {5: 629, 36: 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 495: 629, 598: 629}, + {33: 623, 404: 3458, 608: 3482}, + {33: 3483}, + {5: 630, 36: 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 495: 630, 598: 630}, + {33: 623, 404: 3458, 608: 3485}, + // 1605 + {33: 3486}, + {5: 631, 36: 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 495: 631, 598: 631}, + {33: 623, 404: 3458, 608: 3488}, + {33: 3489}, + {5: 632, 36: 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 495: 632, 598: 632}, + // 1610 + {33: 623, 404: 3458, 608: 3491}, + {33: 3492}, + {5: 633, 36: 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 495: 633, 598: 633}, + {362: 623, 404: 3458, 608: 3494}, + {362: 1990, 583: 3496, 970: 3495}, + // 1615 + {33: 3498}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 3497, 2001, 2002, 2000}, + {33: 612}, + {5: 634, 36: 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 495: 634, 598: 634}, + {160: 623, 623, 404: 3458, 608: 3500}, + // 1620 + {160: 3502, 3503, 971: 3501}, + {33: 3504}, + {33: 614}, + {33: 613}, + {5: 635, 36: 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 495: 635, 598: 635}, + // 1625 + {33: 623, 404: 3458, 608: 3506}, + {33: 3507}, + {5: 636, 36: 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 495: 636, 598: 636}, + {362: 623, 404: 3458, 608: 3509}, + {362: 1990, 583: 3510}, + // 1630 + {33: 3511}, + {5: 637, 36: 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 495: 637, 598: 637}, + {404: 3458, 425: 623, 623, 608: 3513}, + {425: 3516, 3515, 829: 3514}, + {33: 3517}, + // 1635 + {33: 618}, + {33: 617}, + {5: 638, 36: 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 495: 638, 598: 638}, + {404: 3458, 425: 623, 623, 608: 3519}, + {425: 3516, 3515, 829: 3520}, + // 1640 + {33: 3521}, + {5: 639, 36: 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 495: 639, 598: 639}, + {2: 623, 623, 623, 6: 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 34: 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 404: 3458, 608: 3523}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 3466, 2001, 2002, 2000, 665: 3524}, + {2: 2208, 2093, 2005, 686, 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 686, 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 427: 3396, 497: 3395, 2001, 2002, 2000, 650: 3525}, + // 1645 + {5: 3398, 33: 3526}, + {5: 640, 36: 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 495: 640, 598: 640}, + {2: 623, 623, 623, 6: 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 34: 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 404: 3458, 608: 3528}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 3466, 2001, 2002, 2000, 665: 3467, 712: 3529}, + {5: 3470, 33: 3530}, + // 1650 + {5: 641, 36: 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 495: 641, 598: 641}, + {2: 623, 623, 623, 6: 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 34: 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 404: 3458, 608: 3532}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 3466, 2001, 2002, 2000, 665: 3467, 712: 3533}, + {5: 3470, 33: 3534}, + {5: 642, 36: 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 495: 642, 598: 642}, + // 1655 + {2: 623, 623, 623, 6: 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 34: 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 404: 3458, 608: 3536}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 3466, 2001, 2002, 2000, 665: 3467, 712: 3537}, + {5: 3470, 33: 3538}, + {5: 643, 36: 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 495: 643, 598: 643}, + {2: 623, 623, 623, 6: 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 34: 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 404: 3458, 608: 3540}, + // 1660 + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 3466, 2001, 2002, 2000, 665: 3541}, + {2: 2208, 2093, 2005, 686, 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 686, 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 427: 3396, 497: 3395, 2001, 2002, 2000, 650: 3542}, + {5: 3398, 33: 3543}, + {5: 644, 36: 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 495: 644, 598: 644}, + {2: 651, 651, 651, 6: 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 34: 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 332: 651, 651, 335: 651, 651, 651, 340: 651, 651, 651, 344: 651, 353: 651, 356: 651, 360: 651, 362: 651, 651, 373: 651, 651, 380: 651, 404: 651, 406: 651, 417: 651, 651, 420: 651, 651, 651, 651, 651, 651, 651, 428: 651, 651, 651, 651, 651, 651, 651, 651, 437: 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 493: 651, 585: 651, 601: 651, 610: 651, 651, 651, 651, 615: 651, 651, 621: 651}, + // 1665 + {2: 652, 652, 652, 6: 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 34: 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 332: 652, 652, 335: 652, 652, 652, 340: 652, 652, 652, 344: 652, 353: 652, 356: 652, 360: 652, 362: 652, 652, 373: 652, 652, 380: 652, 404: 652, 406: 652, 417: 652, 652, 420: 652, 652, 652, 652, 652, 652, 652, 428: 652, 652, 652, 652, 652, 652, 652, 652, 437: 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 493: 652, 585: 652, 601: 652, 610: 652, 652, 652, 652, 615: 652, 652, 621: 652}, + {5: 648, 36: 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 495: 648, 598: 648}, + {36: 3451, 3444, 3449, 3441, 3440, 3448, 3452, 3454, 3447, 3453, 3455, 3439, 3450, 3442, 3446, 3443, 3445, 495: 3438, 758: 3550, 3549}, + {5: 646, 36: 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 495: 646, 598: 646}, + {5: 647, 36: 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 495: 647, 598: 647}, + // 1670 + {5: 645, 36: 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 495: 645, 598: 645}, + {2: 279, 279, 279, 6: 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 34: 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 2328, 2001, 2002, 2000, 584: 3553}, + {278, 278}, + {60: 3558, 62: 3561, 111: 3560, 138: 3562, 592: 3557, 904: 3563, 964: 3559}, + // 1675 + {404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 34: 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 345: 404, 362: 404, 585: 404, 592: 404}, + {403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 34: 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 345: 403, 362: 403, 585: 403, 592: 403}, + {1527, 1527, 1527, 1527, 1527, 6: 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 34: 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 343: 1527, 406: 1527}, + {1526, 1526, 1526, 1526, 1526, 6: 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 34: 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 343: 1526, 406: 1526}, + {412, 412}, + // 1680 + {409, 409}, + {408, 408}, + {132: 3573}, + {402, 402, 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 343: 402, 497: 2328, 2001, 2002, 2000, 584: 3564, 634: 3565, 903: 3566}, + {792, 792, 5: 792, 33: 792, 343: 792, 360: 792, 516: 792, 518: 792}, + // 1685 + {401, 401, 5: 3571, 33: 401, 343: 401}, + {400, 400, 343: 3568, 1083: 3567}, + {406, 406}, + {520: 3569}, + {348: 3570}, + // 1690 + {399, 399}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 2328, 2001, 2002, 2000, 584: 3572}, + {791, 791, 5: 791, 33: 791, 343: 791, 346: 791, 360: 791, 516: 791, 518: 791}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 3574, 2001, 2002, 2000, 754: 3575}, + {411, 411, 5: 411}, + // 1695 + {407, 407, 5: 3576}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 3577, 2001, 2002, 2000}, + {410, 410, 5: 410}, + {423, 423, 352: 3637, 372: 3636, 685: 3708}, + {57: 3697, 101: 3699, 433: 3698, 592: 3696}, + // 1700 + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 3689, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 2328, 2001, 2002, 2000, 584: 3690}, + {480, 480, 347: 3684}, + {62: 3683}, + {60: 3673, 66: 3674, 3675, 133: 3672}, + {423, 423, 352: 3637, 372: 3636, 685: 3671}, + // 1705 + {423, 423, 352: 3637, 372: 3636, 685: 3670}, + {423, 423, 352: 3637, 372: 3636, 685: 3669}, + {423, 423, 352: 3637, 372: 3636, 685: 3668}, + {472, 472}, + {468, 468, 129: 3644, 143: 3645, 149: 3646, 151: 3643, 166: 3648, 175: 3647, 186: 3650, 190: 3649, 347: 468, 349: 468, 585: 3651, 888: 3642, 1037: 3641, 3640}, + // 1710 + {470, 470}, + {62: 3634}, + {360: 451, 394: 451}, + {360: 450, 394: 450}, + {360: 449, 394: 449}, + // 1715 + {446, 446, 352: 446, 372: 446}, + {445, 445, 352: 445, 372: 445}, + {444, 444, 352: 444, 372: 444}, + {60: 3632}, + {360: 3614, 394: 3615, 631: 3627}, + // 1720 + {436, 436, 352: 436, 372: 436}, + {435, 435, 352: 435, 372: 435}, + {62: 3625, 103: 3626, 120: 3624}, + {431, 431, 352: 431, 372: 431}, + {415, 415, 352: 415, 360: 3614, 372: 415, 394: 3615, 631: 3617, 668: 3623}, + // 1725 + {62: 3622}, + {62: 3621}, + {62: 3620}, + {62: 3619}, + {415, 415, 352: 415, 360: 3614, 372: 415, 394: 3615, 631: 3617, 668: 3616}, + // 1730 + {424, 424, 352: 424, 372: 424}, + {62: 419, 94: 419, 103: 419, 120: 419}, + {62: 418, 94: 418, 103: 418, 120: 418}, + {60: 416, 66: 416, 416, 133: 416}, + {2: 448, 448, 448, 6: 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 34: 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448}, + // 1735 + {2: 447, 447, 447, 6: 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 34: 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447}, + {425, 425, 352: 425, 372: 425}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 3301, 2001, 2002, 2000, 675: 3618}, + {414, 414, 352: 414, 372: 414}, + {426, 426, 352: 426, 372: 426}, + // 1740 + {427, 427, 352: 427, 372: 427}, + {428, 428, 352: 428, 372: 428}, + {429, 429, 352: 429, 372: 429}, + {430, 430, 352: 430, 372: 430}, + {434, 434, 352: 434, 372: 434}, + // 1745 + {433, 433, 352: 433, 372: 433}, + {432, 432, 352: 432, 372: 432}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 3628, 2001, 2002, 2000, 584: 3629}, + {795, 795, 352: 795, 360: 3614, 372: 795, 374: 2339, 394: 3615, 631: 3630}, + {440, 440, 352: 440, 372: 440}, + // 1750 + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 3631, 2001, 2002, 2000}, + {439, 439, 352: 439, 372: 439}, + {415, 415, 352: 415, 360: 3614, 372: 415, 394: 3615, 631: 3617, 668: 3633}, + {442, 442, 352: 442, 372: 442}, + {423, 423, 352: 3637, 372: 3636, 685: 3635}, + // 1755 + {469, 469}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2561, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 3639, 2465, 2542, 2464, 2461}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 2413, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 3638}, + {421, 421, 350: 2558, 354: 2556, 2557, 357: 2555, 2553, 581: 2554, 2552}, + {422, 422, 338: 2562, 491: 2563}, + // 1760 + {455, 455, 347: 3658, 349: 455, 1036: 3657}, + {467, 467, 5: 3655, 347: 467, 349: 467}, + {466, 466, 5: 466, 347: 466, 349: 466}, + {464, 464, 5: 464, 347: 464, 349: 464}, + {463, 463, 5: 463, 347: 463, 349: 463}, + // 1765 + {234: 3654}, + {270: 3653}, + {224: 3652}, + {459, 459, 5: 459, 347: 459, 349: 459}, + {458, 458, 5: 458, 347: 458, 349: 458}, + // 1770 + {457, 457, 5: 457, 347: 457, 349: 457}, + {456, 456, 5: 456, 347: 456, 349: 456}, + {460, 460, 5: 460, 347: 460, 349: 460}, + {461, 461, 5: 461, 347: 461, 349: 461}, + {462, 462, 5: 462, 347: 462, 349: 462}, + // 1775 + {129: 3644, 143: 3645, 149: 3646, 151: 3643, 166: 3648, 175: 3647, 186: 3650, 190: 3649, 585: 3651, 888: 3656}, + {465, 465, 5: 465, 347: 465, 349: 465}, + {658, 658, 349: 3661, 656: 3662}, + {112: 3659}, + {362: 1990, 583: 3660}, + // 1780 + {454, 454, 349: 454}, + {362: 1990, 424: 3427, 583: 2974, 599: 3426, 715: 3663}, + {471, 471}, + {657, 657, 5: 3664, 33: 657, 110: 3665, 331: 657, 339: 657, 343: 657, 346: 657, 657, 657}, + {362: 1990, 424: 3427, 583: 2974, 599: 3426, 715: 3667}, + // 1785 + {362: 1990, 424: 3427, 583: 2974, 599: 3426, 715: 3666}, + {655, 655, 33: 655, 331: 655, 339: 655, 343: 655, 346: 655, 655, 655}, + {656, 656, 33: 656, 331: 656, 339: 656, 343: 656, 346: 656, 656, 656}, + {473, 473}, + {474, 474}, + // 1790 + {475, 475}, + {476, 476}, + {477, 477}, + {415, 415, 352: 415, 360: 3614, 372: 415, 394: 3615, 631: 3617, 668: 3682}, + {360: 3614, 394: 3615, 631: 3677, 890: 3680}, + // 1795 + {360: 3614, 394: 3615, 631: 3677, 890: 3676}, + {415, 415, 352: 415, 360: 3614, 372: 415, 394: 3615, 631: 3617, 668: 3679}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 2328, 2001, 2002, 2000, 584: 3678}, + {413, 413, 352: 413, 360: 413, 372: 413, 394: 413}, + {437, 437, 352: 437, 372: 437}, + // 1800 + {415, 415, 352: 415, 360: 3614, 372: 415, 394: 3615, 631: 3617, 668: 3681}, + {438, 438, 352: 438, 372: 438}, + {443, 443, 352: 443, 372: 443}, + {478, 478}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 332: 2361, 417: 3226, 497: 2362, 2001, 2002, 2000, 586: 3225, 617: 3685}, + // 1805 + {453, 453, 346: 3687, 1063: 3686}, + {479, 479}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 3174, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 332: 3181, 497: 2362, 2001, 2002, 2000, 586: 3183, 632: 3184, 3182, 655: 3688}, + {452, 452, 5: 3270}, + {415, 415, 99: 1332, 352: 415, 360: 3614, 372: 415, 374: 1332, 394: 3615, 495: 1332, 631: 3617, 668: 3695}, + // 1810 + {99: 3691, 495: 3692}, + {482, 482}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 3693, 2001, 2002, 2000}, + {99: 3694}, + {481, 481}, + // 1815 + {441, 441, 352: 441, 372: 441}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 2328, 2001, 2002, 2000, 584: 3707}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 2328, 2001, 2002, 2000, 584: 3706}, + {2: 1426, 1426, 1426, 6: 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 34: 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 406: 3701, 638: 3702}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 332: 2361, 417: 3226, 497: 2362, 2001, 2002, 2000, 586: 3225, 617: 3700}, + // 1820 + {483, 483}, + {333: 3704}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 3301, 2001, 2002, 2000, 675: 3703}, + {484, 484}, + {432: 3705}, + // 1825 + {1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 34: 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 332: 1425, 345: 1425, 1425, 417: 1425, 645: 1425}, + {485, 485}, + {486, 486}, + {487, 487}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 3755, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 3754, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 2328, 2001, 2002, 2000, 584: 3756}, + // 1830 + {495: 3741, 592: 3740}, + {495: 3737}, + {495: 3731, 592: 3732}, + {592: 3729}, + {214: 3723}, + // 1835 + {223: 3721, 248: 3722}, + {121: 3718, 123: 3717}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 3574, 2001, 2002, 2000, 754: 3720}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 3574, 2001, 2002, 2000, 754: 3719}, + {498, 498, 5: 3576}, + // 1840 + {499, 499, 5: 3576}, + {501, 501}, + {500, 500}, + {169: 3724}, + {362: 1990, 583: 3726, 849: 3725}, + // 1845 + {504, 504, 5: 3727}, + {489, 489, 5: 489}, + {362: 1990, 583: 3728}, + {488, 488, 5: 488}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 2328, 2001, 2002, 2000, 584: 3564, 634: 3730}, + // 1850 + {505, 505, 5: 3571}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 2328, 2001, 2002, 2000, 584: 3735}, + {348: 3733}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 2328, 2001, 2002, 2000, 584: 3564, 634: 3734}, + {497, 497, 5: 3571}, + // 1855 + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 3736, 2001, 2002, 2000}, + {507, 507}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 2328, 2001, 2002, 2000, 584: 3738}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 3739, 2001, 2002, 2000}, + {508, 508}, + // 1860 + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 2328, 2001, 2002, 2000, 584: 3564, 634: 3753}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 2328, 2001, 2002, 2000, 584: 3742}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 3743, 2001, 2002, 2000}, + {509, 509, 330: 3746, 825: 3745, 968: 3744}, + {506, 506, 5: 3751}, + // 1865 + {492, 492, 5: 492}, + {362: 1990, 583: 3747}, + {5: 3748}, + {362: 1990, 583: 3749}, + {33: 3750}, + // 1870 + {490, 490, 5: 490}, + {330: 3746, 825: 3752}, + {491, 491, 5: 491}, + {510, 510, 5: 3571}, + {131: 1241, 256: 3764, 275: 3765, 374: 1241, 919: 3763}, + // 1875 + {514, 514, 131: 1159, 168: 3759, 3758, 374: 1159}, + {131: 3757}, + {511, 511}, + {513, 513, 362: 1990, 583: 3762}, + {255: 3760}, + // 1880 + {362: 1990, 583: 3726, 849: 3761}, + {503, 503, 5: 3727}, + {512, 512}, + {502, 502}, + {362: 1990, 583: 3771}, + // 1885 + {232: 3767, 362: 1990, 583: 3766, 585: 3768}, + {495, 495}, + {362: 1990, 583: 3770}, + {362: 1990, 583: 3769}, + {493, 493}, + // 1890 + {494, 494}, + {496, 496}, + {2: 166, 166, 166, 6: 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 34: 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 332: 166, 361: 1384, 374: 1384, 380: 166, 509: 1384}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 3860, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 361: 1353, 374: 1353, 497: 3782, 2001, 2002, 2000, 509: 1353, 659: 3815}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 361: 1348, 374: 1348, 497: 3782, 2001, 2002, 2000, 509: 1348, 659: 3857}, + // 1895 + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 332: 2361, 361: 1346, 374: 1346, 380: 2360, 497: 2362, 2001, 2002, 2000, 509: 1346, 586: 2359, 635: 3853}, + {347: 3843, 361: 3842, 374: 1344, 509: 1344}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 3174, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 3802, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 332: 3181, 335: 3839, 361: 1338, 374: 1338, 497: 2362, 2001, 2002, 2000, 509: 1338, 585: 3837, 3183, 632: 3184, 3182, 655: 3805, 885: 3838, 1034: 3836}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 3834, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 361: 1336, 374: 1336, 497: 3782, 2001, 2002, 2000, 509: 1336, 659: 3812}, + {108: 3820, 361: 1321, 374: 1321, 509: 1321, 520: 3821, 726: 3819, 762: 3818}, + // 1900 + {579, 579, 5: 3808}, + {100: 3801}, + {361: 552, 374: 3799, 509: 552}, + {361: 3789, 509: 3790, 676: 3797}, + {361: 3789, 509: 3790, 676: 3793}, + // 1905 + {361: 3789, 509: 3790, 676: 3791}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 332: 2361, 380: 2360, 497: 2362, 2001, 2002, 2000, 586: 2359, 635: 3788}, + {536, 536, 5: 536}, + {541, 541, 5: 541}, + {2: 554, 554, 554, 6: 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 34: 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 335: 554, 554, 554, 340: 554, 554, 554, 344: 554, 353: 554, 356: 554, 362: 554, 374: 554, 380: 554, 404: 554, 406: 554, 417: 554, 554, 420: 554, 554, 554, 554, 554, 554, 554, 428: 554, 554, 554, 554, 554, 554, 554, 554, 437: 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554}, + // 1910 + {2: 553, 553, 553, 6: 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 34: 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 335: 553, 553, 553, 340: 553, 553, 553, 344: 553, 353: 553, 356: 553, 362: 553, 374: 553, 380: 553, 404: 553, 406: 553, 417: 553, 553, 420: 553, 553, 553, 553, 553, 553, 553, 428: 553, 553, 553, 553, 553, 553, 553, 553, 437: 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 2413, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 3792}, + {545, 545, 5: 545, 350: 2558, 354: 2556, 2557, 357: 2555, 2553, 581: 2554, 2552}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 3794, 2455, 2413, 335: 2444, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 2412, 664: 3795, 724: 3796}, + {556, 556, 5: 556}, + // 1915 + {555, 555, 5: 555}, + {546, 546, 5: 546}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 3794, 2455, 2413, 335: 2444, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 2412, 664: 3795, 724: 3798}, + {550, 550, 5: 550}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 3800, 2001, 2002, 2000}, + // 1920 + {361: 551, 509: 551}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 3174, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 3802, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 332: 3181, 497: 2362, 2001, 2002, 2000, 585: 3804, 3183, 632: 3184, 3182, 655: 3805, 885: 3803}, + {571, 571, 404: 1263, 506: 571, 515: 1263}, + {506: 3806}, + {506: 570}, + // 1925 + {569, 569, 5: 3270, 506: 569}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 332: 2361, 417: 3226, 497: 2362, 2001, 2002, 2000, 586: 3225, 617: 3272, 701: 3807}, + {572, 572, 5: 3274}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 3772, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 3774, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 3809, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 3810, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 3775, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 356: 2996, 404: 3785, 434: 3784, 496: 2994, 3782, 2001, 2002, 2000, 603: 3786, 659: 3783, 768: 3811}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 361: 1353, 374: 1353, 497: 3782, 2001, 2002, 2000, 509: 1353, 659: 3815}, + // 1930 + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 361: 1336, 374: 1336, 497: 3782, 2001, 2002, 2000, 509: 1336, 659: 3812}, + {535, 535, 5: 535}, + {361: 3789, 509: 3790, 676: 3813}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 3794, 2455, 2413, 335: 2444, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 2412, 664: 3795, 724: 3814}, + {548, 548, 5: 548}, + // 1935 + {361: 3789, 509: 3790, 676: 3816}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 3794, 2455, 2413, 335: 2444, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 2412, 664: 3795, 724: 3817}, + {549, 549, 5: 549}, + {574, 574, 5: 3832}, + {565, 565, 5: 565}, + // 1940 + {237: 3824}, + {245: 3823, 539: 3822}, + {562, 562, 5: 562}, + {561, 561, 5: 561}, + {257: 3826, 261: 3828, 520: 3827, 980: 3825}, + // 1945 + {563, 563, 5: 563}, + {520: 3831}, + {212: 3829, 280: 3830}, + {557, 557, 5: 557}, + {559, 559, 5: 559}, + // 1950 + {558, 558, 5: 558}, + {560, 560, 5: 560}, + {108: 3820, 520: 3821, 726: 3833}, + {564, 564, 5: 564}, + {108: 3820, 361: 1321, 374: 1321, 509: 1321, 520: 3821, 726: 3819, 762: 3835}, + // 1955 + {575, 575, 5: 3832}, + {573, 573}, + {570, 570, 956: 3840}, + {567, 567}, + {566, 566}, + // 1960 + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 3174, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 332: 3181, 497: 2362, 2001, 2002, 2000, 586: 3183, 632: 3184, 3182, 655: 3841}, + {568, 568, 5: 3270}, + {10: 3848, 332: 3847, 867: 3852}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 332: 2361, 417: 3226, 497: 2362, 2001, 2002, 2000, 586: 3225, 617: 3844}, + {361: 3845}, + // 1965 + {10: 3848, 332: 3847, 867: 3846}, + {577, 577}, + {524, 524}, + {330: 3849}, + {332: 3241, 704: 3850}, + // 1970 + {33: 3851}, + {523, 523}, + {578, 578}, + {544, 544, 5: 544, 338: 3854}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 332: 2361, 335: 3855, 497: 2362, 2001, 2002, 2000, 586: 3856}, + // 1975 + {543, 543, 5: 543}, + {542, 542, 5: 542}, + {361: 3789, 509: 3790, 676: 3858}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 2413, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 3859}, + {547, 547, 5: 547, 350: 2558, 354: 2556, 2557, 357: 2555, 2553, 581: 2554, 2552}, + // 1980 + {108: 3820, 361: 1321, 374: 1321, 509: 1321, 520: 3821, 726: 3819, 762: 3861}, + {576, 576, 5: 3832}, + {506: 3871}, + {506: 3864}, + {173: 3865}, + // 1985 + {361: 3866}, + {332: 3867}, + {347: 3868}, + {172: 3869}, + {332: 3870}, + // 1990 + {580, 580}, + {173: 3872}, + {361: 3873}, + {332: 3874}, + {347: 3875}, + // 1995 + {172: 3876}, + {332: 3877}, + {581, 581}, + {330: 960, 494: 960, 585: 2723, 615: 2721, 2722, 629: 3879, 3880, 950: 3882, 1061: 3881}, + {2: 963, 963, 963, 6: 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 34: 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 332: 963, 963, 335: 963, 963, 963, 340: 963, 963, 963, 344: 963, 353: 963, 356: 963, 362: 963, 963, 373: 963, 963, 380: 963, 404: 963, 406: 963, 417: 963, 963, 420: 963, 963, 963, 963, 963, 963, 963, 428: 963, 963, 963, 963, 963, 963, 963, 963, 437: 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 494: 963, 601: 963, 610: 963, 963, 963, 963, 621: 963}, + // 2000 + {330: 959, 494: 959}, + {330: 3886, 494: 1908, 593: 3888, 3883, 3884, 3885, 604: 3887}, + {330: 582, 494: 582}, + {1017, 1017, 33: 1017, 331: 1017, 339: 1017, 347: 1017, 1017, 1017, 351: 2768, 360: 3906, 640: 2769, 3907, 820: 3905}, + {1017, 1017, 33: 1017, 331: 1017, 339: 1017, 347: 1017, 1017, 1017, 351: 2768, 640: 2769, 3902}, + // 2005 + {1017, 1017, 33: 1017, 331: 1017, 339: 1017, 347: 1017, 1017, 1017, 351: 2768, 640: 2769, 3893}, + {494: 1908, 593: 3889, 1909, 1910, 1911}, + {339: 585}, + {339: 584}, + {33: 3890}, + // 2010 + {1017, 1017, 33: 1017, 331: 1017, 339: 583, 349: 1017, 351: 2768, 640: 2769, 3891}, + {658, 658, 33: 658, 331: 658, 349: 3661, 656: 3892}, + {587, 587, 33: 587, 331: 587}, + {658, 658, 33: 658, 331: 658, 339: 658, 347: 658, 658, 3661, 656: 3894}, + {593, 593, 33: 593, 331: 593, 339: 593, 347: 3896, 3897, 683: 3895}, + // 2015 + {588, 588, 33: 588, 331: 588, 339: 772}, + {602: 3901}, + {394: 3898}, + {262: 3899}, + {241: 3900}, + // 2020 + {591, 591, 33: 591, 331: 591, 339: 591, 343: 591, 346: 591}, + {592, 592, 33: 592, 331: 592, 339: 592, 343: 592, 346: 592}, + {658, 658, 33: 658, 331: 658, 339: 658, 347: 658, 658, 3661, 656: 3903}, + {593, 593, 33: 593, 331: 593, 339: 593, 347: 3896, 3897, 683: 3904}, + {589, 589, 33: 589, 331: 589, 339: 773}, + // 2025 + {154, 154, 33: 154, 331: 154, 339: 154, 343: 154, 346: 154, 154, 154, 154, 351: 154, 3419, 670: 3420, 3931}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 3318, 420: 3314, 497: 2328, 2001, 2002, 2000, 584: 3317, 623: 3316, 626: 3315, 3320, 663: 3311, 687: 3912, 952: 3911, 1055: 3910}, + {658, 658, 33: 658, 331: 658, 339: 658, 347: 658, 658, 3661, 656: 3908}, + {593, 593, 33: 593, 331: 593, 339: 593, 347: 3896, 3897, 683: 3909}, + {590, 590, 33: 590, 331: 590, 339: 774}, + // 2030 + {154, 154, 33: 154, 331: 154, 339: 154, 343: 154, 346: 154, 154, 154, 154, 351: 154, 3419, 364: 154, 154, 367: 154, 670: 3420, 3913}, + {771, 771, 33: 771, 331: 771, 339: 771, 343: 771, 346: 771, 771, 771, 771, 351: 771, 771}, + {711, 711, 5: 3370, 33: 711, 331: 711, 339: 711, 343: 711, 346: 711, 711, 711, 711, 351: 711, 711, 364: 711, 711, 367: 711}, + {597, 597, 33: 597, 331: 597, 339: 597, 343: 597, 346: 597, 597, 597, 597, 351: 597, 364: 597, 597, 367: 3914, 967: 3916, 1027: 3915}, + {507: 3929}, + // 2035 + {1430, 1430, 33: 1430, 331: 1430, 339: 1430, 343: 1430, 346: 1430, 1430, 1430, 1430, 351: 1430, 364: 1430, 3917, 969: 3918}, + {596, 596, 33: 596, 331: 596, 339: 596, 343: 596, 346: 596, 596, 596, 596, 351: 596, 364: 596, 596}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 2413, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 3928}, + {770, 770, 33: 770, 331: 770, 339: 770, 343: 770, 346: 770, 770, 770, 770, 351: 770, 364: 3920, 1075: 3919}, + {775, 775, 33: 775, 331: 775, 339: 775, 343: 775, 346: 775, 775, 775, 775, 351: 775}, + // 2040 + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 2576, 2001, 2002, 2000, 728: 3923, 915: 3922, 1076: 3921}, + {769, 769, 5: 3926, 33: 769, 331: 769, 339: 769, 343: 769, 346: 769, 769, 769, 769, 351: 769}, + {768, 768, 5: 768, 33: 768, 331: 768, 339: 768, 343: 768, 346: 768, 768, 768, 768, 351: 768}, + {334: 3924}, + {330: 2577, 917: 3925}, + // 2045 + {766, 766, 5: 766, 33: 766, 331: 766, 339: 766, 343: 766, 346: 766, 766, 766, 766, 351: 766}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 2576, 2001, 2002, 2000, 728: 3923, 915: 3927}, + {767, 767, 5: 767, 33: 767, 331: 767, 339: 767, 343: 767, 346: 767, 767, 767, 767, 351: 767}, + {1429, 1429, 33: 1429, 331: 1429, 339: 1429, 343: 1429, 346: 1429, 1429, 1429, 1429, 2558, 1429, 354: 2556, 2557, 357: 2555, 2553, 364: 1429, 581: 2554, 2552}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 2413, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 2587, 689: 2588, 706: 3930}, + // 2050 + {1431, 1431, 5: 2590, 33: 1431, 331: 1431, 339: 1431, 343: 1431, 346: 1431, 1431, 1431, 1431, 351: 1431, 364: 1431, 1431}, + {776, 776, 33: 776, 331: 776, 339: 776, 343: 776, 346: 776, 776, 776, 776, 351: 776}, + {658, 658, 33: 658, 331: 658, 339: 658, 343: 658, 346: 658, 658, 658, 3661, 656: 3933}, + {593, 593, 33: 593, 331: 593, 339: 593, 343: 593, 346: 593, 3896, 3897, 683: 3934}, + {772, 772, 33: 772, 331: 772, 339: 772, 343: 772, 346: 772}, + // 2055 + {658, 658, 33: 658, 331: 658, 339: 658, 343: 658, 346: 658, 658, 658, 3661, 656: 3936}, + {593, 593, 33: 593, 331: 593, 339: 593, 343: 593, 346: 593, 3896, 3897, 683: 3937}, + {773, 773, 33: 773, 331: 773, 339: 773, 343: 773, 346: 773}, + {658, 658, 33: 658, 331: 658, 339: 658, 343: 658, 346: 658, 658, 658, 3661, 656: 3939}, + {593, 593, 33: 593, 331: 593, 339: 593, 343: 593, 346: 593, 3896, 3897, 683: 3940}, + // 2060 + {774, 774, 33: 774, 331: 774, 339: 774, 343: 774, 346: 774}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 2413, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 373: 3959, 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 3961, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 3960, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 3958, 815: 3962, 960: 3963, 1026: 3964}, + {2: 962, 962, 962, 6: 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 34: 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 332: 962, 962, 335: 962, 962, 962, 340: 962, 962, 962, 344: 962, 353: 962, 356: 962, 362: 962, 962, 373: 962, 962, 380: 962, 404: 962, 406: 962, 417: 962, 962, 420: 962, 962, 962, 962, 962, 962, 962, 428: 962, 962, 962, 962, 962, 962, 962, 962, 437: 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 585: 2723, 601: 962, 610: 962, 962, 962, 962, 615: 2721, 2722, 621: 962, 629: 3879, 2725, 636: 3943}, + {2: 799, 799, 799, 6: 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 34: 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 332: 799, 799, 335: 799, 799, 799, 340: 799, 799, 799, 344: 799, 353: 799, 356: 799, 362: 799, 799, 373: 799, 799, 380: 799, 404: 799, 406: 799, 417: 799, 799, 420: 799, 799, 799, 799, 799, 799, 799, 428: 799, 799, 799, 799, 799, 799, 799, 799, 437: 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 601: 799, 610: 3307, 3306, 3305, 799, 621: 799, 699: 3944}, + {2: 602, 602, 602, 6: 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 34: 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 332: 602, 602, 335: 602, 602, 602, 340: 602, 602, 602, 344: 602, 353: 602, 356: 602, 362: 602, 602, 373: 602, 602, 380: 602, 404: 602, 406: 602, 417: 602, 602, 420: 602, 602, 602, 602, 602, 602, 602, 428: 602, 602, 602, 602, 602, 602, 602, 602, 437: 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 601: 602, 613: 602, 621: 3946, 1032: 3945}, + // 2065 + {2: 609, 609, 609, 6: 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 34: 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 332: 609, 609, 335: 609, 609, 609, 340: 609, 609, 609, 344: 609, 353: 609, 356: 609, 362: 609, 609, 373: 609, 609, 380: 609, 404: 609, 406: 609, 417: 609, 609, 420: 609, 609, 609, 609, 609, 609, 609, 428: 609, 609, 609, 609, 609, 609, 609, 609, 437: 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 601: 609, 613: 3948, 1029: 3947}, + {2: 601, 601, 601, 6: 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 34: 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 332: 601, 601, 335: 601, 601, 601, 340: 601, 601, 601, 344: 601, 353: 601, 356: 601, 362: 601, 601, 373: 601, 601, 380: 601, 404: 601, 406: 601, 417: 601, 601, 420: 601, 601, 601, 601, 601, 601, 601, 428: 601, 601, 601, 601, 601, 601, 601, 601, 437: 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601: 601, 613: 601}, + {2: 607, 607, 607, 6: 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 34: 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 3950, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 332: 607, 607, 335: 607, 607, 607, 340: 607, 607, 607, 344: 607, 353: 607, 356: 607, 362: 607, 607, 373: 607, 607, 380: 607, 404: 607, 406: 607, 417: 607, 607, 420: 607, 607, 607, 607, 607, 607, 607, 428: 607, 607, 607, 607, 607, 607, 607, 607, 437: 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 601: 607, 1030: 3949}, + {2: 608, 608, 608, 6: 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 34: 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 332: 608, 608, 335: 608, 608, 608, 340: 608, 608, 608, 344: 608, 353: 608, 356: 608, 362: 608, 608, 373: 608, 608, 380: 608, 404: 608, 406: 608, 417: 608, 608, 420: 608, 608, 608, 608, 608, 608, 608, 428: 608, 608, 608, 608, 608, 608, 608, 608, 437: 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 601: 608}, + {2: 605, 605, 605, 6: 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 34: 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 3952, 3953, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 332: 605, 605, 335: 605, 605, 605, 340: 605, 605, 605, 344: 605, 353: 605, 356: 605, 362: 605, 605, 373: 605, 605, 380: 605, 404: 605, 406: 605, 417: 605, 605, 420: 605, 605, 605, 605, 605, 605, 605, 428: 605, 605, 605, 605, 605, 605, 605, 605, 437: 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 601: 605, 1031: 3951}, + // 2070 + {2: 606, 606, 606, 6: 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 34: 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 332: 606, 606, 335: 606, 606, 606, 340: 606, 606, 606, 344: 606, 353: 606, 356: 606, 362: 606, 606, 373: 606, 606, 380: 606, 404: 606, 406: 606, 417: 606, 606, 420: 606, 606, 606, 606, 606, 606, 606, 428: 606, 606, 606, 606, 606, 606, 606, 606, 437: 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 601: 606}, + {2: 611, 611, 611, 6: 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 34: 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 332: 611, 611, 335: 611, 611, 611, 340: 611, 611, 611, 344: 611, 353: 611, 356: 611, 362: 611, 611, 373: 611, 611, 380: 611, 404: 611, 406: 611, 417: 611, 611, 420: 611, 611, 611, 611, 611, 611, 611, 428: 611, 611, 611, 611, 611, 611, 611, 611, 437: 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 601: 3955, 1025: 3954}, + {2: 604, 604, 604, 6: 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 34: 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 332: 604, 604, 335: 604, 604, 604, 340: 604, 604, 604, 344: 604, 353: 604, 356: 604, 362: 604, 604, 373: 604, 604, 380: 604, 404: 604, 406: 604, 417: 604, 604, 420: 604, 604, 604, 604, 604, 604, 604, 428: 604, 604, 604, 604, 604, 604, 604, 604, 437: 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 601: 604}, + {2: 603, 603, 603, 6: 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 34: 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 332: 603, 603, 335: 603, 603, 603, 340: 603, 603, 603, 344: 603, 353: 603, 356: 603, 362: 603, 603, 373: 603, 603, 380: 603, 404: 603, 406: 603, 417: 603, 603, 420: 603, 603, 603, 603, 603, 603, 603, 428: 603, 603, 603, 603, 603, 603, 603, 603, 437: 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 601: 603}, + {2: 600, 600, 600, 6: 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 34: 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 332: 600, 600, 335: 600, 600, 600, 340: 600, 600, 600, 344: 600, 353: 600, 356: 600, 362: 600, 3957, 373: 600, 600, 380: 600, 404: 600, 406: 600, 417: 600, 600, 420: 600, 600, 600, 600, 600, 600, 600, 428: 600, 600, 600, 600, 600, 600, 600, 600, 437: 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 1033: 3956}, + // 2075 + {2: 610, 610, 610, 6: 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 34: 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 332: 610, 610, 335: 610, 610, 610, 340: 610, 610, 610, 344: 610, 353: 610, 356: 610, 362: 610, 610, 373: 610, 610, 380: 610, 404: 610, 406: 610, 417: 610, 610, 420: 610, 610, 610, 610, 610, 610, 610, 428: 610, 610, 610, 610, 610, 610, 610, 610, 437: 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610}, + {2: 654, 654, 654, 6: 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 34: 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 332: 654, 654, 335: 654, 654, 654, 340: 654, 654, 654, 344: 654, 353: 654, 356: 654, 362: 654, 373: 654, 654, 380: 654, 404: 654, 406: 654, 417: 654, 654, 420: 654, 654, 654, 654, 654, 654, 654, 428: 654, 654, 654, 654, 654, 654, 654, 654, 437: 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654}, + {2: 599, 599, 599, 6: 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 34: 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 332: 599, 599, 335: 599, 599, 599, 340: 599, 599, 599, 344: 599, 353: 599, 356: 599, 362: 599, 373: 599, 599, 380: 599, 404: 599, 406: 599, 417: 599, 599, 420: 599, 599, 599, 599, 599, 599, 599, 428: 599, 599, 599, 599, 599, 599, 599, 599, 437: 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599}, + {1439, 1439, 2208, 2093, 2005, 1439, 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 1439, 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 331: 1439, 3974, 334: 3973, 339: 1439, 343: 1439, 346: 1439, 1439, 1439, 1439, 2558, 1439, 354: 2556, 2557, 357: 2555, 2553, 360: 1439, 497: 3972, 2001, 2002, 2000, 581: 2554, 2552, 816: 3971, 3982}, + {1444, 1444, 5: 1444, 33: 1444, 331: 1444, 339: 1444, 343: 1444, 346: 1444, 1444, 1444, 1444, 351: 1444, 360: 1444}, + // 2080 + {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, 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, 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, 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, 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, 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, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 331: 1000, 1000, 1000, 1000, 338: 1000, 1000, 1000, 1000, 1000, 1000, 346: 1000, 1000, 1000, 1000, 1000, 1000, 354: 1000, 1000, 357: 1000, 1000, 360: 1000, 1000, 372: 1000, 1000, 3977, 394: 1000, 396: 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 405: 1000, 407: 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 491: 1000, 504: 1000, 1000}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 3967, 2001, 2002, 2000, 851: 2914, 2911, 2913, 2912}, + {1433, 1433, 5: 1433, 33: 1433, 331: 1433, 339: 1433, 343: 1433, 346: 1433, 1433, 1433, 1433, 351: 1433, 360: 1433}, + {598, 598, 5: 3965, 33: 598, 331: 598, 339: 598, 343: 598, 346: 598, 598, 598, 598, 351: 598, 360: 598}, + {777, 777, 33: 777, 331: 777, 339: 777, 343: 777, 346: 777, 777, 777, 777, 351: 777, 360: 777}, + // 2085 + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 2413, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 373: 3959, 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 3961, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 3960, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 3958, 815: 3966}, + {1432, 1432, 5: 1432, 33: 1432, 331: 1432, 339: 1432, 343: 1432, 346: 1432, 1432, 1432, 1432, 351: 1432, 360: 1432}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 2413, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 3968}, + {350: 2558, 354: 2556, 2557, 357: 2555, 2553, 371: 3969, 581: 2554, 2552}, + {1439, 1439, 2208, 2093, 2005, 1439, 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 1439, 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 331: 1439, 3974, 334: 3973, 339: 1439, 343: 1439, 346: 1439, 1439, 1439, 1439, 351: 1439, 360: 1439, 497: 3972, 2001, 2002, 2000, 816: 3971, 3970}, + // 2090 + {1440, 1440, 5: 1440, 33: 1440, 331: 1440, 339: 1440, 343: 1440, 346: 1440, 1440, 1440, 1440, 351: 1440, 360: 1440}, + {1438, 1438, 5: 1438, 33: 1438, 331: 1438, 339: 1438, 343: 1438, 346: 1438, 1438, 1438, 1438, 351: 1438, 360: 1438}, + {1437, 1437, 5: 1437, 33: 1437, 331: 1437, 339: 1437, 343: 1437, 346: 1437, 1437, 1437, 1437, 351: 1437, 360: 1437}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 332: 3976, 497: 3975, 2001, 2002, 2000}, + {1435, 1435, 5: 1435, 33: 1435, 331: 1435, 339: 1435, 343: 1435, 346: 1435, 1435, 1435, 1435, 351: 1435, 360: 1435}, + // 2095 + {1436, 1436, 5: 1436, 33: 1436, 331: 1436, 339: 1436, 343: 1436, 346: 1436, 1436, 1436, 1436, 351: 1436, 360: 1436}, + {1434, 1434, 5: 1434, 33: 1434, 331: 1434, 339: 1434, 343: 1434, 346: 1434, 1434, 1434, 1434, 351: 1434, 360: 1434}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 373: 3978, 497: 3979, 2001, 2002, 2000}, + {1443, 1443, 5: 1443, 33: 1443, 331: 1443, 339: 1443, 343: 1443, 346: 1443, 1443, 1443, 1443, 351: 1443, 360: 1443}, + {999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 331: 999, 999, 999, 999, 338: 999, 999, 999, 999, 999, 999, 346: 999, 999, 999, 999, 999, 999, 354: 999, 999, 357: 999, 999, 360: 999, 999, 372: 999, 999, 3980, 394: 999, 396: 999, 999, 999, 999, 999, 999, 999, 999, 405: 999, 407: 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 491: 999, 504: 999, 999}, + // 2100 + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 373: 3981, 497: 3160, 2001, 2002, 2000}, + {1442, 1442, 5: 1442, 33: 1442, 331: 1442, 339: 1442, 343: 1442, 346: 1442, 1442, 1442, 1442, 351: 1442, 360: 1442}, + {1441, 1441, 5: 1441, 33: 1441, 331: 1441, 339: 1441, 343: 1441, 346: 1441, 1441, 1441, 1441, 351: 1441, 360: 1441}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 3984, 2001, 2002, 2000}, + {781, 781}, + // 2105 + {785, 785, 346: 3986}, + {404: 2561, 560: 3988, 1062: 3987}, + {784, 784, 5: 3989}, + {783, 783, 5: 783}, + {404: 2561, 560: 3990}, + // 2110 + {782, 782, 5: 782}, + {360: 3992}, + {332: 3994, 404: 2561, 560: 3995, 1019: 3993}, + {788, 788}, + {787, 787}, + // 2115 + {786, 786}, + {2: 1071, 1071, 1071, 6: 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 34: 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 514: 3997, 834: 3998}, + {2: 1070, 1070, 1070, 6: 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 34: 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 2328, 2001, 2002, 2000, 584: 3999}, + {119: 4005, 330: 4000, 359: 4004, 428: 4006, 494: 1908, 593: 4002, 1909, 1910, 1911, 604: 1914, 1913, 4003, 767: 4001, 833: 4007}, + // 2120 + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 1746, 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 494: 1908, 497: 3161, 2001, 2002, 2000, 589: 3265, 593: 4028, 1909, 1910, 1911, 662: 4026, 781: 4027}, + {330: 4017, 682: 4016, 766: 4015}, + {1063, 1063, 331: 1063, 339: 584}, + {1062, 1062, 331: 1062}, + {1048, 1048, 2208, 2093, 2005, 1048, 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 331: 1048, 497: 3161, 2001, 2002, 2000, 589: 4009, 785: 4010, 942: 4008}, + // 2125 + {330: 1060}, + {330: 1059}, + {1043, 1043}, + {1061, 1061, 5: 4013, 331: 1061}, + {361: 4011}, + // 2130 + {1047, 1047, 5: 1047, 331: 1047}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 2413, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 4012}, + {1049, 1049, 5: 1049, 331: 1049, 350: 2558, 354: 2556, 2557, 357: 2555, 2553, 581: 2554, 2552}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 3161, 2001, 2002, 2000, 589: 4009, 785: 4014}, + {1046, 1046, 5: 1046, 331: 1046}, + // 2135 + {1065, 1065, 5: 4024, 331: 1065}, + {1058, 1058, 5: 1058, 331: 1058}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 1055, 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 2413, 335: 2444, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 2412, 664: 4020, 1064: 4019, 4018}, + {33: 4023}, + {5: 4021, 33: 1054}, + // 2140 + {5: 1052, 33: 1052}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 2413, 335: 2444, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 2412, 664: 4022}, + {5: 1053, 33: 1053}, + {1056, 1056, 5: 1056, 99: 1056, 331: 1056, 350: 1056}, + {330: 4017, 682: 4025}, + // 2145 + {1057, 1057, 5: 1057, 331: 1057}, + {5: 3267, 33: 1745}, + {33: 4030}, + {33: 4029}, + {1064, 1064, 331: 1064, 339: 583}, + // 2150 + {119: 4005, 330: 4033, 428: 4006, 494: 1908, 593: 4032, 1909, 1910, 1911, 604: 1914, 1913, 4034, 767: 4031}, + {330: 4017, 682: 4016, 766: 4037}, + {1068, 1068, 331: 1068, 339: 584}, + {494: 1908, 593: 4035, 1909, 1910, 1911}, + {1066, 1066, 331: 1066}, + // 2155 + {33: 4036}, + {1067, 1067, 331: 1067, 339: 583}, + {1069, 1069, 5: 4024, 331: 1069}, + {2: 1424, 1424, 1424, 6: 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 34: 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 493: 3309, 514: 1424, 713: 4039}, + {2: 1071, 1071, 1071, 6: 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 34: 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 514: 3997, 834: 4040}, + // 2160 + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 2328, 2001, 2002, 2000, 584: 4041}, + {119: 4005, 330: 4000, 359: 4004, 428: 4006, 494: 1908, 593: 4002, 1909, 1910, 1911, 604: 1914, 1913, 4003, 767: 4001, 833: 4042}, + {1045, 1045, 331: 4044, 999: 4043}, + {1072, 1072}, + {217: 4045}, + // 2165 + {419: 4046}, + {602: 4047}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 3161, 2001, 2002, 2000, 589: 3414, 703: 3415, 730: 4048}, + {1044, 1044, 5: 3417}, + {1517, 1517, 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 3161, 2001, 2002, 2000, 589: 4076}, + // 2170 + {1515, 1515}, + {21: 4074}, + {1355, 1355, 1355, 1355, 1355, 6: 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 34: 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 361: 4061, 374: 1355}, + {330: 3030, 353: 1902, 418: 1901, 494: 1908, 593: 4054, 1909, 1910, 1911, 602: 1980, 604: 1914, 1913, 4059, 1894, 648: 4055, 651: 4057, 654: 4058, 658: 4056, 709: 4060}, + {329, 329, 339: 584}, + // 2175 + {328, 328}, + {327, 327}, + {326, 326}, + {325, 325}, + {324, 324}, + // 2180 + {1509, 1509}, + {109: 4065, 277: 4064, 332: 4062, 957: 4063}, + {330: 3030, 347: 4070, 353: 1902, 418: 1901, 494: 1908, 593: 4054, 1909, 1910, 1911, 602: 1980, 604: 1914, 1913, 4059, 1894, 648: 4055, 651: 4057, 654: 4058, 658: 4056, 709: 4071}, + {330: 3030, 347: 4066, 353: 1902, 418: 1901, 494: 1908, 593: 4054, 1909, 1910, 1911, 602: 1980, 604: 1914, 1913, 4059, 1894, 648: 4055, 651: 4057, 654: 4058, 658: 4056, 709: 4067}, + {330: 1508, 347: 1508, 353: 1508, 418: 1508, 494: 1508, 602: 1508, 607: 1508}, + // 2185 + {330: 1507, 347: 1507, 353: 1507, 418: 1507, 494: 1507, 602: 1507, 607: 1507}, + {21: 4068}, + {1510, 1510}, + {362: 1990, 583: 4069}, + {1511, 1511}, + // 2190 + {21: 4072}, + {1512, 1512}, + {362: 1990, 583: 4073}, + {1513, 1513}, + {362: 1990, 583: 4075}, + // 2195 + {1514, 1514}, + {1516, 1516}, + {1522, 1522}, + {361: 4092}, + {340, 340, 339: 584}, + // 2200 + {537, 537, 2208, 2093, 2005, 537, 2041, 2006, 2116, 2220, 3776, 3772, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 3774, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 3773, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 3778, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 3779, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 3775, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 356: 2996, 404: 3785, 434: 3784, 496: 2994, 3782, 2001, 2002, 2000, 603: 3786, 659: 3783, 768: 3787, 913: 3780}, + {339, 339}, + {338, 338}, + {337, 337}, + {336, 336}, + // 2205 + {335, 335}, + {334, 334}, + {333, 333}, + {332, 332}, + {331, 331}, + // 2210 + {330, 330}, + {14: 2343}, + {332: 4093}, + {102: 1888, 105: 1891, 113: 1907, 115: 1889, 330: 3030, 353: 1902, 359: 4080, 418: 1901, 494: 1908, 593: 4079, 1909, 1910, 1911, 602: 1980, 604: 1914, 1913, 4085, 1894, 648: 4081, 651: 4083, 654: 4084, 658: 4082, 705: 4087, 708: 4088, 716: 4091, 4086, 723: 4089, 725: 4090, 907: 4094}, + {1521, 1521}, + // 2215 + {2: 1543, 1543, 1543, 6: 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 34: 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 335: 1543, 338: 1543, 356: 1543, 406: 1543, 496: 1543}, + {2: 1428, 1428, 1428, 6: 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 34: 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 406: 4127, 637: 4152}, + {2: 1428, 1428, 1428, 6: 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 34: 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 406: 4127, 637: 4131}, + {60: 3558, 592: 3557, 904: 4125}, + {60: 1538, 592: 1538}, + // 2220 + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 406: 4118, 497: 2328, 2001, 2002, 2000, 584: 3564, 634: 4117}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 332: 2361, 406: 4114, 417: 3226, 497: 2362, 2001, 2002, 2000, 586: 3225, 617: 3272, 701: 4113}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 3174, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 332: 3181, 406: 4110, 497: 2362, 2001, 2002, 2000, 586: 3183, 632: 3184, 3182, 655: 4109}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 2328, 2001, 2002, 2000, 584: 4108}, + {94: 4105}, + // 2225 + {347: 4106}, + {494: 1908, 593: 4107, 1909, 1910, 1911}, + {101, 101}, + {1531, 1531}, + {1533, 1533, 5: 3270}, + // 2230 + {432: 4111}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 3174, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 332: 3181, 497: 2362, 2001, 2002, 2000, 586: 3183, 632: 3184, 3182, 655: 4112}, + {1532, 1532, 5: 3270}, + {1535, 1535, 5: 3274}, + {432: 4115}, + // 2235 + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 332: 2361, 417: 3226, 497: 2362, 2001, 2002, 2000, 586: 3225, 617: 3272, 701: 4116}, + {1534, 1534, 5: 3274}, + {1530, 1530, 5: 3571, 516: 4123, 518: 4122, 722: 4124}, + {432: 4119}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 2328, 2001, 2002, 2000, 584: 3564, 634: 4120}, + // 2240 + {1530, 1530, 5: 3571, 516: 4123, 518: 4122, 722: 4121}, + {1536, 1536}, + {1529, 1529, 1529, 5: 1529, 345: 1529}, + {1528, 1528, 1528, 5: 1528, 345: 1528}, + {1537, 1537}, + // 2245 + {2: 1428, 1428, 1428, 6: 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 34: 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 406: 4127, 637: 4126}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 2328, 2001, 2002, 2000, 584: 3564, 634: 4129}, + {432: 4128}, + {2: 1427, 1427, 1427, 6: 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 34: 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 332: 1427, 417: 1427}, + {1530, 1530, 5: 3571, 516: 4123, 518: 4122, 722: 4130}, + // 2250 + {1540, 1540}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 4132, 2001, 2002, 2000}, + {331: 4133}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 2328, 2001, 2002, 2000, 584: 4134}, + {1652, 1652, 53: 4135, 348: 4136, 688: 4138, 697: 4137, 832: 4139}, + // 2255 + {150: 1525, 162: 1525, 164: 1525, 1525, 335: 1525, 361: 4143, 591: 4146}, + {2: 1525, 1525, 1525, 6: 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 34: 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 335: 1525, 361: 4143, 591: 4142}, + {1651, 1651, 53: 4135, 688: 4141}, + {1650, 1650, 348: 4136, 697: 4140}, + {1541, 1541}, + // 2260 + {1648, 1648}, + {1649, 1649}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 335: 4144, 497: 4145, 2001, 2002, 2000}, + {2: 1524, 1524, 1524, 6: 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 34: 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 332: 1524, 335: 1524, 344: 1524, 362: 1524, 380: 1524}, + {1813, 1813, 1813, 5: 1813, 53: 1813, 345: 1813}, + // 2265 + {1812, 1812, 1812, 5: 1812, 53: 1812, 345: 1812}, + {150: 4148, 162: 4151, 164: 4149, 4150, 335: 4147}, + {1818, 1818, 1818, 5: 1818, 345: 1818, 348: 1818}, + {1817, 1817, 1817, 5: 1817, 345: 1817, 348: 1817}, + {1816, 1816, 1816, 5: 1816, 345: 1816, 348: 1816}, + // 2270 + {1815, 1815, 1815, 5: 1815, 345: 1815, 348: 1815}, + {1814, 1814, 1814, 5: 1814, 345: 1814, 348: 1814}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 3301, 2001, 2002, 2000, 675: 4153}, + {1542, 1542}, + {2: 799, 799, 799, 6: 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 34: 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, 360: 799, 493: 799, 610: 3307, 3306, 3305, 699: 4155}, + // 2275 + {2: 790, 790, 790, 6: 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 34: 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 4157, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 360: 790, 493: 790, 1021: 4156}, + {2: 1424, 1424, 1424, 6: 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 34: 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 360: 1424, 493: 3309, 713: 4158}, + {2: 789, 789, 789, 6: 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 34: 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 789, 360: 789, 493: 789}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 360: 4159, 497: 2328, 2001, 2002, 2000, 584: 3564, 634: 4160}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 2328, 2001, 2002, 2000, 584: 4164, 634: 4165}, + // 2280 + {5: 3571, 360: 4161}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 3318, 420: 3314, 497: 2328, 2001, 2002, 2000, 584: 3317, 623: 3316, 626: 3315, 3320, 663: 3311, 687: 4162}, + {154, 154, 5: 3370, 352: 3419, 670: 3420, 4163}, + {1545, 1545}, + {698, 698, 2208, 2093, 2005, 792, 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 334: 3327, 346: 792, 349: 698, 351: 698, 698, 493: 698, 497: 3326, 2001, 2002, 2000, 511: 698, 698, 700: 3382, 900: 4169}, + // 2285 + {5: 3571, 346: 4166}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 3318, 420: 3314, 497: 2328, 2001, 2002, 2000, 584: 3317, 623: 3316, 626: 3315, 3320, 663: 3311, 687: 4167}, + {154, 154, 5: 3370, 352: 3419, 670: 3420, 4168}, + {1544, 1544}, + {680, 680, 349: 680, 351: 680, 680, 493: 3385, 511: 3386, 3384, 743: 3388, 3387, 830: 3389, 4170}, + // 2290 + {154, 154, 349: 154, 351: 154, 3419, 670: 3420, 4171}, + {1017, 1017, 349: 1017, 351: 2768, 640: 2769, 4172}, + {662, 662, 349: 3423, 839: 4173}, + {1546, 1546}, + {1547, 1547, 5: 2767}, + // 2295 + {495: 4844}, + {495: 1646}, + {495: 1645}, + {495: 1644}, + {2: 1426, 1426, 1426, 6: 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 34: 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 406: 3701, 638: 4828}, + // 2300 + {592: 4280}, + {53: 4246, 57: 1564, 87: 1564, 513: 1564, 1066: 4245}, + {353: 4244}, + {2: 1426, 1426, 1426, 6: 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 34: 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 332: 1426, 406: 3701, 417: 1426, 638: 4197}, + {2: 1426, 1426, 1426, 6: 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 34: 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 332: 1426, 406: 3701, 638: 4191}, + // 2305 + {94: 4186}, + {347: 4187}, + {494: 1908, 593: 4188, 1909, 1910, 1911}, + {346: 4189}, + {494: 1908, 593: 4190, 1909, 1910, 1911}, + // 2310 + {102, 102}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 3174, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 332: 3181, 497: 2362, 2001, 2002, 2000, 586: 3183, 632: 4193, 3182, 884: 4194, 1024: 4192}, + {149, 149, 5: 4195}, + {105, 105, 5: 105}, + {104, 104, 5: 104}, + // 2315 + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 3174, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 332: 3181, 497: 2362, 2001, 2002, 2000, 586: 3183, 632: 4193, 3182, 884: 4196}, + {103, 103, 5: 103}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 332: 2361, 417: 3226, 497: 2362, 2001, 2002, 2000, 586: 3225, 617: 3227, 702: 3228, 727: 4198}, + {135, 135, 5: 3230, 10: 135, 34: 135, 343: 135, 510: 4201, 877: 4200, 4199}, + {143, 143, 10: 143, 34: 143, 343: 4216, 787: 4215}, + // 2320 + {134, 134, 10: 134, 34: 134, 343: 134}, + {144: 4209, 167: 4207, 189: 4208, 244: 4202, 284: 4204, 879: 4205, 4206, 1041: 4203}, + {133, 133, 10: 133, 34: 133, 343: 133}, + {132, 132, 10: 132, 34: 132, 343: 132}, + {131, 131, 10: 131, 34: 131, 343: 131}, + // 2325 + {130, 130, 10: 130, 34: 130, 343: 130}, + {129, 129, 10: 129, 34: 129, 343: 129, 350: 4213}, + {332: 4212}, + {332: 4211}, + {332: 4210}, + // 2330 + {125, 125, 10: 125, 34: 125, 343: 125, 350: 125}, + {126, 126, 10: 126, 34: 126, 343: 126, 350: 126}, + {127, 127, 10: 127, 34: 127, 343: 127, 350: 127}, + {144: 4209, 167: 4207, 189: 4208, 879: 4214, 4206}, + {128, 128, 10: 128, 34: 128, 343: 128}, + // 2335 + {124, 124, 10: 4233, 34: 4231, 752: 4232, 4230, 868: 4229, 4228}, + {83: 4221, 4219, 4220, 4222, 786: 4218, 944: 4217}, + {142, 142, 10: 142, 34: 142, 83: 4221, 4219, 4220, 4222, 786: 4227}, + {141, 141, 10: 141, 34: 141, 83: 141, 141, 141, 141}, + {362: 1990, 583: 4226}, + // 2340 + {362: 1990, 583: 4225}, + {362: 1990, 583: 4224}, + {362: 1990, 583: 4223}, + {136, 136, 10: 136, 34: 136, 83: 136, 136, 136, 136}, + {137, 137, 10: 137, 34: 137, 83: 137, 137, 137, 137}, + // 2345 + {138, 138, 10: 138, 34: 138, 83: 138, 138, 138, 138}, + {139, 139, 10: 139, 34: 139, 83: 139, 139, 139, 139}, + {140, 140, 10: 140, 34: 140, 83: 140, 140, 140, 140}, + {150, 150}, + {123, 123, 10: 4233, 34: 4231, 752: 4232, 4243}, + // 2350 + {122, 122, 10: 122, 34: 122}, + {348: 4242, 764: 4241}, + {118, 118, 10: 118, 34: 118, 130: 4237, 335: 4238, 423: 4236}, + {222: 4234}, + {113, 113, 10: 113, 34: 113, 130: 113, 335: 113, 423: 113, 935: 4235}, + // 2355 + {114, 114, 10: 114, 34: 114, 130: 114, 335: 114, 423: 114}, + {362: 1990, 583: 4239}, + {116, 116, 10: 116, 34: 116}, + {115, 115, 10: 115, 34: 115}, + {63: 4240}, + // 2360 + {117, 117, 10: 117, 34: 117}, + {120, 120, 10: 120, 34: 120}, + {119, 119, 10: 119, 34: 119}, + {121, 121, 10: 121, 34: 121}, + {53: 1565, 57: 1565, 87: 1565, 513: 1565}, + // 2365 + {57: 1560, 87: 4252, 513: 1560, 1068: 4251}, + {361: 4247}, + {240: 4249, 272: 4250, 281: 4248}, + {57: 1563, 87: 1563, 513: 1563}, + {57: 1562, 87: 1562, 513: 1562}, + // 2370 + {57: 1561, 87: 1561, 513: 1561}, + {57: 1558, 513: 4256, 1071: 4255}, + {361: 4253}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 332: 2361, 417: 3226, 497: 2362, 2001, 2002, 2000, 586: 3225, 617: 4254}, + {57: 1559, 513: 1559}, + // 2375 + {57: 4260}, + {260: 4257}, + {87: 4258, 233: 4259}, + {57: 1557}, + {57: 1556}, + // 2380 + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 2328, 2001, 2002, 2000, 584: 4262, 1070: 4261}, + {330: 4264, 334: 1554, 1069: 4263}, + {330: 1555, 334: 1555}, + {334: 4270}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 4266, 2001, 2002, 2000, 938: 4265}, + // 2385 + {5: 4268, 33: 4267}, + {5: 1552, 33: 1552}, + {334: 1553}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 4269, 2001, 2002, 2000}, + {5: 1551, 33: 1551}, + // 2390 + {494: 1908, 593: 4271, 1909, 1910, 1911}, + {1550, 1550, 343: 4273, 1067: 4272}, + {1567, 1567}, + {90: 4275, 208: 4274}, + {436: 4278}, + // 2395 + {436: 4276}, + {718: 4277}, + {1548, 1548}, + {718: 4279}, + {1549, 1549}, + // 2400 + {2: 1426, 1426, 1426, 6: 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 34: 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 406: 3701, 638: 4281}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 2328, 2001, 2002, 2000, 584: 4282}, + {316, 316, 3: 316, 316, 10: 316, 316, 316, 316, 316, 316, 316, 316, 316, 316, 316, 316, 316, 316, 316, 316, 316, 316, 316, 316, 316, 316, 316, 330: 4286, 334: 316, 316, 338: 316, 316, 345: 316, 353: 316, 356: 316, 372: 4285, 493: 316, 316, 316, 316, 501: 316, 316, 316, 985: 4284, 1053: 4283}, + {285, 285, 3: 4606, 4617, 10: 4622, 1630, 4624, 4613, 4609, 4636, 4607, 4608, 4611, 4612, 4614, 4619, 4620, 4618, 4623, 4625, 4639, 4634, 4628, 4627, 4629, 4633, 4621, 330: 285, 334: 285, 4605, 338: 1630, 4635, 345: 285, 353: 285, 356: 1630, 493: 285, 285, 4610, 1630, 501: 4632, 4631, 4630, 628: 4616, 653: 4615, 681: 4626, 686: 4638, 761: 4637, 946: 4604}, + {1631, 1631}, + // 2405 + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 2328, 2001, 2002, 2000, 584: 4603}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 372: 4289, 419: 1796, 427: 1796, 436: 1796, 489: 1796, 495: 1796, 497: 3161, 2001, 2002, 2000, 522: 1796, 1796, 589: 4288, 661: 4291, 733: 4292, 4287, 4290, 901: 4293, 1052: 4294}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 419: 1795, 427: 1795, 436: 1795, 489: 1795, 495: 1795, 497: 4602, 2001, 2002, 2000, 522: 1795, 1795, 899: 4601}, + {8: 4412, 65: 4471, 106: 4468, 4467, 109: 4450, 116: 4470, 191: 4469, 203: 4439, 4433, 4432, 219: 4448, 242: 4455, 4454, 273: 4464, 356: 4453, 359: 4449, 380: 4444, 496: 4452, 526: 4457, 4456, 529: 4434, 4438, 4436, 4430, 4424, 535: 4437, 538: 4445, 540: 4431, 4460, 4425, 4426, 4427, 4428, 4429, 4451, 4462, 4466, 4461, 4423, 4465, 4435, 4458, 4422, 4459, 4421, 4463, 912: 4442, 929: 4420, 4446, 4417, 933: 4440, 949: 4415, 962: 4418, 4419, 979: 4416, 995: 4441, 4413, 4443, 1047: 4414, 1057: 4447, 1060: 4411}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 2328, 2001, 2002, 2000, 584: 4409}, + // 2410 + {419: 3405, 427: 4298, 436: 4303, 489: 4301, 495: 3406, 522: 4302, 4299, 652: 4300, 945: 4304}, + {5: 320, 33: 320}, + {5: 319, 33: 319}, + {5: 318, 33: 318}, + {5: 4295, 33: 4296}, + // 2415 + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 419: 1796, 427: 1796, 436: 1796, 489: 1796, 495: 1796, 497: 3161, 2001, 2002, 2000, 522: 1796, 1796, 589: 4288, 661: 4291, 733: 4292, 4287, 4290, 901: 4297}, + {315, 315, 3: 315, 315, 10: 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 330: 315, 334: 315, 315, 338: 315, 315, 345: 315, 353: 315, 356: 315, 493: 315, 315, 315, 315, 501: 315, 315, 315}, + {5: 317, 33: 317}, + {419: 4403}, + {2: 1809, 1809, 1809, 6: 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 34: 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 419: 3405, 495: 3406, 652: 4358, 835: 4397}, + // 2420 + {2: 1426, 1426, 1426, 6: 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 34: 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 346: 1426, 406: 3701, 638: 4391}, + {2: 1809, 1809, 1809, 6: 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 34: 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 346: 1809, 419: 3405, 495: 3406, 652: 4358, 835: 4359}, + {419: 4313}, + {330: 4305}, + {321, 321, 321, 5: 321, 33: 321, 345: 321}, + // 2425 + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 2413, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 4306}, + {33: 4307, 350: 2558, 354: 2556, 2557, 357: 2555, 2553, 581: 2554, 2552}, + {1731, 1731, 1731, 5: 1731, 33: 1731, 97: 4308, 333: 4309, 345: 1731, 738: 4310, 810: 4311}, + {1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 33: 1733, 331: 1733, 333: 1733, 1733, 1733, 338: 1733, 344: 1733, 1733, 419: 1733, 427: 1733, 436: 1733, 489: 1733, 1733, 492: 1733}, + {97: 4312}, + // 2430 + {1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 33: 1730, 331: 1730, 333: 1730, 1730, 1730, 338: 1730, 344: 1730, 1730, 419: 1730, 427: 1730, 436: 1730, 489: 1730, 1730, 492: 1730}, + {1695, 1695, 1695, 5: 1695, 33: 1695, 345: 1695}, + {1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 33: 1732, 331: 1732, 333: 1732, 1732, 1732, 338: 1732, 344: 1732, 1732, 419: 1732, 427: 1732, 436: 1732, 489: 1732, 1732, 492: 1732}, + {2: 1426, 1426, 1426, 6: 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 34: 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 406: 3701, 638: 4314}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 1422, 497: 4316, 2001, 2002, 2000, 694: 4315}, + // 2435 + {330: 4317}, + {330: 1421}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 3161, 2001, 2002, 2000, 589: 4319, 649: 4320, 666: 4318}, + {5: 4324, 33: 4323}, + {5: 185, 33: 185, 330: 2985, 378: 185, 185, 600: 2986, 620: 4321}, + // 2440 + {5: 1654, 33: 1654}, + {5: 1020, 33: 1020, 378: 2594, 2593, 750: 4322}, + {5: 1655, 33: 1655}, + {490: 4327, 721: 4326}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 3161, 2001, 2002, 2000, 589: 4319, 649: 4325}, + // 2445 + {5: 1653, 33: 1653}, + {1696, 1696, 1696, 5: 1696, 33: 1696, 345: 1696}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 2328, 2001, 2002, 2000, 584: 4328}, + {1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 33: 1688, 330: 4330, 1688, 333: 1688, 1688, 1688, 338: 1688, 344: 1688, 1688, 419: 1688, 427: 1688, 436: 1688, 489: 1688, 1688, 492: 1688, 534: 1688, 974: 4329}, + {1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 33: 1691, 331: 1691, 333: 1691, 1691, 1691, 338: 1691, 344: 1691, 1691, 419: 1691, 427: 1691, 436: 1691, 489: 1691, 1691, 492: 1691, 534: 4333, 992: 4334, 4335}, + // 2450 + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 3161, 2001, 2002, 2000, 589: 4319, 649: 4320, 666: 4331}, + {5: 4324, 33: 4332}, + {1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 33: 1687, 331: 1687, 333: 1687, 1687, 1687, 338: 1687, 344: 1687, 1687, 419: 1687, 427: 1687, 436: 1687, 489: 1687, 1687, 492: 1687, 534: 1687}, + {159: 4355, 249: 4356, 263: 4357}, + {1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 33: 1690, 331: 1690, 333: 1690, 1690, 1690, 338: 1690, 344: 1690, 1690, 419: 1690, 427: 1690, 436: 1690, 489: 1690, 1690, 492: 1690}, + // 2455 + {1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 33: 1684, 331: 4337, 333: 1684, 1684, 1684, 338: 1684, 344: 1684, 1684, 419: 1684, 427: 1684, 436: 1684, 489: 1684, 1684, 492: 1684, 855: 4338, 4339, 998: 4336}, + {1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 33: 1689, 331: 1689, 333: 1689, 1689, 1689, 338: 1689, 344: 1689, 1689, 419: 1689, 427: 1689, 436: 1689, 489: 1689, 1689, 492: 1689}, + {602: 4353, 607: 4342}, + {1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 33: 1683, 331: 4351, 333: 1683, 1683, 1683, 338: 1683, 344: 1683, 1683, 419: 1683, 427: 1683, 436: 1683, 489: 1683, 1683, 492: 1683, 856: 4352}, + {1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 33: 1682, 331: 4340, 333: 1682, 1682, 1682, 338: 1682, 344: 1682, 1682, 419: 1682, 427: 1682, 436: 1682, 489: 1682, 1682, 492: 1682, 855: 4341}, + // 2460 + {607: 4342}, + {1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 33: 1680, 331: 1680, 333: 1680, 1680, 1680, 338: 1680, 344: 1680, 1680, 419: 1680, 427: 1680, 436: 1680, 489: 1680, 1680, 492: 1680}, + {171: 4347, 359: 4346, 516: 4345, 518: 4344, 874: 4343}, + {1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 33: 1686, 331: 1686, 333: 1686, 1686, 1686, 338: 1686, 344: 1686, 1686, 419: 1686, 427: 1686, 436: 1686, 489: 1686, 1686, 492: 1686}, + {1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 33: 1679, 331: 1679, 333: 1679, 1679, 1679, 338: 1679, 344: 1679, 1679, 419: 1679, 427: 1679, 436: 1679, 489: 1679, 1679, 492: 1679}, + // 2465 + {1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 33: 1678, 331: 1678, 333: 1678, 1678, 1678, 338: 1678, 344: 1678, 1678, 419: 1678, 427: 1678, 436: 1678, 489: 1678, 1678, 492: 1678}, + {335: 4350, 344: 4349}, + {201: 4348}, + {1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 33: 1676, 331: 1676, 333: 1676, 1676, 1676, 338: 1676, 344: 1676, 1676, 419: 1676, 427: 1676, 436: 1676, 489: 1676, 1676, 492: 1676}, + {1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 33: 1677, 331: 1677, 333: 1677, 1677, 1677, 338: 1677, 344: 1677, 1677, 419: 1677, 427: 1677, 436: 1677, 489: 1677, 1677, 492: 1677}, + // 2470 + {1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 33: 1675, 331: 1675, 333: 1675, 1675, 1675, 338: 1675, 344: 1675, 1675, 419: 1675, 427: 1675, 436: 1675, 489: 1675, 1675, 492: 1675}, + {602: 4353}, + {1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 33: 1681, 331: 1681, 333: 1681, 1681, 1681, 338: 1681, 344: 1681, 1681, 419: 1681, 427: 1681, 436: 1681, 489: 1681, 1681, 492: 1681}, + {171: 4347, 359: 4346, 516: 4345, 518: 4344, 874: 4354}, + {1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 33: 1685, 331: 1685, 333: 1685, 1685, 1685, 338: 1685, 344: 1685, 1685, 419: 1685, 427: 1685, 436: 1685, 489: 1685, 1685, 492: 1685}, + // 2475 + {1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 33: 1694, 331: 1694, 333: 1694, 1694, 1694, 338: 1694, 344: 1694, 1694, 419: 1694, 427: 1694, 436: 1694, 489: 1694, 1694, 492: 1694}, + {1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 33: 1693, 331: 1693, 333: 1693, 1693, 1693, 338: 1693, 344: 1693, 1693, 419: 1693, 427: 1693, 436: 1693, 489: 1693, 1693, 492: 1693}, + {1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 33: 1692, 331: 1692, 333: 1692, 1692, 1692, 338: 1692, 344: 1692, 1692, 419: 1692, 427: 1692, 436: 1692, 489: 1692, 1692, 492: 1692}, + {2: 1808, 1808, 1808, 6: 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 34: 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 346: 1808}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 1422, 346: 1422, 497: 4361, 2001, 2002, 2000, 694: 4362, 745: 4360}, + // 2480 + {330: 4370}, + {54: 4368, 330: 1421, 346: 1421}, + {330: 1413, 346: 4363}, + {88: 4366, 104: 4365, 114: 4367, 714: 4364}, + {330: 1412}, + // 2485 + {1406, 1406, 1406, 1406, 5: 1406, 12: 1406, 33: 1406, 53: 1406, 1406, 1406, 1406, 330: 1406, 1406, 343: 1406, 345: 1406, 1406, 348: 1406}, + {1405, 1405, 1405, 1405, 5: 1405, 12: 1405, 33: 1405, 53: 1405, 1405, 1405, 1405, 330: 1405, 1405, 343: 1405, 345: 1405, 1405, 348: 1405}, + {1404, 1404, 1404, 1404, 5: 1404, 12: 1404, 33: 1404, 53: 1404, 1404, 1404, 1404, 330: 1404, 1404, 343: 1404, 345: 1404, 1404, 348: 1404}, + {88: 4366, 104: 4365, 114: 4367, 714: 4369}, + {330: 1411}, + // 2490 + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 3161, 2001, 2002, 2000, 589: 4319, 649: 4320, 666: 4371}, + {5: 4324, 33: 4372}, + {1420, 1420, 1420, 1420, 5: 1420, 12: 1420, 33: 1420, 54: 1420, 1420, 1420, 343: 1420, 345: 1420, 1420, 696: 4373}, + {1697, 1697, 1697, 4378, 5: 1697, 12: 4375, 33: 1697, 54: 4381, 4383, 4382, 343: 4377, 345: 1697, 4380, 678: 4379, 4376, 695: 4374}, + {1419, 1419, 1419, 1419, 5: 1419, 12: 1419, 33: 1419, 53: 1419, 1419, 1419, 1419, 343: 1419, 345: 1419, 1419, 348: 1419}, + // 2495 + {361: 4143, 1525, 591: 4389}, + {1417, 1417, 1417, 1417, 5: 1417, 12: 1417, 33: 1417, 53: 1417, 1417, 1417, 1417, 343: 1417, 345: 1417, 1417, 348: 1417}, + {1012: 4387}, + {332: 4386}, + {1414, 1414, 1414, 1414, 5: 1414, 12: 1414, 33: 1414, 53: 1414, 1414, 1414, 1414, 343: 1414, 345: 1414, 1414, 348: 1414}, + // 2500 + {88: 4366, 104: 4365, 114: 4367, 714: 4385}, + {88: 4366, 104: 4365, 114: 4367, 714: 4384}, + {1403, 1403, 1403, 1403, 5: 1403, 12: 1403, 33: 1403, 53: 1403, 1403, 1403, 1403, 343: 1403, 345: 1403, 1403, 348: 1403}, + {1402, 1402, 1402, 1402, 5: 1402, 12: 1402, 33: 1402, 53: 1402, 1402, 1402, 1402, 343: 1402, 345: 1402, 1402, 348: 1402}, + {1407, 1407, 1407, 1407, 5: 1407, 12: 1407, 33: 1407, 53: 1407, 1407, 1407, 1407, 331: 1407, 343: 1407, 345: 1407, 1407, 348: 1407}, + // 2505 + {1408, 1408, 1408, 1408, 5: 1408, 12: 1408, 33: 1408, 53: 1408, 1408, 1408, 1408, 331: 1408, 343: 1408, 345: 1408, 1408, 348: 1408}, + {1415, 1415, 1415, 1415, 5: 1415, 12: 1415, 33: 1415, 53: 1415, 1415, 1415, 1415, 343: 1415, 345: 1415, 1415, 348: 1415}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 4388, 2001, 2002, 2000}, + {1416, 1416, 1416, 1416, 5: 1416, 12: 1416, 33: 1416, 53: 1416, 1416, 1416, 1416, 343: 1416, 345: 1416, 1416, 348: 1416}, + {362: 1990, 583: 2974, 599: 4390}, + // 2510 + {1418, 1418, 1418, 1418, 5: 1418, 12: 1418, 33: 1418, 53: 1418, 1418, 1418, 1418, 343: 1418, 345: 1418, 1418, 348: 1418}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 1422, 346: 1422, 497: 4361, 2001, 2002, 2000, 694: 4362, 745: 4392}, + {330: 4393}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 3161, 2001, 2002, 2000, 589: 4319, 649: 4320, 666: 4394}, + {5: 4324, 33: 4395}, + // 2515 + {1420, 1420, 1420, 1420, 5: 1420, 12: 1420, 33: 1420, 54: 1420, 1420, 1420, 343: 1420, 345: 1420, 1420, 696: 4396}, + {1698, 1698, 1698, 4378, 5: 1698, 12: 4375, 33: 1698, 54: 4381, 4383, 4382, 343: 4377, 345: 1698, 4380, 678: 4379, 4376, 695: 4374}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 1422, 497: 4316, 2001, 2002, 2000, 694: 4398}, + {330: 4399}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 3161, 2001, 2002, 2000, 589: 4319, 649: 4320, 666: 4400}, + // 2520 + {5: 4324, 33: 4401}, + {1420, 1420, 1420, 1420, 5: 1420, 12: 1420, 33: 1420, 54: 1420, 1420, 1420, 343: 1420, 345: 1420, 1420, 696: 4402}, + {1699, 1699, 1699, 4378, 5: 1699, 12: 4375, 33: 1699, 54: 4381, 4383, 4382, 343: 4377, 345: 1699, 4380, 678: 4379, 4376, 695: 4374}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 1422, 346: 1422, 497: 4361, 2001, 2002, 2000, 694: 4362, 745: 4404}, + {330: 4405}, + // 2525 + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 3161, 2001, 2002, 2000, 589: 4319, 649: 4320, 666: 4406}, + {5: 4324, 33: 4407}, + {1420, 1420, 1420, 1420, 5: 1420, 12: 1420, 33: 1420, 54: 1420, 1420, 1420, 343: 1420, 345: 1420, 1420, 696: 4408}, + {1700, 1700, 1700, 4378, 5: 1700, 12: 4375, 33: 1700, 54: 4381, 4383, 4382, 343: 4377, 345: 1700, 4380, 678: 4379, 4376, 695: 4374}, + {33: 4410}, + // 2530 + {1568, 1568}, + {1702, 1702, 1702, 4543, 4537, 1702, 1702, 1702, 4541, 4548, 33: 1702, 331: 4542, 333: 4535, 1709, 4540, 338: 4547, 344: 4536, 1702, 419: 1735, 427: 4534, 436: 4544, 489: 4539, 4327, 492: 4549, 721: 4546, 731: 4550, 740: 4545, 755: 4538, 783: 4551, 4600}, + {1702, 1702, 1702, 4543, 4537, 1702, 1702, 1702, 4541, 4548, 33: 1702, 331: 4542, 333: 4535, 1709, 4540, 338: 4547, 344: 4536, 1702, 419: 1735, 427: 4534, 436: 4544, 489: 4539, 4327, 492: 4549, 721: 4546, 731: 4550, 740: 4545, 755: 4538, 783: 4551, 4533}, + {263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 33: 263, 331: 263, 333: 263, 263, 263, 338: 263, 344: 263, 263, 419: 263, 427: 263, 436: 263, 489: 263, 263, 492: 263}, + {262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 33: 262, 331: 262, 333: 262, 262, 262, 338: 262, 344: 262, 262, 419: 262, 427: 262, 436: 262, 489: 262, 262, 492: 262}, + // 2535 + {261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 33: 261, 331: 261, 333: 261, 261, 261, 338: 261, 344: 261, 261, 419: 261, 427: 261, 436: 261, 489: 261, 261, 492: 261}, + {185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 33: 185, 35: 185, 330: 2985, 185, 333: 185, 185, 185, 338: 185, 344: 185, 185, 419: 185, 427: 185, 436: 185, 489: 185, 185, 492: 185, 587: 185, 185, 600: 2986, 620: 4531}, + {180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 33: 180, 35: 180, 331: 180, 333: 180, 180, 180, 338: 180, 344: 180, 180, 419: 180, 427: 180, 436: 180, 489: 180, 180, 492: 180, 587: 180, 180, 693: 4530}, + {178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 33: 178, 35: 178, 330: 2971, 178, 333: 178, 178, 178, 338: 178, 344: 178, 178, 419: 178, 427: 178, 436: 178, 489: 178, 178, 492: 178, 587: 178, 178, 600: 2972, 711: 4528, 720: 2973}, + {178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 33: 178, 35: 178, 330: 2971, 178, 333: 178, 178, 178, 338: 178, 344: 178, 178, 419: 178, 427: 178, 436: 178, 489: 178, 178, 492: 178, 587: 178, 178, 600: 2972, 711: 4526, 720: 2973}, + // 2540 + {185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 33: 185, 330: 2985, 185, 333: 185, 185, 185, 338: 185, 344: 185, 185, 419: 185, 427: 185, 436: 185, 489: 185, 185, 492: 185, 600: 2986, 620: 4525}, + {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 33: 255, 35: 255, 330: 255, 255, 333: 255, 255, 255, 338: 255, 344: 255, 255, 419: 255, 427: 255, 436: 255, 489: 255, 255, 492: 255, 587: 255, 255}, + {254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 33: 254, 35: 254, 330: 254, 254, 333: 254, 254, 254, 338: 254, 344: 254, 254, 419: 254, 427: 254, 436: 254, 489: 254, 254, 492: 254, 587: 254, 254}, + {253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 33: 253, 35: 253, 330: 253, 253, 333: 253, 253, 253, 338: 253, 344: 253, 253, 419: 253, 427: 253, 436: 253, 489: 253, 253, 492: 253, 587: 253, 253}, + {252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 33: 252, 35: 252, 330: 252, 252, 333: 252, 252, 252, 338: 252, 344: 252, 252, 419: 252, 427: 252, 436: 252, 489: 252, 252, 492: 252, 587: 252, 252}, + // 2545 + {251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 33: 251, 35: 251, 330: 251, 251, 333: 251, 251, 251, 338: 251, 344: 251, 251, 419: 251, 427: 251, 436: 251, 489: 251, 251, 492: 251, 587: 251, 251}, + {250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 33: 250, 35: 250, 330: 250, 250, 333: 250, 250, 250, 338: 250, 344: 250, 250, 419: 250, 427: 250, 436: 250, 489: 250, 250, 492: 250, 587: 250, 250}, + {249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 33: 249, 35: 249, 330: 249, 249, 333: 249, 249, 249, 338: 249, 344: 249, 249, 419: 249, 427: 249, 436: 249, 489: 249, 249, 492: 249, 587: 249, 249}, + {248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 33: 248, 35: 248, 330: 248, 248, 333: 248, 248, 248, 338: 248, 344: 248, 248, 419: 248, 427: 248, 436: 248, 489: 248, 248, 492: 248, 587: 248, 248}, + {247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 33: 247, 35: 247, 330: 247, 247, 333: 247, 247, 247, 338: 247, 344: 247, 247, 419: 247, 427: 247, 436: 247, 489: 247, 247, 492: 247, 587: 247, 247}, + // 2550 + {246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 33: 246, 35: 246, 330: 246, 246, 333: 246, 246, 246, 338: 246, 344: 246, 246, 419: 246, 427: 246, 436: 246, 489: 246, 246, 492: 246, 587: 246, 246}, + {245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 33: 245, 35: 245, 330: 245, 245, 333: 245, 245, 245, 338: 245, 344: 245, 245, 419: 245, 427: 245, 436: 245, 489: 245, 245, 492: 245, 587: 245, 245}, + {244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 33: 244, 35: 244, 331: 244, 333: 244, 244, 244, 338: 244, 344: 244, 244, 419: 244, 427: 244, 436: 244, 489: 244, 244, 492: 244, 587: 244, 244}, + {243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 33: 243, 35: 243, 331: 243, 333: 243, 243, 243, 338: 243, 344: 243, 243, 419: 243, 427: 243, 436: 243, 489: 243, 243, 492: 243, 587: 243, 243}, + {239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 33: 239, 35: 239, 330: 239, 239, 333: 239, 239, 239, 338: 239, 344: 239, 239, 419: 239, 427: 239, 436: 239, 489: 239, 239, 492: 239, 587: 239, 239}, + // 2555 + {238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 33: 238, 35: 238, 330: 238, 238, 333: 238, 238, 238, 338: 238, 344: 238, 238, 419: 238, 427: 238, 436: 238, 489: 238, 238, 492: 238, 587: 238, 238}, + {237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 33: 237, 35: 237, 330: 237, 237, 333: 237, 237, 237, 338: 237, 344: 237, 237, 419: 237, 427: 237, 436: 237, 489: 237, 237, 492: 237, 587: 237, 237}, + {236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 33: 236, 35: 236, 330: 236, 236, 333: 236, 236, 236, 338: 236, 344: 236, 236, 419: 236, 427: 236, 436: 236, 489: 236, 236, 492: 236, 587: 236, 236}, + {235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 33: 235, 35: 235, 330: 235, 235, 333: 235, 235, 235, 338: 235, 344: 235, 235, 419: 235, 427: 235, 436: 235, 489: 235, 235, 492: 235, 587: 235, 235, 1018: 4524}, + {233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 33: 233, 330: 233, 233, 333: 233, 233, 233, 338: 233, 344: 233, 233, 419: 233, 427: 233, 436: 233, 489: 233, 233, 492: 233}, + // 2560 + {172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 11: 2995, 33: 172, 330: 2985, 172, 333: 172, 172, 172, 338: 172, 344: 172, 172, 356: 2996, 380: 2992, 419: 172, 427: 172, 436: 172, 489: 172, 172, 492: 172, 496: 2994, 600: 4521, 603: 2993, 639: 4522}, + {172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 11: 2995, 33: 172, 330: 2985, 172, 333: 172, 172, 172, 338: 172, 344: 172, 172, 356: 2996, 380: 2992, 419: 172, 427: 172, 436: 172, 489: 172, 172, 492: 172, 496: 2994, 600: 4518, 603: 2993, 639: 4519}, + {330: 2985, 600: 4516}, + {330: 2985, 600: 4514}, + {185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 33: 185, 330: 2985, 185, 333: 185, 185, 185, 338: 185, 344: 185, 185, 419: 185, 427: 185, 436: 185, 489: 185, 185, 492: 185, 600: 2986, 620: 4513}, + // 2565 + {330: 2985, 600: 4512}, + {224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 33: 224, 331: 224, 333: 224, 224, 224, 338: 224, 344: 224, 224, 419: 224, 427: 224, 436: 224, 489: 224, 224, 492: 224}, + {172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 11: 2995, 33: 172, 331: 172, 333: 172, 172, 172, 338: 172, 344: 172, 172, 356: 2996, 380: 2992, 419: 172, 427: 172, 436: 172, 489: 172, 172, 492: 172, 496: 2994, 603: 2993, 639: 4511}, + {330: 4507}, + {330: 4500}, + // 2570 + {220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 33: 220, 331: 220, 333: 220, 220, 220, 338: 220, 344: 220, 220, 419: 220, 427: 220, 436: 220, 489: 220, 220, 492: 220}, + {172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 11: 2995, 33: 172, 331: 172, 333: 172, 172, 172, 338: 172, 344: 172, 172, 356: 4497, 380: 2992, 419: 172, 427: 172, 436: 172, 489: 172, 172, 492: 172, 496: 4496, 526: 4457, 4456, 538: 4498, 603: 2993, 639: 4495, 912: 4494}, + {217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 11: 217, 33: 217, 330: 217, 217, 333: 217, 217, 217, 338: 217, 344: 217, 217, 356: 217, 380: 217, 419: 217, 427: 217, 436: 217, 489: 217, 217, 492: 217, 496: 217, 669: 4493}, + {216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 11: 216, 33: 216, 330: 216, 216, 333: 216, 216, 216, 338: 216, 344: 216, 216, 356: 216, 380: 216, 419: 216, 427: 216, 436: 216, 489: 216, 216, 492: 216, 496: 216, 669: 4492}, + {215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 11: 215, 33: 215, 330: 215, 215, 333: 215, 215, 215, 338: 215, 344: 215, 215, 356: 215, 380: 215, 419: 215, 427: 215, 436: 215, 489: 215, 215, 492: 215, 496: 215, 526: 4490, 4489, 669: 4491}, + // 2575 + {356: 4484, 496: 4483, 526: 4486, 4485}, + {210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 11: 210, 33: 210, 330: 210, 210, 333: 210, 210, 210, 338: 210, 344: 210, 210, 356: 210, 380: 210, 419: 210, 427: 210, 436: 210, 489: 210, 210, 492: 210, 496: 210}, + {209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 11: 209, 33: 209, 330: 209, 209, 333: 209, 209, 209, 338: 209, 344: 209, 209, 356: 209, 380: 209, 419: 209, 427: 209, 436: 209, 489: 209, 209, 492: 209, 496: 209}, + {330: 206}, + {200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 33: 200, 331: 200, 333: 200, 200, 200, 338: 200, 344: 200, 200, 419: 200, 427: 200, 436: 200, 489: 200, 200, 492: 200}, + // 2580 + {185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 33: 185, 330: 2985, 185, 333: 185, 185, 185, 338: 185, 344: 185, 185, 419: 185, 427: 185, 436: 185, 489: 185, 185, 492: 185, 600: 2986, 620: 4482}, + {198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 33: 198, 331: 198, 333: 198, 198, 198, 338: 198, 344: 198, 198, 419: 198, 427: 198, 436: 198, 489: 198, 198, 492: 198}, + {197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 33: 197, 331: 197, 333: 197, 197, 197, 338: 197, 344: 197, 197, 419: 197, 427: 197, 436: 197, 489: 197, 197, 492: 197}, + {195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 11: 195, 33: 195, 331: 195, 333: 195, 195, 195, 338: 195, 344: 195, 195, 356: 195, 380: 195, 419: 195, 427: 195, 436: 195, 489: 195, 195, 492: 195, 496: 195}, + {185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 11: 185, 33: 185, 330: 2985, 185, 333: 185, 185, 185, 338: 185, 344: 185, 185, 356: 185, 380: 185, 419: 185, 427: 185, 436: 185, 489: 185, 185, 492: 185, 496: 185, 600: 2986, 620: 4481}, + // 2585 + {193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 11: 193, 33: 193, 331: 193, 333: 193, 193, 193, 338: 193, 344: 193, 193, 356: 193, 380: 193, 419: 193, 427: 193, 436: 193, 489: 193, 193, 492: 193, 496: 193}, + {192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 11: 192, 33: 192, 331: 192, 333: 192, 192, 192, 338: 192, 344: 192, 192, 356: 192, 380: 192, 419: 192, 427: 192, 436: 192, 489: 192, 192, 492: 192, 496: 192}, + {191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 33: 191, 331: 191, 333: 191, 191, 191, 338: 191, 344: 191, 191, 419: 191, 427: 191, 436: 191, 489: 191, 191, 492: 191}, + {185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 33: 185, 330: 2985, 185, 333: 185, 185, 185, 338: 185, 344: 185, 185, 419: 185, 427: 185, 436: 185, 489: 185, 185, 492: 185, 600: 2986, 620: 4480}, + {185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 33: 185, 330: 2985, 185, 333: 185, 185, 185, 338: 185, 344: 185, 185, 419: 185, 427: 185, 436: 185, 489: 185, 185, 492: 185, 600: 2986, 620: 4479}, + // 2590 + {185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 33: 185, 330: 2985, 185, 333: 185, 185, 185, 338: 185, 344: 185, 185, 419: 185, 427: 185, 436: 185, 489: 185, 185, 492: 185, 600: 2986, 620: 4478}, + {185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 33: 185, 35: 185, 330: 2985, 185, 333: 185, 185, 185, 338: 185, 344: 185, 185, 419: 185, 427: 185, 436: 185, 489: 185, 185, 492: 185, 587: 185, 185, 600: 2986, 620: 4472}, + {180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 33: 180, 35: 180, 331: 180, 333: 180, 180, 180, 338: 180, 344: 180, 180, 419: 180, 427: 180, 436: 180, 489: 180, 180, 492: 180, 587: 180, 180, 693: 4473}, + {187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 33: 187, 35: 4475, 331: 187, 333: 187, 187, 187, 338: 187, 344: 187, 187, 419: 187, 427: 187, 436: 187, 489: 187, 187, 492: 187, 587: 4474, 4476, 692: 4477}, + {183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 33: 183, 35: 183, 331: 183, 333: 183, 183, 183, 338: 183, 344: 183, 183, 419: 183, 427: 183, 436: 183, 489: 183, 183, 492: 183, 587: 183, 183}, + // 2595 + {182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 33: 182, 35: 182, 331: 182, 333: 182, 182, 182, 338: 182, 344: 182, 182, 419: 182, 427: 182, 436: 182, 489: 182, 182, 492: 182, 587: 182, 182}, + {181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 33: 181, 35: 181, 331: 181, 333: 181, 181, 181, 338: 181, 344: 181, 181, 419: 181, 427: 181, 436: 181, 489: 181, 181, 492: 181, 587: 181, 181}, + {179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 33: 179, 35: 179, 331: 179, 333: 179, 179, 179, 338: 179, 344: 179, 179, 419: 179, 427: 179, 436: 179, 489: 179, 179, 492: 179, 587: 179, 179}, + {188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 33: 188, 331: 188, 333: 188, 188, 188, 338: 188, 344: 188, 188, 419: 188, 427: 188, 436: 188, 489: 188, 188, 492: 188}, + {189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 33: 189, 331: 189, 333: 189, 189, 189, 338: 189, 344: 189, 189, 419: 189, 427: 189, 436: 189, 489: 189, 189, 492: 189}, + // 2600 + {190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 33: 190, 331: 190, 333: 190, 190, 190, 338: 190, 344: 190, 190, 419: 190, 427: 190, 436: 190, 489: 190, 190, 492: 190}, + {194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 11: 194, 33: 194, 331: 194, 333: 194, 194, 194, 338: 194, 344: 194, 194, 356: 194, 380: 194, 419: 194, 427: 194, 436: 194, 489: 194, 194, 492: 194, 496: 194}, + {199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 33: 199, 331: 199, 333: 199, 199, 199, 338: 199, 344: 199, 199, 419: 199, 427: 199, 436: 199, 489: 199, 199, 492: 199}, + {214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 11: 214, 33: 214, 330: 214, 214, 333: 214, 214, 214, 338: 214, 344: 214, 214, 356: 214, 380: 214, 419: 214, 427: 214, 436: 214, 489: 214, 214, 492: 214, 496: 214, 669: 4488}, + {213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 11: 213, 33: 213, 330: 213, 213, 333: 213, 213, 213, 338: 213, 344: 213, 213, 356: 213, 380: 213, 419: 213, 427: 213, 436: 213, 489: 213, 213, 492: 213, 496: 213, 669: 4487}, + // 2605 + {330: 208}, + {330: 207}, + {330: 202}, + {330: 203}, + {330: 205}, + // 2610 + {330: 204}, + {330: 201}, + {211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 11: 211, 33: 211, 330: 211, 211, 333: 211, 211, 211, 338: 211, 344: 211, 211, 356: 211, 380: 211, 419: 211, 427: 211, 436: 211, 489: 211, 211, 492: 211, 496: 211}, + {212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 11: 212, 33: 212, 330: 212, 212, 333: 212, 212, 212, 338: 212, 344: 212, 212, 356: 212, 380: 212, 419: 212, 427: 212, 436: 212, 489: 212, 212, 492: 212, 496: 212}, + {172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 11: 2995, 33: 172, 331: 172, 333: 172, 172, 172, 338: 172, 344: 172, 172, 356: 2996, 380: 2992, 419: 172, 427: 172, 436: 172, 489: 172, 172, 492: 172, 496: 2994, 603: 2993, 639: 4499}, + // 2615 + {218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 33: 218, 331: 218, 333: 218, 218, 218, 338: 218, 344: 218, 218, 419: 218, 427: 218, 436: 218, 489: 218, 218, 492: 218}, + {359: 2998, 669: 4493}, + {359: 2997, 669: 4492}, + {196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 33: 196, 331: 196, 333: 196, 196, 196, 338: 196, 344: 196, 196, 419: 196, 427: 196, 436: 196, 489: 196, 196, 492: 196}, + {219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 33: 219, 331: 219, 333: 219, 219, 219, 338: 219, 344: 219, 219, 419: 219, 427: 219, 436: 219, 489: 219, 219, 492: 219}, + // 2620 + {332: 4502, 896: 4501}, + {5: 4504, 33: 4503}, + {5: 162, 33: 162}, + {169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 11: 2995, 33: 169, 331: 169, 333: 169, 169, 169, 338: 169, 344: 169, 169, 356: 2996, 419: 169, 427: 169, 436: 169, 489: 169, 169, 492: 169, 496: 2994, 603: 3003, 749: 4506}, + {332: 4505}, + // 2625 + {5: 161, 33: 161}, + {221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 33: 221, 331: 221, 333: 221, 221, 221, 338: 221, 344: 221, 221, 419: 221, 427: 221, 436: 221, 489: 221, 221, 492: 221}, + {332: 4502, 896: 4508}, + {5: 4504, 33: 4509}, + {169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 11: 2995, 33: 169, 331: 169, 333: 169, 169, 169, 338: 169, 344: 169, 169, 356: 2996, 419: 169, 427: 169, 436: 169, 489: 169, 169, 492: 169, 496: 2994, 603: 3003, 749: 4510}, + // 2630 + {222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 33: 222, 331: 222, 333: 222, 222, 222, 338: 222, 344: 222, 222, 419: 222, 427: 222, 436: 222, 489: 222, 222, 492: 222}, + {223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 33: 223, 331: 223, 333: 223, 223, 223, 338: 223, 344: 223, 223, 419: 223, 427: 223, 436: 223, 489: 223, 223, 492: 223}, + {225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 33: 225, 331: 225, 333: 225, 225, 225, 338: 225, 344: 225, 225, 419: 225, 427: 225, 436: 225, 489: 225, 225, 492: 225}, + {226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 33: 226, 331: 226, 333: 226, 226, 226, 338: 226, 344: 226, 226, 419: 226, 427: 226, 436: 226, 489: 226, 226, 492: 226}, + {172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 11: 2995, 33: 172, 331: 172, 333: 172, 172, 172, 338: 172, 344: 172, 172, 356: 2996, 380: 2992, 419: 172, 427: 172, 436: 172, 489: 172, 172, 492: 172, 496: 2994, 603: 2993, 639: 4515}, + // 2635 + {227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 33: 227, 331: 227, 333: 227, 227, 227, 338: 227, 344: 227, 227, 419: 227, 427: 227, 436: 227, 489: 227, 227, 492: 227}, + {172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 11: 2995, 33: 172, 331: 172, 333: 172, 172, 172, 338: 172, 344: 172, 172, 356: 2996, 380: 2992, 419: 172, 427: 172, 436: 172, 489: 172, 172, 492: 172, 496: 2994, 603: 2993, 639: 4517}, + {228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 33: 228, 331: 228, 333: 228, 228, 228, 338: 228, 344: 228, 228, 419: 228, 427: 228, 436: 228, 489: 228, 228, 492: 228}, + {172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 11: 2995, 33: 172, 331: 172, 333: 172, 172, 172, 338: 172, 344: 172, 172, 356: 2996, 380: 2992, 419: 172, 427: 172, 436: 172, 489: 172, 172, 492: 172, 496: 2994, 603: 2993, 639: 4520}, + {229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 33: 229, 331: 229, 333: 229, 229, 229, 338: 229, 344: 229, 229, 419: 229, 427: 229, 436: 229, 489: 229, 229, 492: 229}, + // 2640 + {230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 33: 230, 331: 230, 333: 230, 230, 230, 338: 230, 344: 230, 230, 419: 230, 427: 230, 436: 230, 489: 230, 230, 492: 230}, + {172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 11: 2995, 33: 172, 331: 172, 333: 172, 172, 172, 338: 172, 344: 172, 172, 356: 2996, 380: 2992, 419: 172, 427: 172, 436: 172, 489: 172, 172, 492: 172, 496: 2994, 603: 2993, 639: 4523}, + {231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 33: 231, 331: 231, 333: 231, 231, 231, 338: 231, 344: 231, 231, 419: 231, 427: 231, 436: 231, 489: 231, 231, 492: 231}, + {232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 33: 232, 331: 232, 333: 232, 232, 232, 338: 232, 344: 232, 232, 419: 232, 427: 232, 436: 232, 489: 232, 232, 492: 232}, + {234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 33: 234, 35: 234, 330: 234, 234, 333: 234, 234, 234, 338: 234, 344: 234, 234, 419: 234, 427: 234, 436: 234, 489: 234, 234, 492: 234, 587: 234, 234}, + // 2645 + {256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 33: 256, 331: 256, 333: 256, 256, 256, 338: 256, 344: 256, 256, 419: 256, 427: 256, 436: 256, 489: 256, 256, 492: 256}, + {180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 33: 180, 35: 180, 331: 180, 333: 180, 180, 180, 338: 180, 344: 180, 180, 419: 180, 427: 180, 436: 180, 489: 180, 180, 492: 180, 587: 180, 180, 693: 4527}, + {257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 33: 257, 35: 4475, 331: 257, 333: 257, 257, 257, 338: 257, 344: 257, 257, 419: 257, 427: 257, 436: 257, 489: 257, 257, 492: 257, 587: 4474, 4476, 692: 4477}, + {180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 33: 180, 35: 180, 331: 180, 333: 180, 180, 180, 338: 180, 344: 180, 180, 419: 180, 427: 180, 436: 180, 489: 180, 180, 492: 180, 587: 180, 180, 693: 4529}, + {258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 33: 258, 35: 4475, 331: 258, 333: 258, 258, 258, 338: 258, 344: 258, 258, 419: 258, 427: 258, 436: 258, 489: 258, 258, 492: 258, 587: 4474, 4476, 692: 4477}, + // 2650 + {259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 33: 259, 35: 4475, 331: 259, 333: 259, 259, 259, 338: 259, 344: 259, 259, 419: 259, 427: 259, 436: 259, 489: 259, 259, 492: 259, 587: 4474, 4476, 692: 4477}, + {180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 33: 180, 35: 180, 331: 180, 333: 180, 180, 180, 338: 180, 344: 180, 180, 419: 180, 427: 180, 436: 180, 489: 180, 180, 492: 180, 587: 180, 180, 693: 4532}, + {260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 33: 260, 35: 4475, 331: 260, 333: 260, 260, 260, 338: 260, 344: 260, 260, 419: 260, 427: 260, 436: 260, 489: 260, 260, 492: 260, 587: 4474, 4476, 692: 4477}, + {1752, 1752, 1752, 5: 1752, 1752, 1752, 33: 1752, 345: 1752}, + {419: 1734}, + // 2655 + {344: 4599}, + {1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 33: 1726, 331: 1726, 333: 1726, 1726, 1726, 338: 1726, 344: 1726, 1726, 419: 1726, 427: 1726, 436: 1726, 489: 1726, 1726, 492: 1726}, + {1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 33: 1725, 331: 1725, 333: 1725, 1725, 1725, 338: 1725, 344: 1725, 1725, 419: 1725, 427: 1725, 436: 1725, 489: 1725, 1725, 492: 1725}, + {419: 4598}, + {1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 33: 1723, 331: 1723, 333: 1723, 1723, 1723, 338: 1723, 344: 1723, 1723, 419: 4597, 427: 1723, 436: 1723, 489: 1723, 1723, 492: 1723}, + // 2660 + {332: 2455, 340: 4593, 4594, 344: 2446, 362: 2450, 421: 2449, 2448, 425: 2445, 2447, 429: 2454, 2453, 435: 4582, 437: 4579, 4580, 4581, 2452, 562: 4592, 2451, 846: 4577, 4578, 4590, 891: 4591, 951: 4589}, + {335: 4587}, + {602: 4575}, + {332: 4574}, + {330: 4567}, + // 2665 + {334: 4560}, + {1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 33: 1715, 331: 1715, 333: 1715, 1715, 1715, 338: 1715, 344: 1715, 1715, 419: 1715, 427: 1715, 436: 1715, 489: 1715, 1715, 492: 1715}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 332: 2361, 497: 2362, 2001, 2002, 2000, 586: 4559, 707: 4558}, + {122: 4557, 125: 4556, 335: 4555, 937: 4554}, + {202: 4553}, + // 2670 + {1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 33: 1704, 331: 1704, 333: 1704, 1704, 1704, 338: 1704, 344: 1704, 1704, 419: 1704, 427: 1704, 436: 1704, 489: 1704, 1704, 492: 1704}, + {1701, 1701, 1701, 4543, 4537, 1701, 1701, 1701, 4541, 4548, 33: 1701, 331: 4542, 333: 4535, 1709, 4540, 338: 4547, 344: 4536, 1701, 419: 1735, 427: 4534, 436: 4544, 489: 4539, 4327, 492: 4549, 721: 4546, 731: 4552, 740: 4545, 755: 4538}, + {1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 33: 1703, 331: 1703, 333: 1703, 1703, 1703, 338: 1703, 344: 1703, 1703, 419: 1703, 427: 1703, 436: 1703, 489: 1703, 1703, 492: 1703}, + {334: 1708}, + {1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 33: 1713, 331: 1713, 333: 1713, 1713, 1713, 338: 1713, 344: 1713, 1713, 419: 1713, 427: 1713, 436: 1713, 489: 1713, 1713, 492: 1713}, + // 2675 + {1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 33: 1712, 331: 1712, 333: 1712, 1712, 1712, 338: 1712, 344: 1712, 1712, 419: 1712, 427: 1712, 436: 1712, 489: 1712, 1712, 492: 1712}, + {1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 33: 1711, 331: 1711, 333: 1711, 1711, 1711, 338: 1711, 344: 1711, 1711, 419: 1711, 427: 1711, 436: 1711, 489: 1711, 1711, 492: 1711}, + {1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 33: 1710, 331: 1710, 333: 1710, 1710, 1710, 338: 1710, 344: 1710, 1710, 419: 1710, 427: 1710, 436: 1710, 489: 1710, 1710, 492: 1710}, + {1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 33: 1714, 331: 1714, 333: 1714, 1714, 1714, 338: 1714, 344: 1714, 1714, 419: 1714, 427: 1714, 436: 1714, 489: 1714, 1714, 492: 1714}, + {538, 538, 538, 538, 538, 538, 538, 538, 538, 538, 538, 538, 538, 538, 538, 538, 538, 538, 538, 538, 538, 538, 538, 538, 538, 538, 538, 538, 538, 538, 538, 538, 538, 538, 330: 538, 538, 333: 538, 538, 538, 338: 538, 538, 344: 538, 538, 353: 538, 356: 538, 419: 538, 427: 538, 436: 538, 489: 538, 538, 492: 538, 538, 538, 538, 538, 501: 538, 538, 538}, + // 2680 + {330: 4561}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 2413, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 4562}, + {33: 4563, 350: 2558, 354: 2556, 2557, 357: 2555, 2553, 581: 2554, 2552}, + {1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 33: 1707, 331: 1707, 333: 1707, 1707, 1707, 338: 1707, 344: 1707, 1707, 419: 1707, 427: 1707, 436: 1707, 489: 1707, 1707, 492: 1707, 1046: 4566, 1072: 4565, 4564}, + {1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 33: 1716, 331: 1716, 333: 1716, 1716, 1716, 338: 1716, 344: 1716, 1716, 419: 1716, 427: 1716, 436: 1716, 489: 1716, 1716, 492: 1716}, + // 2685 + {1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 33: 1706, 331: 1706, 333: 1706, 1706, 1706, 338: 1706, 344: 1706, 1706, 419: 1706, 427: 1706, 436: 1706, 489: 1706, 1706, 492: 1706}, + {1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 33: 1705, 331: 1705, 333: 1705, 1705, 1705, 338: 1705, 344: 1705, 1705, 419: 1705, 427: 1705, 436: 1705, 489: 1705, 1705, 492: 1705}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 2413, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 4568}, + {33: 4569, 350: 2558, 354: 2556, 2557, 357: 2555, 2553, 581: 2554, 2552}, + {1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 33: 1731, 97: 4308, 331: 1731, 333: 4570, 1731, 1731, 338: 1731, 344: 1731, 1731, 419: 1731, 427: 1731, 436: 1731, 489: 1731, 1731, 492: 1731, 738: 4310, 810: 4571, 954: 4572}, + // 2690 + {97: 4312, 344: 4573}, + {1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 33: 1728, 331: 1728, 333: 1728, 1728, 1728, 338: 1728, 344: 1728, 1728, 419: 1728, 427: 1728, 436: 1728, 489: 1728, 1728, 492: 1728}, + {1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 33: 1717, 331: 1717, 333: 1717, 1717, 1717, 338: 1717, 344: 1717, 1717, 419: 1717, 427: 1717, 436: 1717, 489: 1717, 1717, 492: 1717}, + {1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 33: 1729, 331: 1729, 333: 1729, 1729, 1729, 338: 1729, 344: 1729, 1729, 419: 1729, 427: 1729, 436: 1729, 489: 1729, 1729, 492: 1729}, + {1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 33: 1718, 331: 1718, 333: 1718, 1718, 1718, 338: 1718, 344: 1718, 1718, 419: 1718, 427: 1718, 436: 1718, 489: 1718, 1718, 492: 1718}, + // 2695 + {435: 4582, 437: 4579, 4580, 4581, 846: 4577, 4578, 4576}, + {1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 33: 1719, 331: 1719, 333: 1719, 1719, 1719, 338: 1719, 344: 1719, 1719, 419: 1719, 427: 1719, 436: 1719, 489: 1719, 1719, 492: 1719}, + {1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 33: 1672, 331: 1672, 333: 1672, 1672, 1672, 338: 1672, 344: 1672, 1672, 419: 1672, 427: 1672, 436: 1672, 489: 1672, 1672, 492: 1672}, + {330: 4583}, + {1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 33: 1665, 330: 1669, 1665, 333: 1665, 1665, 1665, 338: 1665, 344: 1665, 1665, 419: 1665, 427: 1665, 436: 1665, 489: 1665, 1665, 492: 1665}, + // 2700 + {1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 33: 1664, 330: 1668, 1664, 333: 1664, 1664, 1664, 338: 1664, 344: 1664, 1664, 419: 1664, 427: 1664, 436: 1664, 489: 1664, 1664, 492: 1664}, + {1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 33: 1663, 330: 1667, 1663, 333: 1663, 1663, 1663, 338: 1663, 344: 1663, 1663, 419: 1663, 427: 1663, 436: 1663, 489: 1663, 1663, 492: 1663}, + {330: 1666}, + {33: 4584, 362: 1990, 583: 4585}, + {1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 33: 1671, 331: 1671, 333: 1671, 1671, 1671, 338: 1671, 344: 1671, 1671, 419: 1671, 427: 1671, 436: 1671, 489: 1671, 1671, 492: 1671}, + // 2705 + {33: 4586}, + {1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 33: 1670, 331: 1670, 333: 1670, 1670, 1670, 338: 1670, 344: 1670, 1670, 419: 1670, 427: 1670, 436: 1670, 489: 1670, 1670, 492: 1670}, + {119: 4588}, + {1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 33: 1720, 331: 1720, 333: 1720, 1720, 1720, 338: 1720, 344: 1720, 1720, 419: 1720, 427: 1720, 436: 1720, 489: 1720, 1720, 492: 1720}, + {1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 33: 1721, 331: 1721, 333: 1721, 1721, 1721, 338: 1721, 344: 1721, 1721, 419: 1721, 427: 1721, 436: 1721, 489: 1721, 1721, 492: 1721}, + // 2710 + {1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 33: 1674, 331: 1674, 333: 1674, 1674, 1674, 338: 1674, 344: 1674, 1674, 419: 1674, 427: 1674, 436: 1674, 489: 1674, 1674, 492: 1674}, + {1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 33: 1673, 331: 1673, 333: 1673, 1673, 1673, 338: 1673, 344: 1673, 1673, 419: 1673, 427: 1673, 436: 1673, 489: 1673, 1673, 492: 1673}, + {1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 33: 1662, 331: 1662, 333: 1662, 1662, 1662, 338: 1662, 344: 1662, 1662, 419: 1662, 427: 1662, 436: 1662, 489: 1662, 1662, 492: 1662}, + {362: 2604, 421: 2606, 2605, 680: 4596}, + {362: 2604, 421: 2606, 2605, 680: 4595}, + // 2715 + {1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 33: 1660, 331: 1660, 333: 1660, 1660, 1660, 338: 1660, 344: 1660, 1660, 419: 1660, 427: 1660, 436: 1660, 489: 1660, 1660, 492: 1660}, + {1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 33: 1661, 331: 1661, 333: 1661, 1661, 1661, 338: 1661, 344: 1661, 1661, 419: 1661, 427: 1661, 436: 1661, 489: 1661, 1661, 492: 1661}, + {1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 33: 1722, 331: 1722, 333: 1722, 1722, 1722, 338: 1722, 344: 1722, 1722, 419: 1722, 427: 1722, 436: 1722, 489: 1722, 1722, 492: 1722}, + {1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 33: 1724, 331: 1724, 333: 1724, 1724, 1724, 338: 1724, 344: 1724, 1724, 419: 1724, 427: 1724, 436: 1724, 489: 1724, 1724, 492: 1724}, + {1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 33: 1727, 331: 1727, 333: 1727, 1727, 1727, 338: 1727, 344: 1727, 1727, 419: 1727, 427: 1727, 436: 1727, 489: 1727, 1727, 492: 1727}, + // 2720 + {1753, 1753, 1753, 5: 1753, 1753, 1753, 33: 1753, 345: 1753}, + {419: 1794, 427: 1794, 436: 1794, 489: 1794, 495: 1794, 522: 1794, 1794}, + {1793, 1793, 1793, 5: 1793, 345: 1793, 419: 1793, 427: 1793, 436: 1793, 489: 1793, 495: 1793, 522: 1793, 1793}, + {1569, 1569}, + {1628, 1628, 330: 1628, 334: 1628, 345: 4730, 353: 1628, 493: 1628, 1628, 866: 4729}, + // 2725 + {11: 1629, 15: 1629, 338: 1629, 356: 1629, 496: 1629}, + {332: 1525, 361: 4143, 591: 4727}, + {2: 1525, 1525, 1525, 6: 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 34: 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 332: 1525, 361: 4143, 591: 4725}, + {2: 1525, 1525, 1525, 6: 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 34: 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 332: 1525, 361: 4143, 591: 4723}, + {153: 4720}, + // 2730 + {153: 4717}, + {361: 4143, 1525, 591: 4715}, + {361: 4143, 1525, 591: 4713}, + {2: 1525, 1525, 1525, 6: 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 34: 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 361: 4143, 591: 4711}, + {361: 4143, 1525, 591: 4709}, + // 2735 + {314, 314, 314, 314, 314, 314, 10: 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 330: 314, 334: 314, 314, 338: 314, 314, 345: 314, 353: 314, 356: 314, 493: 314, 314, 314, 314, 501: 314, 314, 314}, + {11: 2995, 338: 4704, 356: 2996, 496: 2994, 603: 4703}, + {361: 4143, 1525, 591: 4701}, + {361: 4143, 1525, 591: 4699}, + {332: 1525, 361: 4143, 591: 4697}, + // 2740 + {361: 4143, 1525, 591: 4695}, + {361: 4143, 1525, 591: 4693}, + {332: 1525, 361: 4143, 591: 4691}, + {332: 1525, 361: 4143, 591: 4689}, + {361: 4143, 1525, 591: 4687}, + // 2745 + {361: 4143, 1525, 591: 4685}, + {302, 302, 302, 302, 302, 302, 10: 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 330: 302, 334: 302, 302, 338: 302, 302, 345: 302, 353: 302, 356: 302, 493: 302, 302, 302, 302, 501: 302, 302, 302}, + {335: 1525, 361: 4143, 1525, 591: 4683}, + {335: 1525, 361: 4143, 1525, 591: 4680}, + {335: 1525, 361: 4143, 1525, 591: 4677}, + // 2750 + {361: 4143, 1525, 591: 4675}, + {361: 4143, 1525, 591: 4673}, + {335: 1525, 361: 4143, 1525, 591: 4669}, + {129: 4667, 216: 4668}, + {2: 1525, 1525, 1525, 6: 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 34: 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 332: 1525, 344: 1525, 361: 4143, 591: 4664}, + // 2755 + {330: 1525, 361: 4143, 591: 4660}, + {332: 1525, 361: 4143, 591: 4658}, + {284, 284, 3: 4606, 4617, 4656, 10: 4622, 1630, 4624, 4613, 4609, 4636, 4607, 4608, 4611, 4612, 4614, 4619, 4620, 4618, 4623, 4625, 4639, 4634, 4628, 4627, 4629, 4633, 4621, 330: 284, 334: 284, 4605, 338: 1630, 4635, 345: 284, 353: 284, 356: 1630, 493: 284, 284, 4610, 1630, 501: 4632, 4631, 4630, 628: 4616, 653: 4615, 681: 4626, 686: 4655}, + {283, 283, 283, 283, 283, 283, 10: 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 330: 283, 334: 283, 283, 338: 283, 283, 345: 283, 353: 283, 356: 283, 493: 283, 283, 283, 283, 501: 283, 283, 283}, + {122: 1525, 125: 1525, 147: 1525, 1525, 178: 1525, 192: 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 335: 1525, 361: 4143, 591: 4640}, + // 2760 + {122: 4642, 125: 4643, 147: 4646, 4644, 178: 4645, 192: 4647, 4648, 4652, 4651, 4649, 4653, 4654, 4650, 335: 4641}, + {277, 277, 277, 277, 277, 277, 10: 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 330: 277, 334: 277, 277, 338: 277, 277, 345: 277, 353: 277, 356: 277, 493: 277, 277, 277, 277, 501: 277, 277, 277}, + {276, 276, 276, 276, 276, 276, 10: 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 330: 276, 334: 276, 276, 338: 276, 276, 345: 276, 353: 276, 356: 276, 493: 276, 276, 276, 276, 501: 276, 276, 276}, + {275, 275, 275, 275, 275, 275, 10: 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 330: 275, 334: 275, 275, 338: 275, 275, 345: 275, 353: 275, 356: 275, 493: 275, 275, 275, 275, 501: 275, 275, 275}, + {274, 274, 274, 274, 274, 274, 10: 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 330: 274, 334: 274, 274, 338: 274, 274, 345: 274, 353: 274, 356: 274, 493: 274, 274, 274, 274, 501: 274, 274, 274}, + // 2765 + {273, 273, 273, 273, 273, 273, 10: 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 330: 273, 334: 273, 273, 338: 273, 273, 345: 273, 353: 273, 356: 273, 493: 273, 273, 273, 273, 501: 273, 273, 273}, + {272, 272, 272, 272, 272, 272, 10: 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 330: 272, 334: 272, 272, 338: 272, 272, 345: 272, 353: 272, 356: 272, 493: 272, 272, 272, 272, 501: 272, 272, 272}, + {271, 271, 271, 271, 271, 271, 10: 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 330: 271, 334: 271, 271, 338: 271, 271, 345: 271, 353: 271, 356: 271, 493: 271, 271, 271, 271, 501: 271, 271, 271}, + {270, 270, 270, 270, 270, 270, 10: 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 330: 270, 334: 270, 270, 338: 270, 270, 345: 270, 353: 270, 356: 270, 493: 270, 270, 270, 270, 501: 270, 270, 270}, + {269, 269, 269, 269, 269, 269, 10: 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 330: 269, 334: 269, 269, 338: 269, 269, 345: 269, 353: 269, 356: 269, 493: 269, 269, 269, 269, 501: 269, 269, 269}, + // 2770 + {268, 268, 268, 268, 268, 268, 10: 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 330: 268, 334: 268, 268, 338: 268, 268, 345: 268, 353: 268, 356: 268, 493: 268, 268, 268, 268, 501: 268, 268, 268}, + {267, 267, 267, 267, 267, 267, 10: 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 330: 267, 334: 267, 267, 338: 267, 267, 345: 267, 353: 267, 356: 267, 493: 267, 267, 267, 267, 501: 267, 267, 267}, + {266, 266, 266, 266, 266, 266, 10: 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 330: 266, 334: 266, 266, 338: 266, 266, 345: 266, 353: 266, 356: 266, 493: 266, 266, 266, 266, 501: 266, 266, 266}, + {265, 265, 265, 265, 265, 265, 10: 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 330: 265, 334: 265, 265, 338: 265, 265, 345: 265, 353: 265, 356: 265, 493: 265, 265, 265, 265, 501: 265, 265, 265}, + {264, 264, 264, 264, 264, 264, 10: 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 330: 264, 334: 264, 264, 338: 264, 264, 345: 264, 353: 264, 356: 264, 493: 264, 264, 264, 264, 501: 264, 264, 264}, + // 2775 + {282, 282, 282, 282, 282, 282, 10: 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 330: 282, 334: 282, 282, 338: 282, 282, 345: 282, 353: 282, 356: 282, 493: 282, 282, 282, 282, 501: 282, 282, 282}, + {3: 4606, 4617, 10: 4622, 1630, 4624, 4613, 4609, 4636, 4607, 4608, 4611, 4612, 4614, 4619, 4620, 4618, 4623, 4625, 4639, 4634, 4628, 4627, 4629, 4633, 4621, 335: 4605, 338: 1630, 4635, 356: 1630, 495: 4610, 1630, 501: 4632, 4631, 4630, 628: 4616, 653: 4615, 681: 4626, 686: 4657}, + {281, 281, 281, 281, 281, 281, 10: 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 330: 281, 334: 281, 281, 338: 281, 281, 345: 281, 353: 281, 356: 281, 493: 281, 281, 281, 281, 501: 281, 281, 281}, + {332: 4659}, + {288, 288, 288, 288, 288, 288, 10: 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 330: 288, 334: 288, 288, 338: 288, 288, 345: 288, 353: 288, 356: 288, 493: 288, 288, 288, 288, 501: 288, 288, 288}, + // 2780 + {330: 4661}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 402, 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 2328, 2001, 2002, 2000, 584: 3564, 634: 3565, 903: 4662}, + {33: 4663}, + {289, 289, 289, 289, 289, 289, 10: 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 330: 289, 334: 289, 289, 338: 289, 289, 345: 289, 353: 289, 356: 289, 493: 289, 289, 289, 289, 501: 289, 289, 289}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 332: 2361, 344: 4665, 497: 2362, 2001, 2002, 2000, 586: 4666}, + // 2785 + {291, 291, 291, 291, 291, 291, 10: 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 330: 291, 334: 291, 291, 338: 291, 291, 345: 291, 353: 291, 356: 291, 493: 291, 291, 291, 291, 501: 291, 291, 291}, + {290, 290, 290, 290, 290, 290, 10: 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 330: 290, 334: 290, 290, 338: 290, 290, 345: 290, 353: 290, 356: 290, 493: 290, 290, 290, 290, 501: 290, 290, 290}, + {293, 293, 293, 293, 293, 293, 10: 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 330: 293, 334: 293, 293, 338: 293, 293, 345: 293, 353: 293, 356: 293, 493: 293, 293, 293, 293, 501: 293, 293, 293}, + {292, 292, 292, 292, 292, 292, 10: 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 330: 292, 334: 292, 292, 338: 292, 292, 345: 292, 353: 292, 356: 292, 493: 292, 292, 292, 292, 501: 292, 292, 292}, + {335: 4671, 362: 1990, 583: 2974, 599: 4672, 895: 4670}, + // 2790 + {294, 294, 294, 294, 294, 294, 10: 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 330: 294, 334: 294, 294, 338: 294, 294, 345: 294, 353: 294, 356: 294, 493: 294, 294, 294, 294, 501: 294, 294, 294}, + {287, 287, 287, 287, 287, 287, 10: 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 330: 287, 334: 287, 287, 338: 287, 287, 345: 287, 353: 287, 356: 287, 493: 287, 287, 287, 287, 501: 287, 287, 287}, + {286, 286, 286, 286, 286, 286, 10: 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 330: 286, 334: 286, 286, 338: 286, 286, 345: 286, 353: 286, 356: 286, 493: 286, 286, 286, 286, 501: 286, 286, 286}, + {362: 1990, 583: 2974, 599: 4674}, + {295, 295, 295, 295, 295, 295, 10: 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 330: 295, 334: 295, 295, 338: 295, 295, 345: 295, 353: 295, 356: 295, 493: 295, 295, 295, 295, 501: 295, 295, 295}, + // 2795 + {362: 1990, 583: 2974, 599: 4676}, + {296, 296, 296, 296, 296, 296, 10: 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 330: 296, 334: 296, 296, 338: 296, 296, 345: 296, 353: 296, 356: 296, 493: 296, 296, 296, 296, 501: 296, 296, 296}, + {335: 4679, 362: 1990, 583: 2974, 599: 4678}, + {298, 298, 298, 298, 298, 298, 10: 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 330: 298, 334: 298, 298, 338: 298, 298, 345: 298, 353: 298, 356: 298, 493: 298, 298, 298, 298, 501: 298, 298, 298}, + {297, 297, 297, 297, 297, 297, 10: 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 330: 297, 334: 297, 297, 338: 297, 297, 345: 297, 353: 297, 356: 297, 493: 297, 297, 297, 297, 501: 297, 297, 297}, + // 2800 + {335: 4682, 362: 1990, 583: 2974, 599: 4681}, + {300, 300, 300, 300, 300, 300, 10: 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 330: 300, 334: 300, 300, 338: 300, 300, 345: 300, 353: 300, 356: 300, 493: 300, 300, 300, 300, 501: 300, 300, 300}, + {299, 299, 299, 299, 299, 299, 10: 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 330: 299, 334: 299, 299, 338: 299, 299, 345: 299, 353: 299, 356: 299, 493: 299, 299, 299, 299, 501: 299, 299, 299}, + {335: 4671, 362: 1990, 583: 2974, 599: 4672, 895: 4684}, + {301, 301, 301, 301, 301, 301, 10: 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 330: 301, 334: 301, 301, 338: 301, 301, 345: 301, 353: 301, 356: 301, 493: 301, 301, 301, 301, 501: 301, 301, 301}, + // 2805 + {362: 1990, 583: 2974, 599: 4686}, + {303, 303, 303, 303, 303, 303, 10: 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 330: 303, 334: 303, 303, 338: 303, 303, 345: 303, 353: 303, 356: 303, 493: 303, 303, 303, 303, 501: 303, 303, 303}, + {362: 1990, 583: 2974, 599: 4688}, + {304, 304, 304, 304, 304, 304, 10: 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 330: 304, 334: 304, 304, 338: 304, 304, 345: 304, 353: 304, 356: 304, 493: 304, 304, 304, 304, 501: 304, 304, 304}, + {332: 4690}, + // 2810 + {305, 305, 305, 305, 305, 305, 10: 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 330: 305, 334: 305, 305, 338: 305, 305, 345: 305, 353: 305, 356: 305, 493: 305, 305, 305, 305, 501: 305, 305, 305}, + {332: 4692}, + {306, 306, 306, 306, 306, 306, 10: 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 330: 306, 334: 306, 306, 338: 306, 306, 345: 306, 353: 306, 356: 306, 493: 306, 306, 306, 306, 501: 306, 306, 306}, + {362: 1990, 583: 2974, 599: 4694}, + {307, 307, 307, 307, 307, 307, 10: 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 330: 307, 334: 307, 307, 338: 307, 307, 345: 307, 353: 307, 356: 307, 493: 307, 307, 307, 307, 501: 307, 307, 307}, + // 2815 + {362: 1990, 583: 2974, 599: 4696}, + {308, 308, 308, 308, 308, 308, 10: 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 330: 308, 334: 308, 308, 338: 308, 308, 345: 308, 353: 308, 356: 308, 493: 308, 308, 308, 308, 501: 308, 308, 308}, + {332: 4698}, + {309, 309, 309, 309, 309, 309, 10: 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 330: 309, 334: 309, 309, 338: 309, 309, 345: 309, 353: 309, 356: 309, 493: 309, 309, 309, 309, 501: 309, 309, 309}, + {362: 1990, 583: 2974, 599: 4700}, + // 2820 + {310, 310, 310, 310, 310, 310, 10: 310, 310, 310, 310, 310, 310, 310, 310, 310, 310, 310, 310, 310, 310, 310, 310, 310, 310, 310, 310, 310, 310, 310, 330: 310, 334: 310, 310, 338: 310, 310, 345: 310, 353: 310, 356: 310, 493: 310, 310, 310, 310, 501: 310, 310, 310}, + {362: 1990, 583: 2974, 599: 4702}, + {311, 311, 311, 311, 311, 311, 10: 311, 311, 311, 311, 311, 311, 311, 311, 311, 311, 311, 311, 311, 311, 311, 311, 311, 311, 311, 311, 311, 311, 311, 330: 311, 334: 311, 311, 338: 311, 311, 345: 311, 353: 311, 356: 311, 493: 311, 311, 311, 311, 501: 311, 311, 311}, + {2: 1525, 1525, 1525, 6: 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 34: 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 332: 1525, 361: 4143, 380: 1525, 591: 4707}, + {2: 1525, 1525, 1525, 6: 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 34: 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 332: 1525, 361: 4143, 591: 4705}, + // 2825 + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 332: 2361, 497: 2362, 2001, 2002, 2000, 586: 4559, 707: 4706}, + {312, 312, 312, 312, 312, 312, 10: 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 330: 312, 334: 312, 312, 338: 312, 312, 345: 312, 353: 312, 356: 312, 493: 312, 312, 312, 312, 501: 312, 312, 312}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 332: 2361, 380: 2360, 497: 2362, 2001, 2002, 2000, 586: 2359, 635: 4708}, + {313, 313, 313, 313, 313, 313, 10: 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 330: 313, 334: 313, 313, 338: 313, 313, 345: 313, 353: 313, 356: 313, 493: 313, 313, 313, 313, 501: 313, 313, 313}, + {362: 1990, 583: 2974, 599: 4710}, + // 2830 + {1586, 1586, 1586, 1586, 1586, 1586, 10: 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 330: 1586, 334: 1586, 1586, 338: 1586, 1586, 345: 1586, 353: 1586, 356: 1586, 493: 1586, 1586, 1586, 1586, 501: 1586, 1586, 1586}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 4712, 2001, 2002, 2000}, + {1587, 1587, 1587, 1587, 1587, 1587, 10: 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 330: 1587, 334: 1587, 1587, 338: 1587, 1587, 345: 1587, 353: 1587, 356: 1587, 493: 1587, 1587, 1587, 1587, 501: 1587, 1587, 1587}, + {362: 1990, 583: 2974, 599: 4714}, + {1588, 1588, 1588, 1588, 1588, 1588, 10: 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 330: 1588, 334: 1588, 1588, 338: 1588, 1588, 345: 1588, 353: 1588, 356: 1588, 493: 1588, 1588, 1588, 1588, 501: 1588, 1588, 1588}, + // 2835 + {362: 1990, 583: 2974, 599: 4716}, + {1589, 1589, 1589, 1589, 1589, 1589, 10: 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 330: 1589, 334: 1589, 1589, 338: 1589, 1589, 345: 1589, 353: 1589, 356: 1589, 493: 1589, 1589, 1589, 1589, 501: 1589, 1589, 1589}, + {332: 1525, 361: 4143, 591: 4718}, + {332: 4719}, + {1590, 1590, 1590, 1590, 1590, 1590, 10: 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 330: 1590, 334: 1590, 1590, 338: 1590, 1590, 345: 1590, 353: 1590, 356: 1590, 493: 1590, 1590, 1590, 1590, 501: 1590, 1590, 1590}, + // 2840 + {332: 1525, 361: 4143, 591: 4721}, + {332: 4722}, + {1591, 1591, 1591, 1591, 1591, 1591, 10: 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 330: 1591, 334: 1591, 1591, 338: 1591, 1591, 345: 1591, 353: 1591, 356: 1591, 493: 1591, 1591, 1591, 1591, 501: 1591, 1591, 1591}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 332: 2361, 497: 2362, 2001, 2002, 2000, 586: 4724}, + {1592, 1592, 1592, 1592, 1592, 1592, 10: 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 330: 1592, 334: 1592, 1592, 338: 1592, 1592, 345: 1592, 353: 1592, 356: 1592, 493: 1592, 1592, 1592, 1592, 501: 1592, 1592, 1592}, + // 2845 + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 332: 2361, 497: 2362, 2001, 2002, 2000, 586: 4726}, + {1593, 1593, 1593, 1593, 1593, 1593, 10: 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 330: 1593, 334: 1593, 1593, 338: 1593, 1593, 345: 1593, 353: 1593, 356: 1593, 493: 1593, 1593, 1593, 1593, 501: 1593, 1593, 1593}, + {332: 4728}, + {1594, 1594, 1594, 1594, 1594, 1594, 10: 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 330: 1594, 334: 1594, 1594, 338: 1594, 1594, 345: 1594, 353: 1594, 356: 1594, 493: 1594, 1594, 1594, 1594, 501: 1594, 1594, 1594}, + {1578, 1578, 330: 1578, 334: 1578, 353: 2351, 493: 2350, 1578, 808: 4821}, + // 2850 + {507: 4731}, + {88: 1614, 238: 4736, 271: 4737, 375: 4735, 419: 1614, 840: 4738, 4733, 898: 4734, 1015: 4732}, + {1608, 1608, 58: 1608, 4771, 330: 1608, 334: 1608, 353: 1608, 493: 1608, 1608, 1017: 4770}, + {88: 4759, 419: 4758}, + {1622, 1622, 58: 1622, 1622, 330: 1622, 334: 1622, 353: 1622, 493: 1622, 1622}, + // 2855 + {66: 2367, 2366, 330: 4751, 739: 4752}, + {66: 2367, 2366, 330: 4744, 739: 4745}, + {1615, 1615, 58: 1615, 1615, 330: 1615, 334: 1615, 349: 4740, 353: 1615, 423: 4739, 493: 1615, 1615}, + {88: 1613, 419: 1613}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 2413, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 4742}, + // 2860 + {362: 1990, 583: 2974, 599: 4741}, + {1616, 1616, 58: 1616, 1616, 330: 1616, 334: 1616, 353: 1616, 493: 1616, 1616}, + {63: 2641, 65: 2645, 68: 2640, 2637, 2639, 2643, 2644, 2638, 2649, 2648, 2647, 2651, 2652, 2646, 2650, 2653, 2642, 350: 2558, 354: 2556, 2557, 357: 2555, 2553, 381: 2635, 2632, 2634, 2633, 2629, 2631, 2630, 2627, 2628, 2626, 2636, 581: 2554, 2552, 642: 2625, 657: 4743}, + {1617, 1617, 58: 1617, 1617, 330: 1617, 334: 1617, 353: 1617, 493: 1617, 1617}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 2413, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 4749}, + // 2865 + {330: 4746}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 3161, 2001, 2002, 2000, 589: 3265, 662: 4747}, + {5: 3267, 33: 4748}, + {1618, 1618, 58: 1618, 1618, 330: 1618, 334: 1618, 353: 1618, 493: 1618, 1618}, + {33: 4750, 350: 2558, 354: 2556, 2557, 357: 2555, 2553, 581: 2554, 2552}, + // 2870 + {1619, 1619, 58: 1619, 1619, 330: 1619, 334: 1619, 353: 1619, 493: 1619, 1619}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 2413, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 4756}, + {330: 4753}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 3161, 2001, 2002, 2000, 589: 3265, 662: 4754}, + {5: 3267, 33: 4755}, + // 2875 + {1620, 1620, 58: 1620, 1620, 330: 1620, 334: 1620, 353: 1620, 493: 1620, 1620}, + {33: 4757, 350: 2558, 354: 2556, 2557, 357: 2555, 2553, 581: 2554, 2552}, + {1621, 1621, 58: 1621, 1621, 330: 1621, 334: 1621, 353: 1621, 493: 1621, 1621}, + {53: 4764, 330: 1624, 1014: 4763}, + {330: 4760}, + // 2880 + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 2413, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 4761}, + {33: 4762, 350: 2558, 354: 2556, 2557, 357: 2555, 2553, 581: 2554, 2552}, + {1625, 1625, 58: 1625, 1625, 136: 1625, 330: 1625, 334: 1625, 353: 1625, 493: 1625, 1625}, + {330: 4767}, + {918: 4765}, + // 2885 + {362: 1990, 583: 4766}, + {330: 1623}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 1746, 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 3161, 2001, 2002, 2000, 589: 3265, 662: 4026, 781: 4768}, + {33: 4769}, + {1626, 1626, 58: 1626, 1626, 136: 1626, 330: 1626, 334: 1626, 353: 1626, 493: 1626, 1626}, + // 2890 + {1612, 1612, 58: 4774, 330: 1612, 334: 1612, 353: 1612, 493: 1612, 1612, 1051: 4773}, + {362: 1990, 583: 2974, 599: 4772}, + {1607, 1607, 58: 1607, 330: 1607, 334: 1607, 353: 1607, 493: 1607, 1607}, + {1606, 1606, 330: 4781, 334: 1606, 353: 1606, 493: 1606, 1606, 865: 4780}, + {507: 4775}, + // 2895 + {88: 1614, 419: 1614, 840: 4738, 4733, 898: 4776}, + {1610, 1610, 136: 4778, 330: 1610, 334: 1610, 353: 1610, 493: 1610, 1610, 1050: 4777}, + {1611, 1611, 330: 1611, 334: 1611, 353: 1611, 493: 1611, 1611}, + {362: 1990, 583: 2974, 599: 4779}, + {1609, 1609, 330: 1609, 334: 1609, 353: 1609, 493: 1609, 1609}, + // 2900 + {1627, 1627, 330: 1627, 334: 1627, 353: 1627, 493: 1627, 1627}, + {345: 4784, 751: 4783, 864: 4782}, + {5: 4819, 33: 4818}, + {5: 1604, 33: 1604}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 4785, 2001, 2002, 2000}, + // 2905 + {3: 1585, 5: 1585, 13: 1585, 1585, 16: 1585, 1585, 1585, 1585, 1585, 33: 1585, 92: 4790, 228: 4789, 330: 1585, 335: 4788, 428: 4787, 495: 1585, 1013: 4786}, + {3: 1596, 5: 1596, 13: 1596, 1596, 16: 1596, 1596, 1596, 1596, 1596, 33: 1596, 330: 1596, 495: 1596, 863: 4806}, + {236: 4791, 394: 4792}, + {3: 1582, 5: 1582, 13: 1582, 1582, 16: 1582, 1582, 1582, 1582, 1582, 33: 1582, 330: 1582, 495: 1582}, + {3: 1580, 5: 1580, 13: 1580, 1580, 16: 1580, 1580, 1580, 1580, 1580, 33: 1580, 330: 1580, 495: 1580}, + // 2910 + {3: 1579, 5: 1579, 13: 1579, 1579, 16: 1579, 1579, 1579, 1579, 1579, 33: 1579, 330: 1579, 495: 1579}, + {274: 4796}, + {330: 4793}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 2413, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 2765, 619: 4794}, + {5: 2767, 33: 4795}, + // 2915 + {3: 1581, 5: 1581, 13: 1581, 1581, 16: 1581, 1581, 1581, 1581, 1581, 33: 1581, 330: 1581, 495: 1581}, + {330: 4798, 748: 4797}, + {3: 1584, 5: 1584, 13: 1584, 1584, 16: 1584, 1584, 1584, 1584, 1584, 33: 1584, 330: 1584, 495: 1584}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 2413, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 4800, 748: 4801, 845: 4802, 994: 4799}, + {5: 4804, 33: 4803}, + // 2920 + {5: 1494, 33: 1494, 350: 2558, 354: 2556, 2557, 357: 2555, 2553, 581: 2554, 2552}, + {5: 1495, 33: 1495}, + {5: 1487, 33: 1487}, + {3: 1583, 5: 1583, 13: 1583, 1583, 16: 1583, 1583, 1583, 1583, 1583, 33: 1583, 330: 1583, 495: 1583}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 2413, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 4800, 748: 4801, 845: 4805}, + // 2925 + {5: 1486, 33: 1486}, + {3: 4606, 5: 1601, 13: 4613, 4609, 16: 4607, 4608, 4611, 4612, 4614, 33: 1601, 330: 4808, 495: 4610, 653: 4809, 1049: 4807}, + {5: 1602, 33: 1602}, + {58: 4812, 897: 4811, 1048: 4810}, + {3: 1595, 5: 1595, 13: 1595, 1595, 16: 1595, 1595, 1595, 1595, 1595, 33: 1595, 330: 1595, 495: 1595}, + // 2930 + {5: 4816, 33: 4815}, + {5: 1599, 33: 1599}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 4813, 2001, 2002, 2000}, + {3: 1596, 5: 1596, 13: 1596, 1596, 16: 1596, 1596, 1596, 1596, 1596, 33: 1596, 495: 1596, 863: 4814}, + {3: 4606, 5: 1597, 13: 4613, 4609, 16: 4607, 4608, 4611, 4612, 4614, 33: 1597, 495: 4610, 653: 4809}, + // 2935 + {5: 1600, 33: 1600}, + {58: 4812, 897: 4817}, + {5: 1598, 33: 1598}, + {1605, 1605, 1605, 5: 1605, 330: 1605, 334: 1605, 345: 1605, 353: 1605, 493: 1605, 1605}, + {345: 4784, 751: 4820}, + // 2940 + {5: 1603, 33: 1603}, + {1575, 1575, 330: 1575, 334: 4823, 494: 1575, 926: 4822}, + {1573, 1573, 330: 1912, 494: 1908, 559: 4827, 593: 4825, 1909, 1910, 1911, 604: 1914, 1913, 4826, 947: 4824}, + {1574, 1574, 330: 1574, 494: 1574}, + {1632, 1632}, + // 2945 + {1572, 1572, 339: 584}, + {1571, 1571}, + {1570, 1570}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 3301, 2001, 2002, 2000, 675: 4829}, + {1636, 1636, 11: 1630, 15: 1630, 335: 4605, 338: 1630, 356: 1630, 496: 1630, 628: 4831, 674: 4833, 736: 4832, 948: 4830}, + // 2950 + {1641, 1641}, + {11: 2995, 15: 4837, 338: 4836, 356: 2996, 496: 2994, 603: 4835}, + {1635, 1635, 11: 1630, 15: 1630, 335: 4605, 338: 1630, 356: 1630, 496: 1630, 628: 4831, 674: 4834}, + {1634, 1634, 11: 1634, 15: 1634, 335: 1634, 338: 1634, 356: 1634, 496: 1634}, + {1633, 1633, 11: 1633, 15: 1633, 335: 1633, 338: 1633, 356: 1633, 496: 1633}, + // 2955 + {2: 1525, 1525, 1525, 6: 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 34: 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 332: 1525, 361: 4143, 380: 1525, 591: 4842}, + {2: 1525, 1525, 1525, 6: 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 34: 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 332: 1525, 361: 4143, 591: 4840}, + {332: 1525, 361: 4143, 591: 4838}, + {332: 4839}, + {1637, 1637, 11: 1637, 15: 1637, 335: 1637, 338: 1637, 356: 1637, 496: 1637}, + // 2960 + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 332: 2361, 497: 2362, 2001, 2002, 2000, 586: 4559, 707: 4841}, + {1638, 1638, 11: 1638, 15: 1638, 335: 1638, 338: 1638, 356: 1638, 496: 1638}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 332: 2361, 380: 2360, 497: 2362, 2001, 2002, 2000, 586: 2359, 635: 4843}, + {1639, 1639, 11: 1639, 15: 1639, 335: 1639, 338: 1639, 356: 1639, 496: 1639}, + {2: 1426, 1426, 1426, 6: 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 34: 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 406: 3701, 638: 4845}, + // 2965 + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 4846, 2001, 2002, 2000}, + {54: 4381, 331: 1410, 346: 4380, 679: 4848, 977: 4847}, + {331: 4849}, + {331: 1409}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 2328, 2001, 2002, 2000, 584: 4850}, + // 2970 + {330: 4851}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 3161, 2001, 2002, 2000, 589: 4319, 649: 4320, 666: 4852}, + {5: 4324, 33: 4853}, + {1420, 1420, 3: 1420, 12: 1420, 53: 1420, 1420, 1420, 1420, 343: 1420, 346: 1420, 348: 1420, 696: 4854}, + {1652, 1652, 3: 4378, 12: 4375, 53: 4135, 4381, 4383, 4382, 343: 4377, 346: 4380, 348: 4136, 678: 4379, 4376, 688: 4138, 695: 4374, 697: 4137, 832: 4855}, + // 2975 + {1656, 1656}, + {1756, 1756}, + {1758, 1758, 343: 4858}, + {213: 4859}, + {264: 4860}, + // 2980 + {1757, 1757}, + {1760, 1760}, + {1759, 1759}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 2328, 2001, 2002, 2000, 584: 4888, 634: 4887}, + {592: 4865}, + // 2985 + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 2328, 2001, 2002, 2000, 584: 4866}, + {345: 4868, 495: 4867}, + {686, 686, 2208, 2093, 2005, 686, 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 343: 686, 427: 3396, 497: 3395, 2001, 2002, 2000, 650: 4885}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 3376, 2001, 2002, 2000, 625: 4869}, + {5: 3378, 495: 4870}, + // 2990 + {686, 686, 2208, 2093, 2005, 686, 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 343: 686, 427: 3396, 497: 3395, 2001, 2002, 2000, 650: 4871}, + {1775, 1775, 5: 3398, 343: 4873, 646: 4872}, + {1776, 1776}, + {362: 1990, 583: 4876, 776: 4875, 924: 4874}, + {1774, 1774, 5: 4883}, + // 2995 + {1773, 1773, 5: 1773}, + {206: 4877, 210: 4879, 259: 4880, 276: 4878}, + {1771, 1771, 5: 1771}, + {1770, 1770, 5: 1770}, + {215: 4881, 283: 4882}, + // 3000 + {1767, 1767, 5: 1767}, + {1769, 1769, 5: 1769}, + {1768, 1768, 5: 1768}, + {362: 1990, 583: 4876, 776: 4884}, + {1772, 1772, 5: 1772}, + // 3005 + {1775, 1775, 5: 3398, 343: 4873, 646: 4886}, + {1779, 1779}, + {1775, 1775, 5: 3571, 343: 4873, 646: 4898}, + {792, 792, 5: 792, 343: 792, 345: 4890, 495: 4889}, + {686, 686, 2208, 2093, 2005, 686, 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 343: 686, 427: 3396, 497: 3395, 2001, 2002, 2000, 650: 4896}, + // 3010 + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 3376, 2001, 2002, 2000, 625: 4891}, + {1775, 1775, 5: 3378, 343: 4873, 495: 4893, 646: 4892}, + {1778, 1778}, + {686, 686, 2208, 2093, 2005, 686, 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 343: 686, 427: 3396, 497: 3395, 2001, 2002, 2000, 650: 4894}, + {1775, 1775, 5: 3398, 343: 4873, 646: 4895}, + // 3015 + {1777, 1777}, + {1775, 1775, 5: 3398, 343: 4873, 646: 4897}, + {1780, 1780}, + {1781, 1781}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 2328, 2001, 2002, 2000, 584: 4900}, + // 3020 + {405: 4903, 495: 4902, 507: 4904, 892: 4901}, + {1785, 1785}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 4911, 2001, 2002, 2000}, + {330: 4017, 682: 4906}, + {330: 4017, 682: 4016, 766: 4905}, + // 3025 + {1782, 1782, 5: 4024}, + {350: 4907}, + {330: 4017, 682: 4908}, + {99: 4909}, + {362: 1990, 583: 4910}, + // 3030 + {1783, 1783}, + {405: 4903, 507: 4904, 892: 4912}, + {1784, 1784}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 2328, 2001, 2002, 2000, 507: 4914, 584: 4915}, + {168: 4917}, + // 3035 + {1787, 1787, 362: 1990, 583: 4916}, + {1786, 1786}, + {362: 1990, 583: 4918}, + {1788, 1788}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 2328, 2001, 2002, 2000, 584: 4922, 906: 4921, 1056: 4920}, + // 3040 + {1792, 1792, 5: 4925}, + {1791, 1791, 5: 1791}, + {506: 4923}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 2328, 2001, 2002, 2000, 584: 4924}, + {1789, 1789, 5: 1789}, + // 3045 + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 2328, 2001, 2002, 2000, 584: 4922, 906: 4926}, + {1790, 1790, 5: 1790}, + {592: 4944}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 335: 4605, 338: 1630, 356: 1630, 496: 1630, 3301, 2001, 2002, 2000, 628: 4831, 674: 4833, 4941, 736: 4942}, + {2: 1428, 1428, 1428, 6: 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 34: 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 332: 1428, 406: 4127, 417: 1428, 637: 4930}, + // 3050 + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 4931, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 332: 2361, 417: 3226, 497: 2362, 2001, 2002, 2000, 586: 3225, 617: 3227, 702: 3228, 727: 4932}, + {1310, 1310, 5: 1310, 10: 1310, 34: 1310, 89: 1310, 330: 4936, 343: 1310, 404: 1310, 510: 1310, 515: 1310}, + {135, 135, 5: 3230, 10: 135, 34: 135, 343: 135, 510: 4201, 877: 4200, 4933}, + {143, 143, 10: 143, 34: 143, 343: 4216, 787: 4934}, + {124, 124, 10: 4233, 34: 4231, 752: 4232, 4230, 868: 4229, 4935}, + // 3055 + {148, 148}, + {33: 4937}, + {89: 4938}, + {507: 4939}, + {332: 3241, 704: 4940}, + // 3060 + {147, 147}, + {11: 1630, 15: 1630, 335: 4605, 338: 1630, 356: 1630, 496: 1630, 628: 4831, 674: 4833, 736: 4943}, + {1642, 1642, 11: 1630, 15: 1630, 335: 4605, 338: 1630, 356: 1630, 496: 1630, 628: 4831, 674: 4834}, + {1643, 1643, 11: 1630, 15: 1630, 335: 4605, 338: 1630, 356: 1630, 496: 1630, 628: 4831, 674: 4834}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 2328, 2001, 2002, 2000, 584: 4945}, + // 3065 + {1802, 1802, 1802, 4606, 4617, 10: 4622, 1630, 4624, 4613, 4609, 4636, 4607, 4608, 4611, 4612, 4614, 4619, 4620, 4618, 4623, 4625, 4639, 4634, 4628, 4627, 4629, 4633, 4621, 53: 4135, 117: 4955, 121: 4963, 123: 4964, 140: 4973, 146: 4952, 154: 4959, 157: 4954, 163: 4958, 170: 4965, 177: 4960, 180: 4961, 4957, 183: 4974, 4975, 335: 4605, 338: 1630, 4635, 343: 4972, 345: 1802, 348: 4136, 351: 4962, 356: 1630, 431: 4949, 436: 4951, 495: 4610, 1630, 501: 4632, 4631, 4630, 511: 4971, 517: 4953, 519: 4947, 521: 4967, 524: 4966, 4968, 536: 4950, 4956, 628: 4616, 653: 4615, 681: 4626, 686: 4638, 688: 4970, 697: 4969, 761: 4948, 773: 4977, 922: 4976, 4946}, + {1628, 1628, 5128, 345: 4730, 866: 5127, 921: 5126}, + {345: 5120}, + {1873, 1873, 1873, 4606, 4617, 1873, 10: 4622, 1630, 4624, 4613, 4609, 4636, 4607, 4608, 4611, 4612, 4614, 4619, 4620, 4618, 4623, 4625, 4639, 4634, 4628, 4627, 4629, 4633, 4621, 335: 4605, 338: 1630, 4635, 345: 1873, 356: 1630, 495: 4610, 1630, 501: 4632, 4631, 4630, 628: 4616, 653: 4615, 681: 4626, 686: 4655}, + {506: 5114}, + // 3070 + {2: 1807, 1807, 1807, 6: 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 34: 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 345: 5099, 406: 1807, 419: 1796, 427: 1796, 436: 1796, 489: 1796, 495: 1796, 522: 1796, 1796, 672: 4999, 690: 5097, 733: 5098, 4287, 4290}, + {345: 5095}, + {345: 5092}, + {2: 1807, 1807, 1807, 6: 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 34: 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 345: 5076, 406: 1807, 419: 3405, 427: 5075, 436: 5079, 495: 3406, 522: 5078, 652: 5077, 672: 4999, 690: 5074}, + {345: 5063}, + // 3075 + {345: 5061}, + {345: 5058}, + {345: 5055}, + {13: 5052, 345: 5051}, + {13: 5048, 345: 5047}, + // 3080 + {345: 5042}, + {345: 5034}, + {507: 5027}, + {747: 5026}, + {747: 5025}, + // 3085 + {2: 1807, 1807, 1807, 6: 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 34: 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 406: 1807, 672: 4999, 690: 5021}, + {2: 1807, 1807, 1807, 6: 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 34: 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 406: 1807, 672: 4999, 690: 5013}, + {2: 1807, 1807, 1807, 6: 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 34: 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 436: 4997, 495: 4998, 672: 4999, 690: 4996}, + {2: 1525, 1525, 1525, 6: 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 34: 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 334: 4985, 361: 4143, 419: 3405, 495: 3406, 506: 4983, 591: 4984, 652: 4986, 672: 4982}, + {1836, 1836, 1836, 5: 1836, 345: 1836}, + // 3090 + {1835, 1835, 1835, 5: 1835, 345: 1835}, + {1834, 1834, 1834, 5: 1834, 345: 1834}, + {118: 4981}, + {118: 4980}, + {1831, 1831, 1831, 5: 1831, 345: 1831}, + // 3095 + {1830, 1830, 1830, 5: 1830, 345: 1830}, + {1801, 1801, 1801, 5: 4978, 345: 1801}, + {1800, 1800, 1800, 5: 1800, 345: 1800}, + {3: 4606, 4617, 10: 4622, 1630, 4624, 4613, 4609, 4636, 4607, 4608, 4611, 4612, 4614, 4619, 4620, 4618, 4623, 4625, 4639, 4634, 4628, 4627, 4629, 4633, 4621, 53: 4135, 117: 4955, 121: 4963, 123: 4964, 140: 4973, 146: 4952, 154: 4959, 157: 4954, 163: 4958, 170: 4965, 177: 4960, 180: 4961, 4957, 183: 4974, 4975, 335: 4605, 338: 1630, 4635, 343: 4972, 348: 4136, 351: 4962, 356: 1630, 431: 4949, 436: 4951, 495: 4610, 1630, 501: 4632, 4631, 4630, 511: 4971, 517: 4953, 521: 4967, 524: 4966, 4968, 536: 4950, 4956, 628: 4616, 653: 4615, 681: 4626, 686: 4638, 688: 4970, 697: 4969, 761: 4948, 773: 4979}, + {1799, 1799, 1799, 5: 1799, 345: 1799}, + // 3100 + {1832, 1832, 1832, 5: 1832, 345: 1832}, + {1833, 1833, 1833, 5: 1833, 345: 1833}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 3161, 2001, 2002, 2000, 589: 4993}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 2328, 2001, 2002, 2000, 584: 4992}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 2328, 2001, 2002, 2000, 584: 4991}, + // 3105 + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 2328, 2001, 2002, 2000, 584: 4990}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 4987, 2001, 2002, 2000}, + {506: 4988}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 4989, 2001, 2002, 2000}, + {1837, 1837, 1837, 5: 1837, 345: 1837}, + // 3110 + {1838, 1838, 1838, 5: 1838, 345: 1838}, + {1839, 1839, 1839, 5: 1839, 345: 1839}, + {1840, 1840, 1840, 5: 1840, 345: 1840}, + {506: 4994}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 3161, 2001, 2002, 2000, 589: 4995}, + // 3115 + {1841, 1841, 1841, 5: 1841, 345: 1841}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 3161, 2001, 2002, 2000, 589: 5004}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 5002, 2001, 2002, 2000}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 5000, 2001, 2002, 2000}, + {2: 1806, 1806, 1806, 6: 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 34: 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 406: 1806}, + // 3120 + {55: 4383, 4382, 678: 5001}, + {1827, 1827, 1827, 5: 1827, 345: 1827}, + {97: 4308, 333: 4309, 738: 5003}, + {1829, 1829, 1829, 5: 1829, 345: 1829}, + {359: 5005, 517: 5006}, + // 3125 + {335: 5008}, + {335: 5007}, + {1842, 1842, 1842, 5: 1842, 345: 1842}, + {330: 5010, 332: 2455, 340: 4593, 4594, 344: 2446, 362: 2450, 421: 2449, 2448, 425: 2445, 2447, 429: 2454, 2453, 440: 2452, 562: 4592, 2451, 891: 5009}, + {1844, 1844, 1844, 5: 1844, 345: 1844}, + // 3130 + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2425, 2420, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2422, 2152, 2429, 2017, 2040, 2424, 2438, 2439, 2437, 2433, 2440, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2430, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2431, 2009, 2133, 2013, 2018, 2025, 2421, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2426, 2428, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2436, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 2417, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2427, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2432, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2423, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2418, 2419, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2441, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2434, 2435, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2442, 2443, 2324, 2310, 2311, 2312, 2472, 332: 2455, 2413, 335: 2548, 2483, 2487, 340: 2469, 2468, 2505, 344: 2446, 353: 2486, 356: 2503, 362: 2450, 374: 2406, 380: 2475, 404: 2411, 406: 2481, 417: 2488, 2504, 420: 2506, 2449, 2448, 2482, 2463, 2445, 2447, 428: 2479, 2454, 2453, 2478, 2474, 2480, 2544, 2484, 437: 2493, 2494, 2495, 2452, 2473, 2466, 2467, 2517, 2519, 2520, 2521, 2476, 2522, 2501, 2507, 2515, 2516, 2511, 2523, 2524, 2525, 2512, 2527, 2528, 2518, 2513, 2526, 2508, 2514, 2499, 2529, 2530, 2477, 2534, 2489, 2490, 2492, 2533, 2539, 2538, 2540, 2537, 2470, 2541, 2536, 2535, 2532, 2485, 2531, 2491, 2496, 2497, 497: 2405, 2001, 2002, 2000, 559: 2471, 2543, 2457, 2462, 2451, 2460, 2458, 2459, 2498, 2510, 2509, 2502, 2500, 2456, 2465, 2542, 2464, 2461, 2416, 2415, 2414, 5011}, + {33: 5012, 350: 2558, 354: 2556, 2557, 357: 2555, 2553, 581: 2554, 2552}, + {1843, 1843, 1843, 5: 1843, 345: 1843}, + {2: 1428, 1428, 1428, 6: 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 34: 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 406: 4127, 637: 5014}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 3161, 2001, 2002, 2000, 589: 5015}, + // 3135 + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 3161, 2001, 2002, 2000, 589: 4288, 661: 5016}, + {1805, 1805, 1805, 5: 1805, 5018, 5019, 345: 1805, 732: 5017}, + {1845, 1845, 1845, 5: 1845, 345: 1845}, + {1804, 1804, 1804, 5: 1804, 345: 1804}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 3161, 2001, 2002, 2000, 589: 5020}, + // 3140 + {1803, 1803, 1803, 5: 1803, 345: 1803}, + {2: 1428, 1428, 1428, 6: 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 34: 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 406: 4127, 637: 5022}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 3161, 2001, 2002, 2000, 589: 4288, 661: 5023}, + {1805, 1805, 1805, 5: 1805, 5018, 5019, 345: 1805, 732: 5024}, + {1846, 1846, 1846, 5: 1846, 345: 1846}, + // 3145 + {1847, 1847, 1847, 5: 1847, 345: 1847}, + {1848, 1848, 1848, 5: 1848, 345: 1848}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 3161, 2001, 2002, 2000, 589: 5030, 772: 5029, 920: 5028}, + {1849, 1849, 1849, 5: 5032, 345: 1849}, + {1027, 1027, 1027, 5: 1027, 345: 1027}, + // 3150 + {1020, 1020, 1020, 5: 1020, 345: 1020, 378: 2594, 2593, 750: 5031}, + {1025, 1025, 1025, 5: 1025, 345: 1025}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 3161, 2001, 2002, 2000, 589: 5030, 772: 5033}, + {1026, 1026, 1026, 5: 1026, 345: 1026}, + {405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 34: 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 3556, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 345: 405, 645: 3555, 667: 5035}, + // 3155 + {1826, 1826, 2208, 2093, 2005, 1826, 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 345: 1826, 497: 3376, 2001, 2002, 2000, 625: 5037, 1023: 5036}, + {1852, 1852, 1852, 5: 1852, 345: 1852}, + {5: 3378, 514: 5038}, + {330: 5039}, + {345: 4784, 751: 4783, 864: 5040}, + // 3160 + {5: 4819, 33: 5041}, + {1825, 1825, 1825, 5: 1825, 345: 1825}, + {2: 405, 405, 405, 6: 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 34: 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 3556, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 585: 405, 645: 3555, 667: 5043}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 3376, 2001, 2002, 2000, 585: 5045, 625: 5046, 660: 5044}, + {1853, 1853, 1853, 5: 1853, 345: 1853}, + // 3165 + {1824, 1824, 1824, 5: 1824, 13: 1824, 345: 1824}, + {1823, 1823, 1823, 5: 3378, 13: 1823, 345: 1823}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 3376, 2001, 2002, 2000, 585: 5045, 625: 5046, 660: 5049}, + {1854, 1854, 1854, 5: 1854, 345: 1854}, + {13: 5050}, + // 3170 + {1856, 1856, 1856, 5: 1856, 345: 1856}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 3376, 2001, 2002, 2000, 585: 5045, 625: 5046, 660: 5053}, + {1855, 1855, 1855, 5: 1855, 345: 1855}, + {13: 5054}, + {1857, 1857, 1857, 5: 1857, 345: 1857}, + // 3175 + {2: 405, 405, 405, 6: 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 34: 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 3556, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 585: 405, 645: 3555, 667: 5056}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 3376, 2001, 2002, 2000, 585: 5045, 625: 5046, 660: 5057}, + {1858, 1858, 1858, 5: 1858, 345: 1858}, + {2: 405, 405, 405, 6: 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 34: 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 3556, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 585: 405, 645: 3555, 667: 5059}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 3376, 2001, 2002, 2000, 585: 5045, 625: 5046, 660: 5060}, + // 3180 + {1859, 1859, 1859, 5: 1859, 345: 1859}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 3376, 2001, 2002, 2000, 585: 5045, 625: 5046, 660: 5062}, + {1860, 1860, 1860, 5: 1860, 345: 1860}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 5064, 2001, 2002, 2000}, + {343: 5065}, + // 3185 + {592: 5066}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 2328, 2001, 2002, 2000, 584: 5067}, + {1822, 1822, 1822, 5: 1822, 140: 5071, 343: 5070, 345: 1822, 1084: 5069, 5068}, + {1861, 1861, 1861, 5: 1861, 345: 1861}, + {1821, 1821, 1821, 5: 1821, 345: 1821}, + // 3190 + {118: 5073}, + {118: 5072}, + {1819, 1819, 1819, 5: 1819, 345: 1819}, + {1820, 1820, 1820, 5: 1820, 345: 1820}, + {2: 1428, 1428, 1428, 6: 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 34: 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 406: 4127, 637: 5089}, + // 3195 + {419: 5088}, + {2: 1428, 1428, 1428, 6: 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 34: 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 406: 4127, 637: 5086}, + {2: 1428, 1428, 1428, 6: 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 34: 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 406: 4127, 637: 5084}, + {419: 5081}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 5080, 2001, 2002, 2000}, + // 3200 + {1828, 1828, 1828, 5: 1828, 345: 1828}, + {2: 1428, 1428, 1428, 6: 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 34: 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 406: 4127, 637: 5082}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 4602, 2001, 2002, 2000, 899: 5083}, + {1850, 1850, 1850, 5: 1850, 345: 1850}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 5085, 2001, 2002, 2000}, + // 3205 + {1851, 1851, 1851, 5: 1851, 345: 1851}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 3376, 2001, 2002, 2000, 625: 5087}, + {1862, 1862, 1862, 5: 3378, 345: 1862}, + {1863, 1863, 1863, 5: 1863, 345: 1863}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 3161, 2001, 2002, 2000, 589: 5090}, + // 3210 + {1530, 1530, 1530, 5: 1530, 345: 1530, 516: 4123, 518: 4122, 722: 5091}, + {1864, 1864, 1864, 5: 1864, 345: 1864}, + {90: 3556, 362: 405, 645: 3555, 667: 5093}, + {362: 1990, 583: 5094}, + {1865, 1865, 1865, 5: 1865, 345: 1865}, + // 3215 + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 3376, 2001, 2002, 2000, 585: 5045, 625: 5046, 660: 5096}, + {1866, 1866, 1866, 5: 1866, 345: 1866}, + {2: 1426, 1426, 1426, 6: 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 34: 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 406: 3701, 638: 5105}, + {1869, 1869, 1869, 5: 1869, 345: 1869}, + {1426, 1426, 1426, 5: 1426, 59: 1426, 90: 1426, 330: 1426, 345: 1426, 406: 3701, 638: 5100, 645: 1426}, + // 3220 + {405, 405, 405, 5: 405, 59: 405, 90: 3556, 330: 405, 345: 405, 645: 3555, 667: 5101}, + {1606, 1606, 1606, 5: 1606, 59: 5103, 330: 4781, 345: 1606, 865: 5102}, + {1868, 1868, 1868, 5: 1868, 345: 1868}, + {362: 1990, 583: 5104}, + {1867, 1867, 1867, 5: 1867, 345: 1867}, + // 3225 + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 5107, 497: 3161, 2001, 2002, 2000, 589: 4288, 661: 5106}, + {1805, 1805, 1805, 5: 1805, 5018, 5019, 345: 1805, 732: 5113}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 3161, 2001, 2002, 2000, 589: 4288, 661: 5109, 936: 5108}, + {5: 5111, 33: 5110}, + {5: 1755, 33: 1755}, + // 3230 + {1870, 1870, 1870, 5: 1870, 345: 1870}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 3161, 2001, 2002, 2000, 589: 4288, 661: 5112}, + {5: 1754, 33: 1754}, + {1871, 1871, 1871, 5: 1871, 345: 1871}, + {11: 2995, 356: 2996, 496: 2994, 603: 5115}, + // 3235 + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 332: 2361, 380: 2360, 497: 2362, 2001, 2002, 2000, 586: 2359, 635: 5116}, + {164, 164, 164, 5: 164, 338: 5118, 345: 164, 1001: 5117}, + {1872, 1872, 1872, 5: 1872, 345: 1872}, + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 332: 2361, 497: 2362, 2001, 2002, 2000, 586: 4559, 707: 5119}, + {163, 163, 163, 5: 163, 345: 163}, + // 3240 + {2: 2208, 2093, 2005, 6: 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 497: 3376, 2001, 2002, 2000, 625: 5121}, + {1775, 1775, 5: 3378, 343: 4873, 495: 5123, 646: 5122}, + {1877, 1877}, + {686, 686, 2208, 2093, 2005, 686, 2041, 2006, 2116, 2220, 2056, 2016, 2098, 2073, 2023, 2031, 2034, 2050, 2100, 2101, 2204, 2095, 2096, 2094, 2097, 2108, 2104, 2213, 2142, 2141, 2212, 2210, 2224, 34: 2186, 2065, 2237, 2264, 2259, 2256, 2258, 2270, 2262, 2268, 2269, 2266, 2267, 2257, 2260, 2261, 2265, 2263, 2299, 2171, 2235, 2233, 2234, 2131, 2071, 2136, 2072, 2156, 2068, 2026, 2152, 2085, 2017, 2040, 2049, 2149, 2150, 2145, 2105, 2155, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2087, 2160, 2161, 2162, 2163, 2172, 2048, 2091, 2052, 2112, 2022, 2044, 2132, 2032, 2081, 2033, 2057, 2280, 2062, 2090, 2009, 2133, 2013, 2018, 2025, 2024, 2109, 2110, 2055, 2127, 2153, 2063, 2218, 2067, 2076, 2080, 2216, 2083, 2119, 2124, 2030, 2125, 2039, 2042, 2047, 2275, 2274, 2189, 2184, 2325, 2151, 2122, 2179, 2064, 2070, 2168, 2255, 2082, 2217, 2236, 2129, 2190, 2180, 2165, 2144, 2019, 2020, 2192, 2286, 2188, 2027, 2201, 2223, 2028, 2243, 2219, 2043, 2046, 2271, 2272, 1999, 2222, 2294, 2295, 2196, 2182, 2245, 2244, 2134, 2128, 2246, 2247, 2138, 2194, 2248, 2059, 2060, 2167, 2061, 2221, 2169, 2214, 2215, 2166, 2198, 2276, 2250, 2181, 2197, 2077, 2315, 2316, 2317, 2318, 2320, 2319, 2321, 2322, 2078, 2003, 2007, 2010, 2012, 2011, 2238, 2239, 2178, 2015, 2240, 2092, 2113, 2021, 2241, 2242, 2211, 2029, 2035, 2036, 2170, 2135, 2185, 2326, 2195, 2045, 2130, 2106, 2202, 2037, 2187, 2121, 2296, 2173, 2191, 2053, 2051, 2118, 2203, 2099, 2174, 2086, 2102, 2103, 2137, 2115, 2069, 2277, 2327, 2206, 2209, 2278, 2146, 2147, 2148, 2154, 2301, 2111, 2164, 2249, 2177, 2117, 2157, 2207, 2066, 2253, 2254, 2252, 2251, 2139, 2193, 2205, 2175, 2074, 2075, 2323, 2273, 2199, 2079, 2107, 2114, 2176, 2084, 2279, 2183, 2281, 2088, 2004, 2008, 2282, 2283, 2284, 2014, 2285, 2287, 2288, 2289, 2290, 2038, 2140, 2291, 2292, 2293, 2298, 2297, 2054, 2300, 2302, 2058, 2126, 2143, 2158, 2159, 2089, 2200, 2120, 2123, 2306, 2307, 2308, 2309, 2303, 2304, 2305, 2313, 2314, 2324, 2310, 2311, 2312, 343: 686, 427: 3396, 497: 3395, 2001, 2002, 2000, 650: 5124}, + {1775, 1775, 5: 3398, 343: 4873, 646: 5125}, + // 3245 + {1876, 1876}, + {1878, 1878}, + {1875, 1875}, + {250: 5129}, + {1874, 1874}, + // 3250 + {1523, 1523, 98: 1903, 102: 1888, 105: 1891, 113: 1907, 115: 1889, 117: 1979, 124: 1904, 134: 1885, 141: 1918, 1890, 152: 1906, 155: 1893, 158: 1920, 187: 1886, 200: 1896, 330: 1912, 348: 1986, 353: 1902, 359: 1917, 378: 1899, 418: 1901, 494: 1908, 512: 1981, 517: 1895, 519: 1887, 521: 1883, 524: 1916, 1884, 559: 1971, 593: 1915, 1909, 1910, 1911, 602: 1980, 604: 1914, 1913, 1965, 1894, 648: 1931, 651: 1954, 654: 1961, 658: 1974, 673: 1892, 677: 1982, 684: 1919, 705: 1927, 708: 1929, 716: 1984, 1956, 723: 1959, 725: 1966, 764: 1985, 770: 1922, 1923, 774: 1924, 1925, 777: 1926, 1928, 780: 1934, 788: 1941, 1935, 1936, 1940, 1937, 1939, 1938, 796: 1930, 1905, 1898, 1942, 1950, 1943, 1944, 1948, 1949, 1945, 1947, 1946, 809: 1921, 811: 1932, 1897, 1933, 1900, 819: 1951, 823: 1953, 1952, 836: 1988, 1987, 1955, 843: 1957, 1977, 870: 1958, 873: 1962, 876: 1960, 881: 1983, 1964, 1963, 886: 1968, 1967, 889: 1970, 893: 1969, 5131, 908: 1972, 1973, 1976, 1975}, + {322, 322}, + } +) + +var yyDebug = 0 + +type yyLexer interface { + Lex(lval *yySymType) int + Errorf(format string, a ...interface{}) error + AppendError(err error) + Errors() (warns []error, errs []error) +} + +type yyLexerEx interface { + yyLexer + Reduced(rule, state int, lval *yySymType) bool +} + +func yySymName(c int) (s string) { + x, ok := yyXLAT[c] + if ok { + return yySymNames[x] + } + + return __yyfmt__.Sprintf("%d", c) +} + +func yylex1(yylex yyLexer, lval *yySymType) (n int) { + n = yylex.Lex(lval) + if n <= 0 { + n = yyEOFCode + } + if yyDebug >= 3 { + __yyfmt__.Printf("\nlex %s(%#x %d), lval: %+v\n", yySymName(n), n, n, lval) + } + return n +} + +func yyParse(yylex yyLexer, parser *Parser) int { + const yyError = 955 + + yyEx, _ := yylex.(yyLexerEx) + var yyn int + parser.yylval = yySymType{} + parser.yyVAL = yySymType{} + yyS := parser.cache + + Nerrs := 0 /* number of errors */ + Errflag := 0 /* error recovery flag */ + yyerrok := func() { + if yyDebug >= 2 { + __yyfmt__.Printf("yyerrok()\n") + } + Errflag = 0 + } + _ = yyerrok + yystate := 0 + yychar := -1 + var yyxchar int + var yyshift int + yyp := -1 + goto yystack + +ret0: + return 0 + +ret1: + return 1 + +yystack: + /* put a state and value onto the stack */ + yyp++ + if yyp >= len(yyS) { + nyys := make([]yySymType, len(yyS)*2) + copy(nyys, yyS) + yyS = nyys + parser.cache = yyS + } + yyS[yyp] = parser.yyVAL + yyS[yyp].yys = yystate + +yynewstate: + if yychar < 0 { + yychar = yylex1(yylex, &parser.yylval) + var ok bool + if yyxchar, ok = yyXLAT[yychar]; !ok { + yyxchar = len(yySymNames) // > tab width + } + } + if yyDebug >= 4 { + var a []int + for _, v := range yyS[:yyp+1] { + a = append(a, v.yys) + } + __yyfmt__.Printf("state stack %v\n", a) + } + row := yyParseTab[yystate] + yyn = 0 + if yyxchar < len(row) { + if yyn = int(row[yyxchar]); yyn != 0 { + yyn += yyTabOfs + } + } + switch { + case yyn > 0: // shift + yychar = -1 + parser.yyVAL = parser.yylval + yystate = yyn + yyshift = yyn + if yyDebug >= 2 { + __yyfmt__.Printf("shift, and goto state %d\n", yystate) + } + if Errflag > 0 { + Errflag-- + } + goto yystack + case yyn < 0: // reduce + case yystate == 1: // accept + if yyDebug >= 2 { + __yyfmt__.Println("accept") + } + goto ret0 + } + + if yyn == 0 { + /* error ... attempt to resume parsing */ + switch Errflag { + case 0: /* brand new error */ + if yyDebug >= 1 { + __yyfmt__.Printf("no action for %s in state %d\n", yySymName(yychar), yystate) + } + msg, ok := yyXErrors[yyXError{yystate, yyxchar}] + if !ok { + msg, ok = yyXErrors[yyXError{yystate, -1}] + } + if !ok && yyshift != 0 { + msg, ok = yyXErrors[yyXError{yyshift, yyxchar}] + } + if !ok { + msg, ok = yyXErrors[yyXError{yyshift, -1}] + } + if !ok || msg == "" { + msg = "syntax error" + } + // ignore goyacc error message + yylex.AppendError(yylex.Errorf("")) + Nerrs++ + fallthrough + + case 1, 2: /* incompletely recovered error ... try again */ + Errflag = 3 + + /* find a state where "error" is a legal shift action */ + for yyp >= 0 { + row := yyParseTab[yyS[yyp].yys] + if yyError < len(row) { + yyn = int(row[yyError]) + yyTabOfs + if yyn > 0 { // hit + if yyDebug >= 2 { + __yyfmt__.Printf("error recovery found error shift in state %d\n", yyS[yyp].yys) + } + yystate = yyn /* simulate a shift of "error" */ + goto yystack + } + } + + /* the current p has no shift on "error", pop stack */ + if yyDebug >= 2 { + __yyfmt__.Printf("error recovery pops state %d\n", yyS[yyp].yys) + } + yyp-- + } + /* there is no state on the stack with an error shift ... abort */ + if yyDebug >= 2 { + __yyfmt__.Printf("error recovery failed\n") + } + goto ret1 + + case 3: /* no shift yet; clobber input char */ + if yyDebug >= 2 { + __yyfmt__.Printf("error recovery discards %s\n", yySymName(yychar)) + } + if yychar == yyEOFCode { + goto ret1 + } + + yychar = -1 + goto yynewstate /* try again in the same state */ + } + } + + r := -yyn + x0 := yyReductions[r] + x, n := x0.xsym, x0.components + yypt := yyp + _ = yypt // guard against "declared and not used" + + yyp -= n + if yyp+1 >= len(yyS) { + nyys := make([]yySymType, len(yyS)*2) + copy(nyys, yyS) + yyS = nyys + parser.cache = yyS + } + parser.yyVAL = yyS[yyp+1] + + /* consult goto table to find next state */ + exState := yystate + yystate = int(yyParseTab[yyS[yyp].yys][x]) + yyTabOfs + /* reduction by production r */ + if yyDebug >= 2 { + __yyfmt__.Printf("reduce using rule %v (%s), and goto state %d\n", r, yySymNames[x], yystate) + } + + switch r { + case 2: + { + specs := yyS[yypt-1].item.([]*ast.AlterTableSpec) + if yyS[yypt-0].item != nil { + specs = append(specs, yyS[yypt-0].item.(*ast.AlterTableSpec)) + } + parser.yyVAL.statement = &ast.AlterTableStmt{ + Table: yyS[yypt-2].item.(*ast.TableName), + Specs: specs, + } + } + case 3: + { + parser.yyVAL.statement = &ast.AnalyzeTableStmt{TableNames: []*ast.TableName{yyS[yypt-4].item.(*ast.TableName)}, PartitionNames: yyS[yypt-1].item.([]model.CIStr), AnalyzeOpts: yyS[yypt-0].item.([]ast.AnalyzeOpt)} + } + case 4: + { + parser.yyVAL.statement = &ast.AnalyzeTableStmt{ + TableNames: []*ast.TableName{yyS[yypt-6].item.(*ast.TableName)}, + PartitionNames: yyS[yypt-3].item.([]model.CIStr), + IndexNames: yyS[yypt-1].item.([]model.CIStr), + IndexFlag: true, + AnalyzeOpts: yyS[yypt-0].item.([]ast.AnalyzeOpt), + } + } + case 5: + { + if yyS[yypt-0].item != nil { + parser.yyVAL.item = &ast.AlterTableSpec{ + Tp: ast.AlterTablePartition, + Partition: yyS[yypt-0].item.(*ast.PartitionOptions), + } + } else { + parser.yyVAL.item = nil + } + + } + case 6: + { + parser.yyVAL.item = &ast.AlterTableSpec{ + Tp: ast.AlterTableRemovePartitioning, + } + yylex.AppendError(yylex.Errorf("The REMOVE PARTITIONING clause is parsed but ignored by all storage engines.")) + parser.lastErrorAsWarn() + } + case 7: + { + parser.yyVAL.item = &ast.AlterTableSpec{ + Tp: ast.AlterTableOption, + Options: yyS[yypt-0].item.([]*ast.TableOption), + } + } + case 8: + { + op := &ast.AlterTableSpec{ + Tp: ast.AlterTableOption, + Options: []*ast.TableOption{{Tp: ast.TableOptionCharset, StrValue: yyS[yypt-1].item.(string)}}, + } + if yyS[yypt-0].item != "" { + op.Options = append(op.Options, &ast.TableOption{Tp: ast.TableOptionCollate, StrValue: yyS[yypt-0].item.(string)}) + } + parser.yyVAL.item = op + } + case 9: + { + parser.yyVAL.item = &ast.AlterTableSpec{ + IfNotExists: yyS[yypt-2].item.(bool), + Tp: ast.AlterTableAddColumns, + NewColumns: []*ast.ColumnDef{yyS[yypt-1].item.(*ast.ColumnDef)}, + Position: yyS[yypt-0].item.(*ast.ColumnPosition), + } + } + case 10: + { + parser.yyVAL.item = &ast.AlterTableSpec{ + IfNotExists: yyS[yypt-3].item.(bool), + Tp: ast.AlterTableAddColumns, + NewColumns: yyS[yypt-1].item.([]*ast.ColumnDef), + } + } + case 11: + { + constraint := yyS[yypt-0].item.(*ast.Constraint) + parser.yyVAL.item = &ast.AlterTableSpec{ + Tp: ast.AlterTableAddConstraint, + Constraint: constraint, + } + } + case 12: + { + var defs []*ast.PartitionDefinition + if yyS[yypt-0].item != nil { + defs = yyS[yypt-0].item.([]*ast.PartitionDefinition) + } + noWriteToBinlog := yyS[yypt-1].item.(bool) + if noWriteToBinlog { + yylex.AppendError(yylex.Errorf("The NO_WRITE_TO_BINLOG option is parsed but ignored for now.")) + parser.lastErrorAsWarn() + } + parser.yyVAL.item = &ast.AlterTableSpec{ + IfNotExists: yyS[yypt-2].item.(bool), + NoWriteToBinlog: noWriteToBinlog, + Tp: ast.AlterTableAddPartitions, + PartDefinitions: defs, + } + } + case 13: + { + noWriteToBinlog := yyS[yypt-2].item.(bool) + if noWriteToBinlog { + yylex.AppendError(yylex.Errorf("The NO_WRITE_TO_BINLOG option is parsed but ignored for now.")) + parser.lastErrorAsWarn() + } + parser.yyVAL.item = &ast.AlterTableSpec{ + IfNotExists: yyS[yypt-3].item.(bool), + NoWriteToBinlog: noWriteToBinlog, + Tp: ast.AlterTableAddPartitions, + Num: getUint64FromNUM(yyS[yypt-0].item), + } + } + case 14: + { + yylex.AppendError(yylex.Errorf("The CHECK PARTITIONING clause is parsed but not implement yet.")) + parser.lastErrorAsWarn() + ret := &ast.AlterTableSpec{ + Tp: ast.AlterTableCheckPartitions, + } + if yyS[yypt-0].item == nil { + ret.OnAllPartitions = true + } else { + ret.PartitionNames = yyS[yypt-0].item.([]model.CIStr) + } + parser.yyVAL.item = ret + } + case 15: + { + noWriteToBinlog := yyS[yypt-1].item.(bool) + if noWriteToBinlog { + yylex.AppendError(yylex.Errorf("The NO_WRITE_TO_BINLOG option is parsed but ignored for now.")) + parser.lastErrorAsWarn() + } + parser.yyVAL.item = &ast.AlterTableSpec{ + Tp: ast.AlterTableCoalescePartitions, + NoWriteToBinlog: noWriteToBinlog, + Num: getUint64FromNUM(yyS[yypt-0].item), + } + } + case 16: + { + parser.yyVAL.item = &ast.AlterTableSpec{ + IfExists: yyS[yypt-2].item.(bool), + Tp: ast.AlterTableDropColumn, + OldColumnName: yyS[yypt-1].item.(*ast.ColumnName), + } + } + case 17: + { + parser.yyVAL.item = &ast.AlterTableSpec{Tp: ast.AlterTableDropPrimaryKey} + } + case 18: + { + parser.yyVAL.item = &ast.AlterTableSpec{ + IfExists: yyS[yypt-1].item.(bool), + Tp: ast.AlterTableDropPartition, + PartitionNames: yyS[yypt-0].item.([]model.CIStr), + } + } + case 19: + { + parser.yyVAL.item = &ast.AlterTableSpec{ + Tp: ast.AlterTableExchangePartition, + PartitionNames: []model.CIStr{model.NewCIStr(yyS[yypt-4].ident)}, + NewTable: yyS[yypt-1].item.(*ast.TableName), + WithValidation: yyS[yypt-0].item.(bool), + } + yylex.AppendError(yylex.Errorf("TiDB does not support EXCHANGE PARTITION now, it would be parsed but ignored.")) + parser.lastErrorAsWarn() + } + case 20: + { + ret := &ast.AlterTableSpec{ + Tp: ast.AlterTableTruncatePartition, + } + if yyS[yypt-0].item == nil { + ret.OnAllPartitions = true + yylex.AppendError(yylex.Errorf("The TRUNCATE PARTITION ALL clause is parsed but ignored by all storage engines.")) + parser.lastErrorAsWarn() + } else { + ret.PartitionNames = yyS[yypt-0].item.([]model.CIStr) + } + parser.yyVAL.item = ret + } + case 21: + { + ret := &ast.AlterTableSpec{ + NoWriteToBinlog: yyS[yypt-1].item.(bool), + Tp: ast.AlterTableOptimizePartition, + } + if yyS[yypt-0].item == nil { + ret.OnAllPartitions = true + } else { + ret.PartitionNames = yyS[yypt-0].item.([]model.CIStr) + } + parser.yyVAL.item = ret + yylex.AppendError(yylex.Errorf("The OPTIMIZE PARTITION clause is parsed but ignored by all storage engines.")) + parser.lastErrorAsWarn() + } + case 22: + { + ret := &ast.AlterTableSpec{ + NoWriteToBinlog: yyS[yypt-1].item.(bool), + Tp: ast.AlterTableRepairPartition, + } + if yyS[yypt-0].item == nil { + ret.OnAllPartitions = true + } else { + ret.PartitionNames = yyS[yypt-0].item.([]model.CIStr) + } + parser.yyVAL.item = ret + yylex.AppendError(yylex.Errorf("The REPAIR PARTITION clause is parsed but ignored by all storage engines.")) + parser.lastErrorAsWarn() + } + case 23: + { + ret := &ast.AlterTableSpec{ + Tp: ast.AlterTableImportPartitionTablespace, + } + if yyS[yypt-1].item == nil { + ret.OnAllPartitions = true + } else { + ret.PartitionNames = yyS[yypt-1].item.([]model.CIStr) + } + parser.yyVAL.item = ret + yylex.AppendError(yylex.Errorf("The IMPORT PARTITION TABLESPACE clause is parsed but ignored by all storage engines.")) + parser.lastErrorAsWarn() + } + case 24: + { + ret := &ast.AlterTableSpec{ + Tp: ast.AlterTableDiscardPartitionTablespace, + } + if yyS[yypt-1].item == nil { + ret.OnAllPartitions = true + } else { + ret.PartitionNames = yyS[yypt-1].item.([]model.CIStr) + } + parser.yyVAL.item = ret + yylex.AppendError(yylex.Errorf("The DISCARD PARTITION TABLESPACE clause is parsed but ignored by all storage engines.")) + parser.lastErrorAsWarn() + } + case 25: + { + ret := &ast.AlterTableSpec{ + Tp: ast.AlterTableImportTablespace, + } + parser.yyVAL.item = ret + yylex.AppendError(yylex.Errorf("The IMPORT TABLESPACE clause is parsed but ignored by all storage engines.")) + parser.lastErrorAsWarn() + } + case 26: + { + ret := &ast.AlterTableSpec{ + Tp: ast.AlterTableDiscardTablespace, + } + parser.yyVAL.item = ret + yylex.AppendError(yylex.Errorf("The DISCARD TABLESPACE clause is parsed but ignored by all storage engines.")) + parser.lastErrorAsWarn() + } + case 27: + { + ret := &ast.AlterTableSpec{ + Tp: ast.AlterTableRebuildPartition, + NoWriteToBinlog: yyS[yypt-1].item.(bool), + } + if yyS[yypt-0].item == nil { + ret.OnAllPartitions = true + } else { + ret.PartitionNames = yyS[yypt-0].item.([]model.CIStr) + } + parser.yyVAL.item = ret + yylex.AppendError(yylex.Errorf("REBUILD PARTITION syntax is parsed but not implement for now.")) + parser.lastErrorAsWarn() + } + case 28: + { + ret := yyS[yypt-0].item.(*ast.AlterTableSpec) + ret.NoWriteToBinlog = yyS[yypt-1].item.(bool) + parser.yyVAL.item = ret + yylex.AppendError(yylex.Errorf("REORGANIZE PARTITION syntax is parsed but not implement for now.")) + parser.lastErrorAsWarn() + } + case 29: + { + parser.yyVAL.item = &ast.AlterTableSpec{ + IfExists: yyS[yypt-1].item.(bool), + Tp: ast.AlterTableDropIndex, + Name: yyS[yypt-0].ident, + } + } + case 30: + { + parser.yyVAL.item = &ast.AlterTableSpec{ + IfExists: yyS[yypt-1].item.(bool), + Tp: ast.AlterTableDropForeignKey, + Name: yyS[yypt-0].item.(string), + } + } + case 31: + { + parser.yyVAL.item = &ast.AlterTableSpec{ + Tp: ast.AlterTableOrderByColumns, + OrderByList: yyS[yypt-0].item.([]*ast.AlterOrderItem), + } + } + case 32: + { + parser.yyVAL.item = &ast.AlterTableSpec{ + Tp: ast.AlterTableDisableKeys, + } + } + case 33: + { + parser.yyVAL.item = &ast.AlterTableSpec{ + Tp: ast.AlterTableEnableKeys, + } + } + case 34: + { + parser.yyVAL.item = &ast.AlterTableSpec{ + IfExists: yyS[yypt-2].item.(bool), + Tp: ast.AlterTableModifyColumn, + NewColumns: []*ast.ColumnDef{yyS[yypt-1].item.(*ast.ColumnDef)}, + Position: yyS[yypt-0].item.(*ast.ColumnPosition), + } + } + case 35: + { + parser.yyVAL.item = &ast.AlterTableSpec{ + IfExists: yyS[yypt-3].item.(bool), + Tp: ast.AlterTableChangeColumn, + OldColumnName: yyS[yypt-2].item.(*ast.ColumnName), + NewColumns: []*ast.ColumnDef{yyS[yypt-1].item.(*ast.ColumnDef)}, + Position: yyS[yypt-0].item.(*ast.ColumnPosition), + } + } + case 36: + { + option := &ast.ColumnOption{Expr: yyS[yypt-0].expr} + colDef := &ast.ColumnDef{ + Name: yyS[yypt-3].item.(*ast.ColumnName), + Options: []*ast.ColumnOption{option}, + } + parser.yyVAL.item = &ast.AlterTableSpec{ + Tp: ast.AlterTableAlterColumn, + NewColumns: []*ast.ColumnDef{colDef}, + } + } + case 37: + { + option := &ast.ColumnOption{Expr: yyS[yypt-1].expr} + colDef := &ast.ColumnDef{ + Name: yyS[yypt-5].item.(*ast.ColumnName), + Options: []*ast.ColumnOption{option}, + } + parser.yyVAL.item = &ast.AlterTableSpec{ + Tp: ast.AlterTableAlterColumn, + NewColumns: []*ast.ColumnDef{colDef}, + } + } + case 38: + { + colDef := &ast.ColumnDef{ + Name: yyS[yypt-2].item.(*ast.ColumnName), + } + parser.yyVAL.item = &ast.AlterTableSpec{ + Tp: ast.AlterTableAlterColumn, + NewColumns: []*ast.ColumnDef{colDef}, + } + } + case 39: + { + parser.yyVAL.item = &ast.AlterTableSpec{ + Tp: ast.AlterTableRenameColumn, + OldColumnName: yyS[yypt-2].item.(*ast.ColumnName), + NewColumnName: yyS[yypt-0].item.(*ast.ColumnName), + } + } + case 40: + { + parser.yyVAL.item = &ast.AlterTableSpec{ + Tp: ast.AlterTableRenameTable, + NewTable: yyS[yypt-0].item.(*ast.TableName), + } + } + case 41: + { + parser.yyVAL.item = &ast.AlterTableSpec{ + Tp: ast.AlterTableRenameTable, + NewTable: yyS[yypt-0].item.(*ast.TableName), + } + } + case 42: + { + parser.yyVAL.item = &ast.AlterTableSpec{ + Tp: ast.AlterTableRenameTable, + NewTable: yyS[yypt-0].item.(*ast.TableName), + } + } + case 43: + { + parser.yyVAL.item = &ast.AlterTableSpec{ + Tp: ast.AlterTableRenameIndex, + FromKey: model.NewCIStr(yyS[yypt-2].ident), + ToKey: model.NewCIStr(yyS[yypt-0].ident), + } + } + case 44: + { + parser.yyVAL.item = &ast.AlterTableSpec{ + Tp: ast.AlterTableLock, + LockType: yyS[yypt-0].item.(ast.LockType), + } + } + case 45: + { + // Parse it and ignore it. Just for compatibility. + parser.yyVAL.item = &ast.AlterTableSpec{ + Tp: ast.AlterTableAlgorithm, + Algorithm: yyS[yypt-0].item.(ast.AlgorithmType), + } + } + case 46: + { + // Parse it and ignore it. Just for compatibility. + parser.yyVAL.item = &ast.AlterTableSpec{ + Tp: ast.AlterTableForce, + } + } + case 47: + { + // Parse it and ignore it. Just for compatibility. + parser.yyVAL.item = &ast.AlterTableSpec{ + Tp: ast.AlterTableWithValidation, + } + yylex.AppendError(yylex.Errorf("The WITH/WITHOUT VALIDATION clause is parsed but ignored by all storage engines.")) + parser.lastErrorAsWarn() + } + case 48: + { + // Parse it and ignore it. Just for compatibility. + parser.yyVAL.item = &ast.AlterTableSpec{ + Tp: ast.AlterTableWithoutValidation, + } + yylex.AppendError(yylex.Errorf("The WITH/WITHOUT VALIDATION clause is parsed but ignored by all storage engines.")) + parser.lastErrorAsWarn() + } + case 49: + { + // Parse it and ignore it. Just for compatibility. + parser.yyVAL.item = &ast.AlterTableSpec{ + Tp: ast.AlterTableSecondaryLoad, + } + yylex.AppendError(yylex.Errorf("The SECONDARY_LOAD clause is parsed but not implement yet.")) + parser.lastErrorAsWarn() + } + case 50: + { + // Parse it and ignore it. Just for compatibility. + parser.yyVAL.item = &ast.AlterTableSpec{ + Tp: ast.AlterTableSecondaryUnload, + } + yylex.AppendError(yylex.Errorf("The SECONDARY_UNLOAD VALIDATION clause is parsed but not implement yet.")) + parser.lastErrorAsWarn() + } + case 51: + { + // Parse it and ignore it. Just for compatibility. + c := &ast.Constraint{ + Name: yyS[yypt-1].ident, + Enforced: yyS[yypt-0].item.(bool), + } + parser.yyVAL.item = &ast.AlterTableSpec{ + Tp: ast.AlterTableAlterCheck, + Constraint: c, + } + yylex.AppendError(yylex.Errorf("The ALTER CHECK clause is parsed but not implemented yet.")) + parser.lastErrorAsWarn() + } + case 52: + { + // Parse it and ignore it. Just for compatibility. + c := &ast.Constraint{ + Name: yyS[yypt-0].ident, + } + parser.yyVAL.item = &ast.AlterTableSpec{ + Tp: ast.AlterTableDropCheck, + Constraint: c, + } + yylex.AppendError(yylex.Errorf("The DROP CHECK clause is parsed but not implemented yet.")) + parser.lastErrorAsWarn() + } + case 53: + { + parser.yyVAL.item = &ast.AlterTableSpec{ + Tp: ast.AlterTableIndexInvisible, + Name: yyS[yypt-1].ident, + Visibility: yyS[yypt-0].item.(ast.IndexVisibility), + } + } + case 54: + { + ret := &ast.AlterTableSpec{ + Tp: ast.AlterTableReorganizePartition, + OnAllPartitions: true, + } + parser.yyVAL.item = ret + } + case 55: + { + ret := &ast.AlterTableSpec{ + Tp: ast.AlterTableReorganizePartition, + PartitionNames: yyS[yypt-4].item.([]model.CIStr), + PartDefinitions: yyS[yypt-1].item.([]*ast.PartitionDefinition), + } + parser.yyVAL.item = ret + } + case 56: + { + parser.yyVAL.item = nil + } + case 57: + { + parser.yyVAL.item = yyS[yypt-0].item + } + case 58: + { + parser.yyVAL.item = true + } + case 59: + { + parser.yyVAL.item = yyS[yypt-0].item + } + case 60: + { + parser.yyVAL.item = true + } + case 61: + { + parser.yyVAL.item = false + } + case 62: + { + parser.yyVAL.item = ast.AlgorithmTypeDefault + } + case 63: + { + parser.yyVAL.item = ast.AlgorithmTypeCopy + } + case 64: + { + parser.yyVAL.item = ast.AlgorithmTypeInplace + } + case 65: + { + parser.yyVAL.item = ast.AlgorithmTypeInstant + } + case 66: + { + yylex.AppendError(ErrUnknownAlterAlgorithm.GenWithStackByArgs(yyS[yypt-2].ident)) + return 1 + } + case 67: + { + parser.yyVAL.item = ast.LockTypeDefault + } + case 68: + { + id := strings.ToUpper(yyS[yypt-0].ident) + + if id == "NONE" { + parser.yyVAL.item = ast.LockTypeNone + } else if id == "SHARED" { + parser.yyVAL.item = ast.LockTypeShared + } else if id == "EXCLUSIVE" { + parser.yyVAL.item = ast.LockTypeExclusive + } else { + yylex.AppendError(ErrUnknownAlterLock.GenWithStackByArgs(yyS[yypt-0].ident)) + return 1 + } + } + case 75: + { + parser.yyVAL.item = &ast.ColumnPosition{Tp: ast.ColumnPositionNone} + } + case 76: + { + parser.yyVAL.item = &ast.ColumnPosition{Tp: ast.ColumnPositionFirst} + } + case 77: + { + parser.yyVAL.item = &ast.ColumnPosition{ + Tp: ast.ColumnPositionAfter, + RelativeColumn: yyS[yypt-0].item.(*ast.ColumnName), + } + } + case 78: + { + parser.yyVAL.item = make([]*ast.AlterTableSpec, 0, 1) + } + case 79: + { + parser.yyVAL.item = yyS[yypt-0].item + } + case 80: + { + parser.yyVAL.item = []*ast.AlterTableSpec{yyS[yypt-0].item.(*ast.AlterTableSpec)} + } + case 81: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.AlterTableSpec), yyS[yypt-0].item.(*ast.AlterTableSpec)) + } + case 82: + { + parser.yyVAL.item = []model.CIStr{model.NewCIStr(yyS[yypt-0].ident)} + } + case 83: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]model.CIStr), model.NewCIStr(yyS[yypt-0].ident)) + } + case 84: + { + parser.yyVAL.item = nil + } + case 85: + { + parser.yyVAL.item = nil + } + case 86: + { + parser.yyVAL.item = yyS[yypt-0].item.(string) + } + case 87: + { + parser.yyVAL.item = yyS[yypt-0].ident + } + case 88: + { + parser.yyVAL.statement = &ast.RenameTableStmt{ + OldTable: yyS[yypt-0].item.([]*ast.TableToTable)[0].OldTable, + NewTable: yyS[yypt-0].item.([]*ast.TableToTable)[0].NewTable, + TableToTables: yyS[yypt-0].item.([]*ast.TableToTable), + } + } + case 89: + { + parser.yyVAL.item = []*ast.TableToTable{yyS[yypt-0].item.(*ast.TableToTable)} + } + case 90: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.TableToTable), yyS[yypt-0].item.(*ast.TableToTable)) + } + case 91: + { + parser.yyVAL.item = &ast.TableToTable{ + OldTable: yyS[yypt-2].item.(*ast.TableName), + NewTable: yyS[yypt-0].item.(*ast.TableName), + } + } + case 92: + { + parser.yyVAL.statement = &ast.RecoverTableStmt{ + JobID: yyS[yypt-0].item.(int64), + } + } + case 93: + { + parser.yyVAL.statement = &ast.RecoverTableStmt{ + Table: yyS[yypt-0].item.(*ast.TableName), + } + } + case 94: + { + parser.yyVAL.statement = &ast.RecoverTableStmt{ + Table: yyS[yypt-1].item.(*ast.TableName), + JobNum: yyS[yypt-0].item.(int64), + } + } + case 95: + { + parser.yyVAL.statement = &ast.SplitRegionStmt{ + Table: yyS[yypt-1].item.(*ast.TableName), + SplitOpt: yyS[yypt-0].item.(*ast.SplitOption), + } + } + case 96: + { + parser.yyVAL.statement = &ast.SplitRegionStmt{ + Table: yyS[yypt-3].item.(*ast.TableName), + IndexName: model.NewCIStr(yyS[yypt-1].ident), + SplitOpt: yyS[yypt-0].item.(*ast.SplitOption), + } + } + case 97: + { + parser.yyVAL.item = &ast.SplitOption{ + Lower: yyS[yypt-4].item.([]ast.ExprNode), + Upper: yyS[yypt-2].item.([]ast.ExprNode), + Num: yyS[yypt-0].item.(int64), + } + } + case 98: + { + parser.yyVAL.item = &ast.SplitOption{ + ValueLists: yyS[yypt-0].item.([][]ast.ExprNode), + } + } + case 99: + { + parser.yyVAL.statement = &ast.AnalyzeTableStmt{TableNames: yyS[yypt-1].item.([]*ast.TableName), AnalyzeOpts: yyS[yypt-0].item.([]ast.AnalyzeOpt)} + } + case 100: + { + parser.yyVAL.statement = &ast.AnalyzeTableStmt{TableNames: []*ast.TableName{yyS[yypt-3].item.(*ast.TableName)}, IndexNames: yyS[yypt-1].item.([]model.CIStr), IndexFlag: true, AnalyzeOpts: yyS[yypt-0].item.([]ast.AnalyzeOpt)} + } + case 101: + { + parser.yyVAL.statement = &ast.AnalyzeTableStmt{TableNames: []*ast.TableName{yyS[yypt-3].item.(*ast.TableName)}, IndexNames: yyS[yypt-1].item.([]model.CIStr), IndexFlag: true, Incremental: true, AnalyzeOpts: yyS[yypt-0].item.([]ast.AnalyzeOpt)} + } + case 102: + { + parser.yyVAL.statement = &ast.AnalyzeTableStmt{TableNames: []*ast.TableName{yyS[yypt-3].item.(*ast.TableName)}, PartitionNames: yyS[yypt-1].item.([]model.CIStr), AnalyzeOpts: yyS[yypt-0].item.([]ast.AnalyzeOpt)} + } + case 103: + { + parser.yyVAL.statement = &ast.AnalyzeTableStmt{ + TableNames: []*ast.TableName{yyS[yypt-5].item.(*ast.TableName)}, + PartitionNames: yyS[yypt-3].item.([]model.CIStr), + IndexNames: yyS[yypt-1].item.([]model.CIStr), + IndexFlag: true, + AnalyzeOpts: yyS[yypt-0].item.([]ast.AnalyzeOpt), + } + } + case 104: + { + parser.yyVAL.statement = &ast.AnalyzeTableStmt{ + TableNames: []*ast.TableName{yyS[yypt-5].item.(*ast.TableName)}, + PartitionNames: yyS[yypt-3].item.([]model.CIStr), + IndexNames: yyS[yypt-1].item.([]model.CIStr), + IndexFlag: true, + Incremental: true, + AnalyzeOpts: yyS[yypt-0].item.([]ast.AnalyzeOpt), + } + } + case 105: + { + parser.yyVAL.item = []ast.AnalyzeOpt{} + } + case 106: + { + parser.yyVAL.item = yyS[yypt-0].item.([]ast.AnalyzeOpt) + } + case 107: + { + parser.yyVAL.item = []ast.AnalyzeOpt{yyS[yypt-0].item.(ast.AnalyzeOpt)} + } + case 108: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]ast.AnalyzeOpt), yyS[yypt-0].item.(ast.AnalyzeOpt)) + } + case 109: + { + parser.yyVAL.item = ast.AnalyzeOpt{Type: ast.AnalyzeOptNumBuckets, Value: getUint64FromNUM(yyS[yypt-1].item)} + } + case 110: + { + parser.yyVAL.item = ast.AnalyzeOpt{Type: ast.AnalyzeOptNumTopN, Value: getUint64FromNUM(yyS[yypt-1].item)} + } + case 111: + { + parser.yyVAL.item = ast.AnalyzeOpt{Type: ast.AnalyzeOptCMSketchDepth, Value: getUint64FromNUM(yyS[yypt-2].item)} + } + case 112: + { + parser.yyVAL.item = ast.AnalyzeOpt{Type: ast.AnalyzeOptCMSketchWidth, Value: getUint64FromNUM(yyS[yypt-2].item)} + } + case 113: + { + parser.yyVAL.item = ast.AnalyzeOpt{Type: ast.AnalyzeOptNumSamples, Value: getUint64FromNUM(yyS[yypt-1].item)} + } + case 114: + { + parser.yyVAL.item = &ast.Assignment{Column: yyS[yypt-2].item.(*ast.ColumnName), Expr: yyS[yypt-0].expr} + } + case 115: + { + parser.yyVAL.item = []*ast.Assignment{yyS[yypt-0].item.(*ast.Assignment)} + } + case 116: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.Assignment), yyS[yypt-0].item.(*ast.Assignment)) + } + case 117: + { + parser.yyVAL.item = []*ast.Assignment{} + } + case 119: + { + parser.yyVAL.statement = &ast.BeginStmt{} + } + case 120: + { + parser.yyVAL.statement = &ast.BeginStmt{ + Mode: ast.Pessimistic, + } + } + case 121: + { + parser.yyVAL.statement = &ast.BeginStmt{ + Mode: ast.Optimistic, + } + } + case 122: + { + parser.yyVAL.statement = &ast.BeginStmt{} + } + case 123: + { + parser.yyVAL.statement = &ast.BeginStmt{} + } + case 124: + { + parser.yyVAL.statement = &ast.BinlogStmt{Str: yyS[yypt-0].ident} + } + case 125: + { + parser.yyVAL.item = []*ast.ColumnDef{yyS[yypt-0].item.(*ast.ColumnDef)} + } + case 126: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.ColumnDef), yyS[yypt-0].item.(*ast.ColumnDef)) + } + case 127: + { + colDef := &ast.ColumnDef{Name: yyS[yypt-2].item.(*ast.ColumnName), Tp: yyS[yypt-1].item.(*types.FieldType), Options: yyS[yypt-0].item.([]*ast.ColumnOption)} + if !colDef.Validate() { + yylex.AppendError(yylex.Errorf("Invalid column definition")) + return 1 + } + parser.yyVAL.item = colDef + } + case 128: + { + // TODO: check flen 0 + tp := types.NewFieldType(mysql.TypeLonglong) + options := []*ast.ColumnOption{{Tp: ast.ColumnOptionNotNull}, {Tp: ast.ColumnOptionAutoIncrement}, {Tp: ast.ColumnOptionUniqKey}} + options = append(options, yyS[yypt-0].item.([]*ast.ColumnOption)...) + tp.Flag |= mysql.UnsignedFlag + colDef := &ast.ColumnDef{Name: yyS[yypt-2].item.(*ast.ColumnName), Tp: tp, Options: options} + if !colDef.Validate() { + yylex.AppendError(yylex.Errorf("Invalid column definition")) + return 1 + } + parser.yyVAL.item = colDef + } + case 129: + { + parser.yyVAL.item = &ast.ColumnName{Name: model.NewCIStr(yyS[yypt-0].ident)} + } + case 130: + { + parser.yyVAL.item = &ast.ColumnName{Table: model.NewCIStr(yyS[yypt-2].ident), Name: model.NewCIStr(yyS[yypt-0].ident)} + } + case 131: + { + parser.yyVAL.item = &ast.ColumnName{Schema: model.NewCIStr(yyS[yypt-4].ident), Table: model.NewCIStr(yyS[yypt-2].ident), Name: model.NewCIStr(yyS[yypt-0].ident)} + } + case 132: + { + parser.yyVAL.item = []*ast.ColumnName{yyS[yypt-0].item.(*ast.ColumnName)} + } + case 133: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.ColumnName), yyS[yypt-0].item.(*ast.ColumnName)) + } + case 134: + { + parser.yyVAL.item = []*ast.ColumnName{} + } + case 135: + { + parser.yyVAL.item = yyS[yypt-0].item.([]*ast.ColumnName) + } + case 136: + { + parser.yyVAL.item = []*ast.ColumnNameOrUserVar{} + } + case 137: + { + parser.yyVAL.item = yyS[yypt-0].item.([]*ast.ColumnNameOrUserVar) + } + case 138: + { + parser.yyVAL.item = []*ast.ColumnNameOrUserVar{yyS[yypt-0].item.(*ast.ColumnNameOrUserVar)} + } + case 139: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.ColumnNameOrUserVar), yyS[yypt-0].item.(*ast.ColumnNameOrUserVar)) + } + case 140: + { + parser.yyVAL.item = &ast.ColumnNameOrUserVar{ColumnName: yyS[yypt-0].item.(*ast.ColumnName)} + } + case 141: + { + parser.yyVAL.item = &ast.ColumnNameOrUserVar{UserVar: yyS[yypt-0].expr.(*ast.VariableExpr)} + } + case 142: + { + parser.yyVAL.item = []*ast.ColumnNameOrUserVar{} + } + case 143: + { + parser.yyVAL.item = yyS[yypt-1].item.([]*ast.ColumnNameOrUserVar) + } + case 144: + { + parser.yyVAL.statement = &ast.CommitStmt{} + } + case 147: + { + parser.yyVAL.item = true + } + case 148: + { + parser.yyVAL.item = false + } + case 149: + { + parser.yyVAL.item = true + } + case 150: + { + parser.yyVAL.item = yyS[yypt-0].item + } + case 151: + { + parser.yyVAL.item = 0 + } + case 152: + { + if yyS[yypt-0].item.(bool) { + parser.yyVAL.item = 1 + } else { + parser.yyVAL.item = 2 + } + } + case 153: + { + parser.yyVAL.item = &ast.ColumnOption{Tp: ast.ColumnOptionNotNull} + } + case 154: + { + parser.yyVAL.item = &ast.ColumnOption{Tp: ast.ColumnOptionNull} + } + case 155: + { + parser.yyVAL.item = &ast.ColumnOption{Tp: ast.ColumnOptionAutoIncrement} + } + case 156: + { + // KEY is normally a synonym for INDEX. The key attribute PRIMARY KEY + // can also be specified as just KEY when given in a column definition. + // See http://dev.mysql.com/doc/refman/5.7/en/create-table.html + parser.yyVAL.item = &ast.ColumnOption{Tp: ast.ColumnOptionPrimaryKey} + } + case 157: + { + parser.yyVAL.item = &ast.ColumnOption{Tp: ast.ColumnOptionUniqKey} + } + case 158: + { + parser.yyVAL.item = &ast.ColumnOption{Tp: ast.ColumnOptionUniqKey} + } + case 159: + { + parser.yyVAL.item = &ast.ColumnOption{Tp: ast.ColumnOptionDefaultValue, Expr: yyS[yypt-0].expr} + } + case 160: + { + parser.yyVAL.item = []*ast.ColumnOption{{Tp: ast.ColumnOptionNotNull}, {Tp: ast.ColumnOptionAutoIncrement}, {Tp: ast.ColumnOptionUniqKey}} + } + case 161: + { + parser.yyVAL.item = &ast.ColumnOption{Tp: ast.ColumnOptionOnUpdate, Expr: yyS[yypt-0].expr} + } + case 162: + { + parser.yyVAL.item = &ast.ColumnOption{Tp: ast.ColumnOptionComment, Expr: ast.NewValueExpr(yyS[yypt-0].ident)} + } + case 163: + { + // See https://dev.mysql.com/doc/refman/5.7/en/create-table.html + // The CHECK clause is parsed but ignored by all storage engines. + // See the branch named `EnforcedOrNotOrNotNullOpt`. + + optionCheck := &ast.ColumnOption{ + Tp: ast.ColumnOptionCheck, + Expr: yyS[yypt-2].expr, + Enforced: true, + } + switch yyS[yypt-0].item.(int) { + case 0: + parser.yyVAL.item = []*ast.ColumnOption{optionCheck, {Tp: ast.ColumnOptionNotNull}} + case 1: + optionCheck.Enforced = true + parser.yyVAL.item = optionCheck + case 2: + optionCheck.Enforced = false + parser.yyVAL.item = optionCheck + default: + } + yylex.AppendError(yylex.Errorf("The CHECK clause is parsed but ignored by all storage engines.")) + parser.lastErrorAsWarn() + } + case 164: + { + startOffset := parser.startOffset(&yyS[yypt-2]) + endOffset := parser.endOffset(&yyS[yypt-1]) + expr := yyS[yypt-2].expr + expr.SetText(parser.src[startOffset:endOffset]) + + parser.yyVAL.item = &ast.ColumnOption{ + Tp: ast.ColumnOptionGenerated, + Expr: expr, + Stored: yyS[yypt-0].item.(bool), + } + } + case 165: + { + parser.yyVAL.item = &ast.ColumnOption{ + Tp: ast.ColumnOptionReference, + Refer: yyS[yypt-0].item.(*ast.ReferenceDef), + } + } + case 166: + { + parser.yyVAL.item = &ast.ColumnOption{Tp: ast.ColumnOptionCollate, StrValue: yyS[yypt-0].item.(string)} + } + case 167: + { + parser.yyVAL.item = &ast.ColumnOption{Tp: ast.ColumnOptionColumnFormat, StrValue: yyS[yypt-0].item.(string)} + } + case 168: + { + parser.yyVAL.item = "DEFAULT" + } + case 169: + { + parser.yyVAL.item = "FIXED" + } + case 170: + { + parser.yyVAL.item = "DYNAMIC" + } + case 173: + { + parser.yyVAL.item = false + } + case 174: + { + parser.yyVAL.item = false + } + case 175: + { + parser.yyVAL.item = true + } + case 176: + { + if columnOption, ok := yyS[yypt-0].item.(*ast.ColumnOption); ok { + parser.yyVAL.item = []*ast.ColumnOption{columnOption} + } else { + parser.yyVAL.item = yyS[yypt-0].item + } + } + case 177: + { + if columnOption, ok := yyS[yypt-0].item.(*ast.ColumnOption); ok { + parser.yyVAL.item = append(yyS[yypt-1].item.([]*ast.ColumnOption), columnOption) + } else { + parser.yyVAL.item = append(yyS[yypt-1].item.([]*ast.ColumnOption), yyS[yypt-0].item.([]*ast.ColumnOption)...) + } + } + case 178: + { + parser.yyVAL.item = []*ast.ColumnOption{} + } + case 179: + { + parser.yyVAL.item = yyS[yypt-0].item.([]*ast.ColumnOption) + } + case 180: + { + c := &ast.Constraint{ + Tp: ast.ConstraintPrimaryKey, + Keys: yyS[yypt-2].item.([]*ast.IndexColName), + } + if yyS[yypt-0].item != nil { + c.Option = yyS[yypt-0].item.(*ast.IndexOption) + } + if indexType := yyS[yypt-4].item.([]interface{})[1]; indexType != nil { + if c.Option == nil { + c.Option = &ast.IndexOption{} + } + c.Option.Tp = indexType.(model.IndexType) + } + parser.yyVAL.item = c + } + case 181: + { + c := &ast.Constraint{ + Tp: ast.ConstraintFulltext, + Keys: yyS[yypt-2].item.([]*ast.IndexColName), + Name: yyS[yypt-4].item.(string), + } + if yyS[yypt-0].item != nil { + c.Option = yyS[yypt-0].item.(*ast.IndexOption) + } + parser.yyVAL.item = c + } + case 182: + { + c := &ast.Constraint{ + IfNotExists: yyS[yypt-5].item.(bool), + Tp: ast.ConstraintIndex, + Keys: yyS[yypt-2].item.([]*ast.IndexColName), + } + if yyS[yypt-0].item != nil { + c.Option = yyS[yypt-0].item.(*ast.IndexOption) + } + c.Name = yyS[yypt-4].item.([]interface{})[0].(string) + if indexType := yyS[yypt-4].item.([]interface{})[1]; indexType != nil { + if c.Option == nil { + c.Option = &ast.IndexOption{} + } + c.Option.Tp = indexType.(model.IndexType) + } + parser.yyVAL.item = c + } + case 183: + { + c := &ast.Constraint{ + Tp: ast.ConstraintUniq, + Keys: yyS[yypt-2].item.([]*ast.IndexColName), + } + if yyS[yypt-0].item != nil { + c.Option = yyS[yypt-0].item.(*ast.IndexOption) + } + c.Name = yyS[yypt-4].item.([]interface{})[0].(string) + if indexType := yyS[yypt-4].item.([]interface{})[1]; indexType != nil { + if c.Option == nil { + c.Option = &ast.IndexOption{} + } + c.Option.Tp = indexType.(model.IndexType) + } + parser.yyVAL.item = c + } + case 184: + { + parser.yyVAL.item = &ast.Constraint{ + IfNotExists: yyS[yypt-5].item.(bool), + Tp: ast.ConstraintForeignKey, + Keys: yyS[yypt-2].item.([]*ast.IndexColName), + Name: yyS[yypt-4].item.(string), + Refer: yyS[yypt-0].item.(*ast.ReferenceDef), + } + } + case 185: + { + parser.yyVAL.item = &ast.Constraint{ + Tp: ast.ConstraintCheck, + Expr: yyS[yypt-2].expr.(ast.ExprNode), + Enforced: yyS[yypt-0].item.(bool), + } + yylex.AppendError(yylex.Errorf("The CHECK clause is parsed but ignored by all storage engines.")) + parser.lastErrorAsWarn() + } + case 186: + { + parser.yyVAL.item = ast.MatchFull + } + case 187: + { + parser.yyVAL.item = ast.MatchPartial + } + case 188: + { + parser.yyVAL.item = ast.MatchSimple + } + case 189: + { + parser.yyVAL.item = ast.MatchNone + } + case 190: + { + parser.yyVAL.item = yyS[yypt-0].item + yylex.AppendError(yylex.Errorf("The MATCH clause is parsed but ignored by all storage engines.")) + parser.lastErrorAsWarn() + } + case 191: + { + onDeleteUpdate := yyS[yypt-0].item.([2]interface{}) + parser.yyVAL.item = &ast.ReferenceDef{ + Table: yyS[yypt-3].item.(*ast.TableName), + IndexColNames: yyS[yypt-2].item.([]*ast.IndexColName), + OnDelete: onDeleteUpdate[0].(*ast.OnDeleteOpt), + OnUpdate: onDeleteUpdate[1].(*ast.OnUpdateOpt), + Match: yyS[yypt-1].item.(ast.MatchType), + } + } + case 192: + { + parser.yyVAL.item = ([]*ast.IndexColName)(nil) + } + case 193: + { + parser.yyVAL.item = yyS[yypt-1].item + } + case 194: + { + parser.yyVAL.item = &ast.OnDeleteOpt{ReferOpt: yyS[yypt-0].item.(ast.ReferOptionType)} + } + case 195: + { + parser.yyVAL.item = &ast.OnUpdateOpt{ReferOpt: yyS[yypt-0].item.(ast.ReferOptionType)} + } + case 196: + { + parser.yyVAL.item = [2]interface{}{&ast.OnDeleteOpt{}, &ast.OnUpdateOpt{}} + } + case 197: + { + parser.yyVAL.item = [2]interface{}{yyS[yypt-0].item, &ast.OnUpdateOpt{}} + } + case 198: + { + parser.yyVAL.item = [2]interface{}{&ast.OnDeleteOpt{}, yyS[yypt-0].item} + } + case 199: + { + parser.yyVAL.item = [2]interface{}{yyS[yypt-1].item, yyS[yypt-0].item} + } + case 200: + { + parser.yyVAL.item = [2]interface{}{yyS[yypt-0].item, yyS[yypt-1].item} + } + case 201: + { + parser.yyVAL.item = ast.ReferOptionRestrict + } + case 202: + { + parser.yyVAL.item = ast.ReferOptionCascade + } + case 203: + { + parser.yyVAL.item = ast.ReferOptionSetNull + } + case 204: + { + parser.yyVAL.item = ast.ReferOptionNoAction + } + case 205: + { + parser.yyVAL.item = ast.ReferOptionSetDefault + yylex.AppendError(yylex.Errorf("The SET DEFAULT clause is parsed but ignored by all storage engines.")) + parser.lastErrorAsWarn() + } + case 208: + { + parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr("CURRENT_TIMESTAMP")} + } + case 209: + { + parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr("CURRENT_TIMESTAMP")} + } + case 210: + { + parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr("CURRENT_TIMESTAMP"), Args: []ast.ExprNode{ast.NewValueExpr(yyS[yypt-1].item)}} + } + case 218: + { + parser.yyVAL.expr = ast.NewValueExpr(yyS[yypt-0].expr) + } + case 219: + { + parser.yyVAL.expr = &ast.UnaryOperationExpr{Op: opcode.Plus, V: ast.NewValueExpr(yyS[yypt-0].item)} + } + case 220: + { + parser.yyVAL.expr = &ast.UnaryOperationExpr{Op: opcode.Minus, V: ast.NewValueExpr(yyS[yypt-0].item)} + } + case 224: + { + var indexOption *ast.IndexOption + if yyS[yypt-1].item != nil { + indexOption = yyS[yypt-1].item.(*ast.IndexOption) + if indexOption.Tp == model.IndexTypeInvalid { + if yyS[yypt-7].item != nil { + indexOption.Tp = yyS[yypt-7].item.(model.IndexType) + } + } + } else { + indexOption = &ast.IndexOption{} + if yyS[yypt-7].item != nil { + indexOption.Tp = yyS[yypt-7].item.(model.IndexType) + } + } + var indexLockAndAlgorithm *ast.IndexLockAndAlgorithm + if yyS[yypt-0].item != nil { + indexLockAndAlgorithm = yyS[yypt-0].item.(*ast.IndexLockAndAlgorithm) + if indexLockAndAlgorithm.LockTp == ast.LockTypeDefault && indexLockAndAlgorithm.AlgorithmTp == ast.AlgorithmTypeDefault { + indexLockAndAlgorithm = nil + } + } + parser.yyVAL.statement = &ast.CreateIndexStmt{ + IfNotExists: yyS[yypt-9].item.(bool), + IndexName: yyS[yypt-8].ident, + Table: yyS[yypt-5].item.(*ast.TableName), + IndexColNames: yyS[yypt-3].item.([]*ast.IndexColName), + IndexOption: indexOption, + KeyType: yyS[yypt-11].item.(ast.IndexKeyType), + LockAlg: indexLockAndAlgorithm, + } + } + case 225: + { + //Order is parsed but just ignored as MySQL did + parser.yyVAL.item = &ast.IndexColName{Column: yyS[yypt-2].item.(*ast.ColumnName), Length: yyS[yypt-1].item.(int)} + } + case 226: + { + parser.yyVAL.item = []*ast.IndexColName{yyS[yypt-0].item.(*ast.IndexColName)} + } + case 227: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.IndexColName), yyS[yypt-0].item.(*ast.IndexColName)) + } + case 228: + { + parser.yyVAL.item = nil + } + case 229: + { + parser.yyVAL.item = &ast.IndexLockAndAlgorithm{ + LockTp: yyS[yypt-0].item.(ast.LockType), + AlgorithmTp: ast.AlgorithmTypeDefault, + } + } + case 230: + { + parser.yyVAL.item = &ast.IndexLockAndAlgorithm{ + LockTp: ast.LockTypeDefault, + AlgorithmTp: yyS[yypt-0].item.(ast.AlgorithmType), + } + } + case 231: + { + parser.yyVAL.item = &ast.IndexLockAndAlgorithm{ + LockTp: yyS[yypt-1].item.(ast.LockType), + AlgorithmTp: yyS[yypt-0].item.(ast.AlgorithmType), + } + } + case 232: + { + parser.yyVAL.item = &ast.IndexLockAndAlgorithm{ + LockTp: yyS[yypt-0].item.(ast.LockType), + AlgorithmTp: yyS[yypt-1].item.(ast.AlgorithmType), + } + } + case 233: + { + parser.yyVAL.item = ast.IndexKeyTypeNone + } + case 234: + { + parser.yyVAL.item = ast.IndexKeyTypeUnique + } + case 235: + { + parser.yyVAL.item = ast.IndexKeyTypeSpatial + } + case 236: + { + parser.yyVAL.item = ast.IndexKeyTypeFullText + } + case 237: + { + parser.yyVAL.statement = &ast.AlterDatabaseStmt{ + Name: yyS[yypt-1].item.(string), + AlterDefaultDatabase: false, + Options: yyS[yypt-0].item.([]*ast.DatabaseOption), + } + } + case 238: + { + parser.yyVAL.statement = &ast.AlterDatabaseStmt{ + Name: "", + AlterDefaultDatabase: true, + Options: yyS[yypt-0].item.([]*ast.DatabaseOption), + } + } + case 239: + { + parser.yyVAL.statement = &ast.CreateDatabaseStmt{ + IfNotExists: yyS[yypt-2].item.(bool), + Name: yyS[yypt-1].item.(string), + Options: yyS[yypt-0].item.([]*ast.DatabaseOption), + } + } + case 240: + { + parser.yyVAL.item = yyS[yypt-0].ident + } + case 241: + { + parser.yyVAL.item = &ast.DatabaseOption{Tp: ast.DatabaseOptionCharset, Value: yyS[yypt-0].item.(string)} + } + case 242: + { + parser.yyVAL.item = &ast.DatabaseOption{Tp: ast.DatabaseOptionCollate, Value: yyS[yypt-0].item.(string)} + } + case 243: + { + parser.yyVAL.item = &ast.DatabaseOption{Tp: ast.DatabaseOptionEncryption, Value: yyS[yypt-0].ident} + } + case 244: + { + parser.yyVAL.item = []*ast.DatabaseOption{} + } + case 246: + { + parser.yyVAL.item = []*ast.DatabaseOption{yyS[yypt-0].item.(*ast.DatabaseOption)} + } + case 247: + { + parser.yyVAL.item = append(yyS[yypt-1].item.([]*ast.DatabaseOption), yyS[yypt-0].item.(*ast.DatabaseOption)) + } + case 248: + { + stmt := yyS[yypt-5].item.(*ast.CreateTableStmt) + stmt.Table = yyS[yypt-6].item.(*ast.TableName) + stmt.IfNotExists = yyS[yypt-7].item.(bool) + stmt.IsTemporary = yyS[yypt-9].item.(bool) + stmt.Options = yyS[yypt-4].item.([]*ast.TableOption) + if yyS[yypt-3].item != nil { + stmt.Partition = yyS[yypt-3].item.(*ast.PartitionOptions) + } + stmt.OnDuplicate = yyS[yypt-2].item.(ast.OnDuplicateKeyHandlingType) + stmt.Select = yyS[yypt-0].item.(*ast.CreateTableStmt).Select + parser.yyVAL.statement = stmt + } + case 249: + { + parser.yyVAL.statement = &ast.CreateTableStmt{ + Table: yyS[yypt-1].item.(*ast.TableName), + ReferTable: yyS[yypt-0].item.(*ast.TableName), + IfNotExists: yyS[yypt-2].item.(bool), + IsTemporary: yyS[yypt-4].item.(bool), + } + } + case 252: + { + parser.yyVAL.item = nil + } + case 253: + { + method := yyS[yypt-3].item.(*ast.PartitionMethod) + method.Num = yyS[yypt-2].item.(uint64) + sub, _ := yyS[yypt-1].item.(*ast.PartitionMethod) + defs, _ := yyS[yypt-0].item.([]*ast.PartitionDefinition) + opt := &ast.PartitionOptions{ + PartitionMethod: *method, + Sub: sub, + Definitions: defs, + } + if err := opt.Validate(); err != nil { + yylex.AppendError(err) + return 1 + } + parser.yyVAL.item = opt + } + case 254: + { + parser.yyVAL.item = &ast.PartitionMethod{ + Tp: model.PartitionTypeKey, + Linear: len(yyS[yypt-5].ident) != 0, + ColumnNames: yyS[yypt-1].item.([]*ast.ColumnName), + } + } + case 255: + { + parser.yyVAL.item = &ast.PartitionMethod{ + Tp: model.PartitionTypeHash, + Linear: len(yyS[yypt-4].ident) != 0, + Expr: yyS[yypt-1].expr.(ast.ExprNode), + } + } + case 258: + { + parser.yyVAL.item = yyS[yypt-0].item + } + case 259: + { + parser.yyVAL.item = &ast.PartitionMethod{ + Tp: model.PartitionTypeRange, + Expr: yyS[yypt-1].expr.(ast.ExprNode), + } + } + case 260: + { + parser.yyVAL.item = &ast.PartitionMethod{ + Tp: model.PartitionTypeRange, + ColumnNames: yyS[yypt-1].item.([]*ast.ColumnName), + } + } + case 261: + { + parser.yyVAL.item = &ast.PartitionMethod{ + Tp: model.PartitionTypeList, + Expr: yyS[yypt-1].expr.(ast.ExprNode), + } + } + case 262: + { + parser.yyVAL.item = &ast.PartitionMethod{ + Tp: model.PartitionTypeList, + ColumnNames: yyS[yypt-1].item.([]*ast.ColumnName), + } + } + case 263: + { + parser.yyVAL.item = &ast.PartitionMethod{ + Tp: model.PartitionTypeSystemTime, + Expr: yyS[yypt-1].expr.(ast.ExprNode), + Unit: yyS[yypt-0].item.(ast.TimeUnitType), + } + } + case 264: + { + parser.yyVAL.item = &ast.PartitionMethod{ + Tp: model.PartitionTypeSystemTime, + Limit: yyS[yypt-0].item.(uint64), + } + } + case 265: + { + parser.yyVAL.item = &ast.PartitionMethod{ + Tp: model.PartitionTypeSystemTime, + } + } + case 266: + { + parser.yyVAL.ident = "" + } + case 267: + { + parser.yyVAL.ident = yyS[yypt-0].ident + } + case 268: + { + parser.yyVAL.item = nil + } + case 269: + { + method := yyS[yypt-1].item.(*ast.PartitionMethod) + method.Num = yyS[yypt-0].item.(uint64) + parser.yyVAL.item = method + } + case 270: + { + parser.yyVAL.item = uint64(0) + } + case 271: + { + res := yyS[yypt-0].item.(uint64) + if res == 0 { + yylex.AppendError(ast.ErrNoParts.GenWithStackByArgs("subpartitions")) + return 1 + } + parser.yyVAL.item = res + } + case 272: + { + parser.yyVAL.item = uint64(0) + } + case 273: + { + res := yyS[yypt-0].item.(uint64) + if res == 0 { + yylex.AppendError(ast.ErrNoParts.GenWithStackByArgs("partitions")) + return 1 + } + parser.yyVAL.item = res + } + case 274: + { + parser.yyVAL.item = nil + } + case 275: + { + parser.yyVAL.item = yyS[yypt-1].item.([]*ast.PartitionDefinition) + } + case 276: + { + parser.yyVAL.item = []*ast.PartitionDefinition{yyS[yypt-0].item.(*ast.PartitionDefinition)} + } + case 277: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.PartitionDefinition), yyS[yypt-0].item.(*ast.PartitionDefinition)) + } + case 278: + { + parser.yyVAL.item = &ast.PartitionDefinition{ + Name: model.NewCIStr(yyS[yypt-3].ident), + Clause: yyS[yypt-2].item.(ast.PartitionDefinitionClause), + Options: yyS[yypt-1].item.([]*ast.TableOption), + Sub: yyS[yypt-0].item.([]*ast.SubPartitionDefinition), + } + } + case 279: + { + parser.yyVAL.item = make([]*ast.SubPartitionDefinition, 0) + } + case 280: + { + parser.yyVAL.item = yyS[yypt-1].item + } + case 281: + { + parser.yyVAL.item = []*ast.SubPartitionDefinition{yyS[yypt-0].item.(*ast.SubPartitionDefinition)} + } + case 282: + { + list := yyS[yypt-2].item.([]*ast.SubPartitionDefinition) + parser.yyVAL.item = append(list, yyS[yypt-0].item.(*ast.SubPartitionDefinition)) + } + case 283: + { + parser.yyVAL.item = &ast.SubPartitionDefinition{ + Name: model.NewCIStr(yyS[yypt-1].ident), + Options: yyS[yypt-0].item.([]*ast.TableOption), + } + } + case 284: + { + parser.yyVAL.item = make([]*ast.TableOption, 0) + } + case 285: + { + list := yyS[yypt-1].item.([]*ast.TableOption) + parser.yyVAL.item = append(list, yyS[yypt-0].item.(*ast.TableOption)) + } + case 286: + { + parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionComment, StrValue: yyS[yypt-0].ident} + } + case 287: + { + parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionEngine, StrValue: yyS[yypt-0].item.(string)} + } + case 288: + { + parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionInsertMethod, StrValue: yyS[yypt-0].item.(string)} + } + case 289: + { + parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionDataDirectory, StrValue: yyS[yypt-0].ident} + } + case 290: + { + parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionIndexDirectory, StrValue: yyS[yypt-0].ident} + } + case 291: + { + parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionMaxRows, UintValue: yyS[yypt-0].item.(uint64)} + } + case 292: + { + parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionMinRows, UintValue: yyS[yypt-0].item.(uint64)} + } + case 293: + { + parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionTablespace, StrValue: yyS[yypt-0].ident} + } + case 294: + { + parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionNodegroup, UintValue: yyS[yypt-0].item.(uint64)} + } + case 295: + { + parser.yyVAL.item = &ast.PartitionDefinitionClauseNone{} + } + case 296: + { + parser.yyVAL.item = &ast.PartitionDefinitionClauseLessThan{ + Exprs: []ast.ExprNode{&ast.MaxValueExpr{}}, + } + } + case 297: + { + parser.yyVAL.item = &ast.PartitionDefinitionClauseLessThan{ + Exprs: yyS[yypt-1].item.([]ast.ExprNode), + } + } + case 298: + { + parser.yyVAL.item = &ast.PartitionDefinitionClauseIn{} + } + case 299: + { + exprs := yyS[yypt-1].item.([]ast.ExprNode) + values := make([][]ast.ExprNode, 0, len(exprs)) + for _, expr := range exprs { + if row, ok := expr.(*ast.RowExpr); ok { + values = append(values, row.Values) + } else { + values = append(values, []ast.ExprNode{expr}) + } + } + parser.yyVAL.item = &ast.PartitionDefinitionClauseIn{Values: values} + } + case 300: + { + parser.yyVAL.item = &ast.PartitionDefinitionClauseHistory{Current: false} + } + case 301: + { + parser.yyVAL.item = &ast.PartitionDefinitionClauseHistory{Current: true} + } + case 302: + { + parser.yyVAL.item = ast.OnDuplicateKeyHandlingError + } + case 303: + { + parser.yyVAL.item = ast.OnDuplicateKeyHandlingIgnore + } + case 304: + { + parser.yyVAL.item = ast.OnDuplicateKeyHandlingReplace + } + case 307: + { + parser.yyVAL.item = &ast.CreateTableStmt{} + } + case 308: + { + parser.yyVAL.item = &ast.CreateTableStmt{Select: yyS[yypt-0].statement} + } + case 309: + { + parser.yyVAL.item = &ast.CreateTableStmt{Select: yyS[yypt-0].statement} + } + case 310: + { + parser.yyVAL.item = &ast.CreateTableStmt{Select: yyS[yypt-0].expr} + } + case 311: + { + parser.yyVAL.item = yyS[yypt-0].item + } + case 312: + { + parser.yyVAL.item = yyS[yypt-1].item + } + case 313: + { + startOffset := parser.startOffset(&yyS[yypt-1]) + selStmt := yyS[yypt-1].statement.(*ast.SelectStmt) + selStmt.SetText(strings.TrimSpace(parser.src[startOffset:])) + x := &ast.CreateViewStmt{ + OrReplace: yyS[yypt-9].item.(bool), + ViewName: yyS[yypt-4].item.(*ast.TableName), + Select: selStmt, + Algorithm: yyS[yypt-8].item.(model.ViewAlgorithm), + Definer: yyS[yypt-7].item.(*auth.UserIdentity), + Security: yyS[yypt-6].item.(model.ViewSecurity), + } + if yyS[yypt-3].item != nil { + x.Cols = yyS[yypt-3].item.([]model.CIStr) + } + if yyS[yypt-0].item != nil { + x.CheckOption = yyS[yypt-0].item.(model.ViewCheckOption) + endOffset := parser.startOffset(&yyS[yypt]) + selStmt.SetText(strings.TrimSpace(parser.src[startOffset:endOffset])) + } else { + x.CheckOption = model.CheckOptionCascaded + } + parser.yyVAL.statement = x + } + case 314: + { + parser.yyVAL.item = false + } + case 315: + { + parser.yyVAL.item = true + } + case 316: + { + parser.yyVAL.item = model.AlgorithmUndefined + } + case 317: + { + parser.yyVAL.item = model.AlgorithmUndefined + } + case 318: + { + parser.yyVAL.item = model.AlgorithmMerge + } + case 319: + { + parser.yyVAL.item = model.AlgorithmTemptable + } + case 320: + { + parser.yyVAL.item = &auth.UserIdentity{CurrentUser: true} + } + case 321: + { + parser.yyVAL.item = yyS[yypt-0].item + } + case 322: + { + parser.yyVAL.item = model.SecurityDefiner + } + case 323: + { + parser.yyVAL.item = model.SecurityDefiner + } + case 324: + { + parser.yyVAL.item = model.SecurityInvoker + } + case 325: + { + parser.yyVAL.item = yyS[yypt-0].item.(*ast.TableName) + } + case 326: + { + parser.yyVAL.item = nil + } + case 327: + { + parser.yyVAL.item = yyS[yypt-1].item.([]model.CIStr) + } + case 328: + { + parser.yyVAL.item = []model.CIStr{model.NewCIStr(yyS[yypt-0].ident)} + } + case 329: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]model.CIStr), model.NewCIStr(yyS[yypt-0].ident)) + } + case 330: + { + parser.yyVAL.item = nil + } + case 331: + { + parser.yyVAL.item = model.CheckOptionCascaded + } + case 332: + { + parser.yyVAL.item = model.CheckOptionLocal + } + case 333: + { + parser.yyVAL.statement = &ast.DoStmt{ + Exprs: yyS[yypt-0].item.([]ast.ExprNode), + } + } + case 334: + { + // Single Table + tn := yyS[yypt-5].item.(*ast.TableName) + tn.IndexHints = yyS[yypt-3].item.([]*ast.IndexHint) + join := &ast.Join{Left: &ast.TableSource{Source: tn, AsName: yyS[yypt-4].item.(model.CIStr)}, Right: nil} + x := &ast.DeleteStmt{ + TableRefs: &ast.TableRefsClause{TableRefs: join}, + Priority: yyS[yypt-9].item.(mysql.PriorityEnum), + Quick: yyS[yypt-8].item.(bool), + IgnoreErr: yyS[yypt-7].item.(bool), + } + if yyS[yypt-2].item != nil { + x.Where = yyS[yypt-2].item.(ast.ExprNode) + } + if yyS[yypt-1].item != nil { + x.Order = yyS[yypt-1].item.(*ast.OrderByClause) + } + if yyS[yypt-0].item != nil { + x.Limit = yyS[yypt-0].item.(*ast.Limit) + } + + parser.yyVAL.statement = x + } + case 335: + { + // Multiple Table + x := &ast.DeleteStmt{ + Priority: yyS[yypt-6].item.(mysql.PriorityEnum), + Quick: yyS[yypt-5].item.(bool), + IgnoreErr: yyS[yypt-4].item.(bool), + IsMultiTable: true, + BeforeFrom: true, + Tables: &ast.DeleteTableList{Tables: yyS[yypt-3].item.([]*ast.TableName)}, + TableRefs: &ast.TableRefsClause{TableRefs: yyS[yypt-1].item.(*ast.Join)}, + } + if yyS[yypt-7].item != nil { + x.TableHints = yyS[yypt-7].item.([]*ast.TableOptimizerHint) + } + if yyS[yypt-0].item != nil { + x.Where = yyS[yypt-0].item.(ast.ExprNode) + } + parser.yyVAL.statement = x + } + case 336: + { + // Multiple Table + x := &ast.DeleteStmt{ + Priority: yyS[yypt-7].item.(mysql.PriorityEnum), + Quick: yyS[yypt-6].item.(bool), + IgnoreErr: yyS[yypt-5].item.(bool), + IsMultiTable: true, + Tables: &ast.DeleteTableList{Tables: yyS[yypt-3].item.([]*ast.TableName)}, + TableRefs: &ast.TableRefsClause{TableRefs: yyS[yypt-1].item.(*ast.Join)}, + } + if yyS[yypt-8].item != nil { + x.TableHints = yyS[yypt-8].item.([]*ast.TableOptimizerHint) + } + if yyS[yypt-0].item != nil { + x.Where = yyS[yypt-0].item.(ast.ExprNode) + } + parser.yyVAL.statement = x + } + case 338: + { + parser.yyVAL.statement = &ast.DropDatabaseStmt{IfExists: yyS[yypt-1].item.(bool), Name: yyS[yypt-0].item.(string)} + } + case 339: + { + var indexLockAndAlgorithm *ast.IndexLockAndAlgorithm + if yyS[yypt-0].item != nil { + indexLockAndAlgorithm = yyS[yypt-0].item.(*ast.IndexLockAndAlgorithm) + if indexLockAndAlgorithm.LockTp == ast.LockTypeDefault && indexLockAndAlgorithm.AlgorithmTp == ast.AlgorithmTypeDefault { + indexLockAndAlgorithm = nil + } + } + parser.yyVAL.statement = &ast.DropIndexStmt{IfExists: yyS[yypt-4].item.(bool), IndexName: yyS[yypt-3].ident, Table: yyS[yypt-1].item.(*ast.TableName), LockAlg: indexLockAndAlgorithm} + } + case 340: + { + parser.yyVAL.statement = &ast.DropTableStmt{IfExists: yyS[yypt-2].item.(bool), Tables: yyS[yypt-1].item.([]*ast.TableName), IsView: false, IsTemporary: yyS[yypt-4].item.(bool)} + } + case 341: + { + parser.yyVAL.item = false + } + case 342: + { + parser.yyVAL.item = true + yylex.AppendError(yylex.Errorf("TiDB doesn't support TEMPORARY TABLE, TEMPORARY will be parsed but ignored.")) + parser.lastErrorAsWarn() + } + case 343: + { + parser.yyVAL.statement = &ast.DropTableStmt{Tables: yyS[yypt-1].item.([]*ast.TableName), IsView: true} + } + case 344: + { + parser.yyVAL.statement = &ast.DropTableStmt{IfExists: true, Tables: yyS[yypt-1].item.([]*ast.TableName), IsView: true} + } + case 345: + { + parser.yyVAL.statement = &ast.DropUserStmt{IsDropRole: false, IfExists: false, UserList: yyS[yypt-0].item.([]*auth.UserIdentity)} + } + case 346: + { + parser.yyVAL.statement = &ast.DropUserStmt{IsDropRole: false, IfExists: true, UserList: yyS[yypt-0].item.([]*auth.UserIdentity)} + } + case 347: + { + tmp := make([]*auth.UserIdentity, 0, 10) + roleList := yyS[yypt-0].item.([]*auth.RoleIdentity) + for _, r := range roleList { + tmp = append(tmp, &auth.UserIdentity{Username: r.Username, Hostname: r.Hostname}) + } + parser.yyVAL.statement = &ast.DropUserStmt{IsDropRole: true, IfExists: false, UserList: tmp} + } + case 348: + { + tmp := make([]*auth.UserIdentity, 0, 10) + roleList := yyS[yypt-0].item.([]*auth.RoleIdentity) + for _, r := range roleList { + tmp = append(tmp, &auth.UserIdentity{Username: r.Username, Hostname: r.Hostname}) + } + parser.yyVAL.statement = &ast.DropUserStmt{IsDropRole: true, IfExists: true, UserList: tmp} + } + case 349: + { + parser.yyVAL.statement = &ast.DropStatsStmt{Table: yyS[yypt-0].item.(*ast.TableName)} + } + case 357: + { + parser.yyVAL.statement = nil + } + case 358: + { + parser.yyVAL.statement = &ast.TraceStmt{ + Stmt: yyS[yypt-0].statement, + Format: "json", + } + startOffset := parser.startOffset(&yyS[yypt]) + yyS[yypt-0].statement.SetText(string(parser.src[startOffset:])) + } + case 359: + { + parser.yyVAL.statement = &ast.TraceStmt{ + Stmt: yyS[yypt-0].statement, + Format: yyS[yypt-1].ident, + } + startOffset := parser.startOffset(&yyS[yypt]) + yyS[yypt-0].statement.SetText(string(parser.src[startOffset:])) + } + case 363: + { + parser.yyVAL.statement = &ast.ExplainStmt{ + Stmt: &ast.ShowStmt{ + Tp: ast.ShowColumns, + Table: yyS[yypt-0].item.(*ast.TableName), + }, + } + } + case 364: + { + parser.yyVAL.statement = &ast.ExplainStmt{ + Stmt: &ast.ShowStmt{ + Tp: ast.ShowColumns, + Table: yyS[yypt-1].item.(*ast.TableName), + Column: yyS[yypt-0].item.(*ast.ColumnName), + }, + } + } + case 365: + { + parser.yyVAL.statement = &ast.ExplainStmt{ + Stmt: yyS[yypt-0].statement, + Format: "row", + } + } + case 366: + { + parser.yyVAL.statement = &ast.ExplainForStmt{ + Format: "row", + ConnectionID: getUint64FromNUM(yyS[yypt-0].item), + } + } + case 367: + { + parser.yyVAL.statement = &ast.ExplainForStmt{ + Format: yyS[yypt-3].ident, + ConnectionID: getUint64FromNUM(yyS[yypt-0].item), + } + } + case 368: + { + parser.yyVAL.statement = &ast.ExplainStmt{ + Stmt: yyS[yypt-0].statement, + Format: yyS[yypt-1].ident, + } + } + case 369: + { + parser.yyVAL.statement = &ast.ExplainForStmt{ + Format: yyS[yypt-3].item.(string), + ConnectionID: getUint64FromNUM(yyS[yypt-0].item), + } + } + case 370: + { + parser.yyVAL.statement = &ast.ExplainStmt{ + Stmt: yyS[yypt-0].statement, + Format: yyS[yypt-1].item.(string), + } + } + case 371: + { + parser.yyVAL.statement = &ast.ExplainStmt{ + Stmt: yyS[yypt-0].statement, + Format: "row", + Analyze: true, + } + } + case 372: + { + parser.yyVAL.item = "row" + } + case 373: + { + parser.yyVAL.item = "json" + } + case 374: + { + parser.yyVAL.item = getUint64FromNUM(yyS[yypt-0].item) + } + case 376: + { + v := yyS[yypt-2].ident + v = strings.TrimPrefix(v, "@") + parser.yyVAL.expr = &ast.VariableExpr{ + Name: v, + IsGlobal: false, + IsSystem: false, + Value: yyS[yypt-0].expr, + } + } + case 377: + { + parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.LogicOr, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} + } + case 378: + { + parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.LogicXor, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} + } + case 379: + { + parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.LogicAnd, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} + } + case 380: + { + expr, ok := yyS[yypt-0].expr.(*ast.ExistsSubqueryExpr) + if ok { + expr.Not = true + parser.yyVAL.expr = yyS[yypt-0].expr + } else { + parser.yyVAL.expr = &ast.UnaryOperationExpr{Op: opcode.Not, V: yyS[yypt-0].expr} + } + } + case 381: + { + parser.yyVAL.expr = &ast.IsTruthExpr{Expr: yyS[yypt-2].expr, Not: !yyS[yypt-1].item.(bool), True: int64(1)} + } + case 382: + { + parser.yyVAL.expr = &ast.IsTruthExpr{Expr: yyS[yypt-2].expr, Not: !yyS[yypt-1].item.(bool), True: int64(0)} + } + case 383: + { + /* https://dev.mysql.com/doc/refman/5.7/en/comparison-operators.html#operator_is */ + parser.yyVAL.expr = &ast.IsNullExpr{Expr: yyS[yypt-2].expr, Not: !yyS[yypt-1].item.(bool)} + } + case 385: + { + parser.yyVAL.expr = &ast.MaxValueExpr{} + } + case 386: + { + parser.yyVAL.expr = yyS[yypt-0].expr + } + case 391: + { + parser.yyVAL.item = []ast.ExprNode{yyS[yypt-0].expr} + } + case 392: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]ast.ExprNode), yyS[yypt-0].expr) + } + case 393: + { + parser.yyVAL.item = []ast.ExprNode{yyS[yypt-0].expr} + } + case 394: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]ast.ExprNode), yyS[yypt-0].expr) + } + case 395: + { + parser.yyVAL.item = []ast.ExprNode{} + } + case 397: + { + parser.yyVAL.item = []ast.ExprNode{} + } + case 398: + { + parser.yyVAL.item = yyS[yypt-0].item + } + case 399: + { + expr := ast.NewValueExpr(yyS[yypt-0].item) + parser.yyVAL.item = []ast.ExprNode{expr} + } + case 400: + { + parser.yyVAL.expr = &ast.IsNullExpr{Expr: yyS[yypt-2].expr, Not: !yyS[yypt-1].item.(bool)} + } + case 401: + { + parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: yyS[yypt-1].item.(opcode.Op), L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} + } + case 402: + { + sq := yyS[yypt-0].expr.(*ast.SubqueryExpr) + sq.MultiRows = true + parser.yyVAL.expr = &ast.CompareSubqueryExpr{Op: yyS[yypt-2].item.(opcode.Op), L: yyS[yypt-3].expr, R: sq, All: yyS[yypt-1].item.(bool)} + } + case 403: + { + v := yyS[yypt-2].ident + v = strings.TrimPrefix(v, "@") + variable := &ast.VariableExpr{ + Name: v, + IsGlobal: false, + IsSystem: false, + Value: yyS[yypt-0].expr, + } + parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: yyS[yypt-3].item.(opcode.Op), L: yyS[yypt-4].expr, R: variable} + } + case 405: + { + parser.yyVAL.item = opcode.GE + } + case 406: + { + parser.yyVAL.item = opcode.GT + } + case 407: + { + parser.yyVAL.item = opcode.LE + } + case 408: + { + parser.yyVAL.item = opcode.LT + } + case 409: + { + parser.yyVAL.item = opcode.NE + } + case 410: + { + parser.yyVAL.item = opcode.NE + } + case 411: + { + parser.yyVAL.item = opcode.EQ + } + case 412: + { + parser.yyVAL.item = opcode.NullEQ + } + case 413: + { + parser.yyVAL.item = true + } + case 414: + { + parser.yyVAL.item = false + } + case 415: + { + parser.yyVAL.item = true + } + case 416: + { + parser.yyVAL.item = false + } + case 417: + { + parser.yyVAL.item = true + } + case 418: + { + parser.yyVAL.item = false + } + case 419: + { + parser.yyVAL.item = true + } + case 420: + { + parser.yyVAL.item = false + } + case 421: + { + parser.yyVAL.item = true + } + case 422: + { + parser.yyVAL.item = false + } + case 423: + { + parser.yyVAL.item = false + } + case 424: + { + parser.yyVAL.item = false + } + case 425: + { + parser.yyVAL.item = true + } + case 426: + { + parser.yyVAL.expr = &ast.PatternInExpr{Expr: yyS[yypt-4].expr, Not: !yyS[yypt-3].item.(bool), List: yyS[yypt-1].item.([]ast.ExprNode)} + } + case 427: + { + sq := yyS[yypt-0].expr.(*ast.SubqueryExpr) + sq.MultiRows = true + parser.yyVAL.expr = &ast.PatternInExpr{Expr: yyS[yypt-2].expr, Not: !yyS[yypt-1].item.(bool), Sel: sq} + } + case 428: + { + parser.yyVAL.expr = &ast.BetweenExpr{ + Expr: yyS[yypt-4].expr, + Left: yyS[yypt-2].expr, + Right: yyS[yypt-0].expr, + Not: !yyS[yypt-3].item.(bool), + } + } + case 429: + { + escape := yyS[yypt-0].item.(string) + if len(escape) > 1 { + yylex.AppendError(ErrWrongArguments.GenWithStackByArgs("ESCAPE")) + return 1 + } else if len(escape) == 0 { + escape = "\\" + } + parser.yyVAL.expr = &ast.PatternLikeExpr{ + Expr: yyS[yypt-3].expr, + Pattern: yyS[yypt-1].expr, + Not: !yyS[yypt-2].item.(bool), + Escape: escape[0], + } + } + case 430: + { + parser.yyVAL.expr = &ast.PatternRegexpExpr{Expr: yyS[yypt-2].expr, Pattern: yyS[yypt-0].expr, Not: !yyS[yypt-1].item.(bool)} + } + case 434: + { + parser.yyVAL.item = "\\" + } + case 435: + { + parser.yyVAL.item = yyS[yypt-0].ident + } + case 436: + { + parser.yyVAL.item = &ast.SelectField{WildCard: &ast.WildCardField{}} + } + case 437: + { + wildCard := &ast.WildCardField{Table: model.NewCIStr(yyS[yypt-2].ident)} + parser.yyVAL.item = &ast.SelectField{WildCard: wildCard} + } + case 438: + { + wildCard := &ast.WildCardField{Schema: model.NewCIStr(yyS[yypt-4].ident), Table: model.NewCIStr(yyS[yypt-2].ident)} + parser.yyVAL.item = &ast.SelectField{WildCard: wildCard} + } + case 439: + { + expr := yyS[yypt-1].expr + asName := yyS[yypt-0].item.(string) + parser.yyVAL.item = &ast.SelectField{Expr: expr, AsName: model.NewCIStr(asName)} + } + case 440: + { + /* + * ODBC escape syntax. + * See https://dev.mysql.com/doc/refman/5.7/en/expressions.html + */ + expr := yyS[yypt-2].expr + asName := yyS[yypt-0].item.(string) + parser.yyVAL.item = &ast.SelectField{Expr: expr, AsName: model.NewCIStr(asName)} + } + case 441: + { + parser.yyVAL.item = "" + } + case 442: + { + parser.yyVAL.item = yyS[yypt-0].item + } + case 443: + { + parser.yyVAL.item = yyS[yypt-0].ident + } + case 444: + { + parser.yyVAL.item = yyS[yypt-0].ident + } + case 445: + { + parser.yyVAL.item = yyS[yypt-0].ident + } + case 446: + { + parser.yyVAL.item = yyS[yypt-0].ident + } + case 447: + { + field := yyS[yypt-0].item.(*ast.SelectField) + field.Offset = parser.startOffset(&yyS[yypt]) + parser.yyVAL.item = []*ast.SelectField{field} + } + case 448: + { + + fl := yyS[yypt-2].item.([]*ast.SelectField) + last := fl[len(fl)-1] + if last.Expr != nil && last.AsName.O == "" { + lastEnd := parser.endOffset(&yyS[yypt-1]) + last.SetText(parser.src[last.Offset:lastEnd]) + } + newField := yyS[yypt-0].item.(*ast.SelectField) + newField.Offset = parser.startOffset(&yyS[yypt]) + parser.yyVAL.item = append(fl, newField) + } + case 449: + { + parser.yyVAL.item = &ast.GroupByClause{Items: yyS[yypt-0].item.([]*ast.ByItem)} + } + case 450: + { + parser.yyVAL.item = nil + } + case 451: + { + parser.yyVAL.item = &ast.HavingClause{Expr: yyS[yypt-0].expr} + } + case 452: + { + parser.yyVAL.item = false + } + case 453: + { + parser.yyVAL.item = true + } + case 454: + { + parser.yyVAL.item = false + } + case 455: + { + parser.yyVAL.item = true + } + case 456: + { + parser.yyVAL.item = false + } + case 457: + { + parser.yyVAL.item = true + } + case 458: + { + parser.yyVAL.item = "" + } + case 459: + { + //"index name" + parser.yyVAL.item = yyS[yypt-0].ident + } + case 460: + { + parser.yyVAL.item = nil + } + case 461: + { + // Merge the options + if yyS[yypt-1].item == nil { + parser.yyVAL.item = yyS[yypt-0].item + } else { + opt1 := yyS[yypt-1].item.(*ast.IndexOption) + opt2 := yyS[yypt-0].item.(*ast.IndexOption) + if len(opt2.Comment) > 0 { + opt1.Comment = opt2.Comment + } else if opt2.Tp != 0 { + opt1.Tp = opt2.Tp + } else if opt2.KeyBlockSize > 0 { + opt1.KeyBlockSize = opt2.KeyBlockSize + } else if len(opt2.ParserName.O) > 0 { + opt1.ParserName = opt2.ParserName + } else if opt2.Visibility != ast.IndexVisibilityDefault { + opt1.Visibility = opt2.Visibility + } + parser.yyVAL.item = opt1 + } + } + case 462: + { + parser.yyVAL.item = &ast.IndexOption{ + KeyBlockSize: yyS[yypt-0].item.(uint64), + } + } + case 463: + { + parser.yyVAL.item = &ast.IndexOption{ + Tp: yyS[yypt-0].item.(model.IndexType), + } + } + case 464: + { + parser.yyVAL.item = &ast.IndexOption{ + ParserName: model.NewCIStr(yyS[yypt-0].ident), + } + yylex.AppendError(yylex.Errorf("The WITH PARASER clause is parsed but ignored by all storage engines.")) + parser.lastErrorAsWarn() + } + case 465: + { + parser.yyVAL.item = &ast.IndexOption{ + Comment: yyS[yypt-0].ident, + } + } + case 466: + { + parser.yyVAL.item = &ast.IndexOption{ + Visibility: yyS[yypt-0].item.(ast.IndexVisibility), + } + } + case 467: + { + parser.yyVAL.item = []interface{}{yyS[yypt-0].item, nil} + } + case 468: + { + parser.yyVAL.item = []interface{}{yyS[yypt-2].item, yyS[yypt-0].item} + } + case 469: + { + parser.yyVAL.item = []interface{}{yyS[yypt-2].ident, yyS[yypt-0].item} + } + case 470: + { + parser.yyVAL.item = nil + } + case 471: + { + parser.yyVAL.item = yyS[yypt-0].item + } + case 472: + { + parser.yyVAL.item = yyS[yypt-0].item + } + case 473: + { + parser.yyVAL.item = yyS[yypt-0].item + } + case 474: + { + parser.yyVAL.item = model.IndexTypeBtree + } + case 475: + { + parser.yyVAL.item = model.IndexTypeHash + } + case 476: + { + parser.yyVAL.item = model.IndexTypeRtree + } + case 477: + { + parser.yyVAL.item = ast.IndexVisibilityVisible + } + case 478: + { + parser.yyVAL.item = ast.IndexVisibilityInvisible + } + case 808: + { + x := yyS[yypt-1].item.(*ast.InsertStmt) + x.Priority = yyS[yypt-5].item.(mysql.PriorityEnum) + x.IgnoreErr = yyS[yypt-4].item.(bool) + // Wraps many layers here so that it can be processed the same way as select statement. + ts := &ast.TableSource{Source: yyS[yypt-2].item.(*ast.TableName)} + x.Table = &ast.TableRefsClause{TableRefs: &ast.Join{Left: ts}} + if yyS[yypt-0].item != nil { + x.OnDuplicate = yyS[yypt-0].item.([]*ast.Assignment) + } + parser.yyVAL.statement = x + } + case 811: + { + parser.yyVAL.item = &ast.InsertStmt{ + Columns: yyS[yypt-3].item.([]*ast.ColumnName), + Lists: yyS[yypt-0].item.([][]ast.ExprNode), + } + } + case 812: + { + parser.yyVAL.item = &ast.InsertStmt{Columns: yyS[yypt-2].item.([]*ast.ColumnName), Select: yyS[yypt-0].statement.(*ast.SelectStmt)} + } + case 813: + { + parser.yyVAL.item = &ast.InsertStmt{Columns: yyS[yypt-4].item.([]*ast.ColumnName), Select: yyS[yypt-1].statement.(*ast.SelectStmt)} + } + case 814: + { + parser.yyVAL.item = &ast.InsertStmt{Columns: yyS[yypt-2].item.([]*ast.ColumnName), Select: yyS[yypt-0].statement.(*ast.UnionStmt)} + } + case 815: + { + parser.yyVAL.item = &ast.InsertStmt{Lists: yyS[yypt-0].item.([][]ast.ExprNode)} + } + case 816: + { + parser.yyVAL.item = &ast.InsertStmt{Select: yyS[yypt-1].statement.(*ast.SelectStmt)} + } + case 817: + { + parser.yyVAL.item = &ast.InsertStmt{Select: yyS[yypt-0].statement.(*ast.SelectStmt)} + } + case 818: + { + parser.yyVAL.item = &ast.InsertStmt{Select: yyS[yypt-0].statement.(*ast.UnionStmt)} + } + case 819: + { + parser.yyVAL.item = &ast.InsertStmt{Setlist: yyS[yypt-0].item.([]*ast.Assignment)} + } + case 822: + { + parser.yyVAL.item = [][]ast.ExprNode{yyS[yypt-0].item.([]ast.ExprNode)} + } + case 823: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([][]ast.ExprNode), yyS[yypt-0].item.([]ast.ExprNode)) + } + case 824: + { + parser.yyVAL.item = yyS[yypt-1].item + } + case 825: + { + parser.yyVAL.item = []ast.ExprNode{} + } + case 827: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]ast.ExprNode), yyS[yypt-0].expr) + } + case 828: + { + parser.yyVAL.item = []ast.ExprNode{yyS[yypt-0].expr} + } + case 830: + { + parser.yyVAL.expr = &ast.DefaultExpr{} + } + case 831: + { + parser.yyVAL.item = &ast.Assignment{ + Column: yyS[yypt-2].item.(*ast.ColumnName), + Expr: yyS[yypt-0].expr, + } + } + case 832: + { + parser.yyVAL.item = []*ast.Assignment{} + } + case 833: + { + parser.yyVAL.item = []*ast.Assignment{yyS[yypt-0].item.(*ast.Assignment)} + } + case 834: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.Assignment), yyS[yypt-0].item.(*ast.Assignment)) + } + case 835: + { + parser.yyVAL.item = nil + } + case 836: + { + parser.yyVAL.item = yyS[yypt-0].item + } + case 837: + { + x := yyS[yypt-0].item.(*ast.InsertStmt) + x.IsReplace = true + x.Priority = yyS[yypt-3].item.(mysql.PriorityEnum) + ts := &ast.TableSource{Source: yyS[yypt-1].item.(*ast.TableName)} + x.Table = &ast.TableRefsClause{TableRefs: &ast.Join{Left: ts}} + parser.yyVAL.statement = x + } + case 838: + { + parser.yyVAL.ident = ast.DateLiteral + } + case 839: + { + parser.yyVAL.ident = ast.TimeLiteral + } + case 840: + { + parser.yyVAL.ident = ast.TimestampLiteral + } + case 841: + { + parser.yyVAL.expr = ast.NewValueExpr(false) + } + case 842: + { + parser.yyVAL.expr = ast.NewValueExpr(nil) + } + case 843: + { + parser.yyVAL.expr = ast.NewValueExpr(true) + } + case 844: + { + parser.yyVAL.expr = ast.NewValueExpr(yyS[yypt-0].item) + } + case 845: + { + parser.yyVAL.expr = ast.NewValueExpr(yyS[yypt-0].item) + } + case 846: + { + parser.yyVAL.expr = ast.NewValueExpr(yyS[yypt-0].item) + } + case 847: + { + parser.yyVAL.expr = yyS[yypt-0].expr + } + case 848: + { + // See https://dev.mysql.com/doc/refman/5.7/en/charset-literal.html + co, err := charset.GetDefaultCollation(yyS[yypt-1].ident) + if err != nil { + yylex.AppendError(yylex.Errorf("Get collation error for charset: %s", yyS[yypt-1].ident)) + return 1 + } + expr := ast.NewValueExpr(yyS[yypt-0].ident) + tp := expr.GetType() + tp.Charset = yyS[yypt-1].ident + tp.Collate = co + if tp.Collate == charset.CollationBin { + tp.Flag |= mysql.BinaryFlag + } + parser.yyVAL.expr = expr + } + case 849: + { + parser.yyVAL.expr = ast.NewValueExpr(yyS[yypt-0].item) + } + case 850: + { + parser.yyVAL.expr = ast.NewValueExpr(yyS[yypt-0].item) + } + case 851: + { + expr := ast.NewValueExpr(yyS[yypt-0].ident) + parser.yyVAL.expr = expr + } + case 852: + { + valExpr := yyS[yypt-1].expr.(ast.ValueExpr) + strLit := valExpr.GetString() + expr := ast.NewValueExpr(strLit + yyS[yypt-0].ident) + // Fix #4239, use first string literal as projection name. + if valExpr.GetProjectionOffset() >= 0 { + expr.SetProjectionOffset(valExpr.GetProjectionOffset()) + } else { + expr.SetProjectionOffset(len(strLit)) + } + parser.yyVAL.expr = expr + } + case 853: + { + parser.yyVAL.item = []*ast.AlterOrderItem{yyS[yypt-0].item.(*ast.AlterOrderItem)} + } + case 854: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.AlterOrderItem), yyS[yypt-0].item.(*ast.AlterOrderItem)) + } + case 855: + { + parser.yyVAL.item = &ast.AlterOrderItem{Column: yyS[yypt-1].item.(*ast.ColumnName), Desc: yyS[yypt-0].item.(bool)} + } + case 856: + { + parser.yyVAL.item = &ast.OrderByClause{Items: yyS[yypt-0].item.([]*ast.ByItem)} + } + case 857: + { + parser.yyVAL.item = []*ast.ByItem{yyS[yypt-0].item.(*ast.ByItem)} + } + case 858: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.ByItem), yyS[yypt-0].item.(*ast.ByItem)) + } + case 859: + { + expr := yyS[yypt-1].expr + valueExpr, ok := expr.(ast.ValueExpr) + if ok { + position, isPosition := valueExpr.GetValue().(int64) + if isPosition { + expr = &ast.PositionExpr{N: int(position)} + } + } + parser.yyVAL.item = &ast.ByItem{Expr: expr, Desc: yyS[yypt-0].item.(bool)} + } + case 860: + { + parser.yyVAL.item = false // ASC by default + } + case 861: + { + parser.yyVAL.item = false + } + case 862: + { + parser.yyVAL.item = true + } + case 863: + { + parser.yyVAL.item = nil + } + case 864: + { + parser.yyVAL.item = yyS[yypt-0].item + } + case 865: + { + parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.Or, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} + } + case 866: + { + parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.And, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} + } + case 867: + { + parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.LeftShift, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} + } + case 868: + { + parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.RightShift, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} + } + case 869: + { + parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.Plus, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} + } + case 870: + { + parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.Minus, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} + } + case 871: + { + parser.yyVAL.expr = &ast.FuncCallExpr{ + FnName: model.NewCIStr("DATE_ADD"), + Args: []ast.ExprNode{ + yyS[yypt-4].expr, + yyS[yypt-1].expr, + &ast.TimeUnitExpr{Unit: yyS[yypt-0].item.(ast.TimeUnitType)}, + }, + } + } + case 872: + { + parser.yyVAL.expr = &ast.FuncCallExpr{ + FnName: model.NewCIStr("DATE_SUB"), + Args: []ast.ExprNode{ + yyS[yypt-4].expr, + yyS[yypt-1].expr, + &ast.TimeUnitExpr{Unit: yyS[yypt-0].item.(ast.TimeUnitType)}, + }, + } + } + case 873: + { + parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.Mul, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} + } + case 874: + { + parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.Div, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} + } + case 875: + { + parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.Mod, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} + } + case 876: + { + parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.IntDiv, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} + } + case 877: + { + parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.Mod, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} + } + case 878: + { + parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.Xor, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} + } + case 880: + { + parser.yyVAL.expr = &ast.ColumnNameExpr{Name: &ast.ColumnName{ + Name: model.NewCIStr(yyS[yypt-0].ident), + }} + } + case 881: + { + parser.yyVAL.expr = &ast.ColumnNameExpr{Name: &ast.ColumnName{ + Table: model.NewCIStr(yyS[yypt-2].ident), + Name: model.NewCIStr(yyS[yypt-0].ident), + }} + } + case 882: + { + parser.yyVAL.expr = &ast.ColumnNameExpr{Name: &ast.ColumnName{ + Table: model.NewCIStr(yyS[yypt-2].ident), + Name: model.NewCIStr(yyS[yypt-0].ident), + }} + } + case 883: + { + parser.yyVAL.expr = &ast.ColumnNameExpr{Name: &ast.ColumnName{ + Schema: model.NewCIStr(yyS[yypt-4].ident), + Table: model.NewCIStr(yyS[yypt-2].ident), + Name: model.NewCIStr(yyS[yypt-0].ident), + }} + } + case 888: + { + // TODO: Create a builtin function hold expr and collation. When do evaluation, convert expr result using the collation. + parser.yyVAL.expr = yyS[yypt-2].expr + } + case 889: + { + parser.yyVAL.expr = yyS[yypt-0].item.(*ast.WindowFuncExpr) + } + case 891: + { + parser.yyVAL.expr = ast.NewParamMarkerExpr(yyS[yypt].offset) + } + case 894: + { + parser.yyVAL.expr = &ast.UnaryOperationExpr{Op: opcode.Not, V: yyS[yypt-0].expr} + } + case 895: + { + parser.yyVAL.expr = &ast.UnaryOperationExpr{Op: opcode.BitNeg, V: yyS[yypt-0].expr} + } + case 896: + { + parser.yyVAL.expr = &ast.UnaryOperationExpr{Op: opcode.Minus, V: yyS[yypt-0].expr} + } + case 897: + { + parser.yyVAL.expr = &ast.UnaryOperationExpr{Op: opcode.Plus, V: yyS[yypt-0].expr} + } + case 898: + { + parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(ast.Concat), Args: []ast.ExprNode{yyS[yypt-2].expr, yyS[yypt-0].expr}} + } + case 899: + { + parser.yyVAL.expr = &ast.UnaryOperationExpr{Op: opcode.Not, V: yyS[yypt-0].expr} + } + case 901: + { + startOffset := parser.startOffset(&yyS[yypt-1]) + endOffset := parser.endOffset(&yyS[yypt]) + expr := yyS[yypt-1].expr + expr.SetText(parser.src[startOffset:endOffset]) + parser.yyVAL.expr = &ast.ParenthesesExpr{Expr: expr} + } + case 902: + { + values := append(yyS[yypt-3].item.([]ast.ExprNode), yyS[yypt-1].expr) + parser.yyVAL.expr = &ast.RowExpr{Values: values} + } + case 903: + { + values := append(yyS[yypt-3].item.([]ast.ExprNode), yyS[yypt-1].expr) + parser.yyVAL.expr = &ast.RowExpr{Values: values} + } + case 904: + { + sq := yyS[yypt-0].expr.(*ast.SubqueryExpr) + sq.Exists = true + parser.yyVAL.expr = &ast.ExistsSubqueryExpr{Sel: sq} + } + case 905: + { + // See https://dev.mysql.com/doc/refman/5.7/en/cast-functions.html#operator_binary + x := types.NewFieldType(mysql.TypeString) + x.Charset = charset.CharsetBin + x.Collate = charset.CharsetBin + parser.yyVAL.expr = &ast.FuncCastExpr{ + Expr: yyS[yypt-0].expr, + Tp: x, + FunctionType: ast.CastBinaryOperator, + } + } + case 906: + { + /* See https://dev.mysql.com/doc/refman/5.7/en/cast-functions.html#function_cast */ + tp := yyS[yypt-1].item.(*types.FieldType) + defaultFlen, defaultDecimal := mysql.GetDefaultFieldLengthAndDecimalForCast(tp.Tp) + if tp.Flen == types.UnspecifiedLength { + tp.Flen = defaultFlen + } + if tp.Decimal == types.UnspecifiedLength { + tp.Decimal = defaultDecimal + } + parser.yyVAL.expr = &ast.FuncCastExpr{ + Expr: yyS[yypt-3].expr, + Tp: tp, + FunctionType: ast.CastFunction, + } + } + case 907: + { + x := &ast.CaseExpr{WhenClauses: yyS[yypt-2].item.([]*ast.WhenClause)} + if yyS[yypt-3].expr != nil { + x.Value = yyS[yypt-3].expr + } + if yyS[yypt-1].item != nil { + x.ElseClause = yyS[yypt-1].item.(ast.ExprNode) + } + parser.yyVAL.expr = x + } + case 908: + { + // See https://dev.mysql.com/doc/refman/5.7/en/cast-functions.html#function_convert + tp := yyS[yypt-1].item.(*types.FieldType) + defaultFlen, defaultDecimal := mysql.GetDefaultFieldLengthAndDecimalForCast(tp.Tp) + if tp.Flen == types.UnspecifiedLength { + tp.Flen = defaultFlen + } + if tp.Decimal == types.UnspecifiedLength { + tp.Decimal = defaultDecimal + } + parser.yyVAL.expr = &ast.FuncCastExpr{ + Expr: yyS[yypt-3].expr, + Tp: tp, + FunctionType: ast.CastConvertFunction, + } + } + case 909: + { + // See https://dev.mysql.com/doc/refman/5.7/en/cast-functions.html#function_convert + charset1 := ast.NewValueExpr(yyS[yypt-1].item) + parser.yyVAL.expr = &ast.FuncCallExpr{ + FnName: model.NewCIStr(yyS[yypt-5].ident), + Args: []ast.ExprNode{yyS[yypt-3].expr, charset1}, + } + } + case 910: + { + parser.yyVAL.expr = &ast.DefaultExpr{Name: yyS[yypt-1].expr.(*ast.ColumnNameExpr).Name} + } + case 911: + { + parser.yyVAL.expr = &ast.ValuesExpr{Column: yyS[yypt-1].expr.(*ast.ColumnNameExpr)} + } + case 912: + { + expr := ast.NewValueExpr(yyS[yypt-0].ident) + parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(ast.JSONExtract), Args: []ast.ExprNode{yyS[yypt-2].expr, expr}} + } + case 913: + { + expr := ast.NewValueExpr(yyS[yypt-0].ident) + extract := &ast.FuncCallExpr{FnName: model.NewCIStr(ast.JSONExtract), Args: []ast.ExprNode{yyS[yypt-2].expr, expr}} + parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(ast.JSONUnquote), Args: []ast.ExprNode{extract}} + } + case 916: + { + parser.yyVAL.item = false + } + case 917: + { + parser.yyVAL.item = true + } + case 918: + { + parser.yyVAL.item = false + } + case 920: + { + parser.yyVAL.item = true + } + case 923: + { + parser.yyVAL.item = true + } + case 965: + { + parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-3].ident), Args: yyS[yypt-1].item.([]ast.ExprNode)} + } + case 966: + { + parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-3].ident), Args: yyS[yypt-1].item.([]ast.ExprNode)} + } + case 967: + { + parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-1].ident)} + } + case 968: + { + parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-2].ident)} + } + case 969: + { + args := []ast.ExprNode{} + if yyS[yypt-0].item != nil { + args = append(args, yyS[yypt-0].item.(ast.ExprNode)) + } + parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-1].ident), Args: args} + } + case 970: + { + nilVal := ast.NewValueExpr(nil) + args := yyS[yypt-1].item.([]ast.ExprNode) + parser.yyVAL.expr = &ast.FuncCallExpr{ + FnName: model.NewCIStr(ast.CharFunc), + Args: append(args, nilVal), + } + } + case 971: + { + charset1 := ast.NewValueExpr(yyS[yypt-1].item) + args := yyS[yypt-3].item.([]ast.ExprNode) + parser.yyVAL.expr = &ast.FuncCallExpr{ + FnName: model.NewCIStr(ast.CharFunc), + Args: append(args, charset1), + } + } + case 972: + { + expr := ast.NewValueExpr(yyS[yypt-0].ident) + parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(ast.DateLiteral), Args: []ast.ExprNode{expr}} + } + case 973: + { + expr := ast.NewValueExpr(yyS[yypt-0].ident) + parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(ast.TimeLiteral), Args: []ast.ExprNode{expr}} + } + case 974: + { + expr := ast.NewValueExpr(yyS[yypt-0].ident) + parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(ast.TimestampLiteral), Args: []ast.ExprNode{expr}} + } + case 975: + { + parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(ast.InsertFunc), Args: yyS[yypt-1].item.([]ast.ExprNode)} + } + case 976: + { + parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.Mod, L: yyS[yypt-3].expr, R: yyS[yypt-1].expr} + } + case 977: + { + parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(ast.PasswordFunc), Args: yyS[yypt-1].item.([]ast.ExprNode)} + } + case 978: + { + // This is ODBC syntax for date and time literals. + // See: https://dev.mysql.com/doc/refman/5.7/en/date-and-time-literals.html + expr := ast.NewValueExpr(yyS[yypt-1].ident) + parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-2].ident), Args: []ast.ExprNode{expr}} + } + case 979: + { + parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-3].ident), Args: yyS[yypt-1].item.([]ast.ExprNode)} + } + case 980: + { + parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-3].ident), Args: yyS[yypt-1].item.([]ast.ExprNode)} + } + case 981: + { + parser.yyVAL.expr = &ast.FuncCallExpr{ + FnName: model.NewCIStr(yyS[yypt-5].ident), + Args: []ast.ExprNode{ + yyS[yypt-3].expr, + yyS[yypt-1].expr, + &ast.TimeUnitExpr{Unit: ast.TimeUnitDay}, + }, + } + } + case 982: + { + parser.yyVAL.expr = &ast.FuncCallExpr{ + FnName: model.NewCIStr(yyS[yypt-7].ident), + Args: []ast.ExprNode{ + yyS[yypt-5].expr, + yyS[yypt-2].expr, + &ast.TimeUnitExpr{Unit: yyS[yypt-1].item.(ast.TimeUnitType)}, + }, + } + } + case 983: + { + parser.yyVAL.expr = &ast.FuncCallExpr{ + FnName: model.NewCIStr(yyS[yypt-7].ident), + Args: []ast.ExprNode{ + yyS[yypt-5].expr, + yyS[yypt-2].expr, + &ast.TimeUnitExpr{Unit: yyS[yypt-1].item.(ast.TimeUnitType)}, + }, + } + } + case 984: + { + timeUnit := &ast.TimeUnitExpr{Unit: yyS[yypt-3].item.(ast.TimeUnitType)} + parser.yyVAL.expr = &ast.FuncCallExpr{ + FnName: model.NewCIStr(yyS[yypt-5].ident), + Args: []ast.ExprNode{timeUnit, yyS[yypt-1].expr}, + } + } + case 985: + { + parser.yyVAL.expr = &ast.FuncCallExpr{ + FnName: model.NewCIStr(yyS[yypt-5].ident), + Args: []ast.ExprNode{ + &ast.GetFormatSelectorExpr{Selector: yyS[yypt-3].item.(ast.GetFormatSelectorType)}, + yyS[yypt-1].expr, + }, + } + } + case 986: + { + parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-5].ident), Args: []ast.ExprNode{yyS[yypt-3].expr, yyS[yypt-1].expr}} + } + case 987: + { + parser.yyVAL.expr = &ast.FuncCallExpr{ + FnName: model.NewCIStr(yyS[yypt-5].ident), + Args: []ast.ExprNode{yyS[yypt-3].expr, yyS[yypt-1].expr}, + } + } + case 988: + { + parser.yyVAL.expr = &ast.FuncCallExpr{ + FnName: model.NewCIStr(yyS[yypt-5].ident), + Args: []ast.ExprNode{yyS[yypt-3].expr, yyS[yypt-1].expr}, + } + } + case 989: + { + parser.yyVAL.expr = &ast.FuncCallExpr{ + FnName: model.NewCIStr(yyS[yypt-7].ident), + Args: []ast.ExprNode{yyS[yypt-5].expr, yyS[yypt-3].expr, yyS[yypt-1].expr}, + } + } + case 990: + { + parser.yyVAL.expr = &ast.FuncCallExpr{ + FnName: model.NewCIStr(yyS[yypt-7].ident), + Args: []ast.ExprNode{yyS[yypt-5].expr, yyS[yypt-3].expr, yyS[yypt-1].expr}, + } + } + case 991: + { + parser.yyVAL.expr = &ast.FuncCallExpr{ + FnName: model.NewCIStr(yyS[yypt-7].ident), + Args: []ast.ExprNode{&ast.TimeUnitExpr{Unit: yyS[yypt-5].item.(ast.TimeUnitType)}, yyS[yypt-3].expr, yyS[yypt-1].expr}, + } + } + case 992: + { + parser.yyVAL.expr = &ast.FuncCallExpr{ + FnName: model.NewCIStr(yyS[yypt-7].ident), + Args: []ast.ExprNode{&ast.TimeUnitExpr{Unit: yyS[yypt-5].item.(ast.TimeUnitType)}, yyS[yypt-3].expr, yyS[yypt-1].expr}, + } + } + case 993: + { + parser.yyVAL.expr = &ast.FuncCallExpr{ + FnName: model.NewCIStr(yyS[yypt-3].ident), + Args: []ast.ExprNode{yyS[yypt-1].expr}, + } + } + case 994: + { + parser.yyVAL.expr = &ast.FuncCallExpr{ + FnName: model.NewCIStr(yyS[yypt-5].ident), + Args: []ast.ExprNode{yyS[yypt-1].expr, yyS[yypt-3].expr}, + } + } + case 995: + { + nilVal := ast.NewValueExpr(nil) + direction := &ast.TrimDirectionExpr{Direction: yyS[yypt-3].item.(ast.TrimDirectionType)} + parser.yyVAL.expr = &ast.FuncCallExpr{ + FnName: model.NewCIStr(yyS[yypt-5].ident), + Args: []ast.ExprNode{yyS[yypt-1].expr, nilVal, direction}, + } + } + case 996: + { + direction := &ast.TrimDirectionExpr{Direction: yyS[yypt-4].item.(ast.TrimDirectionType)} + parser.yyVAL.expr = &ast.FuncCallExpr{ + FnName: model.NewCIStr(yyS[yypt-6].ident), + Args: []ast.ExprNode{yyS[yypt-1].expr, yyS[yypt-3].expr, direction}, + } + } + case 997: + { + parser.yyVAL.item = ast.GetFormatSelectorDate + } + case 998: + { + parser.yyVAL.item = ast.GetFormatSelectorDatetime + } + case 999: + { + parser.yyVAL.item = ast.GetFormatSelectorTime + } + case 1000: + { + parser.yyVAL.item = ast.GetFormatSelectorDatetime + } + case 1005: + { + parser.yyVAL.item = ast.TrimBoth + } + case 1006: + { + parser.yyVAL.item = ast.TrimLeading + } + case 1007: + { + parser.yyVAL.item = ast.TrimTrailing + } + case 1008: + { + if yyS[yypt-0].item != nil { + parser.yyVAL.expr = &ast.WindowFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Distinct: yyS[yypt-3].item.(bool), Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} + } else { + parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Distinct: yyS[yypt-3].item.(bool)} + } + } + case 1009: + { + if yyS[yypt-0].item != nil { + parser.yyVAL.expr = &ast.WindowFuncExpr{F: yyS[yypt-4].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} + } else { + parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-4].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}} + } + } + case 1010: + { + if yyS[yypt-0].item != nil { + parser.yyVAL.expr = &ast.WindowFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} + } else { + parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}} + } + } + case 1011: + { + if yyS[yypt-0].item != nil { + parser.yyVAL.expr = &ast.WindowFuncExpr{F: yyS[yypt-4].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} + } else { + parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-4].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}} + } + } + case 1012: + { + if yyS[yypt-0].item != nil { + parser.yyVAL.expr = &ast.WindowFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} + } else { + parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}} + } + } + case 1013: + { + if yyS[yypt-0].item != nil { + parser.yyVAL.expr = &ast.WindowFuncExpr{F: yyS[yypt-4].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} + } else { + parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-4].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}} + } + } + case 1014: + { + if yyS[yypt-0].item != nil { + parser.yyVAL.expr = &ast.WindowFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} + } else { + parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}} + } + } + case 1015: + { + parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-4].ident, Args: yyS[yypt-1].item.([]ast.ExprNode), Distinct: true} + } + case 1016: + { + if yyS[yypt-0].item != nil { + parser.yyVAL.expr = &ast.WindowFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} + } else { + parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}} + } + } + case 1017: + { + if yyS[yypt-0].item != nil { + parser.yyVAL.expr = &ast.WindowFuncExpr{F: yyS[yypt-4].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} + } else { + parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-4].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}} + } + } + case 1018: + { + args := []ast.ExprNode{ast.NewValueExpr(1)} + if yyS[yypt-0].item != nil { + parser.yyVAL.expr = &ast.WindowFuncExpr{F: yyS[yypt-4].ident, Args: args, Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} + } else { + parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-4].ident, Args: args} + } + } + case 1019: + { + args := yyS[yypt-3].item.([]ast.ExprNode) + args = append(args, yyS[yypt-1].item.(ast.ExprNode)) + parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-6].ident, Args: args, Distinct: yyS[yypt-4].item.(bool)} + } + case 1020: + { + if yyS[yypt-0].item != nil { + parser.yyVAL.expr = &ast.WindowFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Distinct: yyS[yypt-3].item.(bool), Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} + } else { + parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Distinct: yyS[yypt-3].item.(bool)} + } + } + case 1021: + { + if yyS[yypt-0].item != nil { + parser.yyVAL.expr = &ast.WindowFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Distinct: yyS[yypt-3].item.(bool), Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} + } else { + parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Distinct: yyS[yypt-3].item.(bool)} + } + } + case 1022: + { + if yyS[yypt-0].item != nil { + parser.yyVAL.expr = &ast.WindowFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Distinct: yyS[yypt-3].item.(bool), Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} + } else { + parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Distinct: yyS[yypt-3].item.(bool)} + } + } + case 1023: + { + if yyS[yypt-0].item != nil { + parser.yyVAL.expr = &ast.WindowFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Distinct: yyS[yypt-3].item.(bool), Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} + } else { + parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Distinct: yyS[yypt-3].item.(bool)} + } + } + case 1024: + { + if yyS[yypt-0].item != nil { + parser.yyVAL.expr = &ast.WindowFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Distinct: yyS[yypt-3].item.(bool), Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} + } else { + parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Distinct: yyS[yypt-3].item.(bool)} + } + } + case 1025: + { + parser.yyVAL.expr = &ast.AggregateFuncExpr{F: ast.AggFuncVarPop, Args: []ast.ExprNode{yyS[yypt-2].expr}, Distinct: yyS[yypt-3].item.(bool)} + } + case 1026: + { + parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Distinct: yyS[yypt-3].item.(bool)} + } + case 1027: + { + parser.yyVAL.item = ast.NewValueExpr(",") + } + case 1028: + { + parser.yyVAL.item = ast.NewValueExpr(yyS[yypt-0].ident) + } + case 1029: + { + parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-3].ident), Args: yyS[yypt-1].item.([]ast.ExprNode)} + } + case 1030: + { + parser.yyVAL.item = nil + } + case 1031: + { + parser.yyVAL.item = nil + } + case 1032: + { + expr := ast.NewValueExpr(yyS[yypt-1].item) + parser.yyVAL.item = expr + } + case 1033: + { + parser.yyVAL.item = yyS[yypt-0].item + } + case 1034: + { + parser.yyVAL.item = ast.TimeUnitSecondMicrosecond + } + case 1035: + { + parser.yyVAL.item = ast.TimeUnitMinuteMicrosecond + } + case 1036: + { + parser.yyVAL.item = ast.TimeUnitMinuteSecond + } + case 1037: + { + parser.yyVAL.item = ast.TimeUnitHourMicrosecond + } + case 1038: + { + parser.yyVAL.item = ast.TimeUnitHourSecond + } + case 1039: + { + parser.yyVAL.item = ast.TimeUnitHourMinute + } + case 1040: + { + parser.yyVAL.item = ast.TimeUnitDayMicrosecond + } + case 1041: + { + parser.yyVAL.item = ast.TimeUnitDaySecond + } + case 1042: + { + parser.yyVAL.item = ast.TimeUnitDayMinute + } + case 1043: + { + parser.yyVAL.item = ast.TimeUnitDayHour + } + case 1044: + { + parser.yyVAL.item = ast.TimeUnitYearMonth + } + case 1045: + { + parser.yyVAL.item = ast.TimeUnitMicrosecond + } + case 1046: + { + parser.yyVAL.item = ast.TimeUnitSecond + } + case 1047: + { + parser.yyVAL.item = ast.TimeUnitMinute + } + case 1048: + { + parser.yyVAL.item = ast.TimeUnitHour + } + case 1049: + { + parser.yyVAL.item = ast.TimeUnitDay + } + case 1050: + { + parser.yyVAL.item = ast.TimeUnitWeek + } + case 1051: + { + parser.yyVAL.item = ast.TimeUnitMonth + } + case 1052: + { + parser.yyVAL.item = ast.TimeUnitQuarter + } + case 1053: + { + parser.yyVAL.item = ast.TimeUnitYear + } + case 1054: + { + parser.yyVAL.item = ast.TimeUnitSecond + } + case 1055: + { + parser.yyVAL.item = ast.TimeUnitMinute + } + case 1056: + { + parser.yyVAL.item = ast.TimeUnitHour + } + case 1057: + { + parser.yyVAL.item = ast.TimeUnitDay + } + case 1058: + { + parser.yyVAL.item = ast.TimeUnitWeek + } + case 1059: + { + parser.yyVAL.item = ast.TimeUnitMonth + } + case 1060: + { + parser.yyVAL.item = ast.TimeUnitQuarter + } + case 1061: + { + parser.yyVAL.item = ast.TimeUnitYear + } + case 1062: + { + parser.yyVAL.expr = nil + } + case 1063: + { + parser.yyVAL.expr = yyS[yypt-0].expr + } + case 1064: + { + parser.yyVAL.item = []*ast.WhenClause{yyS[yypt-0].item.(*ast.WhenClause)} + } + case 1065: + { + parser.yyVAL.item = append(yyS[yypt-1].item.([]*ast.WhenClause), yyS[yypt-0].item.(*ast.WhenClause)) + } + case 1066: + { + parser.yyVAL.item = &ast.WhenClause{ + Expr: yyS[yypt-2].expr, + Result: yyS[yypt-0].expr, + } + } + case 1067: + { + parser.yyVAL.item = nil + } + case 1068: + { + parser.yyVAL.item = yyS[yypt-0].expr + } + case 1069: + { + x := types.NewFieldType(mysql.TypeVarString) + x.Flen = yyS[yypt-0].item.(int) // TODO: Flen should be the flen of expression + if x.Flen != types.UnspecifiedLength { + x.Tp = mysql.TypeString + } + x.Charset = charset.CharsetBin + x.Collate = charset.CollationBin + x.Flag |= mysql.BinaryFlag + parser.yyVAL.item = x + } + case 1070: + { + x := types.NewFieldType(mysql.TypeVarString) + x.Flen = yyS[yypt-1].item.(int) // TODO: Flen should be the flen of expression + x.Charset = yyS[yypt-0].item.(*ast.OptBinary).Charset + if yyS[yypt-0].item.(*ast.OptBinary).IsBinary { + x.Flag |= mysql.BinaryFlag + } + if x.Charset == "" { + x.Charset = mysql.DefaultCharset + x.Collate = mysql.DefaultCollationName + } + parser.yyVAL.item = x + } + case 1071: + { + x := types.NewFieldType(mysql.TypeDate) + x.Charset = charset.CharsetBin + x.Collate = charset.CollationBin + x.Flag |= mysql.BinaryFlag + parser.yyVAL.item = x + } + case 1072: + { + x := types.NewFieldType(mysql.TypeDatetime) + x.Flen, _ = mysql.GetDefaultFieldLengthAndDecimalForCast(mysql.TypeDatetime) + x.Decimal = yyS[yypt-0].item.(int) + if x.Decimal > 0 { + x.Flen = x.Flen + 1 + x.Decimal + } + x.Charset = charset.CharsetBin + x.Collate = charset.CollationBin + x.Flag |= mysql.BinaryFlag + parser.yyVAL.item = x + } + case 1073: + { + fopt := yyS[yypt-0].item.(*ast.FloatOpt) + x := types.NewFieldType(mysql.TypeNewDecimal) + x.Flen = fopt.Flen + x.Decimal = fopt.Decimal + x.Charset = charset.CharsetBin + x.Collate = charset.CollationBin + x.Flag |= mysql.BinaryFlag + parser.yyVAL.item = x + } + case 1074: + { + x := types.NewFieldType(mysql.TypeDuration) + x.Flen, _ = mysql.GetDefaultFieldLengthAndDecimalForCast(mysql.TypeDuration) + x.Decimal = yyS[yypt-0].item.(int) + if x.Decimal > 0 { + x.Flen = x.Flen + 1 + x.Decimal + } + x.Charset = charset.CharsetBin + x.Collate = charset.CollationBin + x.Flag |= mysql.BinaryFlag + parser.yyVAL.item = x + } + case 1075: + { + x := types.NewFieldType(mysql.TypeLonglong) + x.Charset = charset.CharsetBin + x.Collate = charset.CollationBin + x.Flag |= mysql.BinaryFlag + parser.yyVAL.item = x + } + case 1076: + { + x := types.NewFieldType(mysql.TypeLonglong) + x.Flag |= mysql.UnsignedFlag | mysql.BinaryFlag + x.Charset = charset.CharsetBin + x.Collate = charset.CollationBin + parser.yyVAL.item = x + } + case 1077: + { + x := types.NewFieldType(mysql.TypeJSON) + x.Flag |= mysql.BinaryFlag | (mysql.ParseToJSONFlag) + x.Charset = mysql.DefaultCharset + x.Collate = mysql.DefaultCollationName + parser.yyVAL.item = x + } + case 1078: + { + x := types.NewFieldType(mysql.TypeDouble) + x.Flen, x.Decimal = mysql.GetDefaultFieldLengthAndDecimalForCast(mysql.TypeDouble) + x.Flag |= mysql.BinaryFlag + x.Charset = charset.CharsetBin + x.Collate = charset.CollationBin + parser.yyVAL.item = x + } + case 1079: + { + x := types.NewFieldType(mysql.TypeFloat) + fopt := yyS[yypt-0].item.(*ast.FloatOpt) + if fopt.Flen >= 54 { + yylex.AppendError(ErrTooBigPrecision.GenWithStackByArgs(fopt.Flen, "CAST", 53)) + } else if fopt.Flen >= 25 { + x = types.NewFieldType(mysql.TypeDouble) + } + x.Flen, x.Decimal = mysql.GetDefaultFieldLengthAndDecimalForCast(x.Tp) + x.Flag |= mysql.BinaryFlag + x.Charset = charset.CharsetBin + x.Collate = charset.CollationBin + parser.yyVAL.item = x + } + case 1080: + { + var x *types.FieldType + if parser.lexer.GetSQLMode().HasRealAsFloatMode() { + x = types.NewFieldType(mysql.TypeFloat) + } else { + x = types.NewFieldType(mysql.TypeDouble) + } + x.Flen, x.Decimal = mysql.GetDefaultFieldLengthAndDecimalForCast(x.Tp) + x.Flag |= mysql.BinaryFlag + x.Charset = charset.CharsetBin + x.Collate = charset.CollationBin + parser.yyVAL.item = x + } + case 1081: + { + parser.yyVAL.item = mysql.NoPriority + } + case 1082: + { + parser.yyVAL.item = mysql.LowPriority + } + case 1083: + { + parser.yyVAL.item = mysql.HighPriority + } + case 1084: + { + parser.yyVAL.item = mysql.DelayedPriority + } + case 1085: + { + parser.yyVAL.item = &ast.TableName{Name: model.NewCIStr(yyS[yypt-0].ident)} + } + case 1086: + { + parser.yyVAL.item = &ast.TableName{Schema: model.NewCIStr(yyS[yypt-2].ident), Name: model.NewCIStr(yyS[yypt-0].ident)} + } + case 1087: + { + parser.yyVAL.item = &ast.TableName{Name: model.NewCIStr(yyS[yypt-2].ident)} + } + case 1088: + { + tbl := []*ast.TableName{yyS[yypt-0].item.(*ast.TableName)} + parser.yyVAL.item = tbl + } + case 1089: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.TableName), yyS[yypt-0].item.(*ast.TableName)) + } + case 1090: + { + parser.yyVAL.item = false + } + case 1091: + { + parser.yyVAL.item = true + } + case 1092: + { + var sqlText string + var sqlVar *ast.VariableExpr + switch yyS[yypt-0].item.(type) { + case string: + sqlText = yyS[yypt-0].item.(string) + case *ast.VariableExpr: + sqlVar = yyS[yypt-0].item.(*ast.VariableExpr) + } + parser.yyVAL.statement = &ast.PrepareStmt{ + Name: yyS[yypt-2].ident, + SQLText: sqlText, + SQLVar: sqlVar, + } + } + case 1093: + { + parser.yyVAL.item = yyS[yypt-0].ident + } + case 1094: + { + parser.yyVAL.item = yyS[yypt-0].expr.(interface{}) + } + case 1095: + { + parser.yyVAL.statement = &ast.ExecuteStmt{Name: yyS[yypt-0].ident} + } + case 1096: + { + parser.yyVAL.statement = &ast.ExecuteStmt{ + Name: yyS[yypt-2].ident, + UsingVars: yyS[yypt-0].item.([]ast.ExprNode), + } + } + case 1097: + { + parser.yyVAL.item = []ast.ExprNode{yyS[yypt-0].expr} + } + case 1098: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]ast.ExprNode), yyS[yypt-0].expr) + } + case 1099: + { + parser.yyVAL.statement = &ast.DeallocateStmt{Name: yyS[yypt-0].ident} + } + case 1102: + { + parser.yyVAL.statement = &ast.RollbackStmt{} + } + case 1103: + { + st := &ast.SelectStmt{ + SelectStmtOpts: yyS[yypt-1].item.(*ast.SelectStmtOpts), + Distinct: yyS[yypt-1].item.(*ast.SelectStmtOpts).Distinct, + Fields: yyS[yypt-0].item.(*ast.FieldList), + } + if st.SelectStmtOpts.TableHints != nil { + st.TableHints = st.SelectStmtOpts.TableHints + } + parser.yyVAL.item = st + } + case 1104: + { + st := yyS[yypt-2].item.(*ast.SelectStmt) + lastField := st.Fields.Fields[len(st.Fields.Fields)-1] + if lastField.Expr != nil && lastField.AsName.O == "" { + lastEnd := yyS[yypt-1].offset - 1 + lastField.SetText(parser.src[lastField.Offset:lastEnd]) + } + if yyS[yypt-0].item != nil { + st.Where = yyS[yypt-0].item.(ast.ExprNode) + } + } + case 1105: + { + st := yyS[yypt-6].item.(*ast.SelectStmt) + st.From = yyS[yypt-4].item.(*ast.TableRefsClause) + lastField := st.Fields.Fields[len(st.Fields.Fields)-1] + if lastField.Expr != nil && lastField.AsName.O == "" { + lastEnd := parser.endOffset(&yyS[yypt-5]) + lastField.SetText(parser.src[lastField.Offset:lastEnd]) + } + if yyS[yypt-3].item != nil { + st.Where = yyS[yypt-3].item.(ast.ExprNode) + } + if yyS[yypt-2].item != nil { + st.GroupBy = yyS[yypt-2].item.(*ast.GroupByClause) + } + if yyS[yypt-1].item != nil { + st.Having = yyS[yypt-1].item.(*ast.HavingClause) + } + if yyS[yypt-0].item != nil { + st.WindowSpecs = (yyS[yypt-0].item.([]ast.WindowSpec)) + } + parser.yyVAL.item = st + } + case 1106: + { + st := yyS[yypt-3].item.(*ast.SelectStmt) + st.LockTp = yyS[yypt-0].item.(ast.SelectLockType) + lastField := st.Fields.Fields[len(st.Fields.Fields)-1] + if lastField.Expr != nil && lastField.AsName.O == "" { + src := parser.src + var lastEnd int + if yyS[yypt-2].item != nil { + lastEnd = yyS[yypt-2].offset - 1 + } else if yyS[yypt-1].item != nil { + lastEnd = yyS[yypt-1].offset - 1 + } else if yyS[yypt-0].item != ast.SelectLockNone { + lastEnd = yyS[yypt].offset - 1 + } else { + lastEnd = len(src) + if src[lastEnd-1] == ';' { + lastEnd-- + } + } + lastField.SetText(src[lastField.Offset:lastEnd]) + } + if yyS[yypt-2].item != nil { + st.OrderBy = yyS[yypt-2].item.(*ast.OrderByClause) + } + if yyS[yypt-1].item != nil { + st.Limit = yyS[yypt-1].item.(*ast.Limit) + } + parser.yyVAL.statement = st + } + case 1107: + { + st := yyS[yypt-3].item.(*ast.SelectStmt) + if yyS[yypt-2].item != nil { + st.OrderBy = yyS[yypt-2].item.(*ast.OrderByClause) + } + if yyS[yypt-1].item != nil { + st.Limit = yyS[yypt-1].item.(*ast.Limit) + } + st.LockTp = yyS[yypt-0].item.(ast.SelectLockType) + parser.yyVAL.statement = st + } + case 1108: + { + st := yyS[yypt-3].item.(*ast.SelectStmt) + st.LockTp = yyS[yypt-0].item.(ast.SelectLockType) + if yyS[yypt-2].item != nil { + st.OrderBy = yyS[yypt-2].item.(*ast.OrderByClause) + } + if yyS[yypt-1].item != nil { + st.Limit = yyS[yypt-1].item.(*ast.Limit) + } + parser.yyVAL.statement = st + } + case 1110: + { + parser.yyVAL.item = nil + } + case 1111: + { + parser.yyVAL.item = yyS[yypt-0].item.([]ast.WindowSpec) + } + case 1112: + { + parser.yyVAL.item = []ast.WindowSpec{yyS[yypt-0].item.(ast.WindowSpec)} + } + case 1113: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]ast.WindowSpec), yyS[yypt-0].item.(ast.WindowSpec)) + } + case 1114: + { + var spec = yyS[yypt-0].item.(ast.WindowSpec) + spec.Name = yyS[yypt-2].item.(model.CIStr) + parser.yyVAL.item = spec + } + case 1115: + { + parser.yyVAL.item = model.NewCIStr(yyS[yypt-0].ident) + } + case 1116: + { + parser.yyVAL.item = yyS[yypt-1].item.(ast.WindowSpec) + } + case 1117: + { + spec := ast.WindowSpec{Ref: yyS[yypt-3].item.(model.CIStr)} + if yyS[yypt-2].item != nil { + spec.PartitionBy = yyS[yypt-2].item.(*ast.PartitionByClause) + } + if yyS[yypt-1].item != nil { + spec.OrderBy = yyS[yypt-1].item.(*ast.OrderByClause) + } + if yyS[yypt-0].item != nil { + spec.Frame = yyS[yypt-0].item.(*ast.FrameClause) + } + parser.yyVAL.item = spec + } + case 1118: + { + parser.yyVAL.item = model.CIStr{} + } + case 1119: + { + parser.yyVAL.item = yyS[yypt-0].item.(model.CIStr) + } + case 1120: + { + parser.yyVAL.item = nil + } + case 1121: + { + parser.yyVAL.item = &ast.PartitionByClause{Items: yyS[yypt-0].item.([]*ast.ByItem)} + } + case 1122: + { + parser.yyVAL.item = nil + } + case 1123: + { + parser.yyVAL.item = &ast.OrderByClause{Items: yyS[yypt-0].item.([]*ast.ByItem)} + } + case 1124: + { + parser.yyVAL.item = nil + } + case 1125: + { + parser.yyVAL.item = &ast.FrameClause{ + Type: yyS[yypt-1].item.(ast.FrameType), + Extent: yyS[yypt-0].item.(ast.FrameExtent), + } + } + case 1126: + { + parser.yyVAL.item = ast.FrameType(ast.Rows) + } + case 1127: + { + parser.yyVAL.item = ast.FrameType(ast.Ranges) + } + case 1128: + { + parser.yyVAL.item = ast.FrameType(ast.Groups) + } + case 1129: + { + parser.yyVAL.item = ast.FrameExtent{ + Start: yyS[yypt-0].item.(ast.FrameBound), + End: ast.FrameBound{Type: ast.CurrentRow}, + } + } + case 1130: + { + parser.yyVAL.item = yyS[yypt-0].item.(ast.FrameExtent) + } + case 1131: + { + parser.yyVAL.item = ast.FrameBound{Type: ast.Preceding, UnBounded: true} + } + case 1132: + { + parser.yyVAL.item = ast.FrameBound{Type: ast.Preceding, Expr: ast.NewValueExpr(yyS[yypt-1].item)} + } + case 1133: + { + parser.yyVAL.item = ast.FrameBound{Type: ast.Preceding, Expr: ast.NewParamMarkerExpr(yyS[yypt].offset)} + } + case 1134: + { + parser.yyVAL.item = ast.FrameBound{Type: ast.Preceding, Expr: yyS[yypt-2].expr, Unit: yyS[yypt-1].item.(ast.TimeUnitType)} + } + case 1135: + { + parser.yyVAL.item = ast.FrameBound{Type: ast.CurrentRow} + } + case 1136: + { + parser.yyVAL.item = ast.FrameExtent{Start: yyS[yypt-2].item.(ast.FrameBound), End: yyS[yypt-0].item.(ast.FrameBound)} + } + case 1137: + { + parser.yyVAL.item = yyS[yypt-0].item.(ast.FrameBound) + } + case 1138: + { + parser.yyVAL.item = ast.FrameBound{Type: ast.Following, UnBounded: true} + } + case 1139: + { + parser.yyVAL.item = ast.FrameBound{Type: ast.Following, Expr: ast.NewValueExpr(yyS[yypt-1].item)} + } + case 1140: + { + parser.yyVAL.item = ast.FrameBound{Type: ast.Following, Expr: ast.NewParamMarkerExpr(yyS[yypt].offset)} + } + case 1141: + { + parser.yyVAL.item = ast.FrameBound{Type: ast.Following, Expr: yyS[yypt-2].expr, Unit: yyS[yypt-1].item.(ast.TimeUnitType)} + } + case 1142: + { + parser.yyVAL.item = nil + } + case 1143: + { + spec := yyS[yypt-0].item.(ast.WindowSpec) + parser.yyVAL.item = &spec + } + case 1144: + { + parser.yyVAL.item = yyS[yypt-0].item.(ast.WindowSpec) + } + case 1145: + { + parser.yyVAL.item = ast.WindowSpec{Name: yyS[yypt-0].item.(model.CIStr), OnlyAlias: true} + } + case 1146: + { + parser.yyVAL.item = yyS[yypt-0].item.(ast.WindowSpec) + } + case 1147: + { + parser.yyVAL.item = &ast.WindowFuncExpr{F: yyS[yypt-3].ident, Spec: yyS[yypt-0].item.(ast.WindowSpec)} + } + case 1148: + { + parser.yyVAL.item = &ast.WindowFuncExpr{F: yyS[yypt-3].ident, Spec: yyS[yypt-0].item.(ast.WindowSpec)} + } + case 1149: + { + parser.yyVAL.item = &ast.WindowFuncExpr{F: yyS[yypt-3].ident, Spec: yyS[yypt-0].item.(ast.WindowSpec)} + } + case 1150: + { + parser.yyVAL.item = &ast.WindowFuncExpr{F: yyS[yypt-3].ident, Spec: yyS[yypt-0].item.(ast.WindowSpec)} + } + case 1151: + { + parser.yyVAL.item = &ast.WindowFuncExpr{F: yyS[yypt-3].ident, Spec: yyS[yypt-0].item.(ast.WindowSpec)} + } + case 1152: + { + parser.yyVAL.item = &ast.WindowFuncExpr{F: yyS[yypt-4].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Spec: yyS[yypt-0].item.(ast.WindowSpec)} + } + case 1153: + { + args := []ast.ExprNode{yyS[yypt-4].expr} + if yyS[yypt-3].item != nil { + args = append(args, yyS[yypt-3].item.([]ast.ExprNode)...) + } + parser.yyVAL.item = &ast.WindowFuncExpr{F: yyS[yypt-6].ident, Args: args, IgnoreNull: yyS[yypt-1].item.(bool), Spec: yyS[yypt-0].item.(ast.WindowSpec)} + } + case 1154: + { + args := []ast.ExprNode{yyS[yypt-4].expr} + if yyS[yypt-3].item != nil { + args = append(args, yyS[yypt-3].item.([]ast.ExprNode)...) + } + parser.yyVAL.item = &ast.WindowFuncExpr{F: yyS[yypt-6].ident, Args: args, IgnoreNull: yyS[yypt-1].item.(bool), Spec: yyS[yypt-0].item.(ast.WindowSpec)} + } + case 1155: + { + parser.yyVAL.item = &ast.WindowFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-3].expr}, IgnoreNull: yyS[yypt-1].item.(bool), Spec: yyS[yypt-0].item.(ast.WindowSpec)} + } + case 1156: + { + parser.yyVAL.item = &ast.WindowFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-3].expr}, IgnoreNull: yyS[yypt-1].item.(bool), Spec: yyS[yypt-0].item.(ast.WindowSpec)} + } + case 1157: + { + parser.yyVAL.item = &ast.WindowFuncExpr{F: yyS[yypt-8].ident, Args: []ast.ExprNode{yyS[yypt-6].expr, yyS[yypt-4].expr}, FromLast: yyS[yypt-2].item.(bool), IgnoreNull: yyS[yypt-1].item.(bool), Spec: yyS[yypt-0].item.(ast.WindowSpec)} + } + case 1158: + { + parser.yyVAL.item = nil + } + case 1159: + { + args := []ast.ExprNode{ast.NewValueExpr(yyS[yypt-1].item)} + if yyS[yypt-0].item != nil { + args = append(args, yyS[yypt-0].item.(ast.ExprNode)) + } + parser.yyVAL.item = args + } + case 1160: + { + args := []ast.ExprNode{ast.NewValueExpr(yyS[yypt-1].item)} + if yyS[yypt-0].item != nil { + args = append(args, yyS[yypt-0].item.(ast.ExprNode)) + } + parser.yyVAL.item = args + } + case 1161: + { + parser.yyVAL.item = nil + } + case 1162: + { + parser.yyVAL.item = yyS[yypt-0].expr + } + case 1163: + { + parser.yyVAL.item = false + } + case 1164: + { + parser.yyVAL.item = false + } + case 1165: + { + parser.yyVAL.item = true + } + case 1166: + { + parser.yyVAL.item = false + } + case 1167: + { + parser.yyVAL.item = false + } + case 1168: + { + parser.yyVAL.item = true + } + case 1169: + { + parser.yyVAL.item = &ast.TableRefsClause{TableRefs: yyS[yypt-0].item.(*ast.Join)} + } + case 1170: + { + if j, ok := yyS[yypt-0].item.(*ast.Join); ok { + // if $1 is Join, use it directly + parser.yyVAL.item = j + } else { + parser.yyVAL.item = &ast.Join{Left: yyS[yypt-0].item.(ast.ResultSetNode), Right: nil} + } + } + case 1171: + { + /* from a, b is default cross join */ + parser.yyVAL.item = &ast.Join{Left: yyS[yypt-2].item.(ast.ResultSetNode), Right: yyS[yypt-0].item.(ast.ResultSetNode), Tp: ast.CrossJoin} + } + case 1172: + { + parser.yyVAL.item = yyS[yypt-0].item + } + case 1173: + { + /* + * ODBC escape syntax for outer join is { OJ join_table } + * Use an Identifier for OJ + */ + parser.yyVAL.item = yyS[yypt-1].item + } + case 1174: + { + parser.yyVAL.item = yyS[yypt-0].item + } + case 1175: + { + parser.yyVAL.item = yyS[yypt-0].item + } + case 1176: + { + tn := yyS[yypt-3].item.(*ast.TableName) + tn.PartitionNames = yyS[yypt-2].item.([]model.CIStr) + tn.IndexHints = yyS[yypt-0].item.([]*ast.IndexHint) + parser.yyVAL.item = &ast.TableSource{Source: tn, AsName: yyS[yypt-1].item.(model.CIStr)} + } + case 1177: + { + st := yyS[yypt-2].statement.(*ast.SelectStmt) + endOffset := parser.endOffset(&yyS[yypt-1]) + parser.setLastSelectFieldText(st, endOffset) + parser.yyVAL.item = &ast.TableSource{Source: yyS[yypt-2].statement.(*ast.SelectStmt), AsName: yyS[yypt-0].item.(model.CIStr)} + } + case 1178: + { + parser.yyVAL.item = &ast.TableSource{Source: yyS[yypt-2].statement.(*ast.UnionStmt), AsName: yyS[yypt-0].item.(model.CIStr)} + } + case 1179: + { + parser.yyVAL.item = yyS[yypt-1].item + } + case 1180: + { + parser.yyVAL.item = []model.CIStr{} + } + case 1181: + { + parser.yyVAL.item = yyS[yypt-1].item + } + case 1182: + { + parser.yyVAL.item = model.CIStr{} + } + case 1183: + { + parser.yyVAL.item = yyS[yypt-0].item + } + case 1184: + { + parser.yyVAL.item = model.NewCIStr(yyS[yypt-0].ident) + } + case 1185: + { + parser.yyVAL.item = model.NewCIStr(yyS[yypt-0].ident) + } + case 1186: + { + parser.yyVAL.item = ast.HintUse + } + case 1187: + { + parser.yyVAL.item = ast.HintIgnore + } + case 1188: + { + parser.yyVAL.item = ast.HintForce + } + case 1189: + { + parser.yyVAL.item = ast.HintForScan + } + case 1190: + { + parser.yyVAL.item = ast.HintForJoin + } + case 1191: + { + parser.yyVAL.item = ast.HintForOrderBy + } + case 1192: + { + parser.yyVAL.item = ast.HintForGroupBy + } + case 1193: + { + parser.yyVAL.item = &ast.IndexHint{ + IndexNames: yyS[yypt-1].item.([]model.CIStr), + HintType: yyS[yypt-4].item.(ast.IndexHintType), + HintScope: yyS[yypt-3].item.(ast.IndexHintScope), + } + } + case 1194: + { + var nameList []model.CIStr + parser.yyVAL.item = nameList + } + case 1195: + { + parser.yyVAL.item = []model.CIStr{model.NewCIStr(yyS[yypt-0].ident)} + } + case 1196: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]model.CIStr), model.NewCIStr(yyS[yypt-0].ident)) + } + case 1197: + { + parser.yyVAL.item = []model.CIStr{model.NewCIStr(yyS[yypt-0].ident)} + } + case 1198: + { + parser.yyVAL.item = []*ast.IndexHint{yyS[yypt-0].item.(*ast.IndexHint)} + } + case 1199: + { + parser.yyVAL.item = append(yyS[yypt-1].item.([]*ast.IndexHint), yyS[yypt-0].item.(*ast.IndexHint)) + } + case 1200: + { + var hintList []*ast.IndexHint + parser.yyVAL.item = hintList + } + case 1201: + { + parser.yyVAL.item = yyS[yypt-0].item + } + case 1202: + { + parser.yyVAL.item = &ast.Join{Left: yyS[yypt-2].item.(ast.ResultSetNode), Right: yyS[yypt-0].item.(ast.ResultSetNode), Tp: ast.CrossJoin} + } + case 1203: + { + on := &ast.OnCondition{Expr: yyS[yypt-0].expr} + parser.yyVAL.item = &ast.Join{Left: yyS[yypt-4].item.(ast.ResultSetNode), Right: yyS[yypt-2].item.(ast.ResultSetNode), Tp: ast.CrossJoin, On: on} + } + case 1204: + { + parser.yyVAL.item = &ast.Join{Left: yyS[yypt-6].item.(ast.ResultSetNode), Right: yyS[yypt-4].item.(ast.ResultSetNode), Tp: ast.CrossJoin, Using: yyS[yypt-1].item.([]*ast.ColumnName)} + } + case 1205: + { + on := &ast.OnCondition{Expr: yyS[yypt-0].expr} + parser.yyVAL.item = &ast.Join{Left: yyS[yypt-6].item.(ast.ResultSetNode), Right: yyS[yypt-2].item.(ast.ResultSetNode), Tp: yyS[yypt-5].item.(ast.JoinType), On: on} + } + case 1206: + { + parser.yyVAL.item = &ast.Join{Left: yyS[yypt-8].item.(ast.ResultSetNode), Right: yyS[yypt-4].item.(ast.ResultSetNode), Tp: yyS[yypt-7].item.(ast.JoinType), Using: yyS[yypt-1].item.([]*ast.ColumnName)} + } + case 1207: + { + parser.yyVAL.item = &ast.Join{Left: yyS[yypt-3].item.(ast.ResultSetNode), Right: yyS[yypt-0].item.(ast.ResultSetNode), NaturalJoin: true} + } + case 1208: + { + parser.yyVAL.item = &ast.Join{Left: yyS[yypt-5].item.(ast.ResultSetNode), Right: yyS[yypt-0].item.(ast.ResultSetNode), Tp: yyS[yypt-3].item.(ast.JoinType), NaturalJoin: true} + } + case 1209: + { + parser.yyVAL.item = &ast.Join{Left: yyS[yypt-2].item.(ast.ResultSetNode), Right: yyS[yypt-0].item.(ast.ResultSetNode), StraightJoin: true} + } + case 1210: + { + on := &ast.OnCondition{Expr: yyS[yypt-0].expr} + parser.yyVAL.item = &ast.Join{Left: yyS[yypt-4].item.(ast.ResultSetNode), Right: yyS[yypt-2].item.(ast.ResultSetNode), StraightJoin: true, On: on} + } + case 1211: + { + parser.yyVAL.item = ast.LeftJoin + } + case 1212: + { + parser.yyVAL.item = ast.RightJoin + } + case 1218: + { + parser.yyVAL.item = nil + } + case 1219: + { + parser.yyVAL.item = &ast.Limit{Count: yyS[yypt-0].item.(ast.ValueExpr)} + } + case 1220: + { + parser.yyVAL.item = ast.NewValueExpr(yyS[yypt-0].item) + } + case 1221: + { + parser.yyVAL.item = ast.NewParamMarkerExpr(yyS[yypt].offset) + } + case 1222: + { + parser.yyVAL.item = nil + } + case 1223: + { + parser.yyVAL.item = &ast.Limit{Count: yyS[yypt-0].item.(ast.ExprNode)} + } + case 1224: + { + parser.yyVAL.item = &ast.Limit{Offset: yyS[yypt-2].item.(ast.ExprNode), Count: yyS[yypt-0].item.(ast.ExprNode)} + } + case 1225: + { + parser.yyVAL.item = &ast.Limit{Offset: yyS[yypt-0].item.(ast.ExprNode), Count: yyS[yypt-2].item.(ast.ExprNode)} + } + case 1226: + { + opt := &ast.SelectStmtOpts{} + if yyS[yypt-8].item != nil { + opt.TableHints = yyS[yypt-8].item.([]*ast.TableOptimizerHint) + } + if yyS[yypt-7].item != nil { + opt.Distinct = yyS[yypt-7].item.(bool) + } + if yyS[yypt-6].item != nil { + opt.Priority = yyS[yypt-6].item.(mysql.PriorityEnum) + } + if yyS[yypt-5].item != nil { + opt.SQLSmallResult = yyS[yypt-5].item.(bool) + } + if yyS[yypt-4].item != nil { + opt.SQLBigResult = yyS[yypt-4].item.(bool) + } + if yyS[yypt-3].item != nil { + opt.SQLBufferResult = yyS[yypt-3].item.(bool) + } + if yyS[yypt-2].item != nil { + opt.SQLCache = yyS[yypt-2].item.(bool) + } + if yyS[yypt-1].item != nil { + opt.CalcFoundRows = yyS[yypt-1].item.(bool) + } + if yyS[yypt-0].item != nil { + opt.StraightJoin = yyS[yypt-0].item.(bool) + } + + parser.yyVAL.item = opt + } + case 1227: + { + parser.yyVAL.item = nil + } + case 1228: + { + parser.yyVAL.item = yyS[yypt-1].item + } + case 1229: + { + yyerrok() + parser.lastErrorAsWarn() + parser.yyVAL.item = nil + } + case 1230: + { + parser.yyVAL.item = []*ast.TableOptimizerHint{yyS[yypt-0].item.(*ast.TableOptimizerHint)} + } + case 1231: + { + parser.yyVAL.item = yyS[yypt-0].item.([]*ast.TableOptimizerHint) + } + case 1232: + { + parser.yyVAL.item = append(yyS[yypt-1].item.([]*ast.TableOptimizerHint), yyS[yypt-0].item.(*ast.TableOptimizerHint)) + } + case 1233: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.TableOptimizerHint), yyS[yypt-0].item.(*ast.TableOptimizerHint)) + } + case 1234: + { + parser.yyVAL.item = append(yyS[yypt-1].item.([]*ast.TableOptimizerHint), yyS[yypt-0].item.([]*ast.TableOptimizerHint)...) + } + case 1235: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.TableOptimizerHint), yyS[yypt-0].item.([]*ast.TableOptimizerHint)...) + } + case 1236: + { + parser.yyVAL.item = &ast.TableOptimizerHint{ + HintName: model.NewCIStr(yyS[yypt-5].ident), + QBName: yyS[yypt-3].item.(model.CIStr), + Tables: []ast.HintTable{yyS[yypt-2].item.(ast.HintTable)}, + Indexes: yyS[yypt-1].item.([]model.CIStr), + } + } + case 1237: + { + parser.yyVAL.item = &ast.TableOptimizerHint{HintName: model.NewCIStr(yyS[yypt-4].ident), QBName: yyS[yypt-2].item.(model.CIStr), Tables: yyS[yypt-1].item.([]ast.HintTable)} + } + case 1238: + { + parser.yyVAL.item = &ast.TableOptimizerHint{HintName: model.NewCIStr(yyS[yypt-4].ident), QBName: yyS[yypt-2].item.(model.CIStr), Tables: yyS[yypt-1].item.([]ast.HintTable)} + } + case 1239: + { + parser.yyVAL.item = &ast.TableOptimizerHint{HintName: model.NewCIStr(yyS[yypt-4].ident), QBName: yyS[yypt-2].item.(model.CIStr), Tables: yyS[yypt-1].item.([]ast.HintTable)} + } + case 1240: + { + parser.yyVAL.item = &ast.TableOptimizerHint{ + HintName: model.NewCIStr(yyS[yypt-5].ident), + QBName: yyS[yypt-3].item.(model.CIStr), + Tables: []ast.HintTable{yyS[yypt-2].item.(ast.HintTable)}, + Indexes: yyS[yypt-1].item.([]model.CIStr), + } + } + case 1241: + { + parser.yyVAL.item = &ast.TableOptimizerHint{HintName: model.NewCIStr(yyS[yypt-4].ident), QBName: yyS[yypt-2].item.(model.CIStr), HintFlag: yyS[yypt-1].item.(bool)} + } + case 1242: + { + parser.yyVAL.item = &ast.TableOptimizerHint{HintName: model.NewCIStr(yyS[yypt-4].ident), QBName: yyS[yypt-2].item.(model.CIStr), HintFlag: yyS[yypt-1].item.(bool)} + } + case 1243: + { + parser.yyVAL.item = &ast.TableOptimizerHint{HintName: model.NewCIStr(yyS[yypt-4].ident), QBName: yyS[yypt-2].item.(model.CIStr), MaxExecutionTime: getUint64FromNUM(yyS[yypt-1].item)} + } + case 1244: + { + // arguments not decided yet. + parser.yyVAL.item = &ast.TableOptimizerHint{HintName: model.NewCIStr(yyS[yypt-3].ident), QBName: yyS[yypt-1].item.(model.CIStr)} + } + case 1245: + { + parser.yyVAL.item = &ast.TableOptimizerHint{HintName: model.NewCIStr(yyS[yypt-4].ident), QBName: yyS[yypt-2].item.(model.CIStr), QueryType: model.NewCIStr(yyS[yypt-1].item.(string))} + } + case 1246: + { + parser.yyVAL.item = &ast.TableOptimizerHint{HintName: model.NewCIStr(yyS[yypt-4].ident), QBName: yyS[yypt-2].item.(model.CIStr), MemoryQuota: yyS[yypt-1].item.(int64)} + } + case 1247: + { + parser.yyVAL.item = &ast.TableOptimizerHint{HintName: model.NewCIStr(yyS[yypt-3].ident), QBName: yyS[yypt-1].item.(model.CIStr)} + } + case 1248: + { + parser.yyVAL.item = &ast.TableOptimizerHint{HintName: model.NewCIStr(yyS[yypt-3].ident), QBName: yyS[yypt-1].item.(model.CIStr)} + } + case 1249: + { + parser.yyVAL.item = &ast.TableOptimizerHint{HintName: model.NewCIStr(yyS[yypt-3].ident), QBName: yyS[yypt-1].item.(model.CIStr)} + } + case 1250: + { + parser.yyVAL.item = &ast.TableOptimizerHint{HintName: model.NewCIStr(yyS[yypt-3].ident), QBName: yyS[yypt-1].item.(model.CIStr)} + } + case 1251: + { + parser.yyVAL.item = &ast.TableOptimizerHint{HintName: model.NewCIStr(yyS[yypt-3].ident), QBName: yyS[yypt-1].item.(model.CIStr)} + } + case 1252: + { + parser.yyVAL.item = &ast.TableOptimizerHint{HintName: model.NewCIStr(yyS[yypt-3].ident), QBName: model.NewCIStr(yyS[yypt-1].ident)} + } + case 1253: + { + parser.yyVAL.item = yyS[yypt-1].item.([]*ast.TableOptimizerHint) + for _, hint := range parser.yyVAL.item.([]*ast.TableOptimizerHint) { + hint.HintName = model.NewCIStr(yyS[yypt-4].ident) + hint.QBName = yyS[yypt-2].item.(model.CIStr) + } + } + case 1254: + { + parser.yyVAL.item = []*ast.TableOptimizerHint{yyS[yypt-0].item.(*ast.TableOptimizerHint)} + } + case 1255: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.TableOptimizerHint), yyS[yypt-0].item.(*ast.TableOptimizerHint)) + } + case 1256: + { + parser.yyVAL.item = &ast.TableOptimizerHint{ + StoreType: model.NewCIStr(yyS[yypt-3].item.(string)), + Tables: yyS[yypt-1].item.([]ast.HintTable), + } + } + case 1257: + { + parser.yyVAL.item = model.NewCIStr("") + } + case 1258: + { + parser.yyVAL.item = model.NewCIStr(yyS[yypt-0].ident) + } + case 1259: + { + parser.yyVAL.item = ast.HintTable{TableName: model.NewCIStr(yyS[yypt-1].ident), QBName: yyS[yypt-0].item.(model.CIStr)} + } + case 1260: + { + parser.yyVAL.item = []ast.HintTable{yyS[yypt-0].item.(ast.HintTable)} + } + case 1261: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]ast.HintTable), yyS[yypt-0].item.(ast.HintTable)) + } + case 1262: + { + parser.yyVAL.item = true + } + case 1263: + { + parser.yyVAL.item = false + } + case 1264: + { + parser.yyVAL.item = yyS[yypt-0].ident + } + case 1265: + { + parser.yyVAL.item = yyS[yypt-0].ident + } + case 1266: + { + parser.yyVAL.item = yyS[yypt-0].ident + } + case 1267: + { + parser.yyVAL.item = yyS[yypt-0].ident + } + case 1268: + { + switch model.NewCIStr(yyS[yypt-0].ident).L { + case "mb": + parser.yyVAL.item = yyS[yypt-1].item.(int64) * 1024 * 1024 + case "gb": + parser.yyVAL.item = yyS[yypt-1].item.(int64) * 1024 * 1024 * 1024 + default: + // Executor handle memory quota < 0 as no memory limit, here use it to trigger warning in TiDB. + parser.yyVAL.item = int64(-1) + } + } + case 1269: + { + parser.yyVAL.item = false + } + case 1270: + { + parser.yyVAL.item = true + } + case 1271: + { + parser.yyVAL.item = false + } + case 1272: + { + parser.yyVAL.item = true + } + case 1273: + { + parser.yyVAL.item = false + } + case 1274: + { + parser.yyVAL.item = true + } + case 1275: + { + parser.yyVAL.item = true + } + case 1276: + { + parser.yyVAL.item = true + } + case 1277: + { + parser.yyVAL.item = false + } + case 1278: + { + parser.yyVAL.item = false + } + case 1279: + { + parser.yyVAL.item = true + } + case 1280: + { + parser.yyVAL.item = false + } + case 1281: + { + parser.yyVAL.item = true + } + case 1282: + { + parser.yyVAL.item = &ast.FieldList{Fields: yyS[yypt-0].item.([]*ast.SelectField)} + } + case 1283: + { + parser.yyVAL.item = nil + } + case 1285: + { + s := yyS[yypt-1].statement.(*ast.SelectStmt) + endOffset := parser.endOffset(&yyS[yypt]) + parser.setLastSelectFieldText(s, endOffset) + src := parser.src + // See the implementation of yyParse function + s.SetText(src[yyS[yypt-1].offset:yyS[yypt].offset]) + parser.yyVAL.expr = &ast.SubqueryExpr{Query: s} + } + case 1286: + { + s := yyS[yypt-1].statement.(*ast.UnionStmt) + src := parser.src + // See the implementation of yyParse function + s.SetText(src[yyS[yypt-1].offset:yyS[yypt].offset]) + parser.yyVAL.expr = &ast.SubqueryExpr{Query: s} + } + case 1287: + { + parser.yyVAL.item = ast.SelectLockNone + } + case 1288: + { + parser.yyVAL.item = ast.SelectLockForUpdate + } + case 1289: + { + parser.yyVAL.item = ast.SelectLockInShareMode + } + case 1290: + { + st := yyS[yypt-3].item.(*ast.SelectStmt) + union := yyS[yypt-6].item.(*ast.UnionStmt) + st.IsAfterUnionDistinct = yyS[yypt-4].item.(bool) + lastSelect := union.SelectList.Selects[len(union.SelectList.Selects)-1] + endOffset := parser.endOffset(&yyS[yypt-5]) + parser.setLastSelectFieldText(lastSelect, endOffset) + union.SelectList.Selects = append(union.SelectList.Selects, st) + if yyS[yypt-2].item != nil { + union.OrderBy = yyS[yypt-2].item.(*ast.OrderByClause) + } + if yyS[yypt-1].item != nil { + union.Limit = yyS[yypt-1].item.(*ast.Limit) + } + if yyS[yypt-2].item == nil && yyS[yypt-1].item == nil { + st.LockTp = yyS[yypt-0].item.(ast.SelectLockType) + } + parser.yyVAL.statement = union + } + case 1291: + { + st := yyS[yypt-3].item.(*ast.SelectStmt) + union := yyS[yypt-6].item.(*ast.UnionStmt) + st.IsAfterUnionDistinct = yyS[yypt-4].item.(bool) + lastSelect := union.SelectList.Selects[len(union.SelectList.Selects)-1] + endOffset := parser.endOffset(&yyS[yypt-5]) + parser.setLastSelectFieldText(lastSelect, endOffset) + union.SelectList.Selects = append(union.SelectList.Selects, st) + if yyS[yypt-2].item != nil { + union.OrderBy = yyS[yypt-2].item.(*ast.OrderByClause) + } + if yyS[yypt-1].item != nil { + union.Limit = yyS[yypt-1].item.(*ast.Limit) + } + if yyS[yypt-2].item == nil && yyS[yypt-1].item == nil { + st.LockTp = yyS[yypt-0].item.(ast.SelectLockType) + } + parser.yyVAL.statement = union + } + case 1292: + { + st := yyS[yypt-3].item.(*ast.SelectStmt) + union := yyS[yypt-6].item.(*ast.UnionStmt) + st.IsAfterUnionDistinct = yyS[yypt-4].item.(bool) + lastSelect := union.SelectList.Selects[len(union.SelectList.Selects)-1] + endOffset := parser.endOffset(&yyS[yypt-5]) + parser.setLastSelectFieldText(lastSelect, endOffset) + union.SelectList.Selects = append(union.SelectList.Selects, st) + if yyS[yypt-2].item != nil { + union.OrderBy = yyS[yypt-2].item.(*ast.OrderByClause) + } + if yyS[yypt-1].item != nil { + union.Limit = yyS[yypt-1].item.(*ast.Limit) + } + if yyS[yypt-2].item == nil && yyS[yypt-1].item == nil { + st.LockTp = yyS[yypt-0].item.(ast.SelectLockType) + } + parser.yyVAL.statement = union + } + case 1293: + { + union := yyS[yypt-7].item.(*ast.UnionStmt) + lastSelect := union.SelectList.Selects[len(union.SelectList.Selects)-1] + endOffset := parser.endOffset(&yyS[yypt-6]) + parser.setLastSelectFieldText(lastSelect, endOffset) + st := yyS[yypt-3].statement.(*ast.SelectStmt) + st.IsInBraces = true + st.IsAfterUnionDistinct = yyS[yypt-5].item.(bool) + endOffset = parser.endOffset(&yyS[yypt-2]) + parser.setLastSelectFieldText(st, endOffset) + union.SelectList.Selects = append(union.SelectList.Selects, st) + if yyS[yypt-1].item != nil { + union.OrderBy = yyS[yypt-1].item.(*ast.OrderByClause) + } + if yyS[yypt-0].item != nil { + union.Limit = yyS[yypt-0].item.(*ast.Limit) + } + parser.yyVAL.statement = union + } + case 1294: + { + selectList := &ast.UnionSelectList{Selects: []*ast.SelectStmt{yyS[yypt-0].item.(*ast.SelectStmt)}} + parser.yyVAL.item = &ast.UnionStmt{ + SelectList: selectList, + } + } + case 1295: + { + union := yyS[yypt-3].item.(*ast.UnionStmt) + st := yyS[yypt-0].item.(*ast.SelectStmt) + st.IsAfterUnionDistinct = yyS[yypt-1].item.(bool) + lastSelect := union.SelectList.Selects[len(union.SelectList.Selects)-1] + endOffset := parser.endOffset(&yyS[yypt-2]) + parser.setLastSelectFieldText(lastSelect, endOffset) + union.SelectList.Selects = append(union.SelectList.Selects, st) + parser.yyVAL.item = union + } + case 1296: + { + parser.yyVAL.item = yyS[yypt-0].statement.(interface{}) + } + case 1297: + { + st := yyS[yypt-1].statement.(*ast.SelectStmt) + st.IsInBraces = true + endOffset := parser.endOffset(&yyS[yypt]) + parser.setLastSelectFieldText(st, endOffset) + parser.yyVAL.item = yyS[yypt-1].statement + } + case 1299: + { + parser.yyVAL.statement = &ast.ChangeStmt{ + NodeType: ast.PumpType, + State: yyS[yypt-3].ident, + NodeID: yyS[yypt-0].ident, + } + } + case 1300: + { + parser.yyVAL.statement = &ast.ChangeStmt{ + NodeType: ast.DrainerType, + State: yyS[yypt-3].ident, + NodeID: yyS[yypt-0].ident, + } + } + case 1301: + { + parser.yyVAL.statement = &ast.SetStmt{Variables: yyS[yypt-0].item.([]*ast.VariableAssignment)} + } + case 1302: + { + parser.yyVAL.statement = &ast.SetPwdStmt{Password: yyS[yypt-0].item.(string)} + } + case 1303: + { + parser.yyVAL.statement = &ast.SetPwdStmt{User: yyS[yypt-2].item.(*auth.UserIdentity), Password: yyS[yypt-0].item.(string)} + } + case 1304: + { + vars := yyS[yypt-0].item.([]*ast.VariableAssignment) + for _, v := range vars { + v.IsGlobal = true + } + parser.yyVAL.statement = &ast.SetStmt{Variables: vars} + } + case 1305: + { + parser.yyVAL.statement = &ast.SetStmt{Variables: yyS[yypt-0].item.([]*ast.VariableAssignment)} + } + case 1306: + { + assigns := yyS[yypt-0].item.([]*ast.VariableAssignment) + for i := 0; i < len(assigns); i++ { + if assigns[i].Name == "tx_isolation" { + // A special session variable that make setting tx_isolation take effect one time. + assigns[i].Name = "tx_isolation_one_shot" + } + } + parser.yyVAL.statement = &ast.SetStmt{Variables: assigns} + } + case 1307: + { + parser.yyVAL.statement = yyS[yypt-0].item.(*ast.SetRoleStmt) + } + case 1308: + { + tmp := yyS[yypt-2].item.(*ast.SetRoleStmt) + parser.yyVAL.statement = &ast.SetDefaultRoleStmt{ + SetRoleOpt: tmp.SetRoleOpt, + RoleList: tmp.RoleList, + UserList: yyS[yypt-0].item.([]*auth.UserIdentity), + } + } + case 1309: + { + parser.yyVAL.item = &ast.SetRoleStmt{SetRoleOpt: ast.SetRoleNone, RoleList: nil} + } + case 1310: + { + parser.yyVAL.item = &ast.SetRoleStmt{SetRoleOpt: ast.SetRoleAll, RoleList: nil} + } + case 1311: + { + parser.yyVAL.item = &ast.SetRoleStmt{SetRoleOpt: ast.SetRoleRegular, RoleList: yyS[yypt-0].item.([]*auth.RoleIdentity)} + } + case 1312: + { + parser.yyVAL.item = &ast.SetRoleStmt{SetRoleOpt: ast.SetRoleAllExcept, RoleList: yyS[yypt-0].item.([]*auth.RoleIdentity)} + } + case 1313: + { + parser.yyVAL.item = yyS[yypt-0].item + } + case 1314: + { + parser.yyVAL.item = &ast.SetRoleStmt{SetRoleOpt: ast.SetRoleDefault, RoleList: nil} + } + case 1315: + { + if yyS[yypt-0].item != nil { + parser.yyVAL.item = yyS[yypt-0].item + } else { + parser.yyVAL.item = []*ast.VariableAssignment{} + } + } + case 1316: + { + if yyS[yypt-0].item != nil { + varAssigns := yyS[yypt-0].item.([]*ast.VariableAssignment) + parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.VariableAssignment), varAssigns...) + } else { + parser.yyVAL.item = yyS[yypt-2].item + } + } + case 1317: + { + varAssigns := []*ast.VariableAssignment{} + expr := ast.NewValueExpr(yyS[yypt-0].ident) + varAssigns = append(varAssigns, &ast.VariableAssignment{Name: "tx_isolation", Value: expr, IsSystem: true}) + parser.yyVAL.item = varAssigns + } + case 1318: + { + varAssigns := []*ast.VariableAssignment{} + expr := ast.NewValueExpr("0") + varAssigns = append(varAssigns, &ast.VariableAssignment{Name: "tx_read_only", Value: expr, IsSystem: true}) + parser.yyVAL.item = varAssigns + } + case 1319: + { + varAssigns := []*ast.VariableAssignment{} + expr := ast.NewValueExpr("1") + varAssigns = append(varAssigns, &ast.VariableAssignment{Name: "tx_read_only", Value: expr, IsSystem: true}) + parser.yyVAL.item = varAssigns + } + case 1320: + { + parser.yyVAL.ident = ast.RepeatableRead + } + case 1321: + { + parser.yyVAL.ident = ast.ReadCommitted + } + case 1322: + { + parser.yyVAL.ident = ast.ReadUncommitted + } + case 1323: + { + parser.yyVAL.ident = ast.Serializable + } + case 1324: + { + parser.yyVAL.expr = ast.NewValueExpr("ON") + } + case 1329: + { + parser.yyVAL.ident = yyS[yypt-2].ident + "." + yyS[yypt-0].ident + } + case 1330: + { + parser.yyVAL.item = &ast.VariableAssignment{Name: yyS[yypt-2].ident, Value: yyS[yypt-0].expr, IsSystem: true} + } + case 1331: + { + parser.yyVAL.item = &ast.VariableAssignment{Name: yyS[yypt-2].ident, Value: yyS[yypt-0].expr, IsGlobal: true, IsSystem: true} + } + case 1332: + { + parser.yyVAL.item = &ast.VariableAssignment{Name: yyS[yypt-2].ident, Value: yyS[yypt-0].expr, IsSystem: true} + } + case 1333: + { + parser.yyVAL.item = &ast.VariableAssignment{Name: yyS[yypt-2].ident, Value: yyS[yypt-0].expr, IsSystem: true} + } + case 1334: + { + v := strings.ToLower(yyS[yypt-2].ident) + var isGlobal bool + if strings.HasPrefix(v, "@@global.") { + isGlobal = true + v = strings.TrimPrefix(v, "@@global.") + } else if strings.HasPrefix(v, "@@session.") { + v = strings.TrimPrefix(v, "@@session.") + } else if strings.HasPrefix(v, "@@local.") { + v = strings.TrimPrefix(v, "@@local.") + } else if strings.HasPrefix(v, "@@") { + v = strings.TrimPrefix(v, "@@") + } + parser.yyVAL.item = &ast.VariableAssignment{Name: v, Value: yyS[yypt-0].expr, IsGlobal: isGlobal, IsSystem: true} + } + case 1335: + { + v := yyS[yypt-2].ident + v = strings.TrimPrefix(v, "@") + parser.yyVAL.item = &ast.VariableAssignment{Name: v, Value: yyS[yypt-0].expr} + } + case 1336: + { + parser.yyVAL.item = &ast.VariableAssignment{ + Name: ast.SetNames, + Value: ast.NewValueExpr(yyS[yypt-0].item.(string)), + } + } + case 1337: + { + parser.yyVAL.item = &ast.VariableAssignment{ + Name: ast.SetNames, + Value: ast.NewValueExpr(yyS[yypt-2].item.(string)), + } + } + case 1338: + { + parser.yyVAL.item = &ast.VariableAssignment{ + Name: ast.SetNames, + Value: ast.NewValueExpr(yyS[yypt-2].item.(string)), + ExtendValue: ast.NewValueExpr(yyS[yypt-0].item.(string)), + } + } + case 1339: + { + parser.yyVAL.item = &ast.VariableAssignment{ + Name: ast.SetNames, + Value: ast.NewValueExpr(yyS[yypt-0].item.(string)), + } + } + case 1340: + { + // Validate input charset name to keep the same behavior as parser of MySQL. + name, _, err := charset.GetCharsetInfo(yyS[yypt-0].item.(string)) + if err != nil { + yylex.AppendError(ErrUnknownCharacterSet.GenWithStackByArgs(yyS[yypt-0].item)) + return 1 + } + // Use charset name returned from charset.GetCharsetInfo(), + // to keep lower case of input for generated column restore. + parser.yyVAL.item = name + } + case 1341: + { + parser.yyVAL.item = charset.CharsetBin + } + case 1342: + { + info, err := charset.GetCollationByName(yyS[yypt-0].item.(string)) + if err != nil { + yylex.AppendError(err) + return 1 + } + parser.yyVAL.item = info.Name + } + case 1343: + { + parser.yyVAL.item = []*ast.VariableAssignment{} + } + case 1344: + { + parser.yyVAL.item = []*ast.VariableAssignment{yyS[yypt-0].item.(*ast.VariableAssignment)} + } + case 1345: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.VariableAssignment), yyS[yypt-0].item.(*ast.VariableAssignment)) + } + case 1348: + { + v := strings.ToLower(yyS[yypt-0].ident) + var isGlobal bool + explicitScope := true + if strings.HasPrefix(v, "@@global.") { + isGlobal = true + v = strings.TrimPrefix(v, "@@global.") + } else if strings.HasPrefix(v, "@@session.") { + v = strings.TrimPrefix(v, "@@session.") + } else if strings.HasPrefix(v, "@@local.") { + v = strings.TrimPrefix(v, "@@local.") + } else if strings.HasPrefix(v, "@@") { + v, explicitScope = strings.TrimPrefix(v, "@@"), false + } + parser.yyVAL.expr = &ast.VariableExpr{Name: v, IsGlobal: isGlobal, IsSystem: true, ExplicitScope: explicitScope} + } + case 1349: + { + v := yyS[yypt-0].ident + v = strings.TrimPrefix(v, "@") + parser.yyVAL.expr = &ast.VariableExpr{Name: v, IsGlobal: false, IsSystem: false} + } + case 1350: + { + parser.yyVAL.item = &auth.UserIdentity{Username: yyS[yypt-0].item.(string), Hostname: "%"} + } + case 1351: + { + parser.yyVAL.item = &auth.UserIdentity{Username: yyS[yypt-2].item.(string), Hostname: yyS[yypt-0].item.(string)} + } + case 1352: + { + parser.yyVAL.item = &auth.UserIdentity{Username: yyS[yypt-1].item.(string), Hostname: strings.TrimPrefix(yyS[yypt-0].ident, "@")} + } + case 1353: + { + parser.yyVAL.item = &auth.UserIdentity{CurrentUser: true} + } + case 1354: + { + parser.yyVAL.item = []*auth.UserIdentity{yyS[yypt-0].item.(*auth.UserIdentity)} + } + case 1355: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]*auth.UserIdentity), yyS[yypt-0].item.(*auth.UserIdentity)) + } + case 1356: + { + parser.yyVAL.item = yyS[yypt-0].ident + } + case 1357: + { + parser.yyVAL.item = yyS[yypt-1].item.(string) + } + case 1358: + { + parser.yyVAL.item = yyS[yypt-0].ident + } + case 1359: + { + parser.yyVAL.item = yyS[yypt-0].ident + } + case 1360: + { + parser.yyVAL.item = yyS[yypt-0].ident + } + case 1361: + { + parser.yyVAL.item = &auth.RoleIdentity{Username: yyS[yypt-0].item.(string), Hostname: "%"} + } + case 1362: + { + parser.yyVAL.item = &auth.RoleIdentity{Username: yyS[yypt-2].item.(string), Hostname: yyS[yypt-0].item.(string)} + } + case 1363: + { + parser.yyVAL.item = &auth.RoleIdentity{Username: yyS[yypt-1].item.(string), Hostname: strings.TrimPrefix(yyS[yypt-0].ident, "@")} + } + case 1364: + { + parser.yyVAL.item = []*auth.RoleIdentity{yyS[yypt-0].item.(*auth.RoleIdentity)} + } + case 1365: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]*auth.RoleIdentity), yyS[yypt-0].item.(*auth.RoleIdentity)) + } + case 1366: + { + parser.yyVAL.statement = &ast.AdminStmt{Tp: ast.AdminShowDDL} + } + case 1367: + { + parser.yyVAL.statement = &ast.AdminStmt{Tp: ast.AdminShowDDLJobs} + } + case 1368: + { + parser.yyVAL.statement = &ast.AdminStmt{ + Tp: ast.AdminShowDDLJobs, + JobNumber: yyS[yypt-0].item.(int64), + } + } + case 1369: + { + parser.yyVAL.statement = &ast.AdminStmt{ + Tp: ast.AdminShowNextRowID, + Tables: []*ast.TableName{yyS[yypt-1].item.(*ast.TableName)}, + } + } + case 1370: + { + parser.yyVAL.statement = &ast.AdminStmt{ + Tp: ast.AdminCheckTable, + Tables: yyS[yypt-0].item.([]*ast.TableName), + } + } + case 1371: + { + parser.yyVAL.statement = &ast.AdminStmt{ + Tp: ast.AdminCheckIndex, + Tables: []*ast.TableName{yyS[yypt-1].item.(*ast.TableName)}, + Index: string(yyS[yypt-0].ident), + } + } + case 1372: + { + parser.yyVAL.statement = &ast.AdminStmt{ + Tp: ast.AdminRecoverIndex, + Tables: []*ast.TableName{yyS[yypt-1].item.(*ast.TableName)}, + Index: string(yyS[yypt-0].ident), + } + } + case 1373: + { + parser.yyVAL.statement = &ast.AdminStmt{ + Tp: ast.AdminCleanupIndex, + Tables: []*ast.TableName{yyS[yypt-1].item.(*ast.TableName)}, + Index: string(yyS[yypt-0].ident), + } + } + case 1374: + { + parser.yyVAL.statement = &ast.AdminStmt{ + Tp: ast.AdminCheckIndexRange, + Tables: []*ast.TableName{yyS[yypt-2].item.(*ast.TableName)}, + Index: string(yyS[yypt-1].ident), + HandleRanges: yyS[yypt-0].item.([]ast.HandleRange), + } + } + case 1375: + { + parser.yyVAL.statement = &ast.AdminStmt{ + Tp: ast.AdminChecksumTable, + Tables: yyS[yypt-0].item.([]*ast.TableName), + } + } + case 1376: + { + parser.yyVAL.statement = &ast.AdminStmt{ + Tp: ast.AdminCancelDDLJobs, + JobIDs: yyS[yypt-0].item.([]int64), + } + } + case 1377: + { + parser.yyVAL.statement = &ast.AdminStmt{ + Tp: ast.AdminShowDDLJobQueries, + JobIDs: yyS[yypt-0].item.([]int64), + } + } + case 1378: + { + parser.yyVAL.statement = &ast.AdminStmt{ + Tp: ast.AdminShowSlow, + ShowSlow: yyS[yypt-0].item.(*ast.ShowSlow), + } + } + case 1379: + { + parser.yyVAL.statement = &ast.AdminStmt{ + Tp: ast.AdminReloadExprPushdownBlacklist, + } + } + case 1380: + { + parser.yyVAL.statement = &ast.AdminStmt{ + Tp: ast.AdminReloadOptRuleBlacklist, + } + } + case 1381: + { + parser.yyVAL.statement = &ast.AdminStmt{ + Tp: ast.AdminPluginEnable, + Plugins: yyS[yypt-0].item.([]string), + } + } + case 1382: + { + parser.yyVAL.statement = &ast.AdminStmt{ + Tp: ast.AdminPluginDisable, + Plugins: yyS[yypt-0].item.([]string), + } + } + case 1383: + { + parser.yyVAL.statement = &ast.CleanupTableLockStmt{ + Tables: yyS[yypt-0].item.([]*ast.TableName), + } + } + case 1384: + { + parser.yyVAL.item = &ast.ShowSlow{ + Tp: ast.ShowSlowRecent, + Count: getUint64FromNUM(yyS[yypt-0].item), + } + } + case 1385: + { + parser.yyVAL.item = &ast.ShowSlow{ + Tp: ast.ShowSlowTop, + Kind: ast.ShowSlowKindDefault, + Count: getUint64FromNUM(yyS[yypt-0].item), + } + } + case 1386: + { + parser.yyVAL.item = &ast.ShowSlow{ + Tp: ast.ShowSlowTop, + Kind: ast.ShowSlowKindInternal, + Count: getUint64FromNUM(yyS[yypt-0].item), + } + } + case 1387: + { + parser.yyVAL.item = &ast.ShowSlow{ + Tp: ast.ShowSlowTop, + Kind: ast.ShowSlowKindAll, + Count: getUint64FromNUM(yyS[yypt-0].item), + } + } + case 1388: + { + parser.yyVAL.item = []ast.HandleRange{yyS[yypt-0].item.(ast.HandleRange)} + } + case 1389: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]ast.HandleRange), yyS[yypt-0].item.(ast.HandleRange)) + } + case 1390: + { + parser.yyVAL.item = ast.HandleRange{Begin: yyS[yypt-3].item.(int64), End: yyS[yypt-1].item.(int64)} + } + case 1391: + { + parser.yyVAL.item = []int64{yyS[yypt-0].item.(int64)} + } + case 1392: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]int64), yyS[yypt-0].item.(int64)) + } + case 1393: + { + stmt := yyS[yypt-1].item.(*ast.ShowStmt) + if yyS[yypt-0].item != nil { + if x, ok := yyS[yypt-0].item.(*ast.PatternLikeExpr); ok && x.Expr == nil { + stmt.Pattern = x + } else { + stmt.Where = yyS[yypt-0].item.(ast.ExprNode) + } + } + parser.yyVAL.statement = stmt + } + case 1394: + { + parser.yyVAL.statement = &ast.ShowStmt{ + Tp: ast.ShowCreateTable, + Table: yyS[yypt-0].item.(*ast.TableName), + } + } + case 1395: + { + parser.yyVAL.statement = &ast.ShowStmt{ + Tp: ast.ShowCreateView, + Table: yyS[yypt-0].item.(*ast.TableName), + } + } + case 1396: + { + parser.yyVAL.statement = &ast.ShowStmt{ + Tp: ast.ShowCreateDatabase, + IfNotExists: yyS[yypt-1].item.(bool), + DBName: yyS[yypt-0].item.(string), + } + } + case 1397: + { + // See https://dev.mysql.com/doc/refman/5.7/en/show-create-user.html + parser.yyVAL.statement = &ast.ShowStmt{ + Tp: ast.ShowCreateUser, + User: yyS[yypt-0].item.(*auth.UserIdentity), + } + } + case 1398: + { + parser.yyVAL.statement = &ast.ShowStmt{ + Tp: ast.ShowRegions, + Table: yyS[yypt-1].item.(*ast.TableName), + } + } + case 1399: + { + parser.yyVAL.statement = &ast.ShowStmt{ + Tp: ast.ShowRegions, + Table: yyS[yypt-3].item.(*ast.TableName), + IndexName: model.NewCIStr(yyS[yypt-1].ident), + } + } + case 1400: + { + // See https://dev.mysql.com/doc/refman/5.7/en/show-grants.html + parser.yyVAL.statement = &ast.ShowStmt{Tp: ast.ShowGrants} + } + case 1401: + { + // See https://dev.mysql.com/doc/refman/5.7/en/show-grants.html + if yyS[yypt-0].item != nil { + parser.yyVAL.statement = &ast.ShowStmt{ + Tp: ast.ShowGrants, + User: yyS[yypt-1].item.(*auth.UserIdentity), + Roles: yyS[yypt-0].item.([]*auth.RoleIdentity), + } + } else { + parser.yyVAL.statement = &ast.ShowStmt{ + Tp: ast.ShowGrants, + User: yyS[yypt-1].item.(*auth.UserIdentity), + Roles: nil, + } + } + } + case 1402: + { + parser.yyVAL.statement = &ast.ShowStmt{ + Tp: ast.ShowMasterStatus, + } + } + case 1403: + { + parser.yyVAL.statement = &ast.ShowStmt{ + Tp: ast.ShowProcessList, + Full: yyS[yypt-1].item.(bool), + } + } + case 1404: + { + stmt := &ast.ShowStmt{ + Tp: ast.ShowStatsMeta, + } + if yyS[yypt-0].item != nil { + if x, ok := yyS[yypt-0].item.(*ast.PatternLikeExpr); ok && x.Expr == nil { + stmt.Pattern = x + } else { + stmt.Where = yyS[yypt-0].item.(ast.ExprNode) + } + } + parser.yyVAL.statement = stmt + } + case 1405: + { + stmt := &ast.ShowStmt{ + Tp: ast.ShowStatsHistograms, + } + if yyS[yypt-0].item != nil { + if x, ok := yyS[yypt-0].item.(*ast.PatternLikeExpr); ok && x.Expr == nil { + stmt.Pattern = x + } else { + stmt.Where = yyS[yypt-0].item.(ast.ExprNode) + } + } + parser.yyVAL.statement = stmt + } + case 1406: + { + stmt := &ast.ShowStmt{ + Tp: ast.ShowStatsBuckets, + } + if yyS[yypt-0].item != nil { + if x, ok := yyS[yypt-0].item.(*ast.PatternLikeExpr); ok && x.Expr == nil { + stmt.Pattern = x + } else { + stmt.Where = yyS[yypt-0].item.(ast.ExprNode) + } + } + parser.yyVAL.statement = stmt + } + case 1407: + { + stmt := &ast.ShowStmt{ + Tp: ast.ShowStatsHealthy, + } + if yyS[yypt-0].item != nil { + if x, ok := yyS[yypt-0].item.(*ast.PatternLikeExpr); ok && x.Expr == nil { + stmt.Pattern = x + } else { + stmt.Where = yyS[yypt-0].item.(ast.ExprNode) + } + } + parser.yyVAL.statement = stmt + } + case 1408: + { + parser.yyVAL.statement = &ast.ShowStmt{ + Tp: ast.ShowProfiles, + } + } + case 1409: + { + v := &ast.ShowStmt{ + Tp: ast.ShowProfile, + } + if yyS[yypt-2].item != nil { + v.ShowProfileTypes = yyS[yypt-2].item.([]int) + } + if yyS[yypt-1].item != nil { + v.ShowProfileArgs = yyS[yypt-1].item.(*int64) + } + if yyS[yypt-0].item != nil { + v.ShowProfileLimit = yyS[yypt-0].item.(*ast.Limit) + } + parser.yyVAL.statement = v + } + case 1410: + { + parser.yyVAL.statement = &ast.ShowStmt{ + Tp: ast.ShowPrivileges, + } + } + case 1411: + { + stmt := &ast.ShowStmt{ + Tp: ast.ShowAnalyzeStatus, + } + if yyS[yypt-0].item != nil { + if x, ok := yyS[yypt-0].item.(*ast.PatternLikeExpr); ok && x.Expr == nil { + stmt.Pattern = x + } else { + stmt.Where = yyS[yypt-0].item.(ast.ExprNode) + } + } + parser.yyVAL.statement = stmt + } + case 1412: + { + parser.yyVAL.item = nil + } + case 1413: + { + parser.yyVAL.item = yyS[yypt-0].item + } + case 1414: + { + parser.yyVAL.item = []int{yyS[yypt-0].item.(int)} + } + case 1415: + { + l := yyS[yypt-2].item.([]int) + l = append(l, yyS[yypt-0].item.(int)) + parser.yyVAL.item = l + } + case 1416: + { + parser.yyVAL.item = ast.ProfileTypeCPU + } + case 1417: + { + parser.yyVAL.item = ast.ProfileTypeMemory + } + case 1418: + { + parser.yyVAL.item = ast.ProfileTypeBlockIo + } + case 1419: + { + parser.yyVAL.item = ast.ProfileTypeContextSwitch + } + case 1420: + { + parser.yyVAL.item = ast.ProfileTypePageFaults + } + case 1421: + { + parser.yyVAL.item = ast.ProfileTypeIpc + } + case 1422: + { + parser.yyVAL.item = ast.ProfileTypeSwaps + } + case 1423: + { + parser.yyVAL.item = ast.ProfileTypeSource + } + case 1424: + { + parser.yyVAL.item = ast.ProfileTypeAll + } + case 1425: + { + parser.yyVAL.item = nil + } + case 1426: + { + v := yyS[yypt-0].item.(int64) + parser.yyVAL.item = &v + } + case 1427: + { + parser.yyVAL.item = nil + } + case 1428: + { + parser.yyVAL.item = yyS[yypt-0].item.([]*auth.RoleIdentity) + } + case 1434: + { + parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowEngines} + } + case 1435: + { + parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowDatabases} + } + case 1436: + { + parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowCharset} + } + case 1437: + { + parser.yyVAL.item = &ast.ShowStmt{ + Tp: ast.ShowTables, + DBName: yyS[yypt-0].item.(string), + Full: yyS[yypt-2].item.(bool), + } + } + case 1438: + { + parser.yyVAL.item = &ast.ShowStmt{ + Tp: ast.ShowOpenTables, + DBName: yyS[yypt-0].item.(string), + } + } + case 1439: + { + parser.yyVAL.item = &ast.ShowStmt{ + Tp: ast.ShowTableStatus, + DBName: yyS[yypt-0].item.(string), + } + } + case 1440: + { + parser.yyVAL.item = &ast.ShowStmt{ + Tp: ast.ShowIndex, + Table: yyS[yypt-0].item.(*ast.TableName), + } + } + case 1441: + { + show := &ast.ShowStmt{ + Tp: ast.ShowIndex, + Table: &ast.TableName{Name: model.NewCIStr(yyS[yypt-2].ident), Schema: model.NewCIStr(yyS[yypt-0].ident)}, + } + parser.yyVAL.item = show + } + case 1442: + { + parser.yyVAL.item = &ast.ShowStmt{ + Tp: ast.ShowColumns, + Table: yyS[yypt-1].item.(*ast.TableName), + DBName: yyS[yypt-0].item.(string), + Full: yyS[yypt-3].item.(bool), + } + } + case 1443: + { + // SHOW FIELDS is a synonym for SHOW COLUMNS. + parser.yyVAL.item = &ast.ShowStmt{ + Tp: ast.ShowColumns, + Table: yyS[yypt-1].item.(*ast.TableName), + DBName: yyS[yypt-0].item.(string), + Full: yyS[yypt-3].item.(bool), + } + } + case 1444: + { + parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowWarnings} + } + case 1445: + { + parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowErrors} + } + case 1446: + { + parser.yyVAL.item = &ast.ShowStmt{ + Tp: ast.ShowVariables, + GlobalScope: yyS[yypt-1].item.(bool), + } + } + case 1447: + { + parser.yyVAL.item = &ast.ShowStmt{ + Tp: ast.ShowStatus, + GlobalScope: yyS[yypt-1].item.(bool), + } + } + case 1448: + { + parser.yyVAL.item = &ast.ShowStmt{ + Tp: ast.ShowBindings, + GlobalScope: yyS[yypt-1].item.(bool), + } + } + case 1449: + { + parser.yyVAL.item = &ast.ShowStmt{ + Tp: ast.ShowCollation, + } + } + case 1450: + { + parser.yyVAL.item = &ast.ShowStmt{ + Tp: ast.ShowTriggers, + DBName: yyS[yypt-0].item.(string), + } + } + case 1451: + { + parser.yyVAL.item = &ast.ShowStmt{ + Tp: ast.ShowProcedureStatus, + } + } + case 1452: + { + parser.yyVAL.item = &ast.ShowStmt{ + Tp: ast.ShowPumpStatus, + } + } + case 1453: + { + parser.yyVAL.item = &ast.ShowStmt{ + Tp: ast.ShowDrainerStatus, + } + } + case 1454: + { + // This statement is similar to SHOW PROCEDURE STATUS but for stored functions. + // See http://dev.mysql.com/doc/refman/5.7/en/show-function-status.html + // We do not support neither stored functions nor stored procedures. + // So we reuse show procedure status process logic. + parser.yyVAL.item = &ast.ShowStmt{ + Tp: ast.ShowProcedureStatus, + } + } + case 1455: + { + parser.yyVAL.item = &ast.ShowStmt{ + Tp: ast.ShowEvents, + DBName: yyS[yypt-0].item.(string), + } + } + case 1456: + { + parser.yyVAL.item = &ast.ShowStmt{ + Tp: ast.ShowPlugins, + } + } + case 1457: + { + parser.yyVAL.item = nil + } + case 1458: + { + parser.yyVAL.item = &ast.PatternLikeExpr{ + Pattern: yyS[yypt-0].expr, + Escape: '\\', + } + } + case 1459: + { + parser.yyVAL.item = yyS[yypt-0].expr + } + case 1460: + { + parser.yyVAL.item = false + } + case 1461: + { + parser.yyVAL.item = true + } + case 1462: + { + parser.yyVAL.item = false + } + case 1463: + { + parser.yyVAL.item = false + } + case 1464: + { + parser.yyVAL.item = true + } + case 1465: + { + parser.yyVAL.item = "" + } + case 1466: + { + parser.yyVAL.item = yyS[yypt-0].item.(string) + } + case 1467: + { + parser.yyVAL.item = yyS[yypt-0].item.(*ast.TableName) + } + case 1468: + { + tmp := yyS[yypt-0].item.(*ast.FlushStmt) + tmp.NoWriteToBinLog = yyS[yypt-1].item.(bool) + parser.yyVAL.statement = tmp + } + case 1469: + { + parser.yyVAL.item = []string{yyS[yypt-0].ident} + } + case 1470: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]string), yyS[yypt-0].ident) + } + case 1471: + { + parser.yyVAL.item = &ast.FlushStmt{ + Tp: ast.FlushPrivileges, + } + } + case 1472: + { + parser.yyVAL.item = &ast.FlushStmt{ + Tp: ast.FlushStatus, + } + } + case 1473: + { + parser.yyVAL.item = &ast.FlushStmt{ + Tp: ast.FlushTiDBPlugin, + Plugins: yyS[yypt-0].item.([]string), + } + } + case 1474: + { + parser.yyVAL.item = &ast.FlushStmt{ + Tp: ast.FlushTables, + Tables: yyS[yypt-1].item.([]*ast.TableName), + ReadLock: yyS[yypt-0].item.(bool), + } + } + case 1475: + { + parser.yyVAL.item = false + } + case 1476: + { + parser.yyVAL.item = true + } + case 1477: + { + parser.yyVAL.item = true + } + case 1478: + { + parser.yyVAL.item = []*ast.TableName{} + } + case 1479: + { + parser.yyVAL.item = yyS[yypt-0].item + } + case 1480: + { + parser.yyVAL.item = false + } + case 1481: + { + parser.yyVAL.item = true + } + case 1533: + { + // `(select 1)`; is a valid select statement + // TODO: This is used to fix issue #320. There may be a better solution. + parser.yyVAL.statement = yyS[yypt-0].expr.(*ast.SubqueryExpr).Query.(ast.StmtNode) + } + case 1557: + { + if yyS[yypt-0].statement != nil { + s := yyS[yypt-0].statement + if lexer, ok := yylex.(stmtTexter); ok { + s.SetText(lexer.stmtText()) + } + parser.result = append(parser.result, s) + } + } + case 1558: + { + if yyS[yypt-0].statement != nil { + s := yyS[yypt-0].statement + if lexer, ok := yylex.(stmtTexter); ok { + s.SetText(lexer.stmtText()) + } + parser.result = append(parser.result, s) + } + } + case 1559: + { + cst := yyS[yypt-0].item.(*ast.Constraint) + if yyS[yypt-1].item != nil { + cst.Name = yyS[yypt-1].item.(string) + } + parser.yyVAL.item = cst + } + case 1560: + { + parser.yyVAL.item = yyS[yypt-0].item.(*ast.ColumnDef) + } + case 1561: + { + parser.yyVAL.item = yyS[yypt-0].item.(*ast.Constraint) + } + case 1562: + { + if yyS[yypt-0].item != nil { + parser.yyVAL.item = []interface{}{yyS[yypt-0].item.(interface{})} + } else { + parser.yyVAL.item = []interface{}{} + } + } + case 1563: + { + if yyS[yypt-0].item != nil { + parser.yyVAL.item = append(yyS[yypt-2].item.([]interface{}), yyS[yypt-0].item) + } else { + parser.yyVAL.item = yyS[yypt-2].item + } + } + case 1564: + { + var columnDefs []*ast.ColumnDef + var constraints []*ast.Constraint + parser.yyVAL.item = &ast.CreateTableStmt{ + Cols: columnDefs, + Constraints: constraints, + } + } + case 1565: + { + tes := yyS[yypt-1].item.([]interface{}) + var columnDefs []*ast.ColumnDef + var constraints []*ast.Constraint + for _, te := range tes { + switch te := te.(type) { + case *ast.ColumnDef: + columnDefs = append(columnDefs, te) + case *ast.Constraint: + constraints = append(constraints, te) + } + } + parser.yyVAL.item = &ast.CreateTableStmt{ + Cols: columnDefs, + Constraints: constraints, + } + } + case 1566: + { + parser.yyVAL.item = yyS[yypt-0].item + } + case 1567: + { + parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionCharset, StrValue: yyS[yypt-0].item.(string)} + } + case 1568: + { + parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionCollate, StrValue: yyS[yypt-0].item.(string)} + } + case 1569: + { + parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionAutoIncrement, UintValue: yyS[yypt-0].item.(uint64)} + } + case 1570: + { + parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionAvgRowLength, UintValue: yyS[yypt-0].item.(uint64)} + } + case 1571: + { + parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionConnection, StrValue: yyS[yypt-0].ident} + } + case 1572: + { + parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionCheckSum, UintValue: yyS[yypt-0].item.(uint64)} + } + case 1573: + { + parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionTableCheckSum, UintValue: yyS[yypt-0].item.(uint64)} + } + case 1574: + { + parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionPassword, StrValue: yyS[yypt-0].ident} + } + case 1575: + { + parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionCompression, StrValue: yyS[yypt-0].ident} + } + case 1576: + { + parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionKeyBlockSize, UintValue: yyS[yypt-0].item.(uint64)} + } + case 1577: + { + parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionDelayKeyWrite, UintValue: yyS[yypt-0].item.(uint64)} + } + case 1578: + { + parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionRowFormat, UintValue: yyS[yypt-0].item.(uint64)} + } + case 1579: + { + parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionStatsPersistent} + } + case 1580: + { + n := yyS[yypt-0].item.(uint64) + if n != 0 && n != 1 { + yylex.AppendError(yylex.Errorf("The value of STATS_AUTO_RECALC must be one of [0|1|DEFAULT].")) + return 1 + } + parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionStatsAutoRecalc, UintValue: n} + yylex.AppendError(yylex.Errorf("The STATS_AUTO_RECALC is parsed but ignored by all storage engines.")) + parser.lastErrorAsWarn() + } + case 1581: + { + parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionStatsAutoRecalc, Default: true} + yylex.AppendError(yylex.Errorf("The STATS_AUTO_RECALC is parsed but ignored by all storage engines.")) + parser.lastErrorAsWarn() + } + case 1582: + { + // Parse it but will ignore it. + // In MySQL, STATS_SAMPLE_PAGES=N(Where 0 mysql.MaxFloatPrecisionLength { + x.Tp = mysql.TypeDouble + } + x.Flen = types.UnspecifiedLength + } + x.Decimal = fopt.Decimal + for _, o := range yyS[yypt-0].item.([]*ast.TypeOpt) { + if o.IsUnsigned { + x.Flag |= mysql.UnsignedFlag + } + if o.IsZerofill { + x.Flag |= mysql.ZerofillFlag + } + } + parser.yyVAL.item = x + } + case 1624: + { + x := types.NewFieldType(yyS[yypt-1].item.(byte)) + x.Flen = yyS[yypt-0].item.(int) + if x.Flen == types.UnspecifiedLength || x.Flen == 0 { + x.Flen = 1 + } else if x.Flen > mysql.MaxBitDisplayWidth { + yylex.AppendError(ErrTooBigDisplayWidth.GenWithStackByArgs(x.Flen)) + } + parser.yyVAL.item = x + } + case 1625: + { + parser.yyVAL.item = mysql.TypeTiny + } + case 1626: + { + parser.yyVAL.item = mysql.TypeShort + } + case 1627: + { + parser.yyVAL.item = mysql.TypeInt24 + } + case 1628: + { + parser.yyVAL.item = mysql.TypeLong + } + case 1629: + { + parser.yyVAL.item = mysql.TypeTiny + } + case 1630: + { + parser.yyVAL.item = mysql.TypeShort + } + case 1631: + { + parser.yyVAL.item = mysql.TypeInt24 + } + case 1632: + { + parser.yyVAL.item = mysql.TypeLong + } + case 1633: + { + parser.yyVAL.item = mysql.TypeLonglong + } + case 1634: + { + parser.yyVAL.item = mysql.TypeLong + } + case 1635: + { + parser.yyVAL.item = mysql.TypeLonglong + } + case 1636: + { + parser.yyVAL.item = mysql.TypeTiny + } + case 1637: + { + parser.yyVAL.item = mysql.TypeTiny + } + case 1641: + { + parser.yyVAL.item = mysql.TypeNewDecimal + } + case 1642: + { + parser.yyVAL.item = mysql.TypeNewDecimal + } + case 1643: + { + parser.yyVAL.item = mysql.TypeFloat + } + case 1644: + { + if parser.lexer.GetSQLMode().HasRealAsFloatMode() { + parser.yyVAL.item = mysql.TypeFloat + } else { + parser.yyVAL.item = mysql.TypeDouble + } + } + case 1645: + { + parser.yyVAL.item = mysql.TypeDouble + } + case 1646: + { + parser.yyVAL.item = mysql.TypeDouble + } + case 1647: + { + parser.yyVAL.item = mysql.TypeBit + } + case 1648: + { + x := types.NewFieldType(mysql.TypeString) + x.Flen = yyS[yypt-1].item.(int) + x.Charset = yyS[yypt-0].item.(*ast.OptBinary).Charset + if yyS[yypt-0].item.(*ast.OptBinary).IsBinary { + x.Flag |= mysql.BinaryFlag + } + parser.yyVAL.item = x + } + case 1649: + { + x := types.NewFieldType(mysql.TypeString) + x.Charset = yyS[yypt-0].item.(*ast.OptBinary).Charset + if yyS[yypt-0].item.(*ast.OptBinary).IsBinary { + x.Flag |= mysql.BinaryFlag + } + parser.yyVAL.item = x + } + case 1650: + { + x := types.NewFieldType(mysql.TypeString) + x.Flen = yyS[yypt-1].item.(int) + x.Charset = yyS[yypt-0].item.(*ast.OptBinary).Charset + if yyS[yypt-0].item.(*ast.OptBinary).IsBinary { + x.Flag |= mysql.BinaryFlag + } + parser.yyVAL.item = x + } + case 1651: + { + x := types.NewFieldType(mysql.TypeString) + x.Charset = yyS[yypt-0].item.(*ast.OptBinary).Charset + if yyS[yypt-0].item.(*ast.OptBinary).IsBinary { + x.Flag |= mysql.BinaryFlag + } + parser.yyVAL.item = x + } + case 1652: + { + x := types.NewFieldType(mysql.TypeVarchar) + x.Flen = yyS[yypt-1].item.(int) + x.Charset = yyS[yypt-0].item.(*ast.OptBinary).Charset + if yyS[yypt-0].item.(*ast.OptBinary).IsBinary { + x.Flag |= mysql.BinaryFlag + } + parser.yyVAL.item = x + } + case 1653: + { + x := types.NewFieldType(mysql.TypeVarchar) + x.Flen = yyS[yypt-1].item.(int) + x.Charset = yyS[yypt-0].item.(*ast.OptBinary).Charset + if yyS[yypt-0].item.(*ast.OptBinary).IsBinary { + x.Flag |= mysql.BinaryFlag + } + parser.yyVAL.item = x + } + case 1654: + { + x := types.NewFieldType(mysql.TypeString) + x.Flen = yyS[yypt-0].item.(int) + x.Charset = charset.CharsetBin + x.Collate = charset.CharsetBin + x.Flag |= mysql.BinaryFlag + parser.yyVAL.item = x + } + case 1655: + { + x := types.NewFieldType(mysql.TypeVarchar) + x.Flen = yyS[yypt-0].item.(int) + x.Charset = charset.CharsetBin + x.Collate = charset.CharsetBin + x.Flag |= mysql.BinaryFlag + parser.yyVAL.item = x + } + case 1656: + { + x := yyS[yypt-0].item.(*types.FieldType) + x.Charset = charset.CharsetBin + x.Collate = charset.CharsetBin + x.Flag |= mysql.BinaryFlag + parser.yyVAL.item = yyS[yypt-0].item.(*types.FieldType) + } + case 1657: + { + x := yyS[yypt-1].item.(*types.FieldType) + x.Charset = yyS[yypt-0].item.(*ast.OptBinary).Charset + if yyS[yypt-0].item.(*ast.OptBinary).IsBinary { + x.Flag |= mysql.BinaryFlag + } + parser.yyVAL.item = x + } + case 1658: + { + x := types.NewFieldType(mysql.TypeEnum) + x.Elems = yyS[yypt-2].item.([]string) + x.Charset = yyS[yypt-0].item.(string) + parser.yyVAL.item = x + } + case 1659: + { + x := types.NewFieldType(mysql.TypeSet) + x.Elems = yyS[yypt-2].item.([]string) + x.Charset = yyS[yypt-0].item.(string) + parser.yyVAL.item = x + } + case 1660: + { + x := types.NewFieldType(mysql.TypeJSON) + x.Decimal = 0 + x.Charset = charset.CharsetBin + x.Collate = charset.CollationBin + parser.yyVAL.item = x + } + case 1661: + { + x := types.NewFieldType(mysql.TypeMediumBlob) + x.Charset = yyS[yypt-0].item.(*ast.OptBinary).Charset + if yyS[yypt-0].item.(*ast.OptBinary).IsBinary { + x.Flag |= mysql.BinaryFlag + } + parser.yyVAL.item = x + } + case 1662: + { + x := types.NewFieldType(mysql.TypeMediumBlob) + x.Charset = yyS[yypt-0].item.(*ast.OptBinary).Charset + if yyS[yypt-0].item.(*ast.OptBinary).IsBinary { + x.Flag |= mysql.BinaryFlag + } + parser.yyVAL.item = x + } + case 1680: + { + x := types.NewFieldType(mysql.TypeTinyBlob) + parser.yyVAL.item = x + } + case 1681: + { + x := types.NewFieldType(mysql.TypeBlob) + x.Flen = yyS[yypt-0].item.(int) + parser.yyVAL.item = x + } + case 1682: + { + x := types.NewFieldType(mysql.TypeMediumBlob) + parser.yyVAL.item = x + } + case 1683: + { + x := types.NewFieldType(mysql.TypeLongBlob) + parser.yyVAL.item = x + } + case 1684: + { + x := types.NewFieldType(mysql.TypeMediumBlob) + parser.yyVAL.item = x + } + case 1685: + { + x := types.NewFieldType(mysql.TypeTinyBlob) + parser.yyVAL.item = x + + } + case 1686: + { + x := types.NewFieldType(mysql.TypeBlob) + x.Flen = yyS[yypt-0].item.(int) + parser.yyVAL.item = x + } + case 1687: + { + x := types.NewFieldType(mysql.TypeMediumBlob) + parser.yyVAL.item = x + } + case 1688: + { + x := types.NewFieldType(mysql.TypeLongBlob) + parser.yyVAL.item = x + } + case 1689: + { + x := types.NewFieldType(mysql.TypeDate) + parser.yyVAL.item = x + } + case 1690: + { + x := types.NewFieldType(mysql.TypeDatetime) + x.Flen = mysql.MaxDatetimeWidthNoFsp + x.Decimal = yyS[yypt-0].item.(int) + if x.Decimal > 0 { + x.Flen = x.Flen + 1 + x.Decimal + } + parser.yyVAL.item = x + } + case 1691: + { + x := types.NewFieldType(mysql.TypeTimestamp) + x.Flen = mysql.MaxDatetimeWidthNoFsp + x.Decimal = yyS[yypt-0].item.(int) + if x.Decimal > 0 { + x.Flen = x.Flen + 1 + x.Decimal + } + parser.yyVAL.item = x + } + case 1692: + { + x := types.NewFieldType(mysql.TypeDuration) + x.Flen = mysql.MaxDurationWidthNoFsp + x.Decimal = yyS[yypt-0].item.(int) + if x.Decimal > 0 { + x.Flen = x.Flen + 1 + x.Decimal + } + parser.yyVAL.item = x + } + case 1693: + { + x := types.NewFieldType(mysql.TypeYear) + x.Flen = yyS[yypt-1].item.(int) + if x.Flen != types.UnspecifiedLength && x.Flen != 4 { + yylex.AppendError(ErrInvalidYearColumnLength.GenWithStackByArgs()) + return -1 + } + parser.yyVAL.item = x + } + case 1694: + { + parser.yyVAL.item = int(yyS[yypt-1].item.(uint64)) + } + case 1695: + { + parser.yyVAL.item = types.UnspecifiedLength + } + case 1696: + { + parser.yyVAL.item = yyS[yypt-0].item.(int) + } + case 1697: + { + parser.yyVAL.item = &ast.TypeOpt{IsUnsigned: true} + } + case 1698: + { + parser.yyVAL.item = &ast.TypeOpt{IsUnsigned: false} + } + case 1699: + { + parser.yyVAL.item = &ast.TypeOpt{IsZerofill: true, IsUnsigned: true} + } + case 1700: + { + parser.yyVAL.item = []*ast.TypeOpt{} + } + case 1701: + { + parser.yyVAL.item = append(yyS[yypt-1].item.([]*ast.TypeOpt), yyS[yypt-0].item.(*ast.TypeOpt)) + } + case 1702: + { + parser.yyVAL.item = &ast.FloatOpt{Flen: types.UnspecifiedLength, Decimal: types.UnspecifiedLength} + } + case 1703: + { + parser.yyVAL.item = &ast.FloatOpt{Flen: yyS[yypt-0].item.(int), Decimal: types.UnspecifiedLength} + } + case 1704: + { + parser.yyVAL.item = yyS[yypt-0].item.(*ast.FloatOpt) + } + case 1705: + { + parser.yyVAL.item = &ast.FloatOpt{Flen: int(yyS[yypt-3].item.(uint64)), Decimal: int(yyS[yypt-1].item.(uint64))} + } + case 1706: + { + parser.yyVAL.item = false + } + case 1707: + { + parser.yyVAL.item = true + } + case 1708: + { + parser.yyVAL.item = &ast.OptBinary{ + IsBinary: false, + Charset: "", + } + } + case 1709: + { + parser.yyVAL.item = &ast.OptBinary{ + IsBinary: true, + Charset: yyS[yypt-0].item.(string), + } + } + case 1710: + { + parser.yyVAL.item = &ast.OptBinary{ + IsBinary: yyS[yypt-0].item.(bool), + Charset: yyS[yypt-1].item.(string), + } + } + case 1711: + { + parser.yyVAL.item = "" + } + case 1712: + { + parser.yyVAL.item = yyS[yypt-0].item.(string) + } + case 1716: + { + parser.yyVAL.item = "" + } + case 1717: + { + parser.yyVAL.item = yyS[yypt-0].item.(string) + } + case 1718: + { + parser.yyVAL.item = []string{yyS[yypt-0].ident} + } + case 1719: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]string), yyS[yypt-0].ident) + } + case 1720: + { + parser.yyVAL.item = yyS[yypt-0].ident + } + case 1721: + { + parser.yyVAL.item = yyS[yypt-0].ident + } + case 1722: + { + var refs *ast.Join + if x, ok := yyS[yypt-5].item.(*ast.Join); ok { + refs = x + } else { + refs = &ast.Join{Left: yyS[yypt-5].item.(ast.ResultSetNode)} + } + st := &ast.UpdateStmt{ + Priority: yyS[yypt-7].item.(mysql.PriorityEnum), + TableRefs: &ast.TableRefsClause{TableRefs: refs}, + List: yyS[yypt-3].item.([]*ast.Assignment), + IgnoreErr: yyS[yypt-6].item.(bool), + } + if yyS[yypt-8].item != nil { + st.TableHints = yyS[yypt-8].item.([]*ast.TableOptimizerHint) + } + if yyS[yypt-2].item != nil { + st.Where = yyS[yypt-2].item.(ast.ExprNode) + } + if yyS[yypt-1].item != nil { + st.Order = yyS[yypt-1].item.(*ast.OrderByClause) + } + if yyS[yypt-0].item != nil { + st.Limit = yyS[yypt-0].item.(*ast.Limit) + } + parser.yyVAL.statement = st + } + case 1723: + { + st := &ast.UpdateStmt{ + Priority: yyS[yypt-5].item.(mysql.PriorityEnum), + TableRefs: &ast.TableRefsClause{TableRefs: yyS[yypt-3].item.(*ast.Join)}, + List: yyS[yypt-1].item.([]*ast.Assignment), + IgnoreErr: yyS[yypt-4].item.(bool), + } + if yyS[yypt-6].item != nil { + st.TableHints = yyS[yypt-6].item.([]*ast.TableOptimizerHint) + } + if yyS[yypt-0].item != nil { + st.Where = yyS[yypt-0].item.(ast.ExprNode) + } + parser.yyVAL.statement = st + } + case 1724: + { + parser.yyVAL.statement = &ast.UseStmt{DBName: yyS[yypt-0].item.(string)} + } + case 1725: + { + parser.yyVAL.item = yyS[yypt-0].expr + } + case 1726: + { + parser.yyVAL.item = nil + } + case 1727: + { + parser.yyVAL.item = yyS[yypt-0].item + } + case 1730: + { + // See https://dev.mysql.com/doc/refman/5.7/en/create-user.html + parser.yyVAL.statement = &ast.CreateUserStmt{ + IsCreateRole: false, + IfNotExists: yyS[yypt-4].item.(bool), + Specs: yyS[yypt-3].item.([]*ast.UserSpec), + TslOptions: yyS[yypt-2].item.([]*ast.TslOption), + ResourceOptions: yyS[yypt-1].item.([]*ast.ResourceOption), + PasswordOrLockOptions: yyS[yypt-0].item.([]*ast.PasswordOrLockOption), + } + } + case 1731: + { + // See https://dev.mysql.com/doc/refman/8.0/en/create-role.html + parser.yyVAL.statement = &ast.CreateUserStmt{ + IsCreateRole: true, + IfNotExists: yyS[yypt-1].item.(bool), + Specs: yyS[yypt-0].item.([]*ast.UserSpec), + } + } + case 1732: + { + parser.yyVAL.statement = &ast.AlterUserStmt{ + IfExists: yyS[yypt-4].item.(bool), + Specs: yyS[yypt-3].item.([]*ast.UserSpec), + TslOptions: yyS[yypt-2].item.([]*ast.TslOption), + ResourceOptions: yyS[yypt-1].item.([]*ast.ResourceOption), + PasswordOrLockOptions: yyS[yypt-0].item.([]*ast.PasswordOrLockOption), + } + } + case 1733: + { + auth := &ast.AuthOption{ + AuthString: yyS[yypt-0].item.(string), + ByAuthString: true, + } + parser.yyVAL.statement = &ast.AlterUserStmt{ + IfExists: yyS[yypt-6].item.(bool), + CurrentAuth: auth, + } + } + case 1734: + { + userSpec := &ast.UserSpec{ + User: yyS[yypt-1].item.(*auth.UserIdentity), + } + if yyS[yypt-0].item != nil { + userSpec.AuthOpt = yyS[yypt-0].item.(*ast.AuthOption) + } + parser.yyVAL.item = userSpec + } + case 1735: + { + parser.yyVAL.item = []*ast.UserSpec{yyS[yypt-0].item.(*ast.UserSpec)} + } + case 1736: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.UserSpec), yyS[yypt-0].item.(*ast.UserSpec)) + } + case 1737: + { + l := []*ast.ResourceOption{} + parser.yyVAL.item = l + } + case 1738: + { + parser.yyVAL.item = yyS[yypt-0].item + yylex.AppendError(yylex.Errorf("TiDB does not support WITH ConnectionOptions now, they would be parsed but ignored.")) + parser.lastErrorAsWarn() + } + case 1739: + { + parser.yyVAL.item = []*ast.ResourceOption{yyS[yypt-0].item.(*ast.ResourceOption)} + } + case 1740: + { + l := yyS[yypt-1].item.([]*ast.ResourceOption) + l = append(l, yyS[yypt-0].item.(*ast.ResourceOption)) + parser.yyVAL.item = l + } + case 1741: + { + parser.yyVAL.item = &ast.ResourceOption{ + Type: ast.MaxQueriesPerHour, + Count: yyS[yypt-0].item.(int64), + } + } + case 1742: + { + parser.yyVAL.item = &ast.ResourceOption{ + Type: ast.MaxUpdatesPerHour, + Count: yyS[yypt-0].item.(int64), + } + } + case 1743: + { + parser.yyVAL.item = &ast.ResourceOption{ + Type: ast.MaxConnectionsPerHour, + Count: yyS[yypt-0].item.(int64), + } + } + case 1744: + { + parser.yyVAL.item = &ast.ResourceOption{ + Type: ast.MaxUserConnections, + Count: yyS[yypt-0].item.(int64), + } + } + case 1745: + { + parser.yyVAL.item = []*ast.TslOption{} + } + case 1746: + { + parser.yyVAL.item = yyS[yypt-0].item + yylex.AppendError(yylex.Errorf("TiDB does not support REQUIRE now, they would be parsed but ignored.")) + parser.lastErrorAsWarn() + } + case 1747: + { + t := &ast.TslOption{ + Type: ast.TslNone, + } + parser.yyVAL.item = []*ast.TslOption{t} + } + case 1748: + { + t := &ast.TslOption{ + Type: ast.Ssl, + } + parser.yyVAL.item = []*ast.TslOption{t} + } + case 1749: + { + t := &ast.TslOption{ + Type: ast.X509, + } + parser.yyVAL.item = []*ast.TslOption{t} + } + case 1750: + { + parser.yyVAL.item = yyS[yypt-0].item + } + case 1751: + { + parser.yyVAL.item = []*ast.TslOption{yyS[yypt-0].item.(*ast.TslOption)} + } + case 1752: + { + l := yyS[yypt-0].item.([]*ast.TslOption) + l = append(l, yyS[yypt-2].item.(*ast.TslOption)) + parser.yyVAL.item = l + } + case 1753: + { + parser.yyVAL.item = &ast.TslOption{ + Type: ast.Issuer, + Value: yyS[yypt-0].ident, + } + } + case 1754: + { + parser.yyVAL.item = &ast.TslOption{ + Type: ast.Subject, + Value: yyS[yypt-0].ident, + } + } + case 1755: + { + parser.yyVAL.item = &ast.TslOption{ + Type: ast.Cipher, + Value: yyS[yypt-0].ident, + } + } + case 1756: + { + l := []*ast.PasswordOrLockOption{} + parser.yyVAL.item = l + } + case 1757: + { + parser.yyVAL.item = yyS[yypt-0].item + yylex.AppendError(yylex.Errorf("TiDB does not support PASSWORD EXPIRE and ACCOUNT LOCK now, they would be parsed but ignored.")) + parser.lastErrorAsWarn() + } + case 1758: + { + parser.yyVAL.item = []*ast.PasswordOrLockOption{yyS[yypt-0].item.(*ast.PasswordOrLockOption)} + } + case 1759: + { + l := yyS[yypt-1].item.([]*ast.PasswordOrLockOption) + l = append(l, yyS[yypt-0].item.(*ast.PasswordOrLockOption)) + parser.yyVAL.item = l + } + case 1760: + { + parser.yyVAL.item = &ast.PasswordOrLockOption{ + Type: ast.Unlock, + } + } + case 1761: + { + parser.yyVAL.item = &ast.PasswordOrLockOption{ + Type: ast.Lock, + } + } + case 1762: + { + parser.yyVAL.item = &ast.PasswordOrLockOption{ + Type: ast.PasswordExpire, + } + } + case 1763: + { + parser.yyVAL.item = &ast.PasswordOrLockOption{ + Type: ast.PasswordExpireInterval, + Count: yyS[yypt-1].item.(int64), + } + } + case 1764: + { + parser.yyVAL.item = &ast.PasswordOrLockOption{ + Type: ast.PasswordExpireNever, + } + } + case 1765: + { + parser.yyVAL.item = &ast.PasswordOrLockOption{ + Type: ast.PasswordExpireDefault, + } + } + case 1766: + { + parser.yyVAL.item = nil + } + case 1767: + { + parser.yyVAL.item = nil + } + case 1768: + { + parser.yyVAL.item = nil + } + case 1769: + { + parser.yyVAL.item = &ast.AuthOption{ + AuthString: yyS[yypt-0].item.(string), + ByAuthString: true, + } + } + case 1770: + { + parser.yyVAL.item = nil + } + case 1771: + { + parser.yyVAL.item = &ast.AuthOption{ + AuthString: yyS[yypt-0].item.(string), + ByAuthString: true, + } + } + case 1772: + { + parser.yyVAL.item = &ast.AuthOption{ + HashString: yyS[yypt-0].item.(string), + } + } + case 1773: + { + parser.yyVAL.item = &ast.AuthOption{ + HashString: yyS[yypt-0].item.(string), + } + } + case 1774: + { + parser.yyVAL.item = yyS[yypt-0].ident + } + case 1775: + { + role := yyS[yypt-0].item.(*auth.RoleIdentity) + roleSpec := &ast.UserSpec{ + User: &auth.UserIdentity{ + Username: role.Username, + Hostname: role.Hostname, + }, + IsRole: true, + } + parser.yyVAL.item = roleSpec + } + case 1776: + { + parser.yyVAL.item = []*ast.UserSpec{yyS[yypt-0].item.(*ast.UserSpec)} + } + case 1777: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.UserSpec), yyS[yypt-0].item.(*ast.UserSpec)) + } + case 1778: + { + startOffset := parser.startOffset(&yyS[yypt-2]) + endOffset := parser.startOffset(&yyS[yypt-1]) + selStmt := yyS[yypt-2].statement.(*ast.SelectStmt) + selStmt.SetText(strings.TrimSpace(parser.src[startOffset:endOffset])) + + startOffset = parser.startOffset(&yyS[yypt]) + hintedSelStmt := yyS[yypt-0].statement.(*ast.SelectStmt) + hintedSelStmt.SetText(strings.TrimSpace(parser.src[startOffset:])) + + x := &ast.CreateBindingStmt{ + OriginSel: selStmt, + HintedSel: hintedSelStmt, + GlobalScope: yyS[yypt-5].item.(bool), + } + + parser.yyVAL.statement = x + } + case 1779: + { + startOffset := parser.startOffset(&yyS[yypt]) + selStmt := yyS[yypt-0].statement.(*ast.SelectStmt) + selStmt.SetText(strings.TrimSpace(parser.src[startOffset:])) + + x := &ast.DropBindingStmt{ + OriginSel: selStmt, + GlobalScope: yyS[yypt-3].item.(bool), + } + + parser.yyVAL.statement = x + } + case 1780: + { + parser.yyVAL.statement = &ast.GrantStmt{ + Privs: yyS[yypt-6].item.([]*ast.PrivElem), + ObjectType: yyS[yypt-4].item.(ast.ObjectTypeType), + Level: yyS[yypt-3].item.(*ast.GrantLevel), + Users: yyS[yypt-1].item.([]*ast.UserSpec), + WithGrant: yyS[yypt-0].item.(bool), + } + } + case 1781: + { + parser.yyVAL.statement = &ast.GrantRoleStmt{ + Roles: yyS[yypt-2].item.([]*auth.RoleIdentity), + Users: yyS[yypt-0].item.([]*auth.UserIdentity), + } + } + case 1782: + { + parser.yyVAL.item = false + } + case 1783: + { + parser.yyVAL.item = true + } + case 1784: + { + parser.yyVAL.item = false + } + case 1785: + { + parser.yyVAL.item = false + } + case 1786: + { + parser.yyVAL.item = false + } + case 1787: + { + parser.yyVAL.item = false + } + case 1788: + { + parser.yyVAL.item = &ast.PrivElem{ + Priv: yyS[yypt-0].item.(mysql.PrivilegeType), + } + } + case 1789: + { + parser.yyVAL.item = &ast.PrivElem{ + Priv: yyS[yypt-3].item.(mysql.PrivilegeType), + Cols: yyS[yypt-1].item.([]*ast.ColumnName), + } + } + case 1790: + { + parser.yyVAL.item = []*ast.PrivElem{yyS[yypt-0].item.(*ast.PrivElem)} + } + case 1791: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.PrivElem), yyS[yypt-0].item.(*ast.PrivElem)) + } + case 1792: + { + parser.yyVAL.item = mysql.AllPriv + } + case 1793: + { + parser.yyVAL.item = mysql.AllPriv + } + case 1794: + { + parser.yyVAL.item = mysql.AlterPriv + } + case 1795: + { + parser.yyVAL.item = mysql.CreatePriv + } + case 1796: + { + parser.yyVAL.item = mysql.CreateUserPriv + } + case 1797: + { + parser.yyVAL.item = mysql.TriggerPriv + } + case 1798: + { + parser.yyVAL.item = mysql.DeletePriv + } + case 1799: + { + parser.yyVAL.item = mysql.DropPriv + } + case 1800: + { + parser.yyVAL.item = mysql.ProcessPriv + } + case 1801: + { + parser.yyVAL.item = mysql.ExecutePriv + } + case 1802: + { + parser.yyVAL.item = mysql.IndexPriv + } + case 1803: + { + parser.yyVAL.item = mysql.InsertPriv + } + case 1804: + { + parser.yyVAL.item = mysql.SelectPriv + } + case 1805: + { + parser.yyVAL.item = mysql.SuperPriv + } + case 1806: + { + parser.yyVAL.item = mysql.ShowDBPriv + } + case 1807: + { + parser.yyVAL.item = mysql.UpdatePriv + } + case 1808: + { + parser.yyVAL.item = mysql.GrantPriv + } + case 1809: + { + parser.yyVAL.item = mysql.ReferencesPriv + } + case 1810: + { + parser.yyVAL.item = mysql.PrivilegeType(0) + } + case 1811: + { + parser.yyVAL.item = mysql.PrivilegeType(0) + } + case 1812: + { + parser.yyVAL.item = mysql.PrivilegeType(0) + } + case 1813: + { + parser.yyVAL.item = mysql.PrivilegeType(0) + } + case 1814: + { + parser.yyVAL.item = mysql.CreateTMPTablePriv + } + case 1815: + { + parser.yyVAL.item = mysql.LockTablesPriv + } + case 1816: + { + parser.yyVAL.item = mysql.CreateViewPriv + } + case 1817: + { + parser.yyVAL.item = mysql.ShowViewPriv + } + case 1818: + { + parser.yyVAL.item = mysql.CreateRolePriv + } + case 1819: + { + parser.yyVAL.item = mysql.DropRolePriv + } + case 1820: + { + parser.yyVAL.item = mysql.CreateRoutinePriv + } + case 1821: + { + parser.yyVAL.item = mysql.AlterRoutinePriv + } + case 1822: + { + parser.yyVAL.item = mysql.EventPriv + } + case 1823: + { + parser.yyVAL.item = ast.ObjectTypeNone + } + case 1824: + { + parser.yyVAL.item = ast.ObjectTypeTable + } + case 1825: + { + parser.yyVAL.item = &ast.GrantLevel{ + Level: ast.GrantLevelDB, + } + } + case 1826: + { + parser.yyVAL.item = &ast.GrantLevel{ + Level: ast.GrantLevelGlobal, + } + } + case 1827: + { + parser.yyVAL.item = &ast.GrantLevel{ + Level: ast.GrantLevelDB, + DBName: yyS[yypt-2].ident, + } + } + case 1828: + { + parser.yyVAL.item = &ast.GrantLevel{ + Level: ast.GrantLevelTable, + DBName: yyS[yypt-2].ident, + TableName: yyS[yypt-0].ident, + } + } + case 1829: + { + parser.yyVAL.item = &ast.GrantLevel{ + Level: ast.GrantLevelTable, + TableName: yyS[yypt-0].ident, + } + } + case 1830: + { + parser.yyVAL.statement = &ast.RevokeStmt{ + Privs: yyS[yypt-5].item.([]*ast.PrivElem), + ObjectType: yyS[yypt-3].item.(ast.ObjectTypeType), + Level: yyS[yypt-2].item.(*ast.GrantLevel), + Users: yyS[yypt-0].item.([]*ast.UserSpec), + } + } + case 1831: + { + parser.yyVAL.statement = &ast.RevokeRoleStmt{ + Roles: yyS[yypt-2].item.([]*auth.RoleIdentity), + Users: yyS[yypt-0].item.([]*auth.UserIdentity), + } + } + case 1832: + { + x := &ast.LoadDataStmt{ + Path: yyS[yypt-10].ident, + OnDuplicate: yyS[yypt-9].item.(ast.OnDuplicateKeyHandlingType), + Table: yyS[yypt-6].item.(*ast.TableName), + ColumnsAndUserVars: yyS[yypt-1].item.([]*ast.ColumnNameOrUserVar), + IgnoreLines: yyS[yypt-2].item.(uint64), + } + if yyS[yypt-12].item != nil { + x.IsLocal = true + // See https://dev.mysql.com/doc/refman/5.7/en/load-data.html#load-data-duplicate-key-handling + // If you do not specify IGNORE or REPLACE modifier , then we set default behavior to IGNORE when LOCAL modifier is specified + if x.OnDuplicate == ast.OnDuplicateKeyHandlingError { + x.OnDuplicate = ast.OnDuplicateKeyHandlingIgnore + } + } + if yyS[yypt-4].item != nil { + x.FieldsInfo = yyS[yypt-4].item.(*ast.FieldsClause) + } + if yyS[yypt-3].item != nil { + x.LinesInfo = yyS[yypt-3].item.(*ast.LinesClause) + } + if yyS[yypt-0].item != nil { + x.ColumnAssignments = yyS[yypt-0].item.([]*ast.Assignment) + } + columns := []*ast.ColumnName{} + for _, v := range x.ColumnsAndUserVars { + if v.ColumnName != nil { + columns = append(columns, v.ColumnName) + } + } + x.Columns = columns + + parser.yyVAL.statement = x + } + case 1833: + { + parser.yyVAL.item = uint64(0) + } + case 1834: + { + parser.yyVAL.item = getUint64FromNUM(yyS[yypt-1].item) + } + case 1837: + { + parser.yyVAL.item = nil + } + case 1838: + { + parser.yyVAL.item = yyS[yypt-0].ident + } + case 1839: + { + escape := "\\" + parser.yyVAL.item = &ast.FieldsClause{ + Terminated: "\t", + Escaped: escape[0], + } + } + case 1840: + { + fieldsClause := &ast.FieldsClause{ + Terminated: "\t", + Escaped: []byte("\\")[0], + } + fieldItems := yyS[yypt-0].item.([]*ast.FieldItem) + for _, item := range fieldItems { + switch item.Type { + case ast.Terminated: + fieldsClause.Terminated = item.Value + case ast.Enclosed: + var enclosed byte + if len(item.Value) > 0 { + enclosed = item.Value[0] + } + fieldsClause.Enclosed = enclosed + case ast.Escaped: + var escaped byte + if len(item.Value) > 0 { + escaped = item.Value[0] + } + fieldsClause.Escaped = escaped + } + } + parser.yyVAL.item = fieldsClause + } + case 1843: + { + fieldItems := yyS[yypt-1].item.([]*ast.FieldItem) + parser.yyVAL.item = append(fieldItems, yyS[yypt-0].item.(*ast.FieldItem)) + } + case 1844: + { + fieldItems := make([]*ast.FieldItem, 1, 1) + fieldItems[0] = yyS[yypt-0].item.(*ast.FieldItem) + parser.yyVAL.item = fieldItems + } + case 1845: + { + parser.yyVAL.item = &ast.FieldItem{ + Type: ast.Terminated, + Value: yyS[yypt-0].item.(string), + } + } + case 1846: + { + str := yyS[yypt-0].item.(string) + if str != "\\" && len(str) > 1 { + yylex.AppendError(ErrWrongFieldTerminators.GenWithStackByArgs()) + return 1 + } + parser.yyVAL.item = &ast.FieldItem{ + Type: ast.Enclosed, + Value: str, + } + } + case 1847: + { + str := yyS[yypt-0].item.(string) + if str != "\\" && len(str) > 1 { + yylex.AppendError(ErrWrongFieldTerminators.GenWithStackByArgs()) + return 1 + } + parser.yyVAL.item = &ast.FieldItem{ + Type: ast.Enclosed, + Value: str, + } + } + case 1848: + { + str := yyS[yypt-0].item.(string) + if str != "\\" && len(str) > 1 { + yylex.AppendError(ErrWrongFieldTerminators.GenWithStackByArgs()) + return 1 + } + parser.yyVAL.item = &ast.FieldItem{ + Type: ast.Escaped, + Value: str, + } + } + case 1849: + { + parser.yyVAL.item = yyS[yypt-0].ident + } + case 1850: + { + parser.yyVAL.item = yyS[yypt-0].item.(ast.BinaryLiteral).ToString() + } + case 1851: + { + parser.yyVAL.item = yyS[yypt-0].item.(ast.BinaryLiteral).ToString() + } + case 1852: + { + parser.yyVAL.item = &ast.LinesClause{Terminated: "\n"} + } + case 1853: + { + parser.yyVAL.item = &ast.LinesClause{Starting: yyS[yypt-1].item.(string), Terminated: yyS[yypt-0].item.(string)} + } + case 1854: + { + parser.yyVAL.item = "" + } + case 1855: + { + parser.yyVAL.item = yyS[yypt-0].ident + } + case 1856: + { + parser.yyVAL.item = "\n" + } + case 1857: + { + parser.yyVAL.item = yyS[yypt-0].ident + } + case 1858: + { + parser.yyVAL.item = nil + } + case 1859: + { + parser.yyVAL.item = yyS[yypt-0].item + } + case 1860: + { + l := yyS[yypt-2].item.([]*ast.Assignment) + parser.yyVAL.item = append(l, yyS[yypt-0].item.(*ast.Assignment)) + } + case 1861: + { + parser.yyVAL.item = []*ast.Assignment{yyS[yypt-0].item.(*ast.Assignment)} + } + case 1862: + { + parser.yyVAL.item = &ast.Assignment{ + Column: yyS[yypt-2].expr.(*ast.ColumnNameExpr).Name, + Expr: yyS[yypt-0].expr, + } + + } + case 1863: + { + parser.yyVAL.statement = &ast.UnlockTablesStmt{} + } + case 1864: + { + parser.yyVAL.statement = &ast.LockTablesStmt{ + TableLocks: yyS[yypt-0].item.([]ast.TableLock), + } + } + case 1867: + { + parser.yyVAL.item = ast.TableLock{ + Table: yyS[yypt-1].item.(*ast.TableName), + Type: yyS[yypt-0].item.(model.TableLockType), + } + } + case 1868: + { + parser.yyVAL.item = model.TableLockRead + } + case 1869: + { + parser.yyVAL.item = model.TableLockReadLocal + } + case 1870: + { + parser.yyVAL.item = model.TableLockWrite + } + case 1871: + { + parser.yyVAL.item = model.TableLockWriteLocal + } + case 1872: + { + parser.yyVAL.item = []ast.TableLock{yyS[yypt-0].item.(ast.TableLock)} + } + case 1873: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]ast.TableLock), yyS[yypt-0].item.(ast.TableLock)) + } + case 1874: + { + parser.yyVAL.statement = &ast.KillStmt{ + ConnectionID: getUint64FromNUM(yyS[yypt-0].item), + TiDBExtension: yyS[yypt-1].item.(bool), + } + } + case 1875: + { + parser.yyVAL.statement = &ast.KillStmt{ + ConnectionID: getUint64FromNUM(yyS[yypt-0].item), + TiDBExtension: yyS[yypt-2].item.(bool), + } + } + case 1876: + { + parser.yyVAL.statement = &ast.KillStmt{ + ConnectionID: getUint64FromNUM(yyS[yypt-0].item), + Query: true, + TiDBExtension: yyS[yypt-2].item.(bool), + } + } + case 1877: + { + parser.yyVAL.item = false + } + case 1878: + { + parser.yyVAL.item = true + } + case 1879: + { + parser.yyVAL.statement = &ast.LoadStatsStmt{ + Path: yyS[yypt-0].ident, + } + } + + } + + if yyEx != nil && yyEx.Reduced(r, exState, &parser.yyVAL) { + return -1 + } + goto yystack /* stack new state and value */ +} diff --git a/vendor/github.com/pingcap/parser/parser.y b/vendor/github.com/pingcap/parser/parser.y new file mode 100644 index 0000000..dbc7ca7 --- /dev/null +++ b/vendor/github.com/pingcap/parser/parser.y @@ -0,0 +1,10301 @@ +%{ +// Copyright 2013 The ql Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSES/QL-LICENSE file. + +// Copyright 2015 PingCAP, Inc. +// +// 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +// Initial yacc source generated by ebnf2y[1] +// at 2013-10-04 23:10:47.861401015 +0200 CEST +// +// $ ebnf2y -o ql.y -oe ql.ebnf -start StatementList -pkg ql -p _ +// +// [1]: http://github.com/cznic/ebnf2y + +package parser + +import ( + "strings" + + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/opcode" + "github.com/pingcap/parser/auth" + "github.com/pingcap/parser/charset" + "github.com/pingcap/parser/types" +) + +%} + +%union { + offset int // offset + item interface{} + ident string + expr ast.ExprNode + statement ast.StmtNode +} + +%token + /*yy:token "%c" */ identifier "identifier" + /*yy:token "_%c" */ underscoreCS "UNDERSCORE_CHARSET" + /*yy:token "\"%c\"" */ stringLit "string literal" + singleAtIdentifier "identifier with single leading at" + doubleAtIdentifier "identifier with double leading at" + invalid "a special token never used by parser, used by lexer to indicate error" + hintBegin "hintBegin is a virtual token for optimizer hint grammar" + hintEnd "hintEnd is a virtual token for optimizer hint grammar" + andand "&&" + pipes "||" + + /* The following tokens belong to ODBCDateTimeType. */ + odbcDateType "d" + odbcTimeType "t" + odbcTimestampType "ts" + + /* The following tokens belong to ReservedKeyword. Notice: make sure these tokens are contained in ReservedKeyword. */ + add "ADD" + all "ALL" + alter "ALTER" + analyze "ANALYZE" + and "AND" + as "AS" + asc "ASC" + between "BETWEEN" + bigIntType "BIGINT" + binaryType "BINARY" + blobType "BLOB" + both "BOTH" + by "BY" + cascade "CASCADE" + caseKwd "CASE" + change "CHANGE" + character "CHARACTER" + charType "CHAR" + check "CHECK" + collate "COLLATE" + column "COLUMN" + constraint "CONSTRAINT" + convert "CONVERT" + create "CREATE" + cross "CROSS" + cumeDist "CUME_DIST" + currentDate "CURRENT_DATE" + currentTime "CURRENT_TIME" + currentTs "CURRENT_TIMESTAMP" + currentUser "CURRENT_USER" + currentRole "CURRENT_ROLE" + database "DATABASE" + databases "DATABASES" + dayHour "DAY_HOUR" + dayMicrosecond "DAY_MICROSECOND" + dayMinute "DAY_MINUTE" + daySecond "DAY_SECOND" + decimalType "DECIMAL" + defaultKwd "DEFAULT" + delayed "DELAYED" + deleteKwd "DELETE" + denseRank "DENSE_RANK" + desc "DESC" + describe "DESCRIBE" + distinct "DISTINCT" + distinctRow "DISTINCTROW" + div "DIV" + doubleType "DOUBLE" + drop "DROP" + dual "DUAL" + elseKwd "ELSE" + enclosed "ENCLOSED" + escaped "ESCAPED" + exists "EXISTS" + explain "EXPLAIN" + except "EXCEPT" + falseKwd "FALSE" + firstValue "FIRST_VALUE" + floatType "FLOAT" + forKwd "FOR" + force "FORCE" + foreign "FOREIGN" + from "FROM" + fulltext "FULLTEXT" + generated "GENERATED" + grant "GRANT" + group "GROUP" + groups "GROUPS" + having "HAVING" + highPriority "HIGH_PRIORITY" + hourMicrosecond "HOUR_MICROSECOND" + hourMinute "HOUR_MINUTE" + hourSecond "HOUR_SECOND" + ifKwd "IF" + ignore "IGNORE" + in "IN" + index "INDEX" + infile "INFILE" + inner "INNER" + integerType "INTEGER" + interval "INTERVAL" + into "INTO" + is "IS" + insert "INSERT" + intType "INT" + int1Type "INT1" + int2Type "INT2" + int3Type "INT3" + int4Type "INT4" + int8Type "INT8" + join "JOIN" + key "KEY" + keys "KEYS" + kill "KILL" + lag "LAG" + lastValue "LAST_VALUE" + lead "LEAD" + leading "LEADING" + left "LEFT" + like "LIKE" + limit "LIMIT" + lines "LINES" + linear "LINEAR" + load "LOAD" + localTime "LOCALTIME" + localTs "LOCALTIMESTAMP" + lock "LOCK" + longblobType "LONGBLOB" + longtextType "LONGTEXT" + lowPriority "LOW_PRIORITY" + match "MATCH" + maxValue "MAXVALUE" + mediumblobType "MEDIUMBLOB" + mediumIntType "MEDIUMINT" + mediumtextType "MEDIUMTEXT" + minuteMicrosecond "MINUTE_MICROSECOND" + minuteSecond "MINUTE_SECOND" + mod "MOD" + not "NOT" + noWriteToBinLog "NO_WRITE_TO_BINLOG" + nthValue "NTH_VALUE" + ntile "NTILE" + null "NULL" + numericType "NUMERIC" + nvarcharType "NVARCHAR" + on "ON" + optimize "OPTIMIZE" + option "OPTION" + optionally "OPTIONALLY" + or "OR" + order "ORDER" + outer "OUTER" + over "OVER" + packKeys "PACK_KEYS" + partition "PARTITION" + parser "PARSER" + percentRank "PERCENT_RANK" + precisionType "PRECISION" + primary "PRIMARY" + procedure "PROCEDURE" + shardRowIDBits "SHARD_ROW_ID_BITS" + preSplitRegions "PRE_SPLIT_REGIONS" + rangeKwd "RANGE" + rank "RANK" + read "READ" + realType "REAL" + references "REFERENCES" + regexpKwd "REGEXP" + rename "RENAME" + repeat "REPEAT" + replace "REPLACE" + require "REQUIRE" + restrict "RESTRICT" + revoke "REVOKE" + right "RIGHT" + rlike "RLIKE" + row "ROW" + rows "ROWS" + rowNumber "ROW_NUMBER" + secondMicrosecond "SECOND_MICROSECOND" + selectKwd "SELECT" + set "SET" + show "SHOW" + smallIntType "SMALLINT" + spatial "SPATIAL" + sql "SQL" + sqlBigResult "SQL_BIG_RESULT" + sqlCalcFoundRows "SQL_CALC_FOUND_ROWS" + sqlSmallResult "SQL_SMALL_RESULT" + ssl "SSL" + starting "STARTING" + straightJoin "STRAIGHT_JOIN" + tableKwd "TABLE" + stored "STORED" + terminated "TERMINATED" + then "THEN" + tinyblobType "TINYBLOB" + tinyIntType "TINYINT" + tinytextType "TINYTEXT" + to "TO" + trailing "TRAILING" + trigger "TRIGGER" + trueKwd "TRUE" + unique "UNIQUE" + union "UNION" + unlock "UNLOCK" + unsigned "UNSIGNED" + update "UPDATE" + usage "USAGE" + use "USE" + using "USING" + utcDate "UTC_DATE" + utcTimestamp "UTC_TIMESTAMP" + utcTime "UTC_TIME" + values "VALUES" + long "LONG" + varcharType "VARCHAR" + varcharacter "VARCHARACTER" + varbinaryType "VARBINARY" + varying "VARYING" + virtual "VIRTUAL" + when "WHEN" + where "WHERE" + write "WRITE" + window "WINDOW" + with "WITH" + xor "XOR" + yearMonth "YEAR_MONTH" + zerofill "ZEROFILL" + natural "NATURAL" + + /* The following tokens belong to UnReservedKeyword. Notice: make sure these tokens are contained in UnReservedKeyword. */ + account "ACCOUNT" + action "ACTION" + after "AFTER" + always "ALWAYS" + algorithm "ALGORITHM" + any "ANY" + ascii "ASCII" + autoIncrement "AUTO_INCREMENT" + avgRowLength "AVG_ROW_LENGTH" + avg "AVG" + begin "BEGIN" + binlog "BINLOG" + bitType "BIT" + block "BLOCK" + booleanType "BOOLEAN" + boolType "BOOL" + btree "BTREE" + byteType "BYTE" + cascaded "CASCADED" + charsetKwd "CHARSET" + checksum "CHECKSUM" + cipher "CIPHER" + cleanup "CLEANUP" + client "CLIENT" + coalesce "COALESCE" + collation "COLLATION" + columnFormat "COLUMN_FORMAT" + columns "COLUMNS" + comment "COMMENT" + commit "COMMIT" + committed "COMMITTED" + compact "COMPACT" + compressed "COMPRESSED" + compression "COMPRESSION" + connection "CONNECTION" + consistent "CONSISTENT" + context "CONTEXT" + cpu "CPU" + current "CURRENT" + day "DAY" + data "DATA" + dateType "DATE" + datetimeType "DATETIME" + deallocate "DEALLOCATE" + definer "DEFINER" + delayKeyWrite "DELAY_KEY_WRITE" + directory "DIRECTORY" + disable "DISABLE" + discard "DISCARD" + disk "DISK" + do "DO" + duplicate "DUPLICATE" + dynamic "DYNAMIC" + enable "ENABLE" + encryption "ENCRYPTION" + end "END" + engine "ENGINE" + engines "ENGINES" + enum "ENUM" + event "EVENT" + events "EVENTS" + escape "ESCAPE" + exchange "EXCHANGE" + exclusive "EXCLUSIVE" + execute "EXECUTE" + expire "EXPIRE" + faultsSym "FAULTS" + fields "FIELDS" + first "FIRST" + fixed "FIXED" + flush "FLUSH" + following "FOLLOWING" + format "FORMAT" + full "FULL" + function "FUNCTION" + grants "GRANTS" + hash "HASH" + history "HISTORY" + hour "HOUR" + identified "IDENTIFIED" + importKwd "IMPORT" + insertMethod "INSERT_METHOD" + isolation "ISOLATION" + issuer "ISSUER" + incremental "INCREMENTAL" + indexes "INDEXES" + invisible "INVISIBLE" + invoker "INVOKER" + io "IO" + ipc "IPC" + jsonType "JSON" + keyBlockSize "KEY_BLOCK_SIZE" + last "LAST" + less "LESS" + level "LEVEL" + list "LIST" + local "LOCAL" + master "MASTER" + microsecond "MICROSECOND" + minute "MINUTE" + mode "MODE" + modify "MODIFY" + month "MONTH" + maxRows "MAX_ROWS" + maxConnectionsPerHour "MAX_CONNECTIONS_PER_HOUR" + maxQueriesPerHour "MAX_QUERIES_PER_HOUR" + maxUpdatesPerHour "MAX_UPDATES_PER_HOUR" + maxUserConnections "MAX_USER_CONNECTIONS" + memory "MEMORY" + merge "MERGE" + minRows "MIN_ROWS" + names "NAMES" + national "NATIONAL" + ncharType "NCHAR" + never "NEVER" + no "NO" + nodegroup "NODEGROUP" + none "NONE" + nulls "NULLS" + offset "OFFSET" + only "ONLY" + pageSym "PAGE" + password "PASSWORD" + partial "PARTIAL" + partitioning "PARTITIONING" + partitions "PARTITIONS" + pipesAsOr + plugins "PLUGINS" + preceding "PRECEDING" + prepare "PREPARE" + privileges "PRIVILEGES" + process "PROCESS" + processlist "PROCESSLIST" + profile "PROFILE" + profiles "PROFILES" + quarter "QUARTER" + query "QUERY" + queries "QUERIES" + quick "QUICK" + rebuild "REBUILD" + recover "RECOVER" + redundant "REDUNDANT" + reload "RELOAD" + remove "REMOVE" + reorganize "REORGANIZE" + repair "REPAIR" + repeatable "REPEATABLE" + respect "RESPECT" + replication "REPLICATION" + reverse "REVERSE" + role "ROLE" + rollback "ROLLBACK" + routine "ROUTINE" + rowCount "ROW_COUNT" + rowFormat "ROW_FORMAT" + rtree "RTREE" + second "SECOND" + secondaryEngine "SECONDARY_ENGINE" + secondaryLoad "SECONDARY_LOAD" + secondaryUnload "SECONDARY_UNLOAD" + security "SECURITY" + separator "SEPARATOR" + serial "SERIAL" + serializable "SERIALIZABLE" + session "SESSION" + share "SHARE" + shared "SHARED" + signed "SIGNED" + simple "SIMPLE" + slave "SLAVE" + slow "SLOW" + snapshot "SNAPSHOT" + sqlBufferResult "SQL_BUFFER_RESULT" + sqlCache "SQL_CACHE" + sqlNoCache "SQL_NO_CACHE" + sqlTsiDay "SQL_TSI_DAY" + sqlTsiHour "SQL_TSI_HOUR" + sqlTsiMinute "SQL_TSI_MINUTE" + sqlTsiMonth "SQL_TSI_MONTH" + sqlTsiQuarter "SQL_TSI_QUARTER" + sqlTsiSecond "SQL_TSI_SECOND" + sqlTsiWeek "SQL_TSI_WEEK" + sqlTsiYear "SQL_TSI_YEAR" + start "START" + statsAutoRecalc "STATS_AUTO_RECALC" + statsPersistent "STATS_PERSISTENT" + statsSamplePages "STATS_SAMPLE_PAGES" + status "STATUS" + storage "STORAGE" + swaps "SWAPS" + switchesSym "SWITCHES" + systemTime "SYSTEM_TIME" + open "OPEN" + source "SOURCE" + subject "SUBJECT" + subpartition "SUBPARTITION" + subpartitions "SUBPARTITIONS" + super "SUPER" + some "SOME" + global "GLOBAL" + tableChecksum "TABLE_CHECKSUM" + tables "TABLES" + tablespace "TABLESPACE" + temporary "TEMPORARY" + temptable "TEMPTABLE" + textType "TEXT" + than "THAN" + timeType "TIME" + timestampType "TIMESTAMP" + trace "TRACE" + traditional "TRADITIONAL" + transaction "TRANSACTION" + triggers "TRIGGERS" + truncate "TRUNCATE" + tp "TYPE" + unbounded "UNBOUNDED" + uncommitted "UNCOMMITTED" + unknown "UNKNOWN" + user "USER" + undefined "UNDEFINED" + validation "VALIDATION" + value "VALUE" + variables "VARIABLES" + view "VIEW" + visible "VISIBLE" + binding "BINDING" + bindings "BINDINGS" + warnings "WARNINGS" + without "WITHOUT" + identSQLErrors "ERRORS" + week "WEEK" + yearType "YEAR" + x509 "X509" + enforced "ENFORCED" + + /* The following tokens belong to NotKeywordToken. Notice: make sure these tokens are contained in NotKeywordToken. */ + addDate "ADDDATE" + bitAnd "BIT_AND" + bitOr "BIT_OR" + bitXor "BIT_XOR" + cast "CAST" + copyKwd "COPY" + count "COUNT" + curTime "CURTIME" + dateAdd "DATE_ADD" + dateSub "DATE_SUB" + extract "EXTRACT" + getFormat "GET_FORMAT" + groupConcat "GROUP_CONCAT" + next_row_id "NEXT_ROW_ID" + inplace "INPLACE" + instant "INSTANT" + internal "INTERNAL" + min "MIN" + max "MAX" + maxExecutionTime "MAX_EXECUTION_TIME" + now "NOW" + position "POSITION" + recent "RECENT" + std "STD" + stddev "STDDEV" + stddevPop "STDDEV_POP" + stddevSamp "STDDEV_SAMP" + subDate "SUBDATE" + sum "SUM" + substring "SUBSTRING" + timestampAdd "TIMESTAMPADD" + timestampDiff "TIMESTAMPDIFF" + tokudbDefault "TOKUDB_DEFAULT" + tokudbFast "TOKUDB_FAST" + tokudbLzma "TOKUDB_LZMA" + tokudbQuickLZ "TOKUDB_QUICKLZ" + tokudbSnappy "TOKUDB_SNAPPY" + tokudbSmall "TOKUDB_SMALL" + tokudbUncompressed "TOKUDB_UNCOMPRESSED" + tokudbZlib "TOKUDB_ZLIB" + top "TOP" + trim "TRIM" + variance "VARIANCE" + varPop "VAR_POP" + varSamp "VAR_SAMP" + exprPushdownBlacklist "EXPR_PUSHDOWN_BLACKLIST" + optRuleBlacklist "OPT_RULE_BLACKLIST" + + /* The following tokens belong to TiDBKeyword. Notice: make sure these tokens are contained in TiDBKeyword. */ + admin "ADMIN" + buckets "BUCKETS" + cancel "CANCEL" + cmSketch "CMSKETCH" + ddl "DDL" + depth "DEPTH" + drainer "DRAINER" + jobs "JOBS" + job "JOB" + nodeID "NODE_ID" + nodeState "NODE_STATE" + optimistic "OPTIMISTIC" + pessimistic "PESSIMISTIC" + pump "PUMP" + samples "SAMPLES" + stats "STATS" + statsMeta "STATS_META" + statsHistograms "STATS_HISTOGRAMS" + statsBuckets "STATS_BUCKETS" + statsHealthy "STATS_HEALTHY" + tidb "TIDB" + hintAggToCop "AGG_TO_COP" + hintHJ "HASH_JOIN" + hintSMJ "SM_JOIN" + hintINLJ "INL_JOIN" + hintHASHAGG "HASH_AGG" + hintSTREAMAGG "STREAM_AGG" + hintUseIndexMerge "USE_INDEX_MERGE" + hintNoIndexMerge "NO_INDEX_MERGE" + hintUseToja "USE_TOJA" + hintEnablePlanCache "ENABLE_PLAN_CACHE" + hintUsePlanCache "USE_PLAN_CACHE" + hintReadConsistentReplica "READ_CONSISTENT_REPLICA" + hintReadFromStorage "READ_FROM_STORAGE" + hintQBName "QB_NAME" + hintQueryType "QUERY_TYPE" + hintMemoryQuota "MEMORY_QUOTA" + hintOLAP "OLAP" + hintOLTP "OLTP" + hintTiKV "TIKV" + hintTiFlash "TIFLASH" + topn "TOPN" + split "SPLIT" + width "WIDTH" + regions "REGIONS" + + builtinAddDate + builtinBitAnd + builtinBitOr + builtinBitXor + builtinCast + builtinCount + builtinCurDate + builtinCurTime + builtinDateAdd + builtinDateSub + builtinExtract + builtinGroupConcat + builtinMax + builtinMin + builtinNow + builtinPosition + builtinSubDate + builtinSubstring + builtinSum + builtinSysDate + builtinStddevPop + builtinStddevSamp + builtinTrim + builtinUser + builtinVarPop + builtinVarSamp + +%token + + /*yy:token "1.%d" */ floatLit "floating-point literal" + /*yy:token "1.%d" */ decLit "decimal literal" + /*yy:token "%d" */ intLit "integer literal" + /*yy:token "%x" */ hexLit "hexadecimal literal" + /*yy:token "%b" */ bitLit "bit literal" + + andnot "&^" + assignmentEq ":=" + eq "=" + ge ">=" + le "<=" + jss "->" + juss "->>" + lsh "<<" + neq "!=" + neqSynonym "<>" + nulleq "<=>" + paramMarker "?" + rsh ">>" + +%token not2 + +%type + Expression "expression" + MaxValueOrExpression "maxvalue or expression" + BoolPri "boolean primary expression" + ExprOrDefault "expression or default" + PredicateExpr "Predicate expression factor" + SetExpr "Set variable statement value's expression" + BitExpr "bit expression" + SimpleExpr "simple expression" + SimpleIdent "Simple Identifier expression" + SumExpr "aggregate functions" + FunctionCallGeneric "Function call with Identifier" + FunctionCallKeyword "Function call with keyword as function name" + FunctionCallNonKeyword "Function call with nonkeyword as function name" + Literal "literal value" + Variable "User or system variable" + SystemVariable "System defined variable name" + UserVariable "User defined variable name" + SubSelect "Sub Select" + StringLiteral "text literal" + ExpressionOpt "Optional expression" + SignedLiteral "Literal or NumLiteral with sign" + DefaultValueExpr "DefaultValueExpr(Now or Signed Literal)" + NowSymOptionFraction "NowSym with optional fraction part" + +%type + AdminStmt "Check table statement or show ddl statement" + AlterDatabaseStmt "Alter database statement" + AlterTableStmt "Alter table statement" + AlterUserStmt "Alter user statement" + AnalyzeTableStmt "Analyze table statement" + BeginTransactionStmt "BEGIN TRANSACTION statement" + BinlogStmt "Binlog base64 statement" + CommitStmt "COMMIT statement" + CreateTableStmt "CREATE TABLE statement" + CreateViewStmt "CREATE VIEW stetement" + CreateUserStmt "CREATE User statement" + CreateRoleStmt "CREATE Role statement" + CreateDatabaseStmt "Create Database Statement" + CreateIndexStmt "CREATE INDEX statement" + CreateBindingStmt "CREATE BINDING statement" + DoStmt "Do statement" + DropDatabaseStmt "DROP DATABASE statement" + DropIndexStmt "DROP INDEX statement" + DropStatsStmt "DROP STATS statement" + DropTableStmt "DROP TABLE statement" + DropUserStmt "DROP USER" + DropRoleStmt "DROP ROLE" + DropViewStmt "DROP VIEW statement" + DropBindingStmt "DROP BINDING statement" + DeallocateStmt "Deallocate prepared statement" + DeleteFromStmt "DELETE FROM statement" + EmptyStmt "empty statement" + ExecuteStmt "Execute statement" + ExplainStmt "EXPLAIN statement" + ExplainableStmt "explainable statement" + FlushStmt "Flush statement" + GrantStmt "Grant statement" + GrantRoleStmt "Grant role statement" + InsertIntoStmt "INSERT INTO statement" + KillStmt "Kill statement" + LoadDataStmt "Load data statement" + LoadStatsStmt "Load statistic statement" + LockTablesStmt "Lock tables statement" + PreparedStmt "PreparedStmt" + SelectStmt "SELECT statement" + RenameTableStmt "rename table statement" + ReplaceIntoStmt "REPLACE INTO statement" + RecoverTableStmt "recover table statement" + RevokeStmt "Revoke statement" + RevokeRoleStmt "Revoke role statement" + RollbackStmt "ROLLBACK statement" + SplitRegionStmt "Split index region statement" + SetStmt "Set variable statement" + ChangeStmt "Change statement" + SetRoleStmt "Set active role statement" + SetDefaultRoleStmt "Set default statement for some user" + ShowStmt "Show engines/databases/tables/user/columns/warnings/status statement" + Statement "statement" + TraceStmt "TRACE statement" + TraceableStmt "traceable statement" + TruncateTableStmt "TRUNCATE TABLE statement" + UnlockTablesStmt "Unlock tables statement" + UpdateStmt "UPDATE statement" + UnionStmt "Union select state ment" + UseStmt "USE statement" + +%type + AdminShowSlow "Admin Show Slow statement" + AllOrPartitionNameList "All or partition name list" + AlgorithmClause "Alter table algorithm" + AlterTablePartitionOpt "Alter table partition option" + AlterTableSpec "Alter table specification" + AlterTableSpecList "Alter table specification list" + AlterTableSpecListOpt "Alter table specification list optional" + AnalyzeOption "Analyze option" + AnalyzeOptionList "Analyze option list" + AnalyzeOptionListOpt "Optional analyze option list" + AnyOrAll "Any or All for subquery" + Assignment "assignment" + AssignmentList "assignment list" + AssignmentListOpt "assignment list opt" + AuthOption "User auth option" + AuthString "Password string value" + OptionalBraces "optional braces" + CastType "Cast function target type" + CharsetName "Character set name" + ClearPasswordExpireOptions "Clear password expire options" + CollationName "Collation name" + ColumnDef "table column definition" + ColumnDefList "table column definition list" + ColumnFormat "Column format" + ColumnName "column name" + ColumnNameOrUserVariable "column name or user variable" + ColumnNameList "column name list" + ColumnNameOrUserVariableList "column name or user variable list" + ColumnList "column list" + ColumnNameListOpt "column name list opt" + ColumnNameOrUserVarListOpt "column name or user vairiabe list opt" + ColumnNameOrUserVarListOptWithBrackets "column name or user variable list opt with brackets" + ColumnSetValue "insert statement set value by column name" + ColumnSetValueList "insert statement set value by column name list" + CompareOp "Compare opcode" + ColumnOption "column definition option" + ColumnOptionList "column definition option list" + VirtualOrStored "indicate generated column is stored or not" + ColumnOptionListOpt "optional column definition option list" + ConnectionOption "single connection options" + ConnectionOptionList "connection options for CREATE USER statement" + ConnectionOptions "optional connection options for CREATE USER statement" + Constraint "table constraint" + ConstraintElem "table constraint element" + ConstraintKeywordOpt "Constraint Keyword or empty" + CreateTableOptionListOpt "create table option list opt" + CreateTableSelectOpt "Select/Union statement in CREATE TABLE ... SELECT" + DatabaseOption "CREATE Database specification" + DatabaseOptionList "CREATE Database specification list" + DatabaseOptionListOpt "CREATE Database specification list opt" + DBName "Database Name" + DistinctOpt "Explicit distinct option" + DefaultFalseDistinctOpt "Distinct option which defaults to false" + DefaultTrueDistinctOpt "Distinct option which defaults to true" + BuggyDefaultFalseDistinctOpt "Distinct option which accepts DISTINCT ALL and defaults to false" + RequireClause "Encrypted connections options" + RequireClauseOpt "optional Encrypted connections options" + EqOpt "= or empty" + EscapedTableRef "escaped table reference" + ExplainFormatType "explain format type" + ExpressionList "expression list" + MaxValueOrExpressionList "maxvalue or expression list" + ExpressionListOpt "expression list opt" + FuncDatetimePrecListOpt "Function datetime precision list opt" + FuncDatetimePrecList "Function datetime precision list" + Field "field expression" + Fields "Fields clause" + FieldAsName "Field alias name" + FieldAsNameOpt "Field alias name opt" + FieldList "field expression list" + FieldTerminator "Field terminator" + FlushOption "Flush option" + PluginNameList "Plugin Name List" + TableRefsClause "Table references clause" + FieldItem "Field item for load data clause" + FieldItemList "Field items for load data clause" + FuncDatetimePrec "Function datetime precision" + GetFormatSelector "{DATE|DATETIME|TIME|TIMESTAMP}" + GlobalScope "The scope of variable" + GroupByClause "GROUP BY clause" + HashString "Hashed string" + HavingClause "HAVING clause" + HandleRange "handle range" + HandleRangeList "handle range list" + IfExists "If Exists" + IfNotExists "If Not Exists" + IgnoreOptional "IGNORE or empty" + IndexColName "Index column name" + IndexColNameList "List of index column name" + IndexColNameListOpt "List of index column name opt" + IndexHint "index hint" + IndexHintList "index hint list" + IndexHintListOpt "index hint list opt" + IndexHintScope "index hint scope" + IndexHintType "index hint type" + IndexInvisible "index visible/invisible" + IndexKeyTypeOpt "index key type" + IndexLockAndAlgorithmOpt "index lock and algorithm" + IndexName "index name" + IndexNameAndTypeOpt "index name and index type" + IndexNameList "index name list" + IndexOption "Index Option" + IndexOptionList "Index Option List or empty" + IndexType "index type" + IndexTypeName "index type name" + IndexTypeOpt "optional index type" + InsertValues "Rest part of INSERT/REPLACE INTO statement" + JoinTable "join table" + JoinType "join type" + KillOrKillTiDB "Kill or Kill TiDB" + LikeEscapeOpt "like escape option" + LikeTableWithOrWithoutParen "LIKE table_name or ( LIKE table_name )" + LimitClause "LIMIT clause" + LimitOption "Limit option could be integer or parameter marker." + Lines "Lines clause" + LinesTerminated "Lines terminated by" + LoadDataSetSpecOpt "Optional load data specification" + LoadDataSetList "Load data specifications" + LoadDataSetItem "Single load data specification" + LocalOpt "Local opt" + LockClause "Alter table lock clause" + NumLiteral "Num/Int/Float/Decimal Literal" + NoWriteToBinLogAliasOpt "NO_WRITE_TO_BINLOG alias LOCAL or empty" + ObjectType "Grant statement object type" + OnDuplicateKeyUpdate "ON DUPLICATE KEY UPDATE value list" + DuplicateOpt "[IGNORE|REPLACE] in CREATE TABLE ... SELECT statement or LOAD DATA statement" + OptFull "Full or empty" + OptTemporary "TEMPORARY or empty" + Order "ORDER BY clause optional collation specification" + OrderBy "ORDER BY clause" + OrReplace "or replace" + ByItem "BY item" + OrderByOptional "Optional ORDER BY clause optional" + ByList "BY list" + AlterOrderItem "Alter Order item" + AlterOrderList "Alter Order list" + QuickOptional "QUICK or empty" + QueryBlockOpt "Query block identifier optional" + PartitionDefinition "Partition definition" + PartitionDefinitionList "Partition definition list" + PartitionDefinitionListOpt "Partition definition list option" + PartitionKeyAlgorithmOpt "ALGORITHM = n option for KEY partition" + PartitionMethod "Partition method" + PartitionOpt "Partition option" + PartitionNameList "Partition name list" + PartitionNameListOpt "table partition names list optional" + PartitionNumOpt "PARTITION NUM option" + PartDefValuesOpt "VALUES {LESS THAN {(expr | value_list) | MAXVALUE} | IN {value_list}" + PartDefOptionList "PartDefOption list" + PartDefOption "COMMENT [=] xxx | TABLESPACE [=] tablespace_name | ENGINE [=] xxx" + PasswordExpire "Single password option for create user statement" + PasswordOpt "Password option" + PasswordOrLockOption "Single password or lock option for create user statement" + PasswordOrLockOptionList "Password or lock options for create user statement" + PasswordOrLockOptions "Optional password or lock options for create user statement" + ColumnPosition "Column position [First|After ColumnName]" + PrepareSQL "Prepare statement sql string" + PriorityOpt "Statement priority option" + PrivElem "Privilege element" + PrivElemList "Privilege element list" + PrivLevel "Privilege scope" + PrivType "Privilege type" + ReferDef "Reference definition" + OnDelete "ON DELETE clause" + OnUpdate "ON UPDATE clause" + OnDeleteUpdateOpt "optional ON DELETE and UPDATE clause" + OptGConcatSeparator "optional GROUP_CONCAT SEPARATOR" + ReferOpt "reference option" + ReorganizePartitionRuleOpt "optional reorganize partition partition list and definitions" + RequireList "require list" + RequireListElement "require list element" + Rolename "Rolename" + RolenameList "RolenameList" + RoleSpec "Rolename and auth option" + RoleSpecList "Rolename and auth option list" + RoleNameString "role name string" + RowFormat "Row format option" + RowValue "Row value" + SelectLockOpt "FOR UPDATE or LOCK IN SHARE MODE," + SelectStmtCalcFoundRows "SELECT statement optional SQL_CALC_FOUND_ROWS" + SelectStmtSQLBigResult "SELECT statement optional SQL_BIG_RESULT" + SelectStmtSQLBufferResult "SELECT statement optional SQL_BUFFER_RESULT" + SelectStmtSQLCache "SELECT statement optional SQL_CAHCE/SQL_NO_CACHE" + SelectStmtSQLSmallResult "SELECT statement optional SQL_SMALL_RESULT" + SelectStmtStraightJoin "SELECT statement optional STRAIGHT_JOIN" + SelectStmtFieldList "SELECT statement field list" + SelectStmtLimit "SELECT statement optional LIMIT clause" + SelectStmtOpts "Select statement options" + SelectStmtBasic "SELECT statement from constant value" + SelectStmtFromDualTable "SELECT statement from dual table" + SelectStmtFromTable "SELECT statement from table" + SelectStmtGroup "SELECT statement optional GROUP BY clause" + SetRoleOpt "Set role options" + SetDefaultRoleOpt "Set default role options" + ShowTargetFilterable "Show target that can be filtered by WHERE or LIKE" + ShowDatabaseNameOpt "Show tables/columns statement database name option" + ShowTableAliasOpt "Show table alias option" + ShowLikeOrWhereOpt "Show like or where clause option" + ShowProfileArgsOpt "Show profile args option" + ShowProfileTypesOpt "Show profile types option" + ShowProfileType "Show profile type" + ShowProfileTypes "Show profile types" + SplitOption "Split Option" + Starting "Starting by" + StatementList "statement list" + StatsPersistentVal "stats_persistent value" + StringName "string literal or identifier" + StringList "string list" + SubPartDefinition "SubPartition definition" + SubPartDefinitionList "SubPartition definition list" + SubPartDefinitionListOpt "SubPartition definition list optional" + SubPartitionMethod "SubPartition method" + SubPartitionOpt "SubPartition option" + SubPartitionNumOpt "SubPartition NUM option" + Symbol "Constraint Symbol" + TableAsName "table alias name" + TableAsNameOpt "table alias name optional" + TableElement "table definition element" + TableElementList "table definition element list" + TableElementListOpt "table definition element list optional" + TableFactor "table factor" + TableLock "Table name and lock type" + TableLockList "Table lock list" + TableName "Table name" + TableNameList "Table name list" + TableNameListOpt "Table name list opt" + TableOption "create table option" + TableOptionList "create table option list" + TableRef "table reference" + TableRefs "table references" + TableToTable "rename table to table" + TableToTableList "rename table to table by list" + TimeUnit "Time unit for 'DATE_ADD', 'DATE_SUB', 'ADDDATE', 'SUBDATE', 'EXTRACT'" + TimestampUnit "Time unit for 'TIMESTAMPADD' and 'TIMESTAMPDIFF'" + LockType "Table locks type" + + TransactionChar "Transaction characteristic" + TransactionChars "Transaction characteristic list" + TrimDirection "Trim string direction" + UnionOpt "Union Option(empty/ALL/DISTINCT)" + UnionClauseList "Union select clause list" + UnionSelect "Union (select) item" + Username "Username" + UsernameList "UsernameList" + UserSpec "Username and auth option" + UserSpecList "Username and auth option list" + UserVariableList "User defined variable name list" + UsingRoles "UsingRoles is role option for SHOW GRANT" + Values "values" + ValuesList "values list" + ValuesOpt "values optional" + VariableAssignment "set variable value" + VariableAssignmentList "set variable value list" + ViewAlgorithm "view algorithm" + ViewCheckOption "view check option" + ViewDefiner "view definer" + ViewName "view name" + ViewFieldList "create view statement field list" + ViewSQLSecurity "view sql security" + WhereClause "WHERE clause" + WhereClauseOptional "Optional WHERE clause" + WhenClause "When clause" + WhenClauseList "When clause list" + WithReadLockOpt "With Read Lock opt" + WithGrantOptionOpt "With Grant Option opt" + WithValidation "with validation" + WithValidationOpt "optional with validation" + ElseOpt "Optional else clause" + Type "Types" + + OptExistingWindowName "Optional existing WINDOW name" + OptFromFirstLast "Optional FROM FIRST/LAST" + OptLLDefault "Optional LEAD/LAG default" + OptLeadLagInfo "Optional LEAD/LAG info" + OptNullTreatment "Optional NULL treatment" + OptPartitionClause "Optional PARTITION clause" + OptWindowOrderByClause "Optional ORDER BY clause in WINDOW" + OptWindowFrameClause "Optional FRAME clause in WINDOW" + OptWindowingClause "Optional OVER clause" + WindowingClause "OVER clause" + WindowClauseOptional "Optional WINDOW clause" + WindowDefinitionList "WINDOW definition list" + WindowDefinition "WINDOW definition" + WindowFrameUnits "WINDOW frame units" + WindowFrameBetween "WINDOW frame between" + WindowFrameBound "WINDOW frame bound" + WindowFrameExtent "WINDOW frame extent" + WindowFrameStart "WINDOW frame start" + WindowFuncCall "WINDOW function call" + WindowName "WINDOW name" + WindowNameOrSpec "WINDOW name or spec" + WindowSpec "WINDOW spec" + WindowSpecDetails "WINDOW spec details" + + BetweenOrNotOp "Between predicate" + IsOrNotOp "Is predicate" + InOrNotOp "In predicate" + LikeOrNotOp "Like predicate" + RegexpOrNotOp "Regexp predicate" + + NumericType "Numeric types" + IntegerType "Integer Types types" + BooleanType "Boolean Types types" + FixedPointType "Exact value types" + FloatingPointType "Approximate value types" + BitValueType "bit value types" + StringType "String types" + BlobType "Blob types" + TextType "Text types" + DateAndTimeType "Date and Time types" + + OptFieldLen "Field length or empty" + FieldLen "Field length" + FieldOpts "Field type definition option list" + FieldOpt "Field type definition option" + FloatOpt "Floating-point type option" + Precision "Floating-point precision option" + OptBinary "Optional BINARY" + OptBinMod "Optional BINARY mode" + OptCharset "Optional Character setting" + OptCollate "Optional Collate setting" + IgnoreLines "Ignore num(int) lines" + NUM "A number" + NumList "Some numbers" + LengthNum "Field length num(uint64)" + StorageOptimizerHintOpt "Storage level optimizer hint" + TableOptimizerHintOpt "Table level optimizer hint" + TableOptimizerHints "Table level optimizer hints" + OptimizerHintList "optimizer hint list" + HintTable "Table in optimizer hint" + HintTableList "Table list in optimizer hint" + HintStorageType "storage type in optimizer hint" + HintStorageTypeAndTable "storage type and tables in optimizer hint" + HintStorageTypeAndTableList "storage type and tables list in optimizer hint" + HintTrueOrFalse "True or false in optimizer hint" + HintQueryType "Query type in optimizer hint" + HintMemoryQuota "Memory quota in optimizer hint" + EnforcedOrNot "{ENFORCED|NOT ENFORCED}" + EnforcedOrNotOpt "Optional {ENFORCED|NOT ENFORCED}" + EnforcedOrNotOrNotNullOpt "{[ENFORCED|NOT ENFORCED|NOT NULL]}" + Match "[MATCH FULL | MATCH PARTIAL | MATCH SIMPLE]" + MatchOpt "optional MATCH clause" + +%type + AsOpt "AS or EmptyString" + KeyOrIndex "{KEY|INDEX}" + ColumnKeywordOpt "Column keyword or empty" + PrimaryOpt "Optional primary keyword" + NowSym "CURRENT_TIMESTAMP/LOCALTIME/LOCALTIMESTAMP" + NowSymFunc "CURRENT_TIMESTAMP/LOCALTIME/LOCALTIMESTAMP/NOW" + DefaultKwdOpt "optional DEFAULT keyword" + DatabaseSym "DATABASE or SCHEMA" + ExplainSym "EXPLAIN or DESCRIBE or DESC" + RegexpSym "REGEXP or RLIKE" + IntoOpt "INTO or EmptyString" + ValueSym "Value or Values" + Char "{CHAR|CHARACTER}" + NChar "{NCHAR|NATIONAL CHARACTER|NATIONAL CHAR}" + Varchar "{VARCHAR|VARCHARACTER|CHARACTER VARYING|CHAR VARYING}" + NVarchar "{NATIONAL VARCHAR|NATIONAL VARCHARACTER|NVARCHAR|NCHAR VARCHAR|NATIONAL CHARACTER VARYING|NATIONAL CHAR VARYING|NCHAR VARYING}" + DeallocateSym "Deallocate or drop" + OuterOpt "optional OUTER clause" + CrossOpt "Cross join option" + TablesTerminalSym "{TABLE|TABLES}" + IsolationLevel "Isolation level" + ShowIndexKwd "Show index/indexs/key keyword" + DistinctKwd "DISTINCT/DISTINCTROW keyword" + FromOrIn "From or In" + OptTable "Optional table keyword" + OptInteger "Optional Integer keyword" + CharsetKw "charset or charater set" + CommaOpt "optional comma" + logAnd "logical and operator" + logOr "logical or operator" + LinearOpt "linear or empty" + FieldsOrColumns "Fields or columns" + +%type + ODBCDateTimeType "ODBC type keywords for date and time literals" + Identifier "identifier or unreserved keyword" + NotKeywordToken "Tokens not mysql keyword but treated specially" + UnReservedKeyword "MySQL unreserved keywords" + TiDBKeyword "TiDB added keywords" + FunctionNameConflict "Built-in function call names which are conflict with keywords" + FunctionNameOptionalBraces "Function with optional braces, all of them are reserved keywords." + FunctionNameDatetimePrecision "Function with optional datetime precision, all of them are reserved keywords." + FunctionNameDateArith "Date arith function call names (date_add or date_sub)" + FunctionNameDateArithMultiForms "Date arith function call names (adddate or subdate)" + VariableName "A simple Identifier like xx or the xx.xx form" + +%precedence empty + +%precedence sqlBufferResult +%precedence sqlBigResult +%precedence sqlSmallResult +%precedence sqlCache sqlNoCache +%precedence lowerThanIntervalKeyword +%precedence interval +%precedence lowerThanStringLitToken +%precedence stringLit +%precedence lowerThanSetKeyword +%precedence set +%precedence lowerThanInsertValues +%precedence insertValues +%precedence lowerThanCreateTableSelect +%precedence createTableSelect +%precedence lowerThanCharsetKwd +%precedence charsetKwd +%precedence lowerThanKey +%precedence key +%precedence lowerThanLocal +%precedence local +%precedence lowerThanRemove +%precedence remove +%precedence lowerThenOrder +%precedence order + +%left join straightJoin inner cross left right full natural +/* A dummy token to force the priority of TableRef production in a join. */ +%left tableRefPriority +%precedence lowerThanOn +%precedence on using +%right assignmentEq +%left pipes or pipesAsOr +%left xor +%left andand and +%left between +%precedence lowerThanEq +%left eq ge le neq neqSynonym '>' '<' is like in +%left '|' +%left '&' +%left rsh lsh +%left '-' '+' +%left '*' '/' '%' div mod +%left '^' +%left '~' neg +%precedence lowerThanNot +%right not not2 +%right collate +%right encryption + +%left splitOptionPriv +%precedence '(' +%precedence quick +%precedence escape +%precedence lowerThanComma +%precedence ',' +%precedence higherThanComma + +%start Start + +%% + +Start: + StatementList + +/**************************************AlterTableStmt*************************************** + * See https://dev.mysql.com/doc/refman/5.7/en/alter-table.html + *******************************************************************************************/ +AlterTableStmt: + "ALTER" IgnoreOptional "TABLE" TableName AlterTableSpecListOpt AlterTablePartitionOpt + { + specs := $5.([]*ast.AlterTableSpec) + if $6 != nil { + specs = append(specs, $6.(*ast.AlterTableSpec)) + } + $$ = &ast.AlterTableStmt{ + Table: $4.(*ast.TableName), + Specs: specs, + } + } +| "ALTER" IgnoreOptional "TABLE" TableName "ANALYZE" "PARTITION" PartitionNameList AnalyzeOptionListOpt + { + $$ = &ast.AnalyzeTableStmt{TableNames: []*ast.TableName{$4.(*ast.TableName)}, PartitionNames: $7.([]model.CIStr), AnalyzeOpts: $8.([]ast.AnalyzeOpt),} + } +| "ALTER" IgnoreOptional "TABLE" TableName "ANALYZE" "PARTITION" PartitionNameList "INDEX" IndexNameList AnalyzeOptionListOpt + { + $$ = &ast.AnalyzeTableStmt{ + TableNames: []*ast.TableName{$4.(*ast.TableName)}, + PartitionNames: $7.([]model.CIStr), + IndexNames: $9.([]model.CIStr), + IndexFlag: true, + AnalyzeOpts: $10.([]ast.AnalyzeOpt), + } + } + +AlterTablePartitionOpt: + PartitionOpt + { + if $1 != nil { + $$ = &ast.AlterTableSpec{ + Tp: ast.AlterTablePartition, + Partition: $1.(*ast.PartitionOptions), + } + } else { + $$ = nil + } + + } +| "REMOVE" "PARTITIONING" + { + $$ = &ast.AlterTableSpec{ + Tp: ast.AlterTableRemovePartitioning, + } + yylex.AppendError(yylex.Errorf("The REMOVE PARTITIONING clause is parsed but ignored by all storage engines.")) + parser.lastErrorAsWarn() + } + +AlterTableSpec: + TableOptionList %prec higherThanComma + { + $$ = &ast.AlterTableSpec{ + Tp: ast.AlterTableOption, + Options:$1.([]*ast.TableOption), + } + } +| "CONVERT" "TO" CharsetKw CharsetName OptCollate + { + op := &ast.AlterTableSpec{ + Tp: ast.AlterTableOption, + Options:[]*ast.TableOption{{Tp: ast.TableOptionCharset, StrValue: $4.(string)}}, + } + if $5 != "" { + op.Options = append(op.Options, &ast.TableOption{Tp: ast.TableOptionCollate, StrValue: $5.(string)}) + } + $$ = op + } +| "ADD" ColumnKeywordOpt IfNotExists ColumnDef ColumnPosition + { + $$ = &ast.AlterTableSpec{ + IfNotExists: $3.(bool), + Tp: ast.AlterTableAddColumns, + NewColumns: []*ast.ColumnDef{$4.(*ast.ColumnDef)}, + Position: $5.(*ast.ColumnPosition), + } + } +| "ADD" ColumnKeywordOpt IfNotExists '(' ColumnDefList ')' + { + $$ = &ast.AlterTableSpec{ + IfNotExists: $3.(bool), + Tp: ast.AlterTableAddColumns, + NewColumns: $5.([]*ast.ColumnDef), + } + } +| "ADD" Constraint + { + constraint := $2.(*ast.Constraint) + $$ = &ast.AlterTableSpec{ + Tp: ast.AlterTableAddConstraint, + Constraint: constraint, + } + } +| "ADD" "PARTITION" IfNotExists NoWriteToBinLogAliasOpt PartitionDefinitionListOpt + { + var defs []*ast.PartitionDefinition + if $5 != nil { + defs = $5.([]*ast.PartitionDefinition) + } + noWriteToBinlog := $4.(bool) + if noWriteToBinlog { + yylex.AppendError(yylex.Errorf("The NO_WRITE_TO_BINLOG option is parsed but ignored for now.")) + parser.lastErrorAsWarn() + } + $$ = &ast.AlterTableSpec{ + IfNotExists: $3.(bool), + NoWriteToBinlog: noWriteToBinlog, + Tp: ast.AlterTableAddPartitions, + PartDefinitions: defs, + } + } +| "ADD" "PARTITION" IfNotExists NoWriteToBinLogAliasOpt "PARTITIONS" NUM + { + noWriteToBinlog := $4.(bool) + if noWriteToBinlog { + yylex.AppendError(yylex.Errorf("The NO_WRITE_TO_BINLOG option is parsed but ignored for now.")) + parser.lastErrorAsWarn() + } + $$ = &ast.AlterTableSpec{ + IfNotExists: $3.(bool), + NoWriteToBinlog: noWriteToBinlog, + Tp: ast.AlterTableAddPartitions, + Num: getUint64FromNUM($6), + } + } +| "CHECK" "PARTITION" AllOrPartitionNameList + { + yylex.AppendError(yylex.Errorf("The CHECK PARTITIONING clause is parsed but not implement yet.")) + parser.lastErrorAsWarn() + ret := &ast.AlterTableSpec{ + Tp: ast.AlterTableCheckPartitions, + } + if $3 == nil { + ret.OnAllPartitions = true + } else { + ret.PartitionNames = $3.([]model.CIStr) + } + $$ = ret + } +| "COALESCE" "PARTITION" NoWriteToBinLogAliasOpt NUM + { + noWriteToBinlog := $3.(bool) + if noWriteToBinlog { + yylex.AppendError(yylex.Errorf("The NO_WRITE_TO_BINLOG option is parsed but ignored for now.")) + parser.lastErrorAsWarn() + } + $$ = &ast.AlterTableSpec{ + Tp: ast.AlterTableCoalescePartitions, + NoWriteToBinlog: noWriteToBinlog, + Num: getUint64FromNUM($4), + } + } +| "DROP" ColumnKeywordOpt IfExists ColumnName RestrictOrCascadeOpt + { + $$ = &ast.AlterTableSpec{ + IfExists: $3.(bool), + Tp: ast.AlterTableDropColumn, + OldColumnName: $4.(*ast.ColumnName), + } + } +| "DROP" "PRIMARY" "KEY" + { + $$ = &ast.AlterTableSpec{Tp: ast.AlterTableDropPrimaryKey} + } +| "DROP" "PARTITION" IfExists PartitionNameList %prec lowerThanComma + { + $$ = &ast.AlterTableSpec{ + IfExists: $3.(bool), + Tp: ast.AlterTableDropPartition, + PartitionNames: $4.([]model.CIStr), + } + } +| "EXCHANGE" "PARTITION" Identifier "WITH" "TABLE" TableName WithValidationOpt + { + $$ = &ast.AlterTableSpec{ + Tp: ast.AlterTableExchangePartition, + PartitionNames: []model.CIStr{model.NewCIStr($3)}, + NewTable: $6.(*ast.TableName), + WithValidation: $7.(bool), + } + yylex.AppendError(yylex.Errorf("TiDB does not support EXCHANGE PARTITION now, it would be parsed but ignored.")) + parser.lastErrorAsWarn() + } +| "TRUNCATE" "PARTITION" AllOrPartitionNameList + { + ret := &ast.AlterTableSpec{ + Tp: ast.AlterTableTruncatePartition, + } + if $3 == nil { + ret.OnAllPartitions = true + yylex.AppendError(yylex.Errorf("The TRUNCATE PARTITION ALL clause is parsed but ignored by all storage engines.")) + parser.lastErrorAsWarn() + } else { + ret.PartitionNames = $3.([]model.CIStr) + } + $$ = ret + } +| "OPTIMIZE" "PARTITION" NoWriteToBinLogAliasOpt AllOrPartitionNameList + { + ret := &ast.AlterTableSpec{ + NoWriteToBinlog: $3.(bool), + Tp: ast.AlterTableOptimizePartition, + } + if $4 == nil { + ret.OnAllPartitions = true + } else { + ret.PartitionNames = $4.([]model.CIStr) + } + $$ = ret + yylex.AppendError(yylex.Errorf("The OPTIMIZE PARTITION clause is parsed but ignored by all storage engines.")) + parser.lastErrorAsWarn() + } +| "REPAIR" "PARTITION" NoWriteToBinLogAliasOpt AllOrPartitionNameList + { + ret := &ast.AlterTableSpec{ + NoWriteToBinlog: $3.(bool), + Tp: ast.AlterTableRepairPartition, + } + if $4 == nil { + ret.OnAllPartitions = true + } else { + ret.PartitionNames = $4.([]model.CIStr) + } + $$ = ret + yylex.AppendError(yylex.Errorf("The REPAIR PARTITION clause is parsed but ignored by all storage engines.")) + parser.lastErrorAsWarn() + } +| "IMPORT" "PARTITION" AllOrPartitionNameList "TABLESPACE" + { + ret := &ast.AlterTableSpec{ + Tp: ast.AlterTableImportPartitionTablespace, + } + if $3 == nil { + ret.OnAllPartitions = true + } else { + ret.PartitionNames = $3.([]model.CIStr) + } + $$ = ret + yylex.AppendError(yylex.Errorf("The IMPORT PARTITION TABLESPACE clause is parsed but ignored by all storage engines.")) + parser.lastErrorAsWarn() + } +| "DISCARD" "PARTITION" AllOrPartitionNameList "TABLESPACE" + { + ret := &ast.AlterTableSpec{ + Tp: ast.AlterTableDiscardPartitionTablespace, + } + if $3 == nil { + ret.OnAllPartitions = true + } else { + ret.PartitionNames = $3.([]model.CIStr) + } + $$ = ret + yylex.AppendError(yylex.Errorf("The DISCARD PARTITION TABLESPACE clause is parsed but ignored by all storage engines.")) + parser.lastErrorAsWarn() + } +| "IMPORT" "TABLESPACE" + { + ret := &ast.AlterTableSpec{ + Tp: ast.AlterTableImportTablespace, + } + $$ = ret + yylex.AppendError(yylex.Errorf("The IMPORT TABLESPACE clause is parsed but ignored by all storage engines.")) + parser.lastErrorAsWarn() + } +| "DISCARD" "TABLESPACE" + { + ret := &ast.AlterTableSpec{ + Tp: ast.AlterTableDiscardTablespace, + } + $$ = ret + yylex.AppendError(yylex.Errorf("The DISCARD TABLESPACE clause is parsed but ignored by all storage engines.")) + parser.lastErrorAsWarn() + } +| "REBUILD" "PARTITION" NoWriteToBinLogAliasOpt AllOrPartitionNameList + { + ret := &ast.AlterTableSpec{ + Tp: ast.AlterTableRebuildPartition, + NoWriteToBinlog: $3.(bool), + } + if $4 == nil { + ret.OnAllPartitions = true + } else { + ret.PartitionNames = $4.([]model.CIStr) + } + $$ = ret + yylex.AppendError(yylex.Errorf("REBUILD PARTITION syntax is parsed but not implement for now.")) + parser.lastErrorAsWarn() + } +| "REORGANIZE" "PARTITION" NoWriteToBinLogAliasOpt ReorganizePartitionRuleOpt { + ret := $4.(*ast.AlterTableSpec) + ret.NoWriteToBinlog = $3.(bool) + $$ = ret + yylex.AppendError(yylex.Errorf("REORGANIZE PARTITION syntax is parsed but not implement for now.")) + parser.lastErrorAsWarn() + } +| "DROP" KeyOrIndex IfExists Identifier + { + $$ = &ast.AlterTableSpec{ + IfExists: $3.(bool), + Tp: ast.AlterTableDropIndex, + Name: $4, + } + } +| "DROP" "FOREIGN" "KEY" IfExists Symbol + { + $$ = &ast.AlterTableSpec{ + IfExists: $4.(bool), + Tp: ast.AlterTableDropForeignKey, + Name: $5.(string), + } + } +| "ORDER" "BY" AlterOrderList %prec lowerThenOrder + { + $$ = &ast.AlterTableSpec{ + Tp: ast.AlterTableOrderByColumns, + OrderByList: $3.([]*ast.AlterOrderItem), + } + } +| "DISABLE" "KEYS" + { + $$ = &ast.AlterTableSpec{ + Tp: ast.AlterTableDisableKeys, + } + } +| "ENABLE" "KEYS" + { + $$ = &ast.AlterTableSpec{ + Tp: ast.AlterTableEnableKeys, + } + } +| "MODIFY" ColumnKeywordOpt IfExists ColumnDef ColumnPosition + { + $$ = &ast.AlterTableSpec{ + IfExists: $3.(bool), + Tp: ast.AlterTableModifyColumn, + NewColumns: []*ast.ColumnDef{$4.(*ast.ColumnDef)}, + Position: $5.(*ast.ColumnPosition), + } + } +| "CHANGE" ColumnKeywordOpt IfExists ColumnName ColumnDef ColumnPosition + { + $$ = &ast.AlterTableSpec{ + IfExists: $3.(bool), + Tp: ast.AlterTableChangeColumn, + OldColumnName: $4.(*ast.ColumnName), + NewColumns: []*ast.ColumnDef{$5.(*ast.ColumnDef)}, + Position: $6.(*ast.ColumnPosition), + } + } +| "ALTER" ColumnKeywordOpt ColumnName "SET" "DEFAULT" SignedLiteral + { + option := &ast.ColumnOption{Expr: $6} + colDef := &ast.ColumnDef{ + Name: $3.(*ast.ColumnName), + Options: []*ast.ColumnOption{option}, + } + $$ = &ast.AlterTableSpec{ + Tp: ast.AlterTableAlterColumn, + NewColumns: []*ast.ColumnDef{colDef}, + } + } +| "ALTER" ColumnKeywordOpt ColumnName "SET" "DEFAULT" '(' Expression ')' + { + option := &ast.ColumnOption{Expr: $7} + colDef := &ast.ColumnDef{ + Name: $3.(*ast.ColumnName), + Options: []*ast.ColumnOption{option}, + } + $$ = &ast.AlterTableSpec{ + Tp: ast.AlterTableAlterColumn, + NewColumns: []*ast.ColumnDef{colDef}, + } + } +| "ALTER" ColumnKeywordOpt ColumnName "DROP" "DEFAULT" + { + colDef := &ast.ColumnDef{ + Name: $3.(*ast.ColumnName), + } + $$ = &ast.AlterTableSpec{ + Tp: ast.AlterTableAlterColumn, + NewColumns: []*ast.ColumnDef{colDef}, + } + } +| "RENAME" "COLUMN" ColumnName "TO" ColumnName + { + $$ = &ast.AlterTableSpec{ + Tp: ast.AlterTableRenameColumn, + OldColumnName: $3.(*ast.ColumnName), + NewColumnName: $5.(*ast.ColumnName), + } + } +| "RENAME" "TO" TableName + { + $$ = &ast.AlterTableSpec{ + Tp: ast.AlterTableRenameTable, + NewTable: $3.(*ast.TableName), + } + } +| "RENAME" EqOpt TableName + { + $$ = &ast.AlterTableSpec{ + Tp: ast.AlterTableRenameTable, + NewTable: $3.(*ast.TableName), + } + } +| "RENAME" "AS" TableName + { + $$ = &ast.AlterTableSpec{ + Tp: ast.AlterTableRenameTable, + NewTable: $3.(*ast.TableName), + } + } +| "RENAME" KeyOrIndex Identifier "TO" Identifier + { + $$ = &ast.AlterTableSpec{ + Tp: ast.AlterTableRenameIndex, + FromKey: model.NewCIStr($3), + ToKey: model.NewCIStr($5), + } + } +| LockClause + { + $$ = &ast.AlterTableSpec{ + Tp: ast.AlterTableLock, + LockType: $1.(ast.LockType), + } + } +| AlgorithmClause + { + // Parse it and ignore it. Just for compatibility. + $$ = &ast.AlterTableSpec{ + Tp: ast.AlterTableAlgorithm, + Algorithm: $1.(ast.AlgorithmType), + } + } +| "FORCE" + { + // Parse it and ignore it. Just for compatibility. + $$ = &ast.AlterTableSpec{ + Tp: ast.AlterTableForce, + } + } +| "WITH" "VALIDATION" + { + // Parse it and ignore it. Just for compatibility. + $$ = &ast.AlterTableSpec{ + Tp: ast.AlterTableWithValidation, + } + yylex.AppendError(yylex.Errorf("The WITH/WITHOUT VALIDATION clause is parsed but ignored by all storage engines.")) + parser.lastErrorAsWarn() + } +| "WITHOUT" "VALIDATION" + { + // Parse it and ignore it. Just for compatibility. + $$ = &ast.AlterTableSpec{ + Tp: ast.AlterTableWithoutValidation, + } + yylex.AppendError(yylex.Errorf("The WITH/WITHOUT VALIDATION clause is parsed but ignored by all storage engines.")) + parser.lastErrorAsWarn() + } +// Added in MySQL 8.0.13, see: https://dev.mysql.com/doc/refman/8.0/en/keywords.html for details +| "SECONDARY_LOAD" + { + // Parse it and ignore it. Just for compatibility. + $$ = &ast.AlterTableSpec{ + Tp: ast.AlterTableSecondaryLoad, + } + yylex.AppendError(yylex.Errorf("The SECONDARY_LOAD clause is parsed but not implement yet.")) + parser.lastErrorAsWarn() + } +// Added in MySQL 8.0.13, see: https://dev.mysql.com/doc/refman/8.0/en/keywords.html for details +| "SECONDARY_UNLOAD" + { + // Parse it and ignore it. Just for compatibility. + $$ = &ast.AlterTableSpec{ + Tp: ast.AlterTableSecondaryUnload, + } + yylex.AppendError(yylex.Errorf("The SECONDARY_UNLOAD VALIDATION clause is parsed but not implement yet.")) + parser.lastErrorAsWarn() + } +| "ALTER" "CHECK" Identifier EnforcedOrNot + { + // Parse it and ignore it. Just for compatibility. + c := &ast.Constraint{ + Name: $3, + Enforced: $4.(bool), + } + $$ = &ast.AlterTableSpec{ + Tp: ast.AlterTableAlterCheck, + Constraint: c, + } + yylex.AppendError(yylex.Errorf("The ALTER CHECK clause is parsed but not implemented yet.")) + parser.lastErrorAsWarn() + } +| "DROP" "CHECK" Identifier + { + // Parse it and ignore it. Just for compatibility. + c := &ast.Constraint{ + Name: $3, + } + $$ = &ast.AlterTableSpec{ + Tp: ast.AlterTableDropCheck, + Constraint: c, + } + yylex.AppendError(yylex.Errorf("The DROP CHECK clause is parsed but not implemented yet.")) + parser.lastErrorAsWarn() + } +| "ALTER" "INDEX" Identifier IndexInvisible + { + $$ = &ast.AlterTableSpec{ + Tp: ast.AlterTableIndexInvisible, + Name: $3, + Visibility: $4.(ast.IndexVisibility), + } + } + +ReorganizePartitionRuleOpt: + /* empty */ %prec lowerThanRemove + { + ret := &ast.AlterTableSpec{ + Tp: ast.AlterTableReorganizePartition, + OnAllPartitions: true, + } + $$ = ret + } +| PartitionNameList "INTO" '(' PartitionDefinitionList ')' + { + ret := &ast.AlterTableSpec{ + Tp: ast.AlterTableReorganizePartition, + PartitionNames: $1.([]model.CIStr), + PartDefinitions: $4.([]*ast.PartitionDefinition), + } + $$ = ret + } + +AllOrPartitionNameList: + "ALL" + { + $$ = nil + } +| PartitionNameList %prec lowerThanComma + { + $$ = $1 + } + +WithValidationOpt: + { + $$ = true + } +| WithValidation + { + $$ = $1 + } + +WithValidation: + "WITH" "VALIDATION" + { + $$ = true + } +| "WITHOUT" "VALIDATION" + { + $$ = false + } + +AlgorithmClause: + "ALGORITHM" EqOpt "DEFAULT" + { + $$ = ast.AlgorithmTypeDefault + } +| "ALGORITHM" EqOpt "COPY" + { + $$ = ast.AlgorithmTypeCopy + } +| "ALGORITHM" EqOpt "INPLACE" + { + $$ = ast.AlgorithmTypeInplace + } +| "ALGORITHM" EqOpt "INSTANT" + { + $$ = ast.AlgorithmTypeInstant + } +| "ALGORITHM" EqOpt identifier + { + yylex.AppendError(ErrUnknownAlterAlgorithm.GenWithStackByArgs($1)) + return 1 + } + +LockClause: + "LOCK" EqOpt "DEFAULT" + { + $$ = ast.LockTypeDefault + } +| "LOCK" EqOpt Identifier + { + id := strings.ToUpper($3) + + if id == "NONE" { + $$ = ast.LockTypeNone + } else if id == "SHARED" { + $$ = ast.LockTypeShared + } else if id == "EXCLUSIVE" { + $$ = ast.LockTypeExclusive + } else { + yylex.AppendError(ErrUnknownAlterLock.GenWithStackByArgs($3)) + return 1 + } + } + +KeyOrIndex: "KEY" | "INDEX" + + +KeyOrIndexOpt: + {} +| KeyOrIndex + +ColumnKeywordOpt: + {} +| "COLUMN" + +ColumnPosition: + { + $$ = &ast.ColumnPosition{Tp: ast.ColumnPositionNone} + } +| "FIRST" + { + $$ = &ast.ColumnPosition{Tp: ast.ColumnPositionFirst} + } +| "AFTER" ColumnName + { + $$ = &ast.ColumnPosition{ + Tp: ast.ColumnPositionAfter, + RelativeColumn: $2.(*ast.ColumnName), + } + } + +AlterTableSpecListOpt: + /* empty */ + { + $$ = make([]*ast.AlterTableSpec, 0, 1) + } +| AlterTableSpecList + { + $$ = $1 + } + +AlterTableSpecList: + AlterTableSpec + { + $$ = []*ast.AlterTableSpec{$1.(*ast.AlterTableSpec)} + } +| AlterTableSpecList ',' AlterTableSpec + { + $$ = append($1.([]*ast.AlterTableSpec), $3.(*ast.AlterTableSpec)) + } + +PartitionNameList: + Identifier + { + $$ = []model.CIStr{model.NewCIStr($1)} + } +| PartitionNameList ',' Identifier + { + $$ = append($1.([]model.CIStr), model.NewCIStr($3)) + } + +ConstraintKeywordOpt: + { + $$ = nil + } +| "CONSTRAINT" + { + $$ = nil + } +| "CONSTRAINT" Symbol + { + $$ = $2.(string) + } + +Symbol: + Identifier + { + $$ = $1 + } + +/**************************************RenameTableStmt*************************************** + * See http://dev.mysql.com/doc/refman/5.7/en/rename-table.html + * + * TODO: refactor this when you are going to add full support for multiple schema changes. + * Currently it is only useful for syncer which depends heavily on tidb parser to do some dirty work. + *******************************************************************************************/ +RenameTableStmt: + "RENAME" "TABLE" TableToTableList + { + $$ = &ast.RenameTableStmt{ + OldTable: $3.([]*ast.TableToTable)[0].OldTable, + NewTable: $3.([]*ast.TableToTable)[0].NewTable, + TableToTables: $3.([]*ast.TableToTable), + } + } + +TableToTableList: + TableToTable + { + $$ = []*ast.TableToTable{$1.(*ast.TableToTable)} + } +| TableToTableList ',' TableToTable + { + $$ = append($1.([]*ast.TableToTable), $3.(*ast.TableToTable)) + } + +TableToTable: + TableName "TO" TableName + { + $$ = &ast.TableToTable{ + OldTable: $1.(*ast.TableName), + NewTable: $3.(*ast.TableName), + } + } +/******************************************************************* + * + * Recover Table Statement + * + * Example: + * RECOVER TABLE t1; + * RECOVER TABLE BY JOB 100; + * + *******************************************************************/ +RecoverTableStmt: + "RECOVER" "TABLE" "BY" "JOB" NUM + { + $$ = &ast.RecoverTableStmt{ + JobID: $5.(int64), + } + } +| "RECOVER" "TABLE" TableName + { + $$ = &ast.RecoverTableStmt{ + Table: $3.(*ast.TableName), + } + } +| "RECOVER" "TABLE" TableName NUM + { + $$ = &ast.RecoverTableStmt{ + Table: $3.(*ast.TableName), + JobNum: $4.(int64), + } + } + +/******************************************************************* + * + * Split index region statement + * + * Example: + * SPLIT TABLE table_name INDEX index_name BY (val1...),(val2...)... + * + *******************************************************************/ +SplitRegionStmt: + "SPLIT" "TABLE" TableName SplitOption + { + $$ = &ast.SplitRegionStmt{ + Table: $3.(*ast.TableName), + SplitOpt: $4.(*ast.SplitOption), + } + } +| "SPLIT" "TABLE" TableName "INDEX" Identifier SplitOption + { + $$ = &ast.SplitRegionStmt{ + Table: $3.(*ast.TableName), + IndexName: model.NewCIStr($5), + SplitOpt: $6.(*ast.SplitOption), + } + } + +SplitOption: + "BETWEEN" RowValue "AND" RowValue "REGIONS" NUM + { + $$ = &ast.SplitOption{ + Lower: $2.([]ast.ExprNode), + Upper: $4.([]ast.ExprNode), + Num: $6.(int64), + } + } +| "BY" ValuesList + { + $$ = &ast.SplitOption{ + ValueLists: $2.([][]ast.ExprNode), + } + } + +/*******************************************************************************************/ + +AnalyzeTableStmt: + "ANALYZE" "TABLE" TableNameList AnalyzeOptionListOpt + { + $$ = &ast.AnalyzeTableStmt{TableNames: $3.([]*ast.TableName), AnalyzeOpts: $4.([]ast.AnalyzeOpt),} + } +| "ANALYZE" "TABLE" TableName "INDEX" IndexNameList AnalyzeOptionListOpt + { + $$ = &ast.AnalyzeTableStmt{TableNames: []*ast.TableName{$3.(*ast.TableName)}, IndexNames: $5.([]model.CIStr), IndexFlag: true, AnalyzeOpts: $6.([]ast.AnalyzeOpt),} + } +| "ANALYZE" "INCREMENTAL" "TABLE" TableName "INDEX" IndexNameList AnalyzeOptionListOpt + { + $$ = &ast.AnalyzeTableStmt{TableNames: []*ast.TableName{$4.(*ast.TableName)}, IndexNames: $6.([]model.CIStr), IndexFlag: true, Incremental: true, AnalyzeOpts: $7.([]ast.AnalyzeOpt),} + } +| "ANALYZE" "TABLE" TableName "PARTITION" PartitionNameList AnalyzeOptionListOpt + { + $$ = &ast.AnalyzeTableStmt{TableNames: []*ast.TableName{$3.(*ast.TableName)}, PartitionNames: $5.([]model.CIStr), AnalyzeOpts: $6.([]ast.AnalyzeOpt),} + } +| "ANALYZE" "TABLE" TableName "PARTITION" PartitionNameList "INDEX" IndexNameList AnalyzeOptionListOpt + { + $$ = &ast.AnalyzeTableStmt{ + TableNames: []*ast.TableName{$3.(*ast.TableName)}, + PartitionNames: $5.([]model.CIStr), + IndexNames: $7.([]model.CIStr), + IndexFlag: true, + AnalyzeOpts: $8.([]ast.AnalyzeOpt), + } + } +| "ANALYZE" "INCREMENTAL" "TABLE" TableName "PARTITION" PartitionNameList "INDEX" IndexNameList AnalyzeOptionListOpt + { + $$ = &ast.AnalyzeTableStmt{ + TableNames: []*ast.TableName{$4.(*ast.TableName)}, + PartitionNames: $6.([]model.CIStr), + IndexNames: $8.([]model.CIStr), + IndexFlag: true, + Incremental: true, + AnalyzeOpts: $9.([]ast.AnalyzeOpt), + } + } + +AnalyzeOptionListOpt: + { + $$ = []ast.AnalyzeOpt{} + } +| "WITH" AnalyzeOptionList + { + $$ = $2.([]ast.AnalyzeOpt) + } + +AnalyzeOptionList: + AnalyzeOption + { + $$ = []ast.AnalyzeOpt{$1.(ast.AnalyzeOpt)} + } +| AnalyzeOptionList ',' AnalyzeOption + { + $$ = append($1.([]ast.AnalyzeOpt), $3.(ast.AnalyzeOpt)) + } + +AnalyzeOption: + NUM "BUCKETS" + { + $$ = ast.AnalyzeOpt{Type: ast.AnalyzeOptNumBuckets, Value: getUint64FromNUM($1)} + } +| NUM "TOPN" + { + $$ = ast.AnalyzeOpt{Type: ast.AnalyzeOptNumTopN, Value: getUint64FromNUM($1)} + } +| NUM "CMSKETCH" "DEPTH" + { + $$ = ast.AnalyzeOpt{Type: ast.AnalyzeOptCMSketchDepth, Value: getUint64FromNUM($1)} + } +| NUM "CMSKETCH" "WIDTH" + { + $$ = ast.AnalyzeOpt{Type: ast.AnalyzeOptCMSketchWidth, Value: getUint64FromNUM($1)} + } +| NUM "SAMPLES" + { + $$ = ast.AnalyzeOpt{Type: ast.AnalyzeOptNumSamples, Value: getUint64FromNUM($1)} + } + +/*******************************************************************************************/ +Assignment: + ColumnName eq Expression + { + $$ = &ast.Assignment{Column: $1.(*ast.ColumnName), Expr:$3} + } + +AssignmentList: + Assignment + { + $$ = []*ast.Assignment{$1.(*ast.Assignment)} + } +| AssignmentList ',' Assignment + { + $$ = append($1.([]*ast.Assignment), $3.(*ast.Assignment)) + } + +AssignmentListOpt: + /* EMPTY */ + { + $$ = []*ast.Assignment{} + } +| AssignmentList + +BeginTransactionStmt: + "BEGIN" + { + $$ = &ast.BeginStmt{} + } +| "BEGIN" "PESSIMISTIC" + { + $$ = &ast.BeginStmt{ + Mode: ast.Pessimistic, + } + } +| "BEGIN" "OPTIMISTIC" + { + $$ = &ast.BeginStmt{ + Mode: ast.Optimistic, + } + } +| "START" "TRANSACTION" + { + $$ = &ast.BeginStmt{} + } +| "START" "TRANSACTION" "WITH" "CONSISTENT" "SNAPSHOT" + { + $$ = &ast.BeginStmt{} + } + +BinlogStmt: + "BINLOG" stringLit + { + $$ = &ast.BinlogStmt{Str: $2} + } + +ColumnDefList: + ColumnDef + { + $$ = []*ast.ColumnDef{$1.(*ast.ColumnDef)} + } +| ColumnDefList ',' ColumnDef + { + $$ = append($1.([]*ast.ColumnDef), $3.(*ast.ColumnDef)) + } + +ColumnDef: + ColumnName Type ColumnOptionListOpt + { + colDef := &ast.ColumnDef{Name: $1.(*ast.ColumnName), Tp: $2.(*types.FieldType), Options: $3.([]*ast.ColumnOption)} + if !colDef.Validate() { + yylex.AppendError(yylex.Errorf("Invalid column definition")) + return 1 + } + $$ = colDef + } +| ColumnName "SERIAL" ColumnOptionListOpt + { + // TODO: check flen 0 + tp := types.NewFieldType(mysql.TypeLonglong) + options := []*ast.ColumnOption{{Tp: ast.ColumnOptionNotNull}, {Tp: ast.ColumnOptionAutoIncrement}, {Tp: ast.ColumnOptionUniqKey}} + options = append(options, $3.([]*ast.ColumnOption)...) + tp.Flag |= mysql.UnsignedFlag + colDef := &ast.ColumnDef{Name: $1.(*ast.ColumnName), Tp: tp, Options: options} + if !colDef.Validate() { + yylex.AppendError(yylex.Errorf("Invalid column definition")) + return 1 + } + $$ = colDef + } + +ColumnName: + Identifier + { + $$ = &ast.ColumnName{Name: model.NewCIStr($1)} + } +| Identifier '.' Identifier + { + $$ = &ast.ColumnName{Table: model.NewCIStr($1), Name: model.NewCIStr($3)} + } +| Identifier '.' Identifier '.' Identifier + { + $$ = &ast.ColumnName{Schema: model.NewCIStr($1), Table: model.NewCIStr($3), Name: model.NewCIStr($5)} + } + +ColumnNameList: + ColumnName + { + $$ = []*ast.ColumnName{$1.(*ast.ColumnName)} + } +| ColumnNameList ',' ColumnName + { + $$ = append($1.([]*ast.ColumnName), $3.(*ast.ColumnName)) + } + +ColumnNameListOpt: + /* EMPTY */ + { + $$ = []*ast.ColumnName{} + } +| ColumnNameList + { + $$ = $1.([]*ast.ColumnName) + } + +ColumnNameOrUserVarListOpt: + /* EMPTY */ + { + $$ = []*ast.ColumnNameOrUserVar{} + } +| ColumnNameOrUserVariableList + { + $$ = $1.([]*ast.ColumnNameOrUserVar) + } + +ColumnNameOrUserVariableList: + ColumnNameOrUserVariable + { + $$ = []*ast.ColumnNameOrUserVar{$1.(*ast.ColumnNameOrUserVar)} + } +| ColumnNameOrUserVariableList ',' ColumnNameOrUserVariable + { + $$ = append($1.([]*ast.ColumnNameOrUserVar), $3.(*ast.ColumnNameOrUserVar)) + } + +ColumnNameOrUserVariable: + ColumnName + { + $$ = &ast.ColumnNameOrUserVar{ColumnName: $1.(*ast.ColumnName)} + } +| UserVariable + { + $$ = &ast.ColumnNameOrUserVar{UserVar: $1.(*ast.VariableExpr)} + } + +ColumnNameOrUserVarListOptWithBrackets: + /* EMPTY */ + { + $$ = []*ast.ColumnNameOrUserVar{} + } +| '(' ColumnNameOrUserVarListOpt ')' + { + $$ = $2.([]*ast.ColumnNameOrUserVar) + } + +CommitStmt: + "COMMIT" + { + $$ = &ast.CommitStmt{} + } + +PrimaryOpt: + {} +| "PRIMARY" + +EnforcedOrNot: + "ENFORCED" + { + $$ = true + } +| "NOT" "ENFORCED" + { + $$ = false + } + +EnforcedOrNotOpt: + { + $$ = true + } %prec lowerThanNot +| EnforcedOrNot + { + $$ = $1 + } + +EnforcedOrNotOrNotNullOpt: +// This branch is needed to workaround the need of a lookahead of 2 for the grammar: +// +// { [NOT] NULL | CHECK(...) [NOT] ENFORCED } ... + "NOT" "NULL" + { + $$ = 0 + } +| EnforcedOrNotOpt + { + if ($1.(bool)) { + $$ = 1 + } else { + $$ = 2 + } + } + +ColumnOption: + "NOT" "NULL" + { + $$ = &ast.ColumnOption{Tp: ast.ColumnOptionNotNull} + } +| "NULL" + { + $$ = &ast.ColumnOption{Tp: ast.ColumnOptionNull} + } +| "AUTO_INCREMENT" + { + $$ = &ast.ColumnOption{Tp: ast.ColumnOptionAutoIncrement} + } +| PrimaryOpt "KEY" + { + // KEY is normally a synonym for INDEX. The key attribute PRIMARY KEY + // can also be specified as just KEY when given in a column definition. + // See http://dev.mysql.com/doc/refman/5.7/en/create-table.html + $$ = &ast.ColumnOption{Tp: ast.ColumnOptionPrimaryKey} + } +| "UNIQUE" %prec lowerThanKey + { + $$ = &ast.ColumnOption{Tp: ast.ColumnOptionUniqKey} + } +| "UNIQUE" "KEY" + { + $$ = &ast.ColumnOption{Tp: ast.ColumnOptionUniqKey} + } +| "DEFAULT" DefaultValueExpr + { + $$ = &ast.ColumnOption{Tp: ast.ColumnOptionDefaultValue, Expr: $2} + } +| "SERIAL" "DEFAULT" "VALUE" + { + $$ = []*ast.ColumnOption{{Tp: ast.ColumnOptionNotNull}, {Tp: ast.ColumnOptionAutoIncrement}, {Tp: ast.ColumnOptionUniqKey}} + } +| "ON" "UPDATE" NowSymOptionFraction + { + $$ = &ast.ColumnOption{Tp: ast.ColumnOptionOnUpdate, Expr: $3} + } +| "COMMENT" stringLit + { + $$ = &ast.ColumnOption{Tp: ast.ColumnOptionComment, Expr: ast.NewValueExpr($2)} + } +| "CHECK" '(' Expression ')' EnforcedOrNotOrNotNullOpt + { + // See https://dev.mysql.com/doc/refman/5.7/en/create-table.html + // The CHECK clause is parsed but ignored by all storage engines. + // See the branch named `EnforcedOrNotOrNotNullOpt`. + + optionCheck := &ast.ColumnOption{ + Tp: ast.ColumnOptionCheck, + Expr: $3, + Enforced: true, + } + switch $5.(int) { + case 0: + $$ = []*ast.ColumnOption{optionCheck, {Tp: ast.ColumnOptionNotNull}} + case 1: + optionCheck.Enforced = true + $$ = optionCheck + case 2: + optionCheck.Enforced = false + $$ = optionCheck + default: + } + yylex.AppendError(yylex.Errorf("The CHECK clause is parsed but ignored by all storage engines.")) + parser.lastErrorAsWarn() + } +| GeneratedAlways "AS" '(' Expression ')' VirtualOrStored + { + startOffset := parser.startOffset(&yyS[yypt-2]) + endOffset := parser.endOffset(&yyS[yypt-1]) + expr := $4 + expr.SetText(parser.src[startOffset:endOffset]) + + $$ = &ast.ColumnOption{ + Tp: ast.ColumnOptionGenerated, + Expr: expr, + Stored: $6.(bool), + } + } +| ReferDef + { + $$ = &ast.ColumnOption{ + Tp: ast.ColumnOptionReference, + Refer: $1.(*ast.ReferenceDef), + } + } +| "COLLATE" CollationName + { + $$ = &ast.ColumnOption{Tp: ast.ColumnOptionCollate, StrValue: $2.(string)} + } +| "COLUMN_FORMAT" ColumnFormat + { + $$ = &ast.ColumnOption{Tp: ast.ColumnOptionColumnFormat, StrValue: $2.(string)} + } + +ColumnFormat: + "DEFAULT" + { + $$ = "DEFAULT" + } +| "FIXED" + { + $$ = "FIXED" + } +| "DYNAMIC" + { + $$ = "DYNAMIC" + } + +GeneratedAlways: | "GENERATED" "ALWAYS" + +VirtualOrStored: + { + $$ = false + } +| "VIRTUAL" + { + $$ = false + } +| "STORED" + { + $$ = true + } + +ColumnOptionList: + ColumnOption + { + if columnOption,ok := $1.(*ast.ColumnOption); ok { + $$ = []*ast.ColumnOption{columnOption} + } else { + $$ = $1 + } + } +| ColumnOptionList ColumnOption + { + if columnOption,ok := $2.(*ast.ColumnOption); ok { + $$ = append($1.([]*ast.ColumnOption), columnOption) + } else { + $$ = append($1.([]*ast.ColumnOption), $2.([]*ast.ColumnOption)...) + } + } + +ColumnOptionListOpt: + { + $$ = []*ast.ColumnOption{} + } +| ColumnOptionList + { + $$ = $1.([]*ast.ColumnOption) + } + +ConstraintElem: + "PRIMARY" "KEY" IndexNameAndTypeOpt '(' IndexColNameList ')' IndexOptionList + { + c := &ast.Constraint{ + Tp: ast.ConstraintPrimaryKey, + Keys: $5.([]*ast.IndexColName), + } + if $7 != nil { + c.Option = $7.(*ast.IndexOption) + } + if indexType := $3.([]interface{})[1]; indexType != nil { + if c.Option == nil { + c.Option = &ast.IndexOption{} + } + c.Option.Tp = indexType.(model.IndexType) + } + $$ = c + } +| "FULLTEXT" KeyOrIndexOpt IndexName '(' IndexColNameList ')' IndexOptionList + { + c := &ast.Constraint{ + Tp: ast.ConstraintFulltext, + Keys: $5.([]*ast.IndexColName), + Name: $3.(string), + } + if $7 != nil { + c.Option = $7.(*ast.IndexOption) + } + $$ = c + } +| KeyOrIndex IfNotExists IndexNameAndTypeOpt '(' IndexColNameList ')' IndexOptionList + { + c := &ast.Constraint{ + IfNotExists: $2.(bool), + Tp: ast.ConstraintIndex, + Keys: $5.([]*ast.IndexColName), + } + if $7 != nil { + c.Option = $7.(*ast.IndexOption) + } + c.Name = $3.([]interface{})[0].(string) + if indexType := $3.([]interface{})[1]; indexType != nil { + if c.Option == nil { + c.Option = &ast.IndexOption{} + } + c.Option.Tp = indexType.(model.IndexType) + } + $$ = c + } +| "UNIQUE" KeyOrIndexOpt IndexNameAndTypeOpt '(' IndexColNameList ')' IndexOptionList + { + c := &ast.Constraint{ + Tp: ast.ConstraintUniq, + Keys: $5.([]*ast.IndexColName), + } + if $7 != nil { + c.Option = $7.(*ast.IndexOption) + } + c.Name = $3.([]interface{})[0].(string) + if indexType := $3.([]interface{})[1]; indexType != nil { + if c.Option == nil { + c.Option = &ast.IndexOption{} + } + c.Option.Tp = indexType.(model.IndexType) + } + $$ = c + } +| "FOREIGN" "KEY" IfNotExists IndexName '(' IndexColNameList ')' ReferDef + { + $$ = &ast.Constraint{ + IfNotExists: $3.(bool), + Tp: ast.ConstraintForeignKey, + Keys: $6.([]*ast.IndexColName), + Name: $4.(string), + Refer: $8.(*ast.ReferenceDef), + } + } +| "CHECK" '(' Expression ')' EnforcedOrNotOpt + { + $$ = &ast.Constraint{ + Tp: ast.ConstraintCheck, + Expr: $3.(ast.ExprNode), + Enforced: $5.(bool), + } + yylex.AppendError(yylex.Errorf("The CHECK clause is parsed but ignored by all storage engines.")) + parser.lastErrorAsWarn() + } + +Match: + "MATCH" "FULL" + { + $$ = ast.MatchFull + } +| "MATCH" "PARTIAL" + { + $$ = ast.MatchPartial + } +| "MATCH" "SIMPLE" + { + $$ = ast.MatchSimple + } + +MatchOpt: + { + $$ = ast.MatchNone + } +| Match + { + $$ = $1 + yylex.AppendError(yylex.Errorf("The MATCH clause is parsed but ignored by all storage engines.")) + parser.lastErrorAsWarn() + } + +ReferDef: + "REFERENCES" TableName IndexColNameListOpt MatchOpt OnDeleteUpdateOpt + { + onDeleteUpdate := $5.([2]interface{}) + $$ = &ast.ReferenceDef{ + Table: $2.(*ast.TableName), + IndexColNames: $3.([]*ast.IndexColName), + OnDelete: onDeleteUpdate[0].(*ast.OnDeleteOpt), + OnUpdate: onDeleteUpdate[1].(*ast.OnUpdateOpt), + Match: $4.(ast.MatchType), + } + } + +IndexColNameListOpt: +{ + $$ = ([]*ast.IndexColName)(nil) +} +| +'(' IndexColNameList ')' +{ + $$ = $2 +} + +OnDelete: + "ON" "DELETE" ReferOpt + { + $$ = &ast.OnDeleteOpt{ReferOpt: $3.(ast.ReferOptionType)} + } + +OnUpdate: + "ON" "UPDATE" ReferOpt + { + $$ = &ast.OnUpdateOpt{ReferOpt: $3.(ast.ReferOptionType)} + } + +OnDeleteUpdateOpt: + { + $$ = [2]interface{}{&ast.OnDeleteOpt{}, &ast.OnUpdateOpt{}} + } %prec lowerThanOn +| OnDelete %prec lowerThanOn + { + $$ = [2]interface{}{$1, &ast.OnUpdateOpt{}} + } +| OnUpdate %prec lowerThanOn + { + $$ = [2]interface{}{&ast.OnDeleteOpt{}, $1} + } +| OnDelete OnUpdate + { + $$ = [2]interface{}{$1, $2} + } +| OnUpdate OnDelete + { + $$ = [2]interface{}{$2, $1} + } + +ReferOpt: + "RESTRICT" + { + $$ = ast.ReferOptionRestrict + } +| "CASCADE" + { + $$ = ast.ReferOptionCascade + } +| "SET" "NULL" + { + $$ = ast.ReferOptionSetNull + } +| "NO" "ACTION" + { + $$ = ast.ReferOptionNoAction + } +| "SET" "DEFAULT" + { + $$ = ast.ReferOptionSetDefault + yylex.AppendError(yylex.Errorf("The SET DEFAULT clause is parsed but ignored by all storage engines.")) + parser.lastErrorAsWarn() + } + +/* + * The DEFAULT clause specifies a default value for a column. + * With one exception, the default value must be a constant; + * it cannot be a function or an expression. This means, for example, + * that you cannot set the default for a date column to be the value of + * a function such as NOW() or CURRENT_DATE. The exception is that you + * can specify CURRENT_TIMESTAMP as the default for a TIMESTAMP or DATETIME column. + * + * See http://dev.mysql.com/doc/refman/5.7/en/create-table.html + * https://github.com/mysql/mysql-server/blob/5.7/sql/sql_yacc.yy#L6832 + */ +DefaultValueExpr: + NowSymOptionFraction | SignedLiteral + +NowSymOptionFraction: + NowSym + { + $$ = &ast.FuncCallExpr{FnName: model.NewCIStr("CURRENT_TIMESTAMP")} + } +| NowSymFunc '(' ')' + { + $$ = &ast.FuncCallExpr{FnName: model.NewCIStr("CURRENT_TIMESTAMP")} + } +| NowSymFunc '(' NUM ')' + { + $$ = &ast.FuncCallExpr{FnName: model.NewCIStr("CURRENT_TIMESTAMP"), Args: []ast.ExprNode{ast.NewValueExpr($3)}} + } + +/* +* See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_localtime +* TODO: Process other three keywords +*/ +NowSymFunc: + "CURRENT_TIMESTAMP" | "LOCALTIME" | "LOCALTIMESTAMP" | builtinNow +NowSym: + "CURRENT_TIMESTAMP" | "LOCALTIME" | "LOCALTIMESTAMP" + + +SignedLiteral: + Literal + { + $$ = ast.NewValueExpr($1) + } +| '+' NumLiteral + { + $$ = &ast.UnaryOperationExpr{Op: opcode.Plus, V: ast.NewValueExpr($2)} + } +| '-' NumLiteral + { + $$ = &ast.UnaryOperationExpr{Op: opcode.Minus, V: ast.NewValueExpr($2)} + } + +NumLiteral: + intLit +| floatLit +| decLit + +/**************************************CreateIndexStmt*************************************** + * See https://dev.mysql.com/doc/refman/8.0/en/create-index.html + * + * TYPE type_name is recognized as a synonym for USING type_name. However, USING is the preferred form. + * + * CREATE [UNIQUE | FULLTEXT | SPATIAL] INDEX index_name + * [index_type] + * ON tbl_name (key_part,...) + * [index_option] + * [algorithm_option | lock_option] ... + * + * key_part: {col_name [(length)] | (expr)} [ASC | DESC] + * + * index_option: + * KEY_BLOCK_SIZE [=] value + * | index_type + * | WITH PARSER parser_name + * | COMMENT 'string' + * | {VISIBLE | INVISIBLE} + * + * index_type: + * USING {BTREE | HASH} + * + * algorithm_option: + * ALGORITHM [=] {DEFAULT | INPLACE | COPY} + * + * lock_option: + * LOCK [=] {DEFAULT | NONE | SHARED | EXCLUSIVE} + *******************************************************************************************/ +CreateIndexStmt: + "CREATE" IndexKeyTypeOpt "INDEX" IfNotExists Identifier IndexTypeOpt "ON" TableName '(' IndexColNameList ')' IndexOptionList IndexLockAndAlgorithmOpt + { + var indexOption *ast.IndexOption + if $12 != nil { + indexOption = $12.(*ast.IndexOption) + if indexOption.Tp == model.IndexTypeInvalid { + if $6 != nil { + indexOption.Tp = $6.(model.IndexType) + } + } + } else { + indexOption = &ast.IndexOption{} + if $6 != nil { + indexOption.Tp = $6.(model.IndexType) + } + } + var indexLockAndAlgorithm *ast.IndexLockAndAlgorithm + if $13 != nil { + indexLockAndAlgorithm = $13.(*ast.IndexLockAndAlgorithm) + if indexLockAndAlgorithm.LockTp == ast.LockTypeDefault && indexLockAndAlgorithm.AlgorithmTp == ast.AlgorithmTypeDefault { + indexLockAndAlgorithm = nil + } + } + $$ = &ast.CreateIndexStmt{ + IfNotExists: $4.(bool), + IndexName: $5, + Table: $8.(*ast.TableName), + IndexColNames: $10.([]*ast.IndexColName), + IndexOption: indexOption, + KeyType: $2.(ast.IndexKeyType), + LockAlg: indexLockAndAlgorithm, + } + } + +IndexColName: + ColumnName OptFieldLen Order + { + //Order is parsed but just ignored as MySQL did + $$ = &ast.IndexColName{Column: $1.(*ast.ColumnName), Length: $2.(int)} + } + +IndexColNameList: + IndexColName + { + $$ = []*ast.IndexColName{$1.(*ast.IndexColName)} + } +| IndexColNameList ',' IndexColName + { + $$ = append($1.([]*ast.IndexColName), $3.(*ast.IndexColName)) + } + +IndexLockAndAlgorithmOpt: + { + $$ = nil + } +| LockClause + { + $$ = &ast.IndexLockAndAlgorithm{ + LockTp: $1.(ast.LockType), + AlgorithmTp: ast.AlgorithmTypeDefault, + } + } +| AlgorithmClause + { + $$ = &ast.IndexLockAndAlgorithm{ + LockTp: ast.LockTypeDefault, + AlgorithmTp: $1.(ast.AlgorithmType), + } + } +| LockClause AlgorithmClause + { + $$ = &ast.IndexLockAndAlgorithm{ + LockTp: $1.(ast.LockType), + AlgorithmTp: $2.(ast.AlgorithmType), + } + } +| AlgorithmClause LockClause + { + $$ = &ast.IndexLockAndAlgorithm{ + LockTp: $2.(ast.LockType), + AlgorithmTp: $1.(ast.AlgorithmType), + } + } + +IndexKeyTypeOpt: + { + $$ = ast.IndexKeyTypeNone + } +| "UNIQUE" + { + $$ = ast.IndexKeyTypeUnique + } +| "SPATIAL" + { + $$ = ast.IndexKeyTypeSpatial + } +| "FULLTEXT" + { + $$ = ast.IndexKeyTypeFullText + } + +/**************************************AlterDatabaseStmt*************************************** + * See https://dev.mysql.com/doc/refman/5.7/en/alter-database.html + * 'ALTER DATABASE ... UPGRADE DATA DIRECTORY NAME' is not supported yet. + * + * ALTER {DATABASE | SCHEMA} [db_name] + * alter_specification ... + * + * alter_specification: + * [DEFAULT] CHARACTER SET [=] charset_name + * | [DEFAULT] COLLATE [=] collation_name + * | [DEFAULT] ENCRYPTION [=] {'Y' | 'N'} + *******************************************************************************************/ + AlterDatabaseStmt: + "ALTER" DatabaseSym DBName DatabaseOptionList + { + $$ = &ast.AlterDatabaseStmt{ + Name: $3.(string), + AlterDefaultDatabase: false, + Options: $4.([]*ast.DatabaseOption), + } + } +| "ALTER" DatabaseSym DatabaseOptionList + { + $$ = &ast.AlterDatabaseStmt{ + Name: "", + AlterDefaultDatabase: true, + Options: $3.([]*ast.DatabaseOption), + } + } + +/******************************************************************* + * + * Create Database Statement + * CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name + * [create_specification] ... + * + * create_specification: + * [DEFAULT] CHARACTER SET [=] charset_name + * | [DEFAULT] COLLATE [=] collation_name + * | [DEFAULT] ENCRYPTION [=] {'Y' | 'N'} + *******************************************************************/ +CreateDatabaseStmt: + "CREATE" DatabaseSym IfNotExists DBName DatabaseOptionListOpt + { + $$ = &ast.CreateDatabaseStmt{ + IfNotExists: $3.(bool), + Name: $4.(string), + Options: $5.([]*ast.DatabaseOption), + } + } + +DBName: + Identifier + { + $$ = $1 + } + +DatabaseOption: + DefaultKwdOpt CharsetKw EqOpt CharsetName + { + $$ = &ast.DatabaseOption{Tp: ast.DatabaseOptionCharset, Value: $4.(string)} + } +| DefaultKwdOpt "COLLATE" EqOpt CollationName + { + $$ = &ast.DatabaseOption{Tp: ast.DatabaseOptionCollate, Value: $4.(string)} + } +| DefaultKwdOpt "ENCRYPTION" EqOpt stringLit + { + $$ = &ast.DatabaseOption{Tp: ast.DatabaseOptionEncryption, Value: $4} + } + +DatabaseOptionListOpt: + { + $$ = []*ast.DatabaseOption{} + } +| DatabaseOptionList + +DatabaseOptionList: + DatabaseOption + { + $$ = []*ast.DatabaseOption{$1.(*ast.DatabaseOption)} + } +| DatabaseOptionList DatabaseOption + { + $$ = append($1.([]*ast.DatabaseOption), $2.(*ast.DatabaseOption)) + } + +/******************************************************************* + * + * Create Table Statement + * + * Example: + * CREATE TABLE Persons + * ( + * P_Id int NOT NULL, + * LastName varchar(255) NOT NULL, + * FirstName varchar(255), + * Address varchar(255), + * City varchar(255), + * PRIMARY KEY (P_Id) + * ) + *******************************************************************/ + +CreateTableStmt: + "CREATE" OptTemporary "TABLE" IfNotExists TableName TableElementListOpt CreateTableOptionListOpt PartitionOpt DuplicateOpt AsOpt CreateTableSelectOpt + { + stmt := $6.(*ast.CreateTableStmt) + stmt.Table = $5.(*ast.TableName) + stmt.IfNotExists = $4.(bool) + stmt.IsTemporary = $2.(bool) + stmt.Options = $7.([]*ast.TableOption) + if $8 != nil { + stmt.Partition = $8.(*ast.PartitionOptions) + } + stmt.OnDuplicate = $9.(ast.OnDuplicateKeyHandlingType) + stmt.Select = $11.(*ast.CreateTableStmt).Select + $$ = stmt + } +| "CREATE" OptTemporary "TABLE" IfNotExists TableName LikeTableWithOrWithoutParen + { + $$ = &ast.CreateTableStmt{ + Table: $5.(*ast.TableName), + ReferTable: $6.(*ast.TableName), + IfNotExists: $4.(bool), + IsTemporary: $2.(bool), + } + } + +DefaultKwdOpt: + %prec lowerThanCharsetKwd + {} +| "DEFAULT" + +PartitionOpt: + { + $$ = nil + } +| "PARTITION" "BY" PartitionMethod PartitionNumOpt SubPartitionOpt PartitionDefinitionListOpt + { + method := $3.(*ast.PartitionMethod) + method.Num = $4.(uint64) + sub, _ := $5.(*ast.PartitionMethod) + defs, _ := $6.([]*ast.PartitionDefinition) + opt := &ast.PartitionOptions{ + PartitionMethod: *method, + Sub: sub, + Definitions: defs, + } + if err := opt.Validate(); err != nil { + yylex.AppendError(err) + return 1 + } + $$ = opt + } + +SubPartitionMethod: + LinearOpt "KEY" PartitionKeyAlgorithmOpt '(' ColumnNameListOpt ')' + { + $$ = &ast.PartitionMethod{ + Tp: model.PartitionTypeKey, + Linear: len($1) != 0, + ColumnNames: $5.([]*ast.ColumnName), + } + } +| LinearOpt "HASH" '(' Expression ')' + { + $$ = &ast.PartitionMethod{ + Tp: model.PartitionTypeHash, + Linear: len($1) != 0, + Expr: $4.(ast.ExprNode), + } + } + +PartitionKeyAlgorithmOpt: + /* empty */ + {} +| "ALGORITHM" '=' NUM + {} + +PartitionMethod: + SubPartitionMethod + { + $$ = $1 + } +| "RANGE" '(' Expression ')' + { + $$ = &ast.PartitionMethod{ + Tp: model.PartitionTypeRange, + Expr: $3.(ast.ExprNode), + } + } +| "RANGE" FieldsOrColumns '(' ColumnNameList ')' + { + $$ = &ast.PartitionMethod{ + Tp: model.PartitionTypeRange, + ColumnNames: $4.([]*ast.ColumnName), + } + } +| "LIST" '(' Expression ')' + { + $$ = &ast.PartitionMethod{ + Tp: model.PartitionTypeList, + Expr: $3.(ast.ExprNode), + } + } +| "LIST" FieldsOrColumns '(' ColumnNameList ')' + { + $$ = &ast.PartitionMethod{ + Tp: model.PartitionTypeList, + ColumnNames: $4.([]*ast.ColumnName), + } + } +| "SYSTEM_TIME" "INTERVAL" Expression TimeUnit + { + $$ = &ast.PartitionMethod{ + Tp: model.PartitionTypeSystemTime, + Expr: $3.(ast.ExprNode), + Unit: $4.(ast.TimeUnitType), + } + } +| "SYSTEM_TIME" "LIMIT" LengthNum + { + $$ = &ast.PartitionMethod{ + Tp: model.PartitionTypeSystemTime, + Limit: $3.(uint64), + } + } +| "SYSTEM_TIME" + { + $$ = &ast.PartitionMethod{ + Tp: model.PartitionTypeSystemTime, + } + } + +LinearOpt: + { + $$ = "" + } +| "LINEAR" + { + $$ = $1 + } + +SubPartitionOpt: + { + $$ = nil + } +| "SUBPARTITION" "BY" SubPartitionMethod SubPartitionNumOpt + { + method := $3.(*ast.PartitionMethod) + method.Num = $4.(uint64) + $$ = method + } + +SubPartitionNumOpt: + { + $$ = uint64(0) + } +| "SUBPARTITIONS" LengthNum + { + res := $2.(uint64) + if res == 0 { + yylex.AppendError(ast.ErrNoParts.GenWithStackByArgs("subpartitions")) + return 1 + } + $$ = res + } + +PartitionNumOpt: + { + $$ = uint64(0) + } +| "PARTITIONS" LengthNum + { + res := $2.(uint64) + if res == 0 { + yylex.AppendError(ast.ErrNoParts.GenWithStackByArgs("partitions")) + return 1 + } + $$ = res + } + +PartitionDefinitionListOpt: + /* empty */ %prec lowerThanCreateTableSelect + { + $$ = nil + } +| '(' PartitionDefinitionList ')' + { + $$ = $2.([]*ast.PartitionDefinition) + } + +PartitionDefinitionList: + PartitionDefinition + { + $$ = []*ast.PartitionDefinition{$1.(*ast.PartitionDefinition)} + } +| PartitionDefinitionList ',' PartitionDefinition + { + $$ = append($1.([]*ast.PartitionDefinition), $3.(*ast.PartitionDefinition)) + } + +PartitionDefinition: + "PARTITION" Identifier PartDefValuesOpt PartDefOptionList SubPartDefinitionListOpt + { + $$ = &ast.PartitionDefinition{ + Name: model.NewCIStr($2), + Clause: $3.(ast.PartitionDefinitionClause), + Options: $4.([]*ast.TableOption), + Sub: $5.([]*ast.SubPartitionDefinition), + } + } + +SubPartDefinitionListOpt: + /*empty*/ + { + $$ = make([]*ast.SubPartitionDefinition, 0) + } +| '(' SubPartDefinitionList ')' + { + $$ = $2 + } + +SubPartDefinitionList: + SubPartDefinition + { + $$ = []*ast.SubPartitionDefinition{$1.(*ast.SubPartitionDefinition)} + } +| SubPartDefinitionList ',' SubPartDefinition + { + list := $1.([]*ast.SubPartitionDefinition) + $$ = append(list, $3.(*ast.SubPartitionDefinition)) + } + +SubPartDefinition: + "SUBPARTITION" Identifier PartDefOptionList + { + $$ = &ast.SubPartitionDefinition{ + Name: model.NewCIStr($2), + Options: $3.([]*ast.TableOption), + } + } + +PartDefOptionList: + /*empty*/ + { + $$ = make([]*ast.TableOption, 0) + } +| PartDefOptionList PartDefOption + { + list := $1.([]*ast.TableOption) + $$ = append(list, $2.(*ast.TableOption)) + } + +PartDefOption: + "COMMENT" EqOpt stringLit + { + $$ = &ast.TableOption{Tp: ast.TableOptionComment, StrValue: $3} + } +| "ENGINE" EqOpt StringName + { + $$ = &ast.TableOption{Tp: ast.TableOptionEngine, StrValue: $3.(string)} + } +| "INSERT_METHOD" EqOpt StringName + { + $$ = &ast.TableOption{Tp: ast.TableOptionInsertMethod, StrValue: $3.(string)} + } +| "DATA" "DIRECTORY" EqOpt stringLit + { + $$ = &ast.TableOption{Tp: ast.TableOptionDataDirectory, StrValue: $4} + } +| "INDEX" "DIRECTORY" EqOpt stringLit + { + $$ = &ast.TableOption{Tp: ast.TableOptionIndexDirectory, StrValue: $4} + } +| "MAX_ROWS" EqOpt LengthNum + { + $$ = &ast.TableOption{Tp: ast.TableOptionMaxRows, UintValue: $3.(uint64)} + } +| "MIN_ROWS" EqOpt LengthNum + { + $$ = &ast.TableOption{Tp: ast.TableOptionMinRows, UintValue: $3.(uint64)} + } +| "TABLESPACE" EqOpt Identifier + { + $$ = &ast.TableOption{Tp: ast.TableOptionTablespace, StrValue: $3} + } +| "NODEGROUP" EqOpt LengthNum + { + $$ = &ast.TableOption{Tp: ast.TableOptionNodegroup, UintValue: $3.(uint64)} + } + +PartDefValuesOpt: + { + $$ = &ast.PartitionDefinitionClauseNone{} + } +| "VALUES" "LESS" "THAN" "MAXVALUE" + { + $$ = &ast.PartitionDefinitionClauseLessThan{ + Exprs: []ast.ExprNode{&ast.MaxValueExpr{}}, + } + } +| "VALUES" "LESS" "THAN" '(' MaxValueOrExpressionList ')' + { + $$ = &ast.PartitionDefinitionClauseLessThan{ + Exprs: $5.([]ast.ExprNode), + } + } +| "DEFAULT" + { + $$ = &ast.PartitionDefinitionClauseIn{} + } +| "VALUES" "IN" '(' ExpressionList ')' + { + exprs := $4.([]ast.ExprNode) + values := make([][]ast.ExprNode, 0, len(exprs)) + for _, expr := range exprs { + if row, ok := expr.(*ast.RowExpr); ok { + values = append(values, row.Values) + } else { + values = append(values, []ast.ExprNode{expr}) + } + } + $$ = &ast.PartitionDefinitionClauseIn{Values: values} + } +| "HISTORY" + { + $$ = &ast.PartitionDefinitionClauseHistory{Current: false} + } +| "CURRENT" + { + $$ = &ast.PartitionDefinitionClauseHistory{Current: true} + } + +DuplicateOpt: + { + $$ = ast.OnDuplicateKeyHandlingError + } +| "IGNORE" + { + $$ = ast.OnDuplicateKeyHandlingIgnore + } +| "REPLACE" + { + $$ = ast.OnDuplicateKeyHandlingReplace + } + +AsOpt: + {} +| "AS" + {} + +CreateTableSelectOpt: + /* empty */ + { + $$ = &ast.CreateTableStmt{} + } +| + SelectStmt + { + $$ = &ast.CreateTableStmt{Select: $1} + } +| + UnionStmt + { + $$ = &ast.CreateTableStmt{Select: $1} + } +| + SubSelect %prec createTableSelect + // TODO: We may need better solution as issue #320. + { + $$ = &ast.CreateTableStmt{Select: $1} + } + +LikeTableWithOrWithoutParen: + "LIKE" TableName + { + $$ = $2 + } +| + '(' "LIKE" TableName ')' + { + $$ = $3 + } + +/******************************************************************* + * + * Create View Statement + * + * Example: + * CREATE VIEW OR REPLACE ALGORITHM = MERGE DEFINER="root@localhost" SQL SECURITY = definer view_name (col1,col2) + * as select Col1,Col2 from table WITH LOCAL CHECK OPTION + *******************************************************************/ +CreateViewStmt: + "CREATE" OrReplace ViewAlgorithm ViewDefiner ViewSQLSecurity "VIEW" ViewName ViewFieldList "AS" SelectStmt ViewCheckOption + { + startOffset := parser.startOffset(&yyS[yypt-1]) + selStmt := $10.(*ast.SelectStmt) + selStmt.SetText(strings.TrimSpace(parser.src[startOffset:])) + x := &ast.CreateViewStmt { + OrReplace: $2.(bool), + ViewName: $7.(*ast.TableName), + Select: selStmt, + Algorithm: $3.(model.ViewAlgorithm), + Definer: $4.(*auth.UserIdentity), + Security: $5.(model.ViewSecurity), + } + if $8 != nil{ + x.Cols = $8.([]model.CIStr) + } + if $11 !=nil { + x.CheckOption = $11.(model.ViewCheckOption) + endOffset := parser.startOffset(&yyS[yypt]) + selStmt.SetText(strings.TrimSpace(parser.src[startOffset:endOffset])) + } else { + x.CheckOption = model.CheckOptionCascaded + } + $$ = x + } + +OrReplace: + { + $$ = false + } +| "OR" "REPLACE" + { + $$ = true + } + +ViewAlgorithm: + /* EMPTY */ + { + $$ = model.AlgorithmUndefined + } +| "ALGORITHM" "=" "UNDEFINED" + { + $$ = model.AlgorithmUndefined + } +| "ALGORITHM" "=" "MERGE" + { + $$ = model.AlgorithmMerge + } +| "ALGORITHM" "=" "TEMPTABLE" + { + $$ = model.AlgorithmTemptable + } + +ViewDefiner: + /* EMPTY */ + { + $$ = &auth.UserIdentity{CurrentUser: true} + } +| "DEFINER" "=" Username + { + $$ = $3 + } + +ViewSQLSecurity: + /* EMPTY */ + { + $$ = model.SecurityDefiner + } +| "SQL" "SECURITY" "DEFINER" + { + $$ = model.SecurityDefiner + } +| "SQL" "SECURITY" "INVOKER" + { + $$ = model.SecurityInvoker + } + +ViewName: + TableName + { + $$ = $1.(*ast.TableName) + } + +ViewFieldList: + /* Empty */ + { + $$ = nil + } +| '(' ColumnList ')' + { + $$ = $2.([]model.CIStr) + } + +ColumnList: + Identifier + { + $$ = []model.CIStr{model.NewCIStr($1)} + } +| ColumnList ',' Identifier + { + $$ = append($1.([]model.CIStr), model.NewCIStr($3)) + } + +ViewCheckOption: + /* EMPTY */ + { + $$ = nil + } +| "WITH" "CASCADED" "CHECK" "OPTION" + { + $$ = model.CheckOptionCascaded + } +| "WITH" "LOCAL" "CHECK" "OPTION" + { + $$ = model.CheckOptionLocal + } + +/****************************************************************** + * Do statement + * See https://dev.mysql.com/doc/refman/5.7/en/do.html + ******************************************************************/ +DoStmt: + "DO" ExpressionList + { + $$ = &ast.DoStmt { + Exprs: $2.([]ast.ExprNode), + } + } + +/******************************************************************* + * + * Delete Statement + * + *******************************************************************/ +DeleteFromStmt: + "DELETE" TableOptimizerHints PriorityOpt QuickOptional IgnoreOptional "FROM" TableName TableAsNameOpt IndexHintListOpt WhereClauseOptional OrderByOptional LimitClause + { + // Single Table + tn := $7.(*ast.TableName) + tn.IndexHints = $9.([]*ast.IndexHint) + join := &ast.Join{Left: &ast.TableSource{Source: tn, AsName: $8.(model.CIStr)}, Right: nil} + x := &ast.DeleteStmt{ + TableRefs: &ast.TableRefsClause{TableRefs: join}, + Priority: $3.(mysql.PriorityEnum), + Quick: $4.(bool), + IgnoreErr: $5.(bool), + } + if $10 != nil { + x.Where = $10.(ast.ExprNode) + } + if $11 != nil { + x.Order = $11.(*ast.OrderByClause) + } + if $12 != nil { + x.Limit = $12.(*ast.Limit) + } + + $$ = x + } +| "DELETE" TableOptimizerHints PriorityOpt QuickOptional IgnoreOptional TableNameList "FROM" TableRefs WhereClauseOptional + { + // Multiple Table + x := &ast.DeleteStmt{ + Priority: $3.(mysql.PriorityEnum), + Quick: $4.(bool), + IgnoreErr: $5.(bool), + IsMultiTable: true, + BeforeFrom: true, + Tables: &ast.DeleteTableList{Tables: $6.([]*ast.TableName)}, + TableRefs: &ast.TableRefsClause{TableRefs: $8.(*ast.Join)}, + } + if $2 != nil { + x.TableHints = $2.([]*ast.TableOptimizerHint) + } + if $9 != nil { + x.Where = $9.(ast.ExprNode) + } + $$ = x + } + +| "DELETE" TableOptimizerHints PriorityOpt QuickOptional IgnoreOptional "FROM" TableNameList "USING" TableRefs WhereClauseOptional + { + // Multiple Table + x := &ast.DeleteStmt{ + Priority: $3.(mysql.PriorityEnum), + Quick: $4.(bool), + IgnoreErr: $5.(bool), + IsMultiTable: true, + Tables: &ast.DeleteTableList{Tables: $7.([]*ast.TableName)}, + TableRefs: &ast.TableRefsClause{TableRefs: $9.(*ast.Join)}, + } + if $2 != nil { + x.TableHints = $2.([]*ast.TableOptimizerHint) + } + if $10 != nil { + x.Where = $10.(ast.ExprNode) + } + $$ = x + } + +DatabaseSym: +"DATABASE" + +DropDatabaseStmt: + "DROP" DatabaseSym IfExists DBName + { + $$ = &ast.DropDatabaseStmt{IfExists: $3.(bool), Name: $4.(string)} + } + +/****************************************************************** + * Drop Index Statement + * See https://dev.mysql.com/doc/refman/8.0/en/drop-index.html + * + * DROP INDEX index_name ON tbl_name + * [algorithm_option | lock_option] ... + * + * algorithm_option: + * ALGORITHM [=] {DEFAULT|INPLACE|COPY} + * + * lock_option: + * LOCK [=] {DEFAULT|NONE|SHARED|EXCLUSIVE} + ******************************************************************/ +DropIndexStmt: + "DROP" "INDEX" IfExists Identifier "ON" TableName IndexLockAndAlgorithmOpt + { + var indexLockAndAlgorithm *ast.IndexLockAndAlgorithm + if $7 != nil { + indexLockAndAlgorithm = $7.(*ast.IndexLockAndAlgorithm) + if indexLockAndAlgorithm.LockTp == ast.LockTypeDefault && indexLockAndAlgorithm.AlgorithmTp == ast.AlgorithmTypeDefault { + indexLockAndAlgorithm = nil + } + } + $$ = &ast.DropIndexStmt{IfExists: $3.(bool), IndexName: $4, Table: $6.(*ast.TableName), LockAlg: indexLockAndAlgorithm} + } + +DropTableStmt: + "DROP" OptTemporary TableOrTables IfExists TableNameList RestrictOrCascadeOpt + { + $$ = &ast.DropTableStmt{IfExists: $4.(bool), Tables: $5.([]*ast.TableName), IsView: false, IsTemporary: $2.(bool)} + } + +OptTemporary: + /* empty */ { $$ = false; } + | "TEMPORARY" + { + $$ = true + yylex.AppendError(yylex.Errorf("TiDB doesn't support TEMPORARY TABLE, TEMPORARY will be parsed but ignored.")) + parser.lastErrorAsWarn() + } + ; + +DropViewStmt: + "DROP" "VIEW" TableNameList RestrictOrCascadeOpt + { + $$ = &ast.DropTableStmt{Tables: $3.([]*ast.TableName), IsView: true} + } +| + "DROP" "VIEW" "IF" "EXISTS" TableNameList RestrictOrCascadeOpt + { + $$ = &ast.DropTableStmt{IfExists: true, Tables: $5.([]*ast.TableName), IsView: true} + } + +DropUserStmt: + "DROP" "USER" UsernameList + { + $$ = &ast.DropUserStmt{IsDropRole: false, IfExists: false, UserList: $3.([]*auth.UserIdentity)} + } +| "DROP" "USER" "IF" "EXISTS" UsernameList + { + $$ = &ast.DropUserStmt{IsDropRole: false, IfExists: true, UserList: $5.([]*auth.UserIdentity)} + } + +DropRoleStmt: + "DROP" "ROLE" RolenameList + { + tmp := make([]*auth.UserIdentity, 0, 10) + roleList := $3.([]*auth.RoleIdentity) + for _, r := range roleList { + tmp = append(tmp, &auth.UserIdentity{Username:r.Username, Hostname: r.Hostname}) + } + $$ = &ast.DropUserStmt{IsDropRole: true, IfExists: false, UserList: tmp} + } +| "DROP" "ROLE" "IF" "EXISTS" RolenameList + { + tmp := make([]*auth.UserIdentity, 0, 10) + roleList := $5.([]*auth.RoleIdentity) + for _, r := range roleList { + tmp = append(tmp, &auth.UserIdentity{Username:r.Username, Hostname: r.Hostname}) + } + $$ = &ast.DropUserStmt{IsDropRole: true, IfExists: true, UserList: tmp} + } + +DropStatsStmt: + "DROP" "STATS" TableName + { + $$ = &ast.DropStatsStmt{Table: $3.(*ast.TableName)} + } + +RestrictOrCascadeOpt: + {} +| "RESTRICT" +| "CASCADE" + +TableOrTables: + "TABLE" +| "TABLES" + +EqOpt: + {} +| eq + +EmptyStmt: + /* EMPTY */ + { + $$ = nil + } + +TraceStmt: + "TRACE" TraceableStmt + { + $$ = &ast.TraceStmt{ + Stmt: $2, + Format: "json", + } + startOffset := parser.startOffset(&yyS[yypt]) + $2.SetText(string(parser.src[startOffset:])) + } +| "TRACE" "FORMAT" "=" stringLit TraceableStmt + { + $$ = &ast.TraceStmt{ + Stmt: $5, + Format: $4, + } + startOffset := parser.startOffset(&yyS[yypt]) + $5.SetText(string(parser.src[startOffset:])) + } + +ExplainSym: +"EXPLAIN" | "DESCRIBE" | "DESC" + +ExplainStmt: + ExplainSym TableName + { + $$ = &ast.ExplainStmt{ + Stmt: &ast.ShowStmt{ + Tp: ast.ShowColumns, + Table: $2.(*ast.TableName), + }, + } + } +| ExplainSym TableName ColumnName + { + $$ = &ast.ExplainStmt{ + Stmt: &ast.ShowStmt{ + Tp: ast.ShowColumns, + Table: $2.(*ast.TableName), + Column: $3.(*ast.ColumnName), + }, + } + } +| ExplainSym ExplainableStmt + { + $$ = &ast.ExplainStmt{ + Stmt: $2, + Format: "row", + } + } +| ExplainSym "FOR" "CONNECTION" NUM + { + $$ = &ast.ExplainForStmt{ + Format: "row", + ConnectionID: getUint64FromNUM($4), + } + } +| ExplainSym "FORMAT" "=" stringLit "FOR" "CONNECTION" NUM + { + $$ = &ast.ExplainForStmt{ + Format: $4, + ConnectionID: getUint64FromNUM($7), + } + } +| ExplainSym "FORMAT" "=" stringLit ExplainableStmt + { + $$ = &ast.ExplainStmt{ + Stmt: $5, + Format: $4, + } + } +| ExplainSym "FORMAT" "=" ExplainFormatType "FOR" "CONNECTION" NUM + { + $$ = &ast.ExplainForStmt{ + Format: $4.(string), + ConnectionID: getUint64FromNUM($7), + } + } +| ExplainSym "FORMAT" "=" ExplainFormatType ExplainableStmt + { + $$ = &ast.ExplainStmt{ + Stmt: $5, + Format: $4.(string), + } + } +| ExplainSym "ANALYZE" ExplainableStmt + { + $$ = &ast.ExplainStmt { + Stmt: $3, + Format: "row", + Analyze: true, + } + } + +ExplainFormatType: + "TRADITIONAL" + { + $$ = "row" + } +| "JSON" + { + $$ = "json" + } + +LengthNum: + NUM + { + $$ = getUint64FromNUM($1) + } + +NUM: + intLit + +Expression: + singleAtIdentifier assignmentEq Expression %prec assignmentEq + { + v := $1 + v = strings.TrimPrefix(v, "@") + $$ = &ast.VariableExpr{ + Name: v, + IsGlobal: false, + IsSystem: false, + Value: $3, + } + } +| Expression logOr Expression %prec pipes + { + $$ = &ast.BinaryOperationExpr{Op: opcode.LogicOr, L: $1, R: $3} + } +| Expression "XOR" Expression %prec xor + { + $$ = &ast.BinaryOperationExpr{Op: opcode.LogicXor, L: $1, R: $3} + } +| Expression logAnd Expression %prec andand + { + $$ = &ast.BinaryOperationExpr{Op: opcode.LogicAnd, L: $1, R: $3} + } +| "NOT" Expression %prec not + { + expr, ok := $2.(*ast.ExistsSubqueryExpr) + if ok { + expr.Not = true + $$ = $2 + } else { + $$ = &ast.UnaryOperationExpr{Op: opcode.Not, V: $2} + } + } +| BoolPri IsOrNotOp trueKwd %prec is + { + $$ = &ast.IsTruthExpr{Expr:$1, Not: !$2.(bool), True: int64(1)} + } +| BoolPri IsOrNotOp falseKwd %prec is + { + $$ = &ast.IsTruthExpr{Expr:$1, Not: !$2.(bool), True: int64(0)} + } +| BoolPri IsOrNotOp "UNKNOWN" %prec is + { + /* https://dev.mysql.com/doc/refman/5.7/en/comparison-operators.html#operator_is */ + $$ = &ast.IsNullExpr{Expr: $1, Not: !$2.(bool)} + } +| BoolPri + +MaxValueOrExpression: + "MAXVALUE" + { + $$ = &ast.MaxValueExpr{} + } +| Expression + { + $$ = $1 + } + + +logOr: + pipesAsOr +| "OR" + +logAnd: +"&&" | "AND" + +ExpressionList: + Expression + { + $$ = []ast.ExprNode{$1} + } +| ExpressionList ',' Expression + { + $$ = append($1.([]ast.ExprNode), $3) + } + +MaxValueOrExpressionList: + MaxValueOrExpression + { + $$ = []ast.ExprNode{$1} +} +| MaxValueOrExpressionList ',' MaxValueOrExpression +{ + $$ = append($1.([]ast.ExprNode), $3) + } + + +ExpressionListOpt: + { + $$ = []ast.ExprNode{} + } +| ExpressionList + +FuncDatetimePrecListOpt: + { + $$ = []ast.ExprNode{} + } +| FuncDatetimePrecList + { + $$ = $1 + } + +FuncDatetimePrecList: + intLit + { + expr := ast.NewValueExpr($1) + $$ = []ast.ExprNode{expr} + } + +BoolPri: + BoolPri IsOrNotOp "NULL" %prec is + { + $$ = &ast.IsNullExpr{Expr: $1, Not: !$2.(bool)} + } +| BoolPri CompareOp PredicateExpr %prec eq + { + $$ = &ast.BinaryOperationExpr{Op: $2.(opcode.Op), L: $1, R: $3} + } +| BoolPri CompareOp AnyOrAll SubSelect %prec eq + { + sq := $4.(*ast.SubqueryExpr) + sq.MultiRows = true + $$ = &ast.CompareSubqueryExpr{Op: $2.(opcode.Op), L: $1, R: sq, All: $3.(bool)} + } +| BoolPri CompareOp singleAtIdentifier assignmentEq PredicateExpr %prec assignmentEq + { + v := $3 + v = strings.TrimPrefix(v, "@") + variable := &ast.VariableExpr{ + Name: v, + IsGlobal: false, + IsSystem: false, + Value: $5, + } + $$ = &ast.BinaryOperationExpr{Op: $2.(opcode.Op), L: $1, R: variable} + } +| PredicateExpr + +CompareOp: + ">=" + { + $$ = opcode.GE + } +| '>' + { + $$ = opcode.GT + } +| "<=" + { + $$ = opcode.LE + } +| '<' + { + $$ = opcode.LT + } +| "!=" + { + $$ = opcode.NE + } +| "<>" + { + $$ = opcode.NE + } +| "=" + { + $$ = opcode.EQ + } +| "<=>" + { + $$ = opcode.NullEQ + } + +BetweenOrNotOp: + "BETWEEN" + { + $$ = true + } +| "NOT" "BETWEEN" + { + $$ = false + } + +IsOrNotOp: + "IS" + { + $$ = true + } +| "IS" "NOT" + { + $$ = false + } + +InOrNotOp: + "IN" + { + $$ = true + } +| "NOT" "IN" + { + $$ = false + } + +LikeOrNotOp: + "LIKE" + { + $$ = true + } +| "NOT" "LIKE" + { + $$ = false + } + +RegexpOrNotOp: + RegexpSym + { + $$ = true + } +| "NOT" RegexpSym + { + $$ = false + } + +AnyOrAll: + "ANY" + { + $$ = false + } +| "SOME" + { + $$ = false + } +| "ALL" + { + $$ = true + } + +PredicateExpr: + BitExpr InOrNotOp '(' ExpressionList ')' + { + $$ = &ast.PatternInExpr{Expr: $1, Not: !$2.(bool), List: $4.([]ast.ExprNode)} + } +| BitExpr InOrNotOp SubSelect + { + sq := $3.(*ast.SubqueryExpr) + sq.MultiRows = true + $$ = &ast.PatternInExpr{Expr: $1, Not: !$2.(bool), Sel: sq} + } +| BitExpr BetweenOrNotOp BitExpr "AND" PredicateExpr + { + $$ = &ast.BetweenExpr{ + Expr: $1, + Left: $3, + Right: $5, + Not: !$2.(bool), + } + } +| BitExpr LikeOrNotOp SimpleExpr LikeEscapeOpt + { + escape := $4.(string) + if len(escape) > 1 { + yylex.AppendError(ErrWrongArguments.GenWithStackByArgs("ESCAPE")) + return 1 + } else if len(escape) == 0 { + escape = "\\" + } + $$ = &ast.PatternLikeExpr{ + Expr: $1, + Pattern: $3, + Not: !$2.(bool), + Escape: escape[0], + } + } +| BitExpr RegexpOrNotOp SimpleExpr + { + $$ = &ast.PatternRegexpExpr{Expr: $1, Pattern: $3, Not: !$2.(bool)} + } +| BitExpr + +RegexpSym: +"REGEXP" | "RLIKE" + +LikeEscapeOpt: + %prec empty + { + $$ = "\\" + } +| "ESCAPE" stringLit + { + $$ = $2 + } + +Field: + '*' + { + $$ = &ast.SelectField{WildCard: &ast.WildCardField{}} + } +| Identifier '.' '*' + { + wildCard := &ast.WildCardField{Table: model.NewCIStr($1)} + $$ = &ast.SelectField{WildCard: wildCard} + } +| Identifier '.' Identifier '.' '*' + { + wildCard := &ast.WildCardField{Schema: model.NewCIStr($1), Table: model.NewCIStr($3)} + $$ = &ast.SelectField{WildCard: wildCard} + } +| Expression FieldAsNameOpt + { + expr := $1 + asName := $2.(string) + $$ = &ast.SelectField{Expr: expr, AsName: model.NewCIStr(asName)} + } +| '{' Identifier Expression '}' FieldAsNameOpt + { + /* + * ODBC escape syntax. + * See https://dev.mysql.com/doc/refman/5.7/en/expressions.html + */ + expr := $3 + asName := $5.(string) + $$ = &ast.SelectField{Expr: expr, AsName: model.NewCIStr(asName)} + } + +FieldAsNameOpt: + /* EMPTY */ + { + $$ = "" + } +| FieldAsName + { + $$ = $1 + } + +FieldAsName: + Identifier + { + $$ = $1 + } +| "AS" Identifier + { + $$ = $2 + } +| stringLit + { + $$ = $1 + } +| "AS" stringLit + { + $$ = $2 + } + +FieldList: + Field + { + field := $1.(*ast.SelectField) + field.Offset = parser.startOffset(&yyS[yypt]) + $$ = []*ast.SelectField{field} + } +| FieldList ',' Field + { + + fl := $1.([]*ast.SelectField) + last := fl[len(fl)-1] + if last.Expr != nil && last.AsName.O == "" { + lastEnd := parser.endOffset(&yyS[yypt-1]) + last.SetText(parser.src[last.Offset:lastEnd]) + } + newField := $3.(*ast.SelectField) + newField.Offset = parser.startOffset(&yyS[yypt]) + $$ = append(fl, newField) + } + +GroupByClause: + "GROUP" "BY" ByList + { + $$ = &ast.GroupByClause{Items: $3.([]*ast.ByItem)} + } + +HavingClause: + { + $$ = nil + } +| "HAVING" Expression + { + $$ = &ast.HavingClause{Expr: $2} + } + +IfExists: + { + $$ = false + } +| "IF" "EXISTS" + { + $$ = true + } + +IfNotExists: + { + $$ = false + } +| "IF" "NOT" "EXISTS" + { + $$ = true + } + + +IgnoreOptional: + { + $$ = false + } +| "IGNORE" + { + $$ = true + } + +IndexName: + { + $$ = "" + } +| Identifier + { + //"index name" + $$ = $1 + } + +IndexOptionList: + { + $$ = nil + } +| IndexOptionList IndexOption + { + // Merge the options + if $1 == nil { + $$ = $2 + } else { + opt1 := $1.(*ast.IndexOption) + opt2 := $2.(*ast.IndexOption) + if len(opt2.Comment) > 0 { + opt1.Comment = opt2.Comment + } else if opt2.Tp != 0 { + opt1.Tp = opt2.Tp + } else if opt2.KeyBlockSize > 0 { + opt1.KeyBlockSize = opt2.KeyBlockSize + } else if len(opt2.ParserName.O) > 0 { + opt1.ParserName = opt2.ParserName + } else if opt2.Visibility != ast.IndexVisibilityDefault { + opt1.Visibility = opt2.Visibility + } + $$ = opt1 + } + } + +IndexOption: + "KEY_BLOCK_SIZE" EqOpt LengthNum + { + $$ = &ast.IndexOption{ + KeyBlockSize: $3.(uint64), + } + } +| IndexType + { + $$ = &ast.IndexOption { + Tp: $1.(model.IndexType), + } + } +| "WITH" "PARSER" Identifier + { + $$ = &ast.IndexOption { + ParserName: model.NewCIStr($3), + } + yylex.AppendError(yylex.Errorf("The WITH PARASER clause is parsed but ignored by all storage engines.")) + parser.lastErrorAsWarn() + } +| "COMMENT" stringLit + { + $$ = &ast.IndexOption { + Comment: $2, + } + } +| IndexInvisible + { + $$ = &ast.IndexOption { + Visibility: $1.(ast.IndexVisibility), + } + } + +/* + See: https://github.com/mysql/mysql-server/blob/8.0/sql/sql_yacc.yy#L7179 + + The syntax for defining an index is: + + ... INDEX [index_name] [USING|TYPE] ... + + The problem is that whereas USING is a reserved word, TYPE is not. We can + still handle it if an index name is supplied, i.e.: + + ... INDEX type TYPE ... + + here the index's name is unmbiguously 'type', but for this: + + ... INDEX TYPE ... + + it's impossible to know what this actually mean - is 'type' the name or the + type? For this reason we accept the TYPE syntax only if a name is supplied. +*/ +IndexNameAndTypeOpt: + IndexName + { + $$ = []interface{}{$1, nil} + } +| IndexName "USING" IndexTypeName + { + $$ = []interface{}{$1, $3} + } +| Identifier "TYPE" IndexTypeName + { + $$ = []interface{}{$1, $3} + } + +IndexTypeOpt: + { + $$ = nil + } +| IndexType + { + $$ = $1 + } + +IndexType: + "USING" IndexTypeName + { + $$ = $2 + } +| "TYPE" IndexTypeName + { + $$ = $2 + } + +IndexTypeName: + "BTREE" + { + $$ = model.IndexTypeBtree + } + | "HASH" + { + $$ = model.IndexTypeHash + } + | "RTREE" + { + $$ = model.IndexTypeRtree + } + +IndexInvisible: + "VISIBLE" + { + $$ = ast.IndexVisibilityVisible + } +| "INVISIBLE" + { + $$ = ast.IndexVisibilityInvisible + } + +/**********************************Identifier********************************************/ +Identifier: +identifier | UnReservedKeyword | NotKeywordToken | TiDBKeyword + +UnReservedKeyword: + "ACTION" | "ASCII" | "AUTO_INCREMENT" | "AFTER" | "ALWAYS" | "AVG" | "BEGIN" | "BIT" | "BOOL" | "BOOLEAN" | "BTREE" | "BYTE" | "CLEANUP" | "CHARSET" +| "COLUMNS" | "COMMIT" | "COMPACT" | "COMPRESSED" | "CONSISTENT" | "CURRENT" | "DATA" | "DATE" %prec lowerThanStringLitToken| "DATETIME" | "DAY" | "DEALLOCATE" | "DO" | "DUPLICATE" +| "DYNAMIC" | "ENCRYPTION" | "END" | "ENFORCED" | "ENGINE" | "ENGINES" | "ENUM" | "ERRORS" | "ESCAPE" | "EXECUTE" | "FIELDS" | "FIRST" | "FIXED" | "FLUSH" | "FOLLOWING" | "FORMAT" | "FULL" |"GLOBAL" +| "HASH" | "HOUR" | "INSERT_METHOD" | "LESS" | "LOCAL" | "LAST" | "NAMES" | "OFFSET" | "PASSWORD" %prec lowerThanEq | "PREPARE" | "QUICK" | "REBUILD" | "REDUNDANT" | "REORGANIZE" +| "ROLE" |"ROLLBACK" | "SESSION" | "SIGNED" | "SNAPSHOT" | "START" | "STATUS" | "OPEN"| "SUBPARTITIONS" | "SUBPARTITION" | "TABLES" | "TABLESPACE" | "TEXT" | "THAN" | "TIME" %prec lowerThanStringLitToken +| "TIMESTAMP" %prec lowerThanStringLitToken | "TRACE" | "TRANSACTION" | "TRUNCATE" | "UNBOUNDED" | "UNKNOWN" | "VALUE" | "WARNINGS" | "YEAR" | "MODE" | "WEEK" | "ANY" | "SOME" | "USER" | "IDENTIFIED" +| "COLLATION" | "COMMENT" | "AVG_ROW_LENGTH" | "CONNECTION" | "CHECKSUM" | "COMPRESSION" | "KEY_BLOCK_SIZE" | "MASTER" | "MAX_ROWS" +| "MIN_ROWS" | "NATIONAL" | "NCHAR" | "ROW_FORMAT" | "QUARTER" | "GRANTS" | "TRIGGERS" | "DELAY_KEY_WRITE" | "ISOLATION" | "JSON" +| "REPEATABLE" | "RESPECT" | "COMMITTED" | "UNCOMMITTED" | "ONLY" | "SERIAL" | "SERIALIZABLE" | "LEVEL" | "VARIABLES" | "SQL_CACHE" | "INDEXES" | "PROCESSLIST" +| "SQL_NO_CACHE" | "DISABLE" | "ENABLE" | "REVERSE" | "PRIVILEGES" | "NO" | "BINLOG" | "FUNCTION" | "VIEW" | "BINDING" | "BINDINGS" | "MODIFY" | "EVENTS" | "PARTITIONS" +| "NONE" | "NULLS" | "SUPER" | "EXCLUSIVE" | "STATS_PERSISTENT" | "STATS_AUTO_RECALC" | "ROW_COUNT" | "COALESCE" | "MONTH" | "PROCESS" | "PROFILE" | "PROFILES" +| "MICROSECOND" | "MINUTE" | "PLUGINS" | "PRECEDING" | "QUERY" | "QUERIES" | "SECOND" | "SEPARATOR" | "SHARE" | "SHARED" | "SLOW" | "MAX_CONNECTIONS_PER_HOUR" | "MAX_QUERIES_PER_HOUR" | "MAX_UPDATES_PER_HOUR" +| "MAX_USER_CONNECTIONS" | "REPLICATION" | "CLIENT" | "SLAVE" | "RELOAD" | "TEMPORARY" | "ROUTINE" | "EVENT" | "ALGORITHM" | "DEFINER" | "INVOKER" | "MERGE" | "TEMPTABLE" | "UNDEFINED" | "SECURITY" | "CASCADED" +| "RECOVER" | "CIPHER" | "SUBJECT" | "ISSUER" | "X509" | "NEVER" | "EXPIRE" | "ACCOUNT" | "INCREMENTAL" | "CPU" | "MEMORY" | "BLOCK" | "IO" | "CONTEXT" | "SWITCHES" | "PAGE" | "FAULTS" | "IPC" | "SWAPS" | "SOURCE" +| "TRADITIONAL" | "SQL_BUFFER_RESULT" | "DIRECTORY" | "HISTORY" | "LIST" | "NODEGROUP" | "SYSTEM_TIME" | "PARTIAL" | "SIMPLE" | "REMOVE" | "PARTITIONING" | "STORAGE" | "DISK" | "STATS_SAMPLE_PAGES" | "SECONDARY_ENGINE" | "SECONDARY_LOAD" | "SECONDARY_UNLOAD" | "VALIDATION" +| "WITHOUT" | "RTREE" | "EXCHANGE" | "COLUMN_FORMAT" | "REPAIR" | "IMPORT" | "DISCARD" | "TABLE_CHECKSUM" +| "SQL_TSI_DAY" | "SQL_TSI_HOUR" | "SQL_TSI_MINUTE" | "SQL_TSI_MONTH" | "SQL_TSI_QUARTER" | "SQL_TSI_SECOND" | "SQL_TSI_WEEK" | "SQL_TSI_YEAR" | "INVISIBLE" | "VISIBLE" | "TYPE" + +TiDBKeyword: + "ADMIN" | "AGG_TO_COP" |"BUCKETS" | "CANCEL" | "CMSKETCH" | "DDL" | "DEPTH" | "DRAINER" | "JOBS" | "JOB" | "NODE_ID" | "NODE_STATE" | "PUMP" | "SAMPLES" | "STATS" | "STATS_META" | "STATS_HISTOGRAMS" | "STATS_BUCKETS" | "STATS_HEALTHY" | "TIDB" +| "HASH_JOIN" | "SM_JOIN" | "INL_JOIN" | "HASH_AGG" | "STREAM_AGG" | "USE_INDEX_MERGE" | "NO_INDEX_MERGE" | "USE_TOJA" | "ENABLE_PLAN_CACHE" | "USE_PLAN_CACHE" +| "READ_CONSISTENT_REPLICA" | "READ_FROM_STORAGE" | "QB_NAME" | "QUERY_TYPE" | "MEMORY_QUOTA" | "OLAP" | "OLTP" | "TOPN" | "TIKV" | "TIFLASH" | "SPLIT" | "OPTIMISTIC" | "PESSIMISTIC" | "WIDTH" | "REGIONS" + +NotKeywordToken: + "ADDDATE" | "BIT_AND" | "BIT_OR" | "BIT_XOR" | "CAST" | "COPY" | "COUNT" | "CURTIME" | "DATE_ADD" | "DATE_SUB" | "EXTRACT" | "GET_FORMAT" | "GROUP_CONCAT" +| "INPLACE" | "INSTANT" | "INTERNAL" |"MIN" | "MAX" | "MAX_EXECUTION_TIME" | "NOW" | "RECENT" | "POSITION" | "SUBDATE" | "SUBSTRING" | "SUM" +| "STD" | "STDDEV" | "STDDEV_POP" | "STDDEV_SAMP" | "VARIANCE" | "VAR_POP" | "VAR_SAMP" +| "TIMESTAMPADD" | "TIMESTAMPDIFF" | "TOKUDB_DEFAULT" | "TOKUDB_FAST" | "TOKUDB_LZMA" | "TOKUDB_QUICKLZ" | "TOKUDB_SNAPPY" | "TOKUDB_SMALL" | "TOKUDB_UNCOMPRESSED" | "TOKUDB_ZLIB" | "TOP" | "TRIM" | "NEXT_ROW_ID" +| "EXPR_PUSHDOWN_BLACKLIST" | "OPT_RULE_BLACKLIST" + +/************************************************************************************ + * + * Insert Statements + * + * TODO: support PARTITION + **********************************************************************************/ +InsertIntoStmt: + "INSERT" PriorityOpt IgnoreOptional IntoOpt TableName InsertValues OnDuplicateKeyUpdate + { + x := $6.(*ast.InsertStmt) + x.Priority = $2.(mysql.PriorityEnum) + x.IgnoreErr = $3.(bool) + // Wraps many layers here so that it can be processed the same way as select statement. + ts := &ast.TableSource{Source: $5.(*ast.TableName)} + x.Table = &ast.TableRefsClause{TableRefs: &ast.Join{Left: ts}} + if $7 != nil { + x.OnDuplicate = $7.([]*ast.Assignment) + } + $$ = x + } + +IntoOpt: + {} +| "INTO" + +InsertValues: + '(' ColumnNameListOpt ')' ValueSym ValuesList + { + $$ = &ast.InsertStmt{ + Columns: $2.([]*ast.ColumnName), + Lists: $5.([][]ast.ExprNode), + } + } +| '(' ColumnNameListOpt ')' SelectStmt + { + $$ = &ast.InsertStmt{Columns: $2.([]*ast.ColumnName), Select: $4.(*ast.SelectStmt)} + } +| '(' ColumnNameListOpt ')' '(' SelectStmt ')' + { + $$ = &ast.InsertStmt{Columns: $2.([]*ast.ColumnName), Select: $5.(*ast.SelectStmt)} + } +| '(' ColumnNameListOpt ')' UnionStmt + { + $$ = &ast.InsertStmt{Columns: $2.([]*ast.ColumnName), Select: $4.(*ast.UnionStmt)} + } +| ValueSym ValuesList %prec insertValues + { + $$ = &ast.InsertStmt{Lists: $2.([][]ast.ExprNode)} + } +| '(' SelectStmt ')' + { + $$ = &ast.InsertStmt{Select: $2.(*ast.SelectStmt)} + } +| SelectStmt + { + $$ = &ast.InsertStmt{Select: $1.(*ast.SelectStmt)} + } +| UnionStmt + { + $$ = &ast.InsertStmt{Select: $1.(*ast.UnionStmt)} + } +| "SET" ColumnSetValueList + { + $$ = &ast.InsertStmt{Setlist: $2.([]*ast.Assignment)} + } + +ValueSym: +"VALUE" | "VALUES" + +ValuesList: + RowValue + { + $$ = [][]ast.ExprNode{$1.([]ast.ExprNode)} + } +| ValuesList ',' RowValue + { + $$ = append($1.([][]ast.ExprNode), $3.([]ast.ExprNode)) + } + +RowValue: + '(' ValuesOpt ')' + { + $$ = $2 + } + +ValuesOpt: + { + $$ = []ast.ExprNode{} + } +| Values + +Values: + Values ',' ExprOrDefault + { + $$ = append($1.([]ast.ExprNode), $3) + } +| ExprOrDefault + { + $$ = []ast.ExprNode{$1} + } + +ExprOrDefault: + Expression +| "DEFAULT" + { + $$ = &ast.DefaultExpr{} + } + +ColumnSetValue: + ColumnName eq Expression + { + $$ = &ast.Assignment{ + Column: $1.(*ast.ColumnName), + Expr: $3, + } + } + +ColumnSetValueList: + { + $$ = []*ast.Assignment{} + } +| ColumnSetValue + { + $$ = []*ast.Assignment{$1.(*ast.Assignment)} + } +| ColumnSetValueList ',' ColumnSetValue + { + $$ = append($1.([]*ast.Assignment), $3.(*ast.Assignment)) + } + +/* + * ON DUPLICATE KEY UPDATE col_name=expr [, col_name=expr] ... + * See https://dev.mysql.com/doc/refman/5.7/en/insert-on-duplicate.html + */ +OnDuplicateKeyUpdate: + { + $$ = nil + } +| "ON" "DUPLICATE" "KEY" "UPDATE" AssignmentList + { + $$ = $5 + } + +/***********************************Insert Statements END************************************/ + +/************************************************************************************ + * Replace Statements + * See https://dev.mysql.com/doc/refman/5.7/en/replace.html + * + * TODO: support PARTITION + **********************************************************************************/ +ReplaceIntoStmt: + "REPLACE" PriorityOpt IntoOpt TableName InsertValues + { + x := $5.(*ast.InsertStmt) + x.IsReplace = true + x.Priority = $2.(mysql.PriorityEnum) + ts := &ast.TableSource{Source: $4.(*ast.TableName)} + x.Table = &ast.TableRefsClause{TableRefs: &ast.Join{Left: ts}} + $$ = x + } + +/***********************************Replace Statements END************************************/ + +ODBCDateTimeType: + "d" + { + $$ = ast.DateLiteral + } +| "t" + { + $$ = ast.TimeLiteral + } +| "ts" + { + $$ = ast.TimestampLiteral + } + +Literal: + "FALSE" + { + $$ = ast.NewValueExpr(false) + } +| "NULL" + { + $$ = ast.NewValueExpr(nil) + } +| "TRUE" + { + $$ = ast.NewValueExpr(true) + } +| floatLit + { + $$ = ast.NewValueExpr($1) + } +| decLit + { + $$ = ast.NewValueExpr($1) + } +| intLit + { + $$ = ast.NewValueExpr($1) + } +| StringLiteral %prec lowerThanStringLitToken + { + $$ = $1 + } +| "UNDERSCORE_CHARSET" stringLit + { + // See https://dev.mysql.com/doc/refman/5.7/en/charset-literal.html + co, err := charset.GetDefaultCollation($1) + if err != nil { + yylex.AppendError(yylex.Errorf("Get collation error for charset: %s", $1)) + return 1 + } + expr := ast.NewValueExpr($2) + tp := expr.GetType() + tp.Charset = $1 + tp.Collate = co + if tp.Collate == charset.CollationBin { + tp.Flag |= mysql.BinaryFlag + } + $$ = expr + } +| hexLit + { + $$ = ast.NewValueExpr($1) + } +| bitLit + { + $$ = ast.NewValueExpr($1) + } + +StringLiteral: + stringLit + { + expr := ast.NewValueExpr($1) + $$ = expr + } +| StringLiteral stringLit + { + valExpr := $1.(ast.ValueExpr) + strLit := valExpr.GetString() + expr := ast.NewValueExpr(strLit+$2) + // Fix #4239, use first string literal as projection name. + if valExpr.GetProjectionOffset() >= 0 { + expr.SetProjectionOffset(valExpr.GetProjectionOffset()) + } else { + expr.SetProjectionOffset(len(strLit)) + } + $$ = expr + } + +AlterOrderList: + AlterOrderItem + { + $$ = []*ast.AlterOrderItem{$1.(*ast.AlterOrderItem)} + } +| AlterOrderList ',' AlterOrderItem + { + $$ = append($1.([]*ast.AlterOrderItem), $3.(*ast.AlterOrderItem)) + } + +AlterOrderItem: + ColumnName Order + { + $$ = &ast.AlterOrderItem{Column: $1.(*ast.ColumnName), Desc: $2.(bool)} + } + +OrderBy: + "ORDER" "BY" ByList + { + $$ = &ast.OrderByClause{Items: $3.([]*ast.ByItem)} + } + +ByList: + ByItem + { + $$ = []*ast.ByItem{$1.(*ast.ByItem)} + } +| ByList ',' ByItem + { + $$ = append($1.([]*ast.ByItem), $3.(*ast.ByItem)) + } + +ByItem: + Expression Order + { + expr := $1 + valueExpr, ok := expr.(ast.ValueExpr) + if ok { + position, isPosition := valueExpr.GetValue().(int64) + if isPosition { + expr = &ast.PositionExpr{N: int(position)} + } + } + $$ = &ast.ByItem{Expr: expr, Desc: $2.(bool)} + } + +Order: + /* EMPTY */ + { + $$ = false // ASC by default + } +| "ASC" + { + $$ = false + } +| "DESC" + { + $$ = true + } + +OrderByOptional: + { + $$ = nil + } +| OrderBy + { + $$ = $1 + } + +BitExpr: + BitExpr '|' BitExpr %prec '|' + { + $$ = &ast.BinaryOperationExpr{Op: opcode.Or, L: $1, R: $3} + } +| BitExpr '&' BitExpr %prec '&' + { + $$ = &ast.BinaryOperationExpr{Op: opcode.And, L: $1, R: $3} + } +| BitExpr "<<" BitExpr %prec lsh + { + $$ = &ast.BinaryOperationExpr{Op: opcode.LeftShift, L: $1, R: $3} + } +| BitExpr ">>" BitExpr %prec rsh + { + $$ = &ast.BinaryOperationExpr{Op: opcode.RightShift, L: $1, R: $3} + } +| BitExpr '+' BitExpr %prec '+' + { + $$ = &ast.BinaryOperationExpr{Op: opcode.Plus, L: $1, R: $3} + } +| BitExpr '-' BitExpr %prec '-' + { + $$ = &ast.BinaryOperationExpr{Op: opcode.Minus, L: $1, R: $3} + } +| BitExpr '+' "INTERVAL" Expression TimeUnit %prec '+' + { + $$ = &ast.FuncCallExpr{ + FnName: model.NewCIStr("DATE_ADD"), + Args: []ast.ExprNode{ + $1, + $4, + &ast.TimeUnitExpr{Unit: $5.(ast.TimeUnitType)}, + }, + } + } +| BitExpr '-' "INTERVAL" Expression TimeUnit %prec '+' + { + $$ = &ast.FuncCallExpr{ + FnName: model.NewCIStr("DATE_SUB"), + Args: []ast.ExprNode{ + $1, + $4, + &ast.TimeUnitExpr{Unit: $5.(ast.TimeUnitType)}, + }, + } + } +| BitExpr '*' BitExpr %prec '*' + { + $$ = &ast.BinaryOperationExpr{Op: opcode.Mul, L: $1, R: $3} + } +| BitExpr '/' BitExpr %prec '/' + { + $$ = &ast.BinaryOperationExpr{Op: opcode.Div, L: $1, R: $3} + } +| BitExpr '%' BitExpr %prec '%' + { + $$ = &ast.BinaryOperationExpr{Op: opcode.Mod, L: $1, R: $3} + } +| BitExpr "DIV" BitExpr %prec div + { + $$ = &ast.BinaryOperationExpr{Op: opcode.IntDiv, L: $1, R: $3} + } +| BitExpr "MOD" BitExpr %prec mod + { + $$ = &ast.BinaryOperationExpr{Op: opcode.Mod, L: $1, R: $3} + } +| BitExpr '^' BitExpr + { + $$ = &ast.BinaryOperationExpr{Op: opcode.Xor, L: $1, R: $3} + } +| SimpleExpr + +SimpleIdent: + Identifier + { + $$ = &ast.ColumnNameExpr{Name: &ast.ColumnName{ + Name: model.NewCIStr($1), + }} + } +| Identifier '.' Identifier + { + $$ = &ast.ColumnNameExpr{Name: &ast.ColumnName{ + Table: model.NewCIStr($1), + Name: model.NewCIStr($3), + }} + } +| '.' Identifier '.' Identifier + { + $$ = &ast.ColumnNameExpr{Name: &ast.ColumnName{ + Table: model.NewCIStr($2), + Name: model.NewCIStr($4), + }} + } +| Identifier '.' Identifier '.' Identifier + { + $$ = &ast.ColumnNameExpr{Name: &ast.ColumnName{ + Schema: model.NewCIStr($1), + Table: model.NewCIStr($3), + Name: model.NewCIStr($5), + }} + } + +SimpleExpr: + SimpleIdent +| FunctionCallKeyword +| FunctionCallNonKeyword +| FunctionCallGeneric +| SimpleExpr "COLLATE" StringName %prec neg + { + // TODO: Create a builtin function hold expr and collation. When do evaluation, convert expr result using the collation. + $$ = $1 + } +| WindowFuncCall + { + $$ = $1.(*ast.WindowFuncExpr) + } +| Literal +| paramMarker + { + $$ = ast.NewParamMarkerExpr(yyS[yypt].offset) + } +| Variable +| SumExpr +| '!' SimpleExpr %prec neg + { + $$ = &ast.UnaryOperationExpr{Op: opcode.Not, V: $2} + } +| '~' SimpleExpr %prec neg + { + $$ = &ast.UnaryOperationExpr{Op: opcode.BitNeg, V: $2} + } +| '-' SimpleExpr %prec neg + { + $$ = &ast.UnaryOperationExpr{Op: opcode.Minus, V: $2} + } +| '+' SimpleExpr %prec neg + { + $$ = &ast.UnaryOperationExpr{Op: opcode.Plus, V: $2} + } +| SimpleExpr pipes SimpleExpr + { + $$ = &ast.FuncCallExpr{FnName: model.NewCIStr(ast.Concat), Args: []ast.ExprNode{$1, $3}} + } +| not2 SimpleExpr %prec neg + { + $$ = &ast.UnaryOperationExpr{Op: opcode.Not, V: $2} + } +| SubSelect +| '(' Expression ')' { + startOffset := parser.startOffset(&yyS[yypt-1]) + endOffset := parser.endOffset(&yyS[yypt]) + expr := $2 + expr.SetText(parser.src[startOffset:endOffset]) + $$ = &ast.ParenthesesExpr{Expr: expr} + } +| '(' ExpressionList ',' Expression ')' + { + values := append($2.([]ast.ExprNode), $4) + $$ = &ast.RowExpr{Values: values} + } +| "ROW" '(' ExpressionList ',' Expression ')' + { + values := append($3.([]ast.ExprNode), $5) + $$ = &ast.RowExpr{Values: values} + } +| "EXISTS" SubSelect + { + sq := $2.(*ast.SubqueryExpr) + sq.Exists = true + $$ = &ast.ExistsSubqueryExpr{Sel: sq} + } +| "BINARY" SimpleExpr %prec neg + { + // See https://dev.mysql.com/doc/refman/5.7/en/cast-functions.html#operator_binary + x := types.NewFieldType(mysql.TypeString) + x.Charset = charset.CharsetBin + x.Collate = charset.CharsetBin + $$ = &ast.FuncCastExpr{ + Expr: $2, + Tp: x, + FunctionType: ast.CastBinaryOperator, + } + } +| builtinCast '(' Expression "AS" CastType ')' + { + /* See https://dev.mysql.com/doc/refman/5.7/en/cast-functions.html#function_cast */ + tp := $5.(*types.FieldType) + defaultFlen, defaultDecimal := mysql.GetDefaultFieldLengthAndDecimalForCast(tp.Tp) + if tp.Flen == types.UnspecifiedLength { + tp.Flen = defaultFlen + } + if tp.Decimal == types.UnspecifiedLength { + tp.Decimal = defaultDecimal + } + $$ = &ast.FuncCastExpr{ + Expr: $3, + Tp: tp, + FunctionType: ast.CastFunction, + } + } +| "CASE" ExpressionOpt WhenClauseList ElseOpt "END" + { + x := &ast.CaseExpr{WhenClauses: $3.([]*ast.WhenClause)} + if $2 != nil { + x.Value = $2 + } + if $4 != nil { + x.ElseClause = $4.(ast.ExprNode) + } + $$ = x + } +| "CONVERT" '(' Expression ',' CastType ')' + { + // See https://dev.mysql.com/doc/refman/5.7/en/cast-functions.html#function_convert + tp := $5.(*types.FieldType) + defaultFlen, defaultDecimal := mysql.GetDefaultFieldLengthAndDecimalForCast(tp.Tp) + if tp.Flen == types.UnspecifiedLength { + tp.Flen = defaultFlen + } + if tp.Decimal == types.UnspecifiedLength { + tp.Decimal = defaultDecimal + } + $$ = &ast.FuncCastExpr{ + Expr: $3, + Tp: tp, + FunctionType: ast.CastConvertFunction, + } + } +| "CONVERT" '(' Expression "USING" CharsetName ')' + { + // See https://dev.mysql.com/doc/refman/5.7/en/cast-functions.html#function_convert + charset1 := ast.NewValueExpr($5) + $$ = &ast.FuncCallExpr{ + FnName: model.NewCIStr($1), + Args: []ast.ExprNode{$3, charset1}, + } + } +| "DEFAULT" '(' SimpleIdent ')' + { + $$ = &ast.DefaultExpr{Name: $3.(*ast.ColumnNameExpr).Name} + } +| "VALUES" '(' SimpleIdent ')' %prec lowerThanInsertValues + { + $$ = &ast.ValuesExpr{Column: $3.(*ast.ColumnNameExpr)} + } +| SimpleIdent jss stringLit + { + expr := ast.NewValueExpr($3) + $$ = &ast.FuncCallExpr{FnName: model.NewCIStr(ast.JSONExtract), Args: []ast.ExprNode{$1, expr}} + } +| SimpleIdent juss stringLit + { + expr := ast.NewValueExpr($3) + extract := &ast.FuncCallExpr{FnName: model.NewCIStr(ast.JSONExtract), Args: []ast.ExprNode{$1, expr}} + $$ = &ast.FuncCallExpr{FnName: model.NewCIStr(ast.JSONUnquote), Args: []ast.ExprNode{extract}} + } + +DistinctKwd: + "DISTINCT" +| "DISTINCTROW" + +DistinctOpt: + "ALL" + { + $$ = false + } +| DistinctKwd + { + $$ = true + } + +DefaultFalseDistinctOpt: + { + $$ = false + } +| DistinctOpt + +DefaultTrueDistinctOpt: + { + $$ = true + } +| DistinctOpt + +BuggyDefaultFalseDistinctOpt: + DefaultFalseDistinctOpt +| DistinctKwd "ALL" + { + $$ = true + } + + +FunctionNameConflict: + "ASCII" +| "CHARSET" +| "COALESCE" +| "COLLATION" +| "DATE" +| "DATABASE" +| "DAY" +| "HOUR" +| "IF" +| "INTERVAL" %prec lowerThanIntervalKeyword +| "FORMAT" +| "LEFT" +| "MICROSECOND" +| "MINUTE" +| "MONTH" +| builtinNow +| "QUARTER" +| "REPEAT" +| "REPLACE" +| "REVERSE" +| "RIGHT" +| "ROW_COUNT" +| "SECOND" +| "TIME" +| "TIMESTAMP" +| "TRUNCATE" +| "USER" +| "WEEK" +| "YEAR" + +OptionalBraces: + {} | '(' ')' {} + +FunctionNameOptionalBraces: + "CURRENT_USER" +| "CURRENT_DATE" +| "CURRENT_ROLE" +| "UTC_DATE" + +FunctionNameDatetimePrecision: + "CURRENT_TIME" +| "CURRENT_TIMESTAMP" +| "LOCALTIME" +| "LOCALTIMESTAMP" +| "UTC_TIME" +| "UTC_TIMESTAMP" + +FunctionCallKeyword: + FunctionNameConflict '(' ExpressionListOpt ')' + { + $$ = &ast.FuncCallExpr{FnName: model.NewCIStr($1), Args: $3.([]ast.ExprNode)} + } +| builtinUser '(' ExpressionListOpt ')' + { + $$ = &ast.FuncCallExpr{FnName: model.NewCIStr($1), Args: $3.([]ast.ExprNode)} + } +| FunctionNameOptionalBraces OptionalBraces + { + $$ = &ast.FuncCallExpr{FnName: model.NewCIStr($1)} + } +| builtinCurDate '(' ')' + { + $$ = &ast.FuncCallExpr{FnName: model.NewCIStr($1)} + } +| FunctionNameDatetimePrecision FuncDatetimePrec + { + args := []ast.ExprNode{} + if $2 != nil { + args = append(args, $2.(ast.ExprNode)) + } + $$ = &ast.FuncCallExpr{FnName: model.NewCIStr($1), Args: args} + } +| "CHAR" '(' ExpressionList ')' + { + nilVal := ast.NewValueExpr(nil) + args := $3.([]ast.ExprNode) + $$ = &ast.FuncCallExpr{ + FnName: model.NewCIStr(ast.CharFunc), + Args: append(args, nilVal), + } + } +| "CHAR" '(' ExpressionList "USING" CharsetName ')' + { + charset1 := ast.NewValueExpr($5) + args := $3.([]ast.ExprNode) + $$ = &ast.FuncCallExpr{ + FnName: model.NewCIStr(ast.CharFunc), + Args: append(args, charset1), + } + } +| "DATE" stringLit + { + expr := ast.NewValueExpr($2) + $$ = &ast.FuncCallExpr{FnName: model.NewCIStr(ast.DateLiteral), Args: []ast.ExprNode{expr}} + } +| "TIME" stringLit + { + expr := ast.NewValueExpr($2) + $$ = &ast.FuncCallExpr{FnName: model.NewCIStr(ast.TimeLiteral), Args: []ast.ExprNode{expr}} + } +| "TIMESTAMP" stringLit + { + expr := ast.NewValueExpr($2) + $$ = &ast.FuncCallExpr{FnName: model.NewCIStr(ast.TimestampLiteral), Args: []ast.ExprNode{expr}} + } +| "INSERT" '(' ExpressionListOpt ')' + { + $$ = &ast.FuncCallExpr{FnName:model.NewCIStr(ast.InsertFunc), Args: $3.([]ast.ExprNode)} + } +| "MOD" '(' BitExpr ',' BitExpr ')' + { + $$ = &ast.BinaryOperationExpr{Op: opcode.Mod, L: $3, R: $5} + } +| "PASSWORD" '(' ExpressionListOpt ')' + { + $$ = &ast.FuncCallExpr{FnName:model.NewCIStr(ast.PasswordFunc), Args: $3.([]ast.ExprNode)} + } +| '{' ODBCDateTimeType stringLit '}' + { + // This is ODBC syntax for date and time literals. + // See: https://dev.mysql.com/doc/refman/5.7/en/date-and-time-literals.html + expr := ast.NewValueExpr($3) + $$ = &ast.FuncCallExpr{FnName: model.NewCIStr($2), Args: []ast.ExprNode{expr}} + } + +FunctionCallNonKeyword: + builtinCurTime '(' FuncDatetimePrecListOpt ')' + { + $$ = &ast.FuncCallExpr{FnName: model.NewCIStr($1), Args: $3.([]ast.ExprNode)} + } +| builtinSysDate '(' FuncDatetimePrecListOpt ')' + { + $$ = &ast.FuncCallExpr{FnName: model.NewCIStr($1), Args: $3.([]ast.ExprNode)} + } +| FunctionNameDateArithMultiForms '(' Expression ',' Expression ')' + { + $$ = &ast.FuncCallExpr{ + FnName: model.NewCIStr($1), + Args: []ast.ExprNode{ + $3, + $5, + &ast.TimeUnitExpr{Unit: ast.TimeUnitDay}, + }, + } + } +| FunctionNameDateArithMultiForms '(' Expression ',' "INTERVAL" Expression TimeUnit ')' + { + $$ = &ast.FuncCallExpr{ + FnName: model.NewCIStr($1), + Args: []ast.ExprNode{ + $3, + $6, + &ast.TimeUnitExpr{Unit: $7.(ast.TimeUnitType)}, + }, + } + } +| FunctionNameDateArith '(' Expression ',' "INTERVAL" Expression TimeUnit ')' + { + $$ = &ast.FuncCallExpr{ + FnName: model.NewCIStr($1), + Args: []ast.ExprNode{ + $3, + $6, + &ast.TimeUnitExpr{Unit: $7.(ast.TimeUnitType)}, + }, + } + } +| builtinExtract '(' TimeUnit "FROM" Expression ')' + { + timeUnit := &ast.TimeUnitExpr{Unit: $3.(ast.TimeUnitType)} + $$ = &ast.FuncCallExpr{ + FnName: model.NewCIStr($1), + Args: []ast.ExprNode{timeUnit, $5}, + } + } +| "GET_FORMAT" '(' GetFormatSelector ',' Expression ')' + { + $$ = &ast.FuncCallExpr{ + FnName: model.NewCIStr($1), + Args: []ast.ExprNode{ + &ast.GetFormatSelectorExpr{Selector: $3.(ast.GetFormatSelectorType)}, + $5, + }, + } + } +| builtinPosition '(' BitExpr "IN" Expression ')' + { + $$ = &ast.FuncCallExpr{FnName: model.NewCIStr($1), Args: []ast.ExprNode{$3, $5}} + } +| builtinSubstring '(' Expression ',' Expression ')' + { + $$ = &ast.FuncCallExpr{ + FnName: model.NewCIStr($1), + Args: []ast.ExprNode{$3, $5}, + } + } +| builtinSubstring '(' Expression "FROM" Expression ')' + { + $$ = &ast.FuncCallExpr{ + FnName: model.NewCIStr($1), + Args: []ast.ExprNode{$3, $5}, + } + } +| builtinSubstring '(' Expression ',' Expression ',' Expression ')' + { + $$ = &ast.FuncCallExpr{ + FnName: model.NewCIStr($1), + Args: []ast.ExprNode{$3, $5, $7}, + } + } +| builtinSubstring '(' Expression "FROM" Expression "FOR" Expression ')' + { + $$ = &ast.FuncCallExpr{ + FnName: model.NewCIStr($1), + Args: []ast.ExprNode{$3, $5, $7}, + } + } +| "TIMESTAMPADD" '(' TimestampUnit ',' Expression ',' Expression ')' + { + $$ = &ast.FuncCallExpr{ + FnName: model.NewCIStr($1), + Args: []ast.ExprNode{&ast.TimeUnitExpr{Unit: $3.(ast.TimeUnitType)}, $5, $7}, + } + } +| "TIMESTAMPDIFF" '(' TimestampUnit ',' Expression ',' Expression ')' + { + $$ = &ast.FuncCallExpr{ + FnName: model.NewCIStr($1), + Args: []ast.ExprNode{&ast.TimeUnitExpr{Unit: $3.(ast.TimeUnitType)}, $5, $7}, + } + } +| builtinTrim '(' Expression ')' + { + $$ = &ast.FuncCallExpr{ + FnName: model.NewCIStr($1), + Args: []ast.ExprNode{$3}, + } + } +| builtinTrim '(' Expression "FROM" Expression ')' + { + $$ = &ast.FuncCallExpr{ + FnName: model.NewCIStr($1), + Args: []ast.ExprNode{$5, $3}, + } + } +| builtinTrim '(' TrimDirection "FROM" Expression ')' + { + nilVal := ast.NewValueExpr(nil) + direction := &ast.TrimDirectionExpr{Direction: $3.(ast.TrimDirectionType)} + $$ = &ast.FuncCallExpr{ + FnName: model.NewCIStr($1), + Args: []ast.ExprNode{$5, nilVal, direction}, + } + } +| builtinTrim '(' TrimDirection Expression "FROM" Expression ')' + { + direction := &ast.TrimDirectionExpr{Direction: $3.(ast.TrimDirectionType)} + $$ = &ast.FuncCallExpr{ + FnName: model.NewCIStr($1), + Args: []ast.ExprNode{$6, $4, direction}, + } + } + +GetFormatSelector: + "DATE" + { + $$ = ast.GetFormatSelectorDate + } +| "DATETIME" + { + $$ = ast.GetFormatSelectorDatetime + } +| "TIME" + { + $$ = ast.GetFormatSelectorTime + } +| "TIMESTAMP" + { + $$ = ast.GetFormatSelectorDatetime + } + + +FunctionNameDateArith: + builtinDateAdd +| builtinDateSub + + +FunctionNameDateArithMultiForms: + builtinAddDate +| builtinSubDate + + +TrimDirection: + "BOTH" + { + $$ = ast.TrimBoth + } +| "LEADING" + { + $$ = ast.TrimLeading + } +| "TRAILING" + { + $$ = ast.TrimTrailing + } + +SumExpr: + "AVG" '(' BuggyDefaultFalseDistinctOpt Expression ')' OptWindowingClause + { + if $6 != nil { + $$ = &ast.WindowFuncExpr{F: $1, Args: []ast.ExprNode{$4}, Distinct: $3.(bool), Spec: *($6.(*ast.WindowSpec)),} + } else { + $$ = &ast.AggregateFuncExpr{F: $1, Args: []ast.ExprNode{$4}, Distinct: $3.(bool)} + } + } +| builtinBitAnd '(' Expression ')' OptWindowingClause + { + if $5 != nil { + $$ = &ast.WindowFuncExpr{F: $1, Args: []ast.ExprNode{$3}, Spec: *($5.(*ast.WindowSpec)),} + } else { + $$ = &ast.AggregateFuncExpr{F: $1, Args: []ast.ExprNode{$3},} + } + } +| builtinBitAnd '(' "ALL" Expression ')' OptWindowingClause + { + if $6 != nil { + $$ = &ast.WindowFuncExpr{F: $1, Args: []ast.ExprNode{$4}, Spec: *($6.(*ast.WindowSpec)),} + } else { + $$ = &ast.AggregateFuncExpr{F: $1, Args: []ast.ExprNode{$4},} + } + } +| builtinBitOr '(' Expression ')' OptWindowingClause + { + if $5 != nil { + $$ = &ast.WindowFuncExpr{F: $1, Args: []ast.ExprNode{$3}, Spec: *($5.(*ast.WindowSpec)),} + } else { + $$ = &ast.AggregateFuncExpr{F: $1, Args: []ast.ExprNode{$3},} + } + } +| builtinBitOr '(' "ALL" Expression ')' OptWindowingClause + { + if $6 != nil { + $$ = &ast.WindowFuncExpr{F: $1, Args: []ast.ExprNode{$4}, Spec: *($6.(*ast.WindowSpec)),} + } else { + $$ = &ast.AggregateFuncExpr{F: $1, Args: []ast.ExprNode{$4},} + } + } +| builtinBitXor '(' Expression ')' OptWindowingClause + { + if $5 != nil { + $$ = &ast.WindowFuncExpr{F: $1, Args: []ast.ExprNode{$3}, Spec: *($5.(*ast.WindowSpec)),} + } else { + $$ = &ast.AggregateFuncExpr{F: $1, Args: []ast.ExprNode{$3},} + } + } +| builtinBitXor '(' "ALL" Expression ')' OptWindowingClause + { + if $6 != nil { + $$ = &ast.WindowFuncExpr{F: $1, Args: []ast.ExprNode{$4}, Spec: *($6.(*ast.WindowSpec)),} + } else { + $$ = &ast.AggregateFuncExpr{F: $1, Args: []ast.ExprNode{$4},} + } + } +| builtinCount '(' DistinctKwd ExpressionList ')' + { + $$ = &ast.AggregateFuncExpr{F: $1, Args: $4.([]ast.ExprNode), Distinct: true} + } +| builtinCount '(' "ALL" Expression ')' OptWindowingClause + { + if $6 != nil { + $$ = &ast.WindowFuncExpr{F: $1, Args: []ast.ExprNode{$4}, Spec: *($6.(*ast.WindowSpec)),} + } else { + $$ = &ast.AggregateFuncExpr{F: $1, Args: []ast.ExprNode{$4},} + } + } +| builtinCount '(' Expression ')' OptWindowingClause + { + if $5 != nil { + $$ = &ast.WindowFuncExpr{F: $1, Args: []ast.ExprNode{$3}, Spec: *($5.(*ast.WindowSpec)),} + } else { + $$ = &ast.AggregateFuncExpr{F: $1, Args: []ast.ExprNode{$3},} + } + } +| builtinCount '(' '*' ')' OptWindowingClause + { + args := []ast.ExprNode{ast.NewValueExpr(1)} + if $5 != nil { + $$ = &ast.WindowFuncExpr{F: $1, Args: args, Spec: *($5.(*ast.WindowSpec)),} + } else { + $$ = &ast.AggregateFuncExpr{F: $1, Args: args,} + } + } +| builtinGroupConcat '(' BuggyDefaultFalseDistinctOpt ExpressionList OrderByOptional OptGConcatSeparator ')' + { + args := $4.([]ast.ExprNode) + args = append(args, $6.(ast.ExprNode)) + $$ = &ast.AggregateFuncExpr{F: $1, Args: args, Distinct: $3.(bool)} + } +| builtinMax '(' BuggyDefaultFalseDistinctOpt Expression ')' OptWindowingClause + { + if $6 != nil { + $$ = &ast.WindowFuncExpr{F: $1, Args: []ast.ExprNode{$4}, Distinct: $3.(bool), Spec: *($6.(*ast.WindowSpec)),} + } else { + $$ = &ast.AggregateFuncExpr{F: $1, Args: []ast.ExprNode{$4}, Distinct: $3.(bool)} + } + } +| builtinMin '(' BuggyDefaultFalseDistinctOpt Expression ')' OptWindowingClause + { + if $6 != nil { + $$ = &ast.WindowFuncExpr{F: $1, Args: []ast.ExprNode{$4}, Distinct: $3.(bool), Spec: *($6.(*ast.WindowSpec)),} + } else { + $$ = &ast.AggregateFuncExpr{F: $1, Args: []ast.ExprNode{$4}, Distinct: $3.(bool)} + } + } +| builtinSum '(' BuggyDefaultFalseDistinctOpt Expression ')' OptWindowingClause + { + if $6 != nil { + $$ = &ast.WindowFuncExpr{F: $1, Args: []ast.ExprNode{$4}, Distinct: $3.(bool), Spec: *($6.(*ast.WindowSpec)),} + } else { + $$ = &ast.AggregateFuncExpr{F: $1, Args: []ast.ExprNode{$4}, Distinct: $3.(bool)} + } + } +| builtinStddevPop '(' BuggyDefaultFalseDistinctOpt Expression ')' OptWindowingClause + { + if $6 != nil { + $$ = &ast.WindowFuncExpr{F: $1, Args: []ast.ExprNode{$4}, Distinct: $3.(bool), Spec: *($6.(*ast.WindowSpec)),} + } else { + $$ = &ast.AggregateFuncExpr{F: $1, Args: []ast.ExprNode{$4}, Distinct: $3.(bool)} + } + } +| builtinStddevSamp '(' BuggyDefaultFalseDistinctOpt Expression ')' OptWindowingClause + { + if $6 != nil { + $$ = &ast.WindowFuncExpr{F: $1, Args: []ast.ExprNode{$4}, Distinct: $3.(bool), Spec: *($6.(*ast.WindowSpec)),} + } else { + $$ = &ast.AggregateFuncExpr{F: $1, Args: []ast.ExprNode{$4}, Distinct: $3.(bool)} + } + } +| builtinVarPop '(' BuggyDefaultFalseDistinctOpt Expression ')' OptWindowingClause + { + $$ = &ast.AggregateFuncExpr{F: ast.AggFuncVarPop, Args: []ast.ExprNode{$4}, Distinct: $3.(bool)} + } +| builtinVarSamp '(' BuggyDefaultFalseDistinctOpt Expression ')' OptWindowingClause + { + $$ = &ast.AggregateFuncExpr{F: $1, Args: []ast.ExprNode{$4}, Distinct: $3.(bool)} + } + +OptGConcatSeparator: + { + $$ = ast.NewValueExpr(",") + } +| "SEPARATOR" stringLit + { + $$ = ast.NewValueExpr($2) + } + + +FunctionCallGeneric: + identifier '(' ExpressionListOpt ')' + { + $$ = &ast.FuncCallExpr{FnName: model.NewCIStr($1), Args: $3.([]ast.ExprNode)} + } + +FuncDatetimePrec: + { + $$ = nil + } +| '(' ')' + { + $$ = nil + } +| '(' intLit ')' + { + expr := ast.NewValueExpr($2) + $$ = expr + } + +TimeUnit: + TimestampUnit + { + $$ = $1 + } +| "SECOND_MICROSECOND" + { + $$ = ast.TimeUnitSecondMicrosecond + } +| "MINUTE_MICROSECOND" + { + $$ = ast.TimeUnitMinuteMicrosecond + } +| "MINUTE_SECOND" + { + $$ = ast.TimeUnitMinuteSecond + } +| "HOUR_MICROSECOND" + { + $$ = ast.TimeUnitHourMicrosecond + } +| "HOUR_SECOND" + { + $$ = ast.TimeUnitHourSecond + } +| "HOUR_MINUTE" + { + $$ = ast.TimeUnitHourMinute + } +| "DAY_MICROSECOND" + { + $$ = ast.TimeUnitDayMicrosecond + } +| "DAY_SECOND" + { + $$ = ast.TimeUnitDaySecond + } +| "DAY_MINUTE" + { + $$ = ast.TimeUnitDayMinute + } +| "DAY_HOUR" + { + $$ = ast.TimeUnitDayHour + } +| "YEAR_MONTH" + { + $$ = ast.TimeUnitYearMonth + } + +TimestampUnit: + "MICROSECOND" + { + $$ = ast.TimeUnitMicrosecond + } +| "SECOND" + { + $$ = ast.TimeUnitSecond + } +| "MINUTE" + { + $$ = ast.TimeUnitMinute + } +| "HOUR" + { + $$ = ast.TimeUnitHour + } +| "DAY" + { + $$ = ast.TimeUnitDay + } +| "WEEK" + { + $$ = ast.TimeUnitWeek + } +| "MONTH" + { + $$ = ast.TimeUnitMonth + } +| "QUARTER" + { + $$ = ast.TimeUnitQuarter + } +| "YEAR" + { + $$ = ast.TimeUnitYear + } +| "SQL_TSI_SECOND" + { + $$ = ast.TimeUnitSecond + } +| "SQL_TSI_MINUTE" + { + $$ = ast.TimeUnitMinute + } +| "SQL_TSI_HOUR" + { + $$ = ast.TimeUnitHour + } +| "SQL_TSI_DAY" + { + $$ = ast.TimeUnitDay + } +| "SQL_TSI_WEEK" + { + $$ = ast.TimeUnitWeek + } +| "SQL_TSI_MONTH" + { + $$ = ast.TimeUnitMonth + } +| "SQL_TSI_QUARTER" + { + $$ = ast.TimeUnitQuarter + } +| "SQL_TSI_YEAR" + { + $$ = ast.TimeUnitYear + } + +ExpressionOpt: + { + $$ = nil + } +| Expression + { + $$ = $1 + } + +WhenClauseList: + WhenClause + { + $$ = []*ast.WhenClause{$1.(*ast.WhenClause)} + } +| WhenClauseList WhenClause + { + $$ = append($1.([]*ast.WhenClause), $2.(*ast.WhenClause)) + } + +WhenClause: + "WHEN" Expression "THEN" Expression + { + $$ = &ast.WhenClause{ + Expr: $2, + Result: $4, + } + } + +ElseOpt: + /* empty */ + { + $$ = nil + } +| "ELSE" Expression + { + $$ = $2 + } + +CastType: + "BINARY" OptFieldLen + { + x := types.NewFieldType(mysql.TypeVarString) + x.Flen = $2.(int) // TODO: Flen should be the flen of expression + if x.Flen != types.UnspecifiedLength { + x.Tp = mysql.TypeString + } + x.Charset = charset.CharsetBin + x.Collate = charset.CollationBin + x.Flag |= mysql.BinaryFlag + $$ = x + } +| "CHAR" OptFieldLen OptBinary + { + x := types.NewFieldType(mysql.TypeVarString) + x.Flen = $2.(int) // TODO: Flen should be the flen of expression + x.Charset = $3.(*ast.OptBinary).Charset + if $3.(*ast.OptBinary).IsBinary{ + x.Flag |= mysql.BinaryFlag + } + if x.Charset == "" { + x.Charset = mysql.DefaultCharset + x.Collate = mysql.DefaultCollationName + } + $$ = x + } +| "DATE" + { + x := types.NewFieldType(mysql.TypeDate) + x.Charset = charset.CharsetBin + x.Collate = charset.CollationBin + x.Flag |= mysql.BinaryFlag + $$ = x + } +| "DATETIME" OptFieldLen + { + x := types.NewFieldType(mysql.TypeDatetime) + x.Flen, _ = mysql.GetDefaultFieldLengthAndDecimalForCast(mysql.TypeDatetime) + x.Decimal = $2.(int) + if x.Decimal > 0 { + x.Flen = x.Flen + 1 + x.Decimal + } + x.Charset = charset.CharsetBin + x.Collate = charset.CollationBin + x.Flag |= mysql.BinaryFlag + $$ = x + } +| "DECIMAL" FloatOpt + { + fopt := $2.(*ast.FloatOpt) + x := types.NewFieldType(mysql.TypeNewDecimal) + x.Flen = fopt.Flen + x.Decimal = fopt.Decimal + x.Charset = charset.CharsetBin + x.Collate = charset.CollationBin + x.Flag |= mysql.BinaryFlag + $$ = x + } +| "TIME" OptFieldLen + { + x := types.NewFieldType(mysql.TypeDuration) + x.Flen, _ = mysql.GetDefaultFieldLengthAndDecimalForCast(mysql.TypeDuration) + x.Decimal = $2.(int) + if x.Decimal > 0 { + x.Flen = x.Flen + 1 + x.Decimal + } + x.Charset = charset.CharsetBin + x.Collate = charset.CollationBin + x.Flag |= mysql.BinaryFlag + $$ = x + } +| "SIGNED" OptInteger + { + x := types.NewFieldType(mysql.TypeLonglong) + x.Charset = charset.CharsetBin + x.Collate = charset.CollationBin + x.Flag |= mysql.BinaryFlag + $$ = x + } +| "UNSIGNED" OptInteger + { + x := types.NewFieldType(mysql.TypeLonglong) + x.Flag |= mysql.UnsignedFlag | mysql.BinaryFlag + x.Charset = charset.CharsetBin + x.Collate = charset.CollationBin + $$ = x + } +| "JSON" + { + x := types.NewFieldType(mysql.TypeJSON) + x.Flag |= mysql.BinaryFlag | (mysql.ParseToJSONFlag) + x.Charset = mysql.DefaultCharset + x.Collate = mysql.DefaultCollationName + $$ = x + } +| "DOUBLE" + { + x := types.NewFieldType(mysql.TypeDouble) + x.Flen, x.Decimal = mysql.GetDefaultFieldLengthAndDecimalForCast(mysql.TypeDouble) + x.Flag |= mysql.BinaryFlag + x.Charset = charset.CharsetBin + x.Collate = charset.CollationBin + $$ = x + } +| "FLOAT" FloatOpt + { + x := types.NewFieldType(mysql.TypeFloat) + fopt := $2.(*ast.FloatOpt) + if fopt.Flen >= 54 { + yylex.AppendError(ErrTooBigPrecision.GenWithStackByArgs(fopt.Flen,"CAST",53)) + } else if fopt.Flen >= 25 { + x = types.NewFieldType(mysql.TypeDouble) + } + x.Flen, x.Decimal = mysql.GetDefaultFieldLengthAndDecimalForCast(x.Tp) + x.Flag |= mysql.BinaryFlag + x.Charset = charset.CharsetBin + x.Collate = charset.CollationBin + $$ = x + } +| "REAL" + { + var x *types.FieldType + if parser.lexer.GetSQLMode().HasRealAsFloatMode() { + x = types.NewFieldType(mysql.TypeFloat) + } else { + x = types.NewFieldType(mysql.TypeDouble) + } + x.Flen, x.Decimal = mysql.GetDefaultFieldLengthAndDecimalForCast(x.Tp) + x.Flag |= mysql.BinaryFlag + x.Charset = charset.CharsetBin + x.Collate = charset.CollationBin + $$ = x + } + +PriorityOpt: + { + $$ = mysql.NoPriority + } +| "LOW_PRIORITY" + { + $$ = mysql.LowPriority + } +| "HIGH_PRIORITY" + { + $$ = mysql.HighPriority + } +| "DELAYED" + { + $$ = mysql.DelayedPriority + } + +TableName: + Identifier + { + $$ = &ast.TableName{Name:model.NewCIStr($1)} + } +| Identifier '.' Identifier + { + $$ = &ast.TableName{Schema:model.NewCIStr($1), Name:model.NewCIStr($3)} + } +| Identifier '.' '*' + { + $$ = &ast.TableName{Name:model.NewCIStr($1)} + } + +TableNameList: + TableName + { + tbl := []*ast.TableName{$1.(*ast.TableName)} + $$ = tbl + } +| TableNameList ',' TableName + { + $$ = append($1.([]*ast.TableName), $3.(*ast.TableName)) + } + +QuickOptional: + %prec empty + { + $$ = false + } +| "QUICK" + { + $$ = true + } + +/***************************Prepared Statement Start****************************** + * See https://dev.mysql.com/doc/refman/5.7/en/prepare.html + * Example: + * PREPARE stmt_name FROM 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse'; + * OR + * SET @s = 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse'; + * PREPARE stmt_name FROM @s; + */ + +PreparedStmt: + "PREPARE" Identifier "FROM" PrepareSQL + { + var sqlText string + var sqlVar *ast.VariableExpr + switch $4.(type) { + case string: + sqlText = $4.(string) + case *ast.VariableExpr: + sqlVar = $4.(*ast.VariableExpr) + } + $$ = &ast.PrepareStmt{ + Name: $2, + SQLText: sqlText, + SQLVar: sqlVar, + } + } + +PrepareSQL: + stringLit + { + $$ = $1 + } +| UserVariable + { + $$ = $1.(interface{}) + } + + +/* + * See https://dev.mysql.com/doc/refman/5.7/en/execute.html + * Example: + * EXECUTE stmt1 USING @a, @b; + * OR + * EXECUTE stmt1; + */ +ExecuteStmt: + "EXECUTE" Identifier + { + $$ = &ast.ExecuteStmt{Name: $2} + } +| "EXECUTE" Identifier "USING" UserVariableList + { + $$ = &ast.ExecuteStmt{ + Name: $2, + UsingVars: $4.([]ast.ExprNode), + } + } + +UserVariableList: + UserVariable + { + $$ = []ast.ExprNode{$1} + } +| UserVariableList ',' UserVariable + { + $$ = append($1.([]ast.ExprNode), $3) + } + +/* + * See https://dev.mysql.com/doc/refman/5.0/en/deallocate-prepare.html + */ + +DeallocateStmt: + DeallocateSym "PREPARE" Identifier + { + $$ = &ast.DeallocateStmt{Name: $3} + } + +DeallocateSym: +"DEALLOCATE" | "DROP" + +/****************************Prepared Statement End*******************************/ + + +RollbackStmt: + "ROLLBACK" + { + $$ = &ast.RollbackStmt{} + } + +SelectStmtBasic: + "SELECT" SelectStmtOpts SelectStmtFieldList + { + st := &ast.SelectStmt { + SelectStmtOpts: $2.(*ast.SelectStmtOpts), + Distinct: $2.(*ast.SelectStmtOpts).Distinct, + Fields: $3.(*ast.FieldList), + } + if st.SelectStmtOpts.TableHints != nil { + st.TableHints = st.SelectStmtOpts.TableHints + } + $$ = st + } + +SelectStmtFromDualTable: + SelectStmtBasic FromDual WhereClauseOptional + { + st := $1.(*ast.SelectStmt) + lastField := st.Fields.Fields[len(st.Fields.Fields)-1] + if lastField.Expr != nil && lastField.AsName.O == "" { + lastEnd := yyS[yypt-1].offset-1 + lastField.SetText(parser.src[lastField.Offset:lastEnd]) + } + if $3 != nil { + st.Where = $3.(ast.ExprNode) + } + } + +SelectStmtFromTable: + SelectStmtBasic "FROM" + TableRefsClause WhereClauseOptional SelectStmtGroup HavingClause WindowClauseOptional + { + st := $1.(*ast.SelectStmt) + st.From = $3.(*ast.TableRefsClause) + lastField := st.Fields.Fields[len(st.Fields.Fields)-1] + if lastField.Expr != nil && lastField.AsName.O == "" { + lastEnd := parser.endOffset(&yyS[yypt-5]) + lastField.SetText(parser.src[lastField.Offset:lastEnd]) + } + if $4 != nil { + st.Where = $4.(ast.ExprNode) + } + if $5 != nil { + st.GroupBy = $5.(*ast.GroupByClause) + } + if $6 != nil { + st.Having = $6.(*ast.HavingClause) + } + if $7 != nil { + st.WindowSpecs = ($7.([]ast.WindowSpec)) + } + $$ = st + } + +SelectStmt: + SelectStmtBasic OrderByOptional SelectStmtLimit SelectLockOpt + { + st := $1.(*ast.SelectStmt) + st.LockTp = $4.(ast.SelectLockType) + lastField := st.Fields.Fields[len(st.Fields.Fields)-1] + if lastField.Expr != nil && lastField.AsName.O == "" { + src := parser.src + var lastEnd int + if $2 != nil { + lastEnd = yyS[yypt-2].offset-1 + } else if $3 != nil { + lastEnd = yyS[yypt-1].offset-1 + } else if $4 != ast.SelectLockNone { + lastEnd = yyS[yypt].offset-1 + } else { + lastEnd = len(src) + if src[lastEnd-1] == ';' { + lastEnd-- + } + } + lastField.SetText(src[lastField.Offset:lastEnd]) + } + if $2 != nil { + st.OrderBy = $2.(*ast.OrderByClause) + } + if $3 != nil { + st.Limit = $3.(*ast.Limit) + } + $$ = st + } +| SelectStmtFromDualTable OrderByOptional SelectStmtLimit SelectLockOpt + { + st := $1.(*ast.SelectStmt) + if $2 != nil { + st.OrderBy = $2.(*ast.OrderByClause) + } + if $3 != nil { + st.Limit = $3.(*ast.Limit) + } + st.LockTp = $4.(ast.SelectLockType) + $$ = st + } +| SelectStmtFromTable OrderByOptional SelectStmtLimit SelectLockOpt + { + st := $1.(*ast.SelectStmt) + st.LockTp = $4.(ast.SelectLockType) + if $2 != nil { + st.OrderBy = $2.(*ast.OrderByClause) + } + if $3 != nil { + st.Limit = $3.(*ast.Limit) + } + $$ = st + } + +FromDual: + "FROM" "DUAL" + +WindowClauseOptional: + { + $$ = nil + } +| "WINDOW" WindowDefinitionList + { + $$ = $2.([]ast.WindowSpec) + } + +WindowDefinitionList: + WindowDefinition + { + $$ = []ast.WindowSpec{$1.(ast.WindowSpec)} + } +| WindowDefinitionList ',' WindowDefinition + { + $$ = append($1.([]ast.WindowSpec), $3.(ast.WindowSpec)) + } + +WindowDefinition: + WindowName "AS" WindowSpec + { + var spec = $3.(ast.WindowSpec) + spec.Name = $1.(model.CIStr) + $$ = spec + } + +WindowName: + Identifier + { + $$ = model.NewCIStr($1) + } + +WindowSpec: + '(' WindowSpecDetails ')' + { + $$ = $2.(ast.WindowSpec) + } + +WindowSpecDetails: + OptExistingWindowName OptPartitionClause OptWindowOrderByClause OptWindowFrameClause + { + spec := ast.WindowSpec{Ref: $1.(model.CIStr),} + if $2 != nil { + spec.PartitionBy = $2.(*ast.PartitionByClause) + } + if $3 != nil { + spec.OrderBy = $3.(*ast.OrderByClause) + } + if $4 != nil { + spec.Frame = $4.(*ast.FrameClause) + } + $$ = spec + } + +OptExistingWindowName: + { + $$ = model.CIStr{} + } +| WindowName + { + $$ = $1.(model.CIStr) + } + +OptPartitionClause: + { + $$ = nil + } +| "PARTITION" "BY" ByList + { + $$ = &ast.PartitionByClause{Items: $3.([]*ast.ByItem)} + } + +OptWindowOrderByClause: + { + $$ = nil + } +| "ORDER" "BY" ByList + { + $$ = &ast.OrderByClause{Items: $3.([]*ast.ByItem)} + } + +OptWindowFrameClause: + { + $$ = nil + } +| WindowFrameUnits WindowFrameExtent + { + $$ = &ast.FrameClause{ + Type: $1.(ast.FrameType), + Extent: $2.(ast.FrameExtent), + } + } + +WindowFrameUnits: + "ROWS" + { + $$ = ast.FrameType(ast.Rows) + } +| "RANGE" + { + $$ = ast.FrameType(ast.Ranges) + } +| "GROUPS" + { + $$ = ast.FrameType(ast.Groups) + } + +WindowFrameExtent: + WindowFrameStart + { + $$ = ast.FrameExtent { + Start: $1.(ast.FrameBound), + End: ast.FrameBound{Type: ast.CurrentRow,}, + } + } +| WindowFrameBetween + { + $$ = $1.(ast.FrameExtent) + } + +WindowFrameStart: + "UNBOUNDED" "PRECEDING" + { + $$ = ast.FrameBound{Type: ast.Preceding, UnBounded: true,} + } +| NumLiteral "PRECEDING" + { + $$ = ast.FrameBound{Type: ast.Preceding, Expr: ast.NewValueExpr($1),} + } +| paramMarker "PRECEDING" + { + $$ = ast.FrameBound{Type: ast.Preceding, Expr: ast.NewParamMarkerExpr(yyS[yypt].offset),} + } +| "INTERVAL" Expression TimeUnit "PRECEDING" + { + $$ = ast.FrameBound{Type: ast.Preceding, Expr: $2, Unit: $3.(ast.TimeUnitType),} + } +| "CURRENT" "ROW" + { + $$ = ast.FrameBound{Type: ast.CurrentRow,} + } + +WindowFrameBetween: + "BETWEEN" WindowFrameBound "AND" WindowFrameBound + { + $$ = ast.FrameExtent{Start: $2.(ast.FrameBound), End: $4.(ast.FrameBound),} + } + +WindowFrameBound: + WindowFrameStart + { + $$ = $1.(ast.FrameBound) + } +| "UNBOUNDED" "FOLLOWING" + { + $$ = ast.FrameBound{Type: ast.Following, UnBounded: true,} + } +| NumLiteral "FOLLOWING" + { + $$ = ast.FrameBound{Type: ast.Following, Expr: ast.NewValueExpr($1),} + } +| paramMarker "FOLLOWING" + { + $$ = ast.FrameBound{Type: ast.Following, Expr: ast.NewParamMarkerExpr(yyS[yypt].offset),} + } +| "INTERVAL" Expression TimeUnit "FOLLOWING" + { + $$ = ast.FrameBound{Type: ast.Following, Expr: $2, Unit: $3.(ast.TimeUnitType),} + } + +OptWindowingClause: + { + $$ = nil + } +| WindowingClause + { + spec := $1.(ast.WindowSpec) + $$ = &spec + } + +WindowingClause: + "OVER" WindowNameOrSpec + { + $$ = $2.(ast.WindowSpec) + } + +WindowNameOrSpec: + WindowName + { + $$ = ast.WindowSpec{Name: $1.(model.CIStr), OnlyAlias: true,} + } +| WindowSpec + { + $$ = $1.(ast.WindowSpec) + } + +WindowFuncCall: + "ROW_NUMBER" '(' ')' WindowingClause + { + $$ = &ast.WindowFuncExpr{F: $1, Spec: $4.(ast.WindowSpec),} + } +| "RANK" '(' ')' WindowingClause + { + $$ = &ast.WindowFuncExpr{F: $1, Spec: $4.(ast.WindowSpec),} + } +| "DENSE_RANK" '(' ')' WindowingClause + { + $$ = &ast.WindowFuncExpr{F: $1, Spec: $4.(ast.WindowSpec),} + } +| "CUME_DIST" '(' ')' WindowingClause + { + $$ = &ast.WindowFuncExpr{F: $1, Spec: $4.(ast.WindowSpec),} + } +| "PERCENT_RANK" '(' ')' WindowingClause + { + $$ = &ast.WindowFuncExpr{F: $1, Spec: $4.(ast.WindowSpec),} + } +| "NTILE" '(' SimpleExpr ')' WindowingClause + { + $$ = &ast.WindowFuncExpr{F: $1, Args: []ast.ExprNode{$3}, Spec: $5.(ast.WindowSpec),} + } +| "LEAD" '(' Expression OptLeadLagInfo ')' OptNullTreatment WindowingClause + { + args := []ast.ExprNode{$3} + if $4 != nil { + args = append(args, $4.([]ast.ExprNode)...) + } + $$ = &ast.WindowFuncExpr{F: $1, Args: args, IgnoreNull: $6.(bool), Spec: $7.(ast.WindowSpec),} + } +| "LAG" '(' Expression OptLeadLagInfo ')' OptNullTreatment WindowingClause + { + args := []ast.ExprNode{$3} + if $4 != nil { + args = append(args, $4.([]ast.ExprNode)...) + } + $$ = &ast.WindowFuncExpr{F: $1, Args: args, IgnoreNull: $6.(bool), Spec: $7.(ast.WindowSpec),} + } +| "FIRST_VALUE" '(' Expression ')' OptNullTreatment WindowingClause + { + $$ = &ast.WindowFuncExpr{F: $1, Args: []ast.ExprNode{$3}, IgnoreNull: $5.(bool), Spec: $6.(ast.WindowSpec),} + } +| "LAST_VALUE" '(' Expression ')' OptNullTreatment WindowingClause + { + $$ = &ast.WindowFuncExpr{F: $1, Args: []ast.ExprNode{$3}, IgnoreNull: $5.(bool), Spec: $6.(ast.WindowSpec),} + } +| "NTH_VALUE" '(' Expression ',' SimpleExpr ')' OptFromFirstLast OptNullTreatment WindowingClause + { + $$ = &ast.WindowFuncExpr{F: $1, Args: []ast.ExprNode{$3, $5}, FromLast: $7.(bool), IgnoreNull: $8.(bool), Spec: $9.(ast.WindowSpec),} + } + +OptLeadLagInfo: + { + $$ = nil + } +| ',' NumLiteral OptLLDefault + { + args := []ast.ExprNode{ast.NewValueExpr($2)} + if $3 != nil { + args = append(args, $3.(ast.ExprNode)) + } + $$ = args + } +| ',' paramMarker OptLLDefault + { + args := []ast.ExprNode{ast.NewValueExpr($2)} + if $3 != nil { + args = append(args, $3.(ast.ExprNode)) + } + $$ = args + } + +OptLLDefault: + { + $$ = nil + } +| ',' Expression + { + $$ = $2 + } + +OptNullTreatment: + { + $$ = false + } +| "RESPECT" "NULLS" + { + $$ = false + } +| "IGNORE" "NULLS" + { + $$ = true + } + +OptFromFirstLast: + { + $$ = false + } +| "FROM" "FIRST" + { + $$ = false + } +| "FROM" "LAST" + { + $$ = true + } + +TableRefsClause: + TableRefs + { + $$ = &ast.TableRefsClause{TableRefs: $1.(*ast.Join)} + } + +TableRefs: + EscapedTableRef + { + if j, ok := $1.(*ast.Join); ok { + // if $1 is Join, use it directly + $$ = j + } else { + $$ = &ast.Join{Left: $1.(ast.ResultSetNode), Right: nil} + } + } +| TableRefs ',' EscapedTableRef + { + /* from a, b is default cross join */ + $$ = &ast.Join{Left: $1.(ast.ResultSetNode), Right: $3.(ast.ResultSetNode), Tp: ast.CrossJoin} + } + +EscapedTableRef: + TableRef %prec lowerThanSetKeyword + { + $$ = $1 + } +| '{' Identifier TableRef '}' + { + /* + * ODBC escape syntax for outer join is { OJ join_table } + * Use an Identifier for OJ + */ + $$ = $3 + } + +TableRef: + TableFactor + { + $$ = $1 + } +| JoinTable + { + $$ = $1 + } + +TableFactor: + TableName PartitionNameListOpt TableAsNameOpt IndexHintListOpt + { + tn := $1.(*ast.TableName) + tn.PartitionNames = $2.([]model.CIStr) + tn.IndexHints = $4.([]*ast.IndexHint) + $$ = &ast.TableSource{Source: tn, AsName: $3.(model.CIStr)} + } +| '(' SelectStmt ')' TableAsName + { + st := $2.(*ast.SelectStmt) + endOffset := parser.endOffset(&yyS[yypt-1]) + parser.setLastSelectFieldText(st, endOffset) + $$ = &ast.TableSource{Source: $2.(*ast.SelectStmt), AsName: $4.(model.CIStr)} + } +| '(' UnionStmt ')' TableAsName + { + $$ = &ast.TableSource{Source: $2.(*ast.UnionStmt), AsName: $4.(model.CIStr)} + } +| '(' TableRefs ')' + { + $$ = $2 + } + +PartitionNameListOpt: + /* empty */ + { + $$ = []model.CIStr{} + } +| "PARTITION" '(' PartitionNameList ')' + { + $$ = $3 + } + +TableAsNameOpt: + { + $$ = model.CIStr{} + } +| TableAsName + { + $$ = $1 + } + +TableAsName: + Identifier + { + $$ = model.NewCIStr($1) + } +| "AS" Identifier + { + $$ = model.NewCIStr($2) + } + +IndexHintType: + "USE" KeyOrIndex + { + $$ = ast.HintUse + } +| "IGNORE" KeyOrIndex + { + $$ = ast.HintIgnore + } +| "FORCE" KeyOrIndex + { + $$ = ast.HintForce + } + +IndexHintScope: + { + $$ = ast.HintForScan + } +| "FOR" "JOIN" + { + $$ = ast.HintForJoin + } +| "FOR" "ORDER" "BY" + { + $$ = ast.HintForOrderBy + } +| "FOR" "GROUP" "BY" + { + $$ = ast.HintForGroupBy + } + + +IndexHint: + IndexHintType IndexHintScope '(' IndexNameList ')' + { + $$ = &ast.IndexHint{ + IndexNames: $4.([]model.CIStr), + HintType: $1.(ast.IndexHintType), + HintScope: $2.(ast.IndexHintScope), + } + } + +IndexNameList: + { + var nameList []model.CIStr + $$ = nameList + } +| Identifier + { + $$ = []model.CIStr{model.NewCIStr($1)} + } +| IndexNameList ',' Identifier + { + $$ = append($1.([]model.CIStr), model.NewCIStr($3)) + } +| "PRIMARY" + { + $$ = []model.CIStr{model.NewCIStr($1)} + } + +IndexHintList: + IndexHint + { + $$ = []*ast.IndexHint{$1.(*ast.IndexHint)} + } +| IndexHintList IndexHint + { + $$ = append($1.([]*ast.IndexHint), $2.(*ast.IndexHint)) + } + +IndexHintListOpt: + { + var hintList []*ast.IndexHint + $$ = hintList + } +| IndexHintList + { + $$ = $1 + } + +JoinTable: + /* Use %prec to evaluate production TableRef before cross join */ + TableRef CrossOpt TableRef %prec tableRefPriority + { + $$ = &ast.Join{Left: $1.(ast.ResultSetNode), Right: $3.(ast.ResultSetNode), Tp: ast.CrossJoin} + } +| TableRef CrossOpt TableRef "ON" Expression + { + on := &ast.OnCondition{Expr: $5} + $$ = &ast.Join{Left: $1.(ast.ResultSetNode), Right: $3.(ast.ResultSetNode), Tp: ast.CrossJoin, On: on} + } +| TableRef CrossOpt TableRef "USING" '(' ColumnNameList ')' + { + $$ = &ast.Join{Left: $1.(ast.ResultSetNode), Right: $3.(ast.ResultSetNode), Tp: ast.CrossJoin, Using: $6.([]*ast.ColumnName)} + } +| TableRef JoinType OuterOpt "JOIN" TableRef "ON" Expression + { + on := &ast.OnCondition{Expr: $7} + $$ = &ast.Join{Left: $1.(ast.ResultSetNode), Right: $5.(ast.ResultSetNode), Tp: $2.(ast.JoinType), On: on} + } +| TableRef JoinType OuterOpt "JOIN" TableRef "USING" '(' ColumnNameList ')' + { + $$ = &ast.Join{Left: $1.(ast.ResultSetNode), Right: $5.(ast.ResultSetNode), Tp: $2.(ast.JoinType), Using: $8.([]*ast.ColumnName)} + } +| TableRef "NATURAL" "JOIN" TableRef + { + $$ = &ast.Join{Left: $1.(ast.ResultSetNode), Right: $4.(ast.ResultSetNode), NaturalJoin: true} + } +| TableRef "NATURAL" JoinType OuterOpt "JOIN" TableRef + { + $$ = &ast.Join{Left: $1.(ast.ResultSetNode), Right: $6.(ast.ResultSetNode), Tp: $3.(ast.JoinType), NaturalJoin: true} + } +| TableRef "STRAIGHT_JOIN" TableRef + { + $$ = &ast.Join{Left: $1.(ast.ResultSetNode), Right: $3.(ast.ResultSetNode), StraightJoin: true} + } +| TableRef "STRAIGHT_JOIN" TableRef "ON" Expression + { + on := &ast.OnCondition{Expr: $5} + $$ = &ast.Join{Left: $1.(ast.ResultSetNode), Right: $3.(ast.ResultSetNode), StraightJoin: true, On: on} + } + +JoinType: + "LEFT" + { + $$ = ast.LeftJoin + } +| "RIGHT" + { + $$ = ast.RightJoin + } + +OuterOpt: + {} +| "OUTER" + +CrossOpt: + "JOIN" +| "CROSS" "JOIN" +| "INNER" "JOIN" + + +LimitClause: + { + $$ = nil + } +| "LIMIT" LimitOption + { + $$ = &ast.Limit{Count: $2.(ast.ValueExpr)} + } + +LimitOption: + LengthNum + { + $$ = ast.NewValueExpr($1) + } +| paramMarker + { + $$ = ast.NewParamMarkerExpr(yyS[yypt].offset) + } + +SelectStmtLimit: + { + $$ = nil + } +| "LIMIT" LimitOption + { + $$ = &ast.Limit{Count: $2.(ast.ExprNode)} + } +| "LIMIT" LimitOption ',' LimitOption + { + $$ = &ast.Limit{Offset: $2.(ast.ExprNode), Count: $4.(ast.ExprNode)} + } +| "LIMIT" LimitOption "OFFSET" LimitOption + { + $$ = &ast.Limit{Offset: $4.(ast.ExprNode), Count: $2.(ast.ExprNode)} + } + + +SelectStmtOpts: + TableOptimizerHints DefaultFalseDistinctOpt PriorityOpt SelectStmtSQLSmallResult SelectStmtSQLBigResult SelectStmtSQLBufferResult SelectStmtSQLCache SelectStmtCalcFoundRows SelectStmtStraightJoin + { + opt := &ast.SelectStmtOpts{} + if $1 != nil { + opt.TableHints = $1.([]*ast.TableOptimizerHint) + } + if $2 != nil { + opt.Distinct = $2.(bool) + } + if $3 != nil { + opt.Priority = $3.(mysql.PriorityEnum) + } + if $4 != nil { + opt.SQLSmallResult = $4.(bool) + } + if $5 != nil { + opt.SQLBigResult = $5.(bool) + } + if $6 != nil { + opt.SQLBufferResult = $6.(bool) + } + if $7 != nil { + opt.SQLCache = $7.(bool) + } + if $8 != nil { + opt.CalcFoundRows = $8.(bool) + } + if $9 != nil { + opt.StraightJoin = $9.(bool) + } + + $$ = opt + } + +TableOptimizerHints: + /* empty */ + { + $$ = nil + } +| hintBegin OptimizerHintList hintEnd + { + $$ = $2 + } +| hintBegin error hintEnd + { + yyerrok() + parser.lastErrorAsWarn() + $$ = nil + } + +OptimizerHintList: + TableOptimizerHintOpt + { + $$ = []*ast.TableOptimizerHint{$1.(*ast.TableOptimizerHint)} + } +| StorageOptimizerHintOpt + { + $$ = $1.([]*ast.TableOptimizerHint) + } +| OptimizerHintList TableOptimizerHintOpt + { + $$ = append($1.([]*ast.TableOptimizerHint), $2.(*ast.TableOptimizerHint)) + } +| OptimizerHintList ',' TableOptimizerHintOpt + { + $$ = append($1.([]*ast.TableOptimizerHint), $3.(*ast.TableOptimizerHint)) + } +| OptimizerHintList StorageOptimizerHintOpt + { + $$ = append($1.([]*ast.TableOptimizerHint), $2.([]*ast.TableOptimizerHint)...) + } +| OptimizerHintList ',' StorageOptimizerHintOpt + { + $$ = append($1.([]*ast.TableOptimizerHint), $3.([]*ast.TableOptimizerHint)...) + } + +TableOptimizerHintOpt: + index '(' QueryBlockOpt HintTable IndexNameList ')' + { + $$ = &ast.TableOptimizerHint{ + HintName: model.NewCIStr($1), + QBName: $3.(model.CIStr), + Tables: []ast.HintTable{$4.(ast.HintTable)}, + Indexes: $5.([]model.CIStr), + } + } +| hintSMJ '(' QueryBlockOpt HintTableList ')' + { + $$ = &ast.TableOptimizerHint{HintName: model.NewCIStr($1), QBName: $3.(model.CIStr), Tables: $4.([]ast.HintTable)} + } +| hintINLJ '(' QueryBlockOpt HintTableList ')' + { + $$ = &ast.TableOptimizerHint{HintName: model.NewCIStr($1), QBName: $3.(model.CIStr), Tables: $4.([]ast.HintTable)} + } +| hintHJ '(' QueryBlockOpt HintTableList ')' + { + $$ = &ast.TableOptimizerHint{HintName: model.NewCIStr($1), QBName: $3.(model.CIStr), Tables: $4.([]ast.HintTable)} + } +| hintUseIndexMerge '(' QueryBlockOpt HintTable IndexNameList ')' + { + $$ = &ast.TableOptimizerHint{ + HintName: model.NewCIStr($1), + QBName: $3.(model.CIStr), + Tables: []ast.HintTable{$4.(ast.HintTable)}, + Indexes: $5.([]model.CIStr), + } + } +| hintUseToja '(' QueryBlockOpt HintTrueOrFalse ')' + { + $$ = &ast.TableOptimizerHint{HintName: model.NewCIStr($1), QBName: $3.(model.CIStr), HintFlag: $4.(bool)} + } +| hintEnablePlanCache '(' QueryBlockOpt HintTrueOrFalse ')' + { + $$ = &ast.TableOptimizerHint{HintName: model.NewCIStr($1), QBName: $3.(model.CIStr), HintFlag: $4.(bool)} + } +| maxExecutionTime '(' QueryBlockOpt NUM ')' + { + $$ = &ast.TableOptimizerHint{HintName: model.NewCIStr($1), QBName: $3.(model.CIStr), MaxExecutionTime: getUint64FromNUM($4)} + } +| hintUsePlanCache '(' QueryBlockOpt ')' + { + // arguments not decided yet. + $$ = &ast.TableOptimizerHint{HintName: model.NewCIStr($1), QBName: $3.(model.CIStr)} + } +| hintQueryType '(' QueryBlockOpt HintQueryType ')' + { + $$ = &ast.TableOptimizerHint{HintName: model.NewCIStr($1), QBName: $3.(model.CIStr), QueryType: model.NewCIStr($4.(string))} + } +| hintMemoryQuota '(' QueryBlockOpt HintMemoryQuota ')' + { + $$ = &ast.TableOptimizerHint{HintName: model.NewCIStr($1), QBName: $3.(model.CIStr), MemoryQuota: $4.(int64)} + } +| hintHASHAGG '(' QueryBlockOpt ')' + { + $$ = &ast.TableOptimizerHint{HintName: model.NewCIStr($1), QBName: $3.(model.CIStr)} + } +| hintSTREAMAGG '(' QueryBlockOpt ')' + { + $$ = &ast.TableOptimizerHint{HintName: model.NewCIStr($1), QBName: $3.(model.CIStr)} + } +| hintAggToCop '(' QueryBlockOpt ')' + { + $$ = &ast.TableOptimizerHint{HintName: model.NewCIStr($1), QBName: $3.(model.CIStr)} + } +| hintNoIndexMerge '(' QueryBlockOpt ')' + { + $$ = &ast.TableOptimizerHint{HintName: model.NewCIStr($1), QBName: $3.(model.CIStr)} + } +| hintReadConsistentReplica '(' QueryBlockOpt ')' + { + $$ = &ast.TableOptimizerHint{HintName: model.NewCIStr($1), QBName: $3.(model.CIStr)} + } +| hintQBName '(' Identifier ')' + { + $$ = &ast.TableOptimizerHint{HintName: model.NewCIStr($1), QBName: model.NewCIStr($3)} + } + +StorageOptimizerHintOpt: + hintReadFromStorage '(' QueryBlockOpt HintStorageTypeAndTableList ')' + { + $$ = $4.([]*ast.TableOptimizerHint) + for _, hint := range $$.([]*ast.TableOptimizerHint) { + hint.HintName = model.NewCIStr($1) + hint.QBName = $3.(model.CIStr) + } + } + +HintStorageTypeAndTableList: + HintStorageTypeAndTable + { + $$ = []*ast.TableOptimizerHint{$1.(*ast.TableOptimizerHint)} + } +| HintStorageTypeAndTableList ',' HintStorageTypeAndTable + { + $$ = append($1.([]*ast.TableOptimizerHint), $3.(*ast.TableOptimizerHint)) + } + +HintStorageTypeAndTable: + HintStorageType '[' HintTableList ']' + { + $$ = &ast.TableOptimizerHint{ + StoreType: model.NewCIStr($1.(string)), + Tables: $3.([]ast.HintTable), + } + } + +QueryBlockOpt: + { + $$ = model.NewCIStr("") + } +| singleAtIdentifier + { + $$ = model.NewCIStr($1) + } + +HintTable: + Identifier QueryBlockOpt + { + $$ = ast.HintTable{TableName: model.NewCIStr($1), QBName: $2.(model.CIStr)} + } + +HintTableList: + HintTable + { + $$ = []ast.HintTable{$1.(ast.HintTable)} + } +| HintTableList ',' HintTable + { + $$ = append($1.([]ast.HintTable), $3.(ast.HintTable)) + } + +HintTrueOrFalse: + "TRUE" + { + $$ = true + } +| "FALSE" + { + $$ = false + } + +HintStorageType: + hintTiKV + { + $$ = $1 + } +| hintTiFlash + { + $$ = $1 + } + +HintQueryType: + hintOLAP + { + $$ = $1 + } +| hintOLTP + { + $$ = $1 + } + +HintMemoryQuota: + NUM Identifier + { + switch model.NewCIStr($2).L { + case "mb": + $$ = $1.(int64) * 1024 * 1024 + case "gb": + $$ = $1.(int64) * 1024 * 1024 * 1024 + default: + // Executor handle memory quota < 0 as no memory limit, here use it to trigger warning in TiDB. + $$ = int64(-1) + } + } + +SelectStmtCalcFoundRows: + { + $$ = false + } +| "SQL_CALC_FOUND_ROWS" + { + $$ = true + } +SelectStmtSQLBigResult: + %prec empty + { + $$ = false + } +| "SQL_BIG_RESULT" + { + $$ = true + } +SelectStmtSQLBufferResult: + %prec empty + { + $$ = false + } +| "SQL_BUFFER_RESULT" + { + $$ = true + } +SelectStmtSQLCache: + %prec empty + { + $$ = true + } +| "SQL_CACHE" + { + $$ = true + } +| "SQL_NO_CACHE" + { + $$ = false + } +SelectStmtSQLSmallResult: + %prec empty + { + $$ = false + } +| "SQL_SMALL_RESULT" + { + $$ = true + } +SelectStmtStraightJoin: + %prec empty + { + $$ = false + } +| "STRAIGHT_JOIN" + { + $$ = true + } + +SelectStmtFieldList: + FieldList + { + $$ = &ast.FieldList{Fields: $1.([]*ast.SelectField)} + } + +SelectStmtGroup: + /* EMPTY */ + { + $$ = nil + } +| GroupByClause + +// See https://dev.mysql.com/doc/refman/5.7/en/subqueries.html +SubSelect: + '(' SelectStmt ')' + { + s := $2.(*ast.SelectStmt) + endOffset := parser.endOffset(&yyS[yypt]) + parser.setLastSelectFieldText(s, endOffset) + src := parser.src + // See the implementation of yyParse function + s.SetText(src[yyS[yypt-1].offset:yyS[yypt].offset]) + $$ = &ast.SubqueryExpr{Query: s} + } +| '(' UnionStmt ')' + { + s := $2.(*ast.UnionStmt) + src := parser.src + // See the implementation of yyParse function + s.SetText(src[yyS[yypt-1].offset:yyS[yypt].offset]) + $$ = &ast.SubqueryExpr{Query: s} + } + +// See https://dev.mysql.com/doc/refman/5.7/en/innodb-locking-reads.html +SelectLockOpt: + /* empty */ + { + $$ = ast.SelectLockNone + } +| "FOR" "UPDATE" + { + $$ = ast.SelectLockForUpdate + } +| "LOCK" "IN" "SHARE" "MODE" + { + $$ = ast.SelectLockInShareMode + } + +// See https://dev.mysql.com/doc/refman/5.7/en/union.html +UnionStmt: + UnionClauseList "UNION" UnionOpt SelectStmtBasic OrderByOptional SelectStmtLimit SelectLockOpt + { + st := $4.(*ast.SelectStmt) + union := $1.(*ast.UnionStmt) + st.IsAfterUnionDistinct = $3.(bool) + lastSelect := union.SelectList.Selects[len(union.SelectList.Selects)-1] + endOffset := parser.endOffset(&yyS[yypt-5]) + parser.setLastSelectFieldText(lastSelect, endOffset) + union.SelectList.Selects = append(union.SelectList.Selects, st) + if $5 != nil { + union.OrderBy = $5.(*ast.OrderByClause) + } + if $6 != nil { + union.Limit = $6.(*ast.Limit) + } + if $5 == nil && $6 == nil { + st.LockTp = $7.(ast.SelectLockType) + } + $$ = union + } +| UnionClauseList "UNION" UnionOpt SelectStmtFromDualTable OrderByOptional + SelectStmtLimit SelectLockOpt + { + st := $4.(*ast.SelectStmt) + union := $1.(*ast.UnionStmt) + st.IsAfterUnionDistinct = $3.(bool) + lastSelect := union.SelectList.Selects[len(union.SelectList.Selects)-1] + endOffset := parser.endOffset(&yyS[yypt-5]) + parser.setLastSelectFieldText(lastSelect, endOffset) + union.SelectList.Selects = append(union.SelectList.Selects, st) + if $5 != nil { + union.OrderBy = $5.(*ast.OrderByClause) + } + if $6 != nil { + union.Limit = $6.(*ast.Limit) + } + if $5 == nil && $6 == nil { + st.LockTp = $7.(ast.SelectLockType) + } + $$ = union + } +| UnionClauseList "UNION" UnionOpt SelectStmtFromTable OrderByOptional + SelectStmtLimit SelectLockOpt + { + st := $4.(*ast.SelectStmt) + union := $1.(*ast.UnionStmt) + st.IsAfterUnionDistinct = $3.(bool) + lastSelect := union.SelectList.Selects[len(union.SelectList.Selects)-1] + endOffset := parser.endOffset(&yyS[yypt-5]) + parser.setLastSelectFieldText(lastSelect, endOffset) + union.SelectList.Selects = append(union.SelectList.Selects, st) + if $5 != nil { + union.OrderBy = $5.(*ast.OrderByClause) + } + if $6 != nil { + union.Limit = $6.(*ast.Limit) + } + if $5 == nil && $6 == nil { + st.LockTp = $7.(ast.SelectLockType) + } + $$ = union + } +| UnionClauseList "UNION" UnionOpt '(' SelectStmt ')' OrderByOptional SelectStmtLimit + { + union := $1.(*ast.UnionStmt) + lastSelect := union.SelectList.Selects[len(union.SelectList.Selects)-1] + endOffset := parser.endOffset(&yyS[yypt-6]) + parser.setLastSelectFieldText(lastSelect, endOffset) + st := $5.(*ast.SelectStmt) + st.IsInBraces = true + st.IsAfterUnionDistinct = $3.(bool) + endOffset = parser.endOffset(&yyS[yypt-2]) + parser.setLastSelectFieldText(st, endOffset) + union.SelectList.Selects = append(union.SelectList.Selects, st) + if $7 != nil { + union.OrderBy = $7.(*ast.OrderByClause) + } + if $8 != nil { + union.Limit = $8.(*ast.Limit) + } + $$ = union + } + +UnionClauseList: + UnionSelect + { + selectList := &ast.UnionSelectList{Selects: []*ast.SelectStmt{$1.(*ast.SelectStmt)}} + $$ = &ast.UnionStmt{ + SelectList: selectList, + } + } +| UnionClauseList "UNION" UnionOpt UnionSelect + { + union := $1.(*ast.UnionStmt) + st := $4.(*ast.SelectStmt) + st.IsAfterUnionDistinct = $3.(bool) + lastSelect := union.SelectList.Selects[len(union.SelectList.Selects)-1] + endOffset := parser.endOffset(&yyS[yypt-2]) + parser.setLastSelectFieldText(lastSelect, endOffset) + union.SelectList.Selects = append(union.SelectList.Selects, st) + $$ = union + } + +UnionSelect: + SelectStmt + { + $$ = $1.(interface{}) + } +| '(' SelectStmt ')' + { + st := $2.(*ast.SelectStmt) + st.IsInBraces = true + endOffset := parser.endOffset(&yyS[yypt]) + parser.setLastSelectFieldText(st, endOffset) + $$ = $2 + } + +UnionOpt: +DefaultTrueDistinctOpt + +/********************Change Statement*******************************/ +ChangeStmt: + "CHANGE" "PUMP" "TO" "NODE_STATE" eq stringLit forKwd "NODE_ID" stringLit + { + $$ = &ast.ChangeStmt{ + NodeType: ast.PumpType, + State: $6, + NodeID: $9, + } + } +| "CHANGE" "DRAINER" "TO" "NODE_STATE" eq stringLit forKwd "NODE_ID" stringLit + { + $$ = &ast.ChangeStmt{ + NodeType: ast.DrainerType, + State: $6, + NodeID: $9, + } + } + +/********************Set Statement*******************************/ +SetStmt: + "SET" VariableAssignmentList + { + $$ = &ast.SetStmt{Variables: $2.([]*ast.VariableAssignment)} + } +| "SET" "PASSWORD" eq PasswordOpt + { + $$ = &ast.SetPwdStmt{Password: $4.(string)} + } +| "SET" "PASSWORD" "FOR" Username eq PasswordOpt + { + $$ = &ast.SetPwdStmt{User: $4.(*auth.UserIdentity), Password: $6.(string)} + } +| "SET" "GLOBAL" "TRANSACTION" TransactionChars + { + vars := $4.([]*ast.VariableAssignment) + for _, v := range vars { + v.IsGlobal = true + } + $$ = &ast.SetStmt{Variables: vars} + } +| "SET" "SESSION" "TRANSACTION" TransactionChars + { + $$ = &ast.SetStmt{Variables: $4.([]*ast.VariableAssignment)} + } +| "SET" "TRANSACTION" TransactionChars + { + assigns := $3.([]*ast.VariableAssignment) + for i:=0; i mysql.MaxFloatPrecisionLength { + x.Tp = mysql.TypeDouble + } + x.Flen = types.UnspecifiedLength + } + x.Decimal = fopt.Decimal + for _, o := range $3.([]*ast.TypeOpt) { + if o.IsUnsigned { + x.Flag |= mysql.UnsignedFlag + } + if o.IsZerofill { + x.Flag |= mysql.ZerofillFlag + } + } + $$ = x + } +| BitValueType OptFieldLen + { + x := types.NewFieldType($1.(byte)) + x.Flen = $2.(int) + if x.Flen == types.UnspecifiedLength || x.Flen == 0 { + x.Flen = 1 + } else if x.Flen > mysql.MaxBitDisplayWidth { + yylex.AppendError(ErrTooBigDisplayWidth.GenWithStackByArgs(x.Flen)) + } + $$ = x + } + +IntegerType: + "TINYINT" + { + $$ = mysql.TypeTiny + } +| "SMALLINT" + { + $$ = mysql.TypeShort + } +| "MEDIUMINT" + { + $$ = mysql.TypeInt24 + } +| "INT" + { + $$ = mysql.TypeLong + } +| "INT1" + { + $$ = mysql.TypeTiny + } +| "INT2" + { + $$ = mysql.TypeShort + } +| "INT3" + { + $$ = mysql.TypeInt24 + } +| "INT4" + { + $$ = mysql.TypeLong + } +| "INT8" + { + $$ = mysql.TypeLonglong + } +| "INTEGER" + { + $$ = mysql.TypeLong + } +| "BIGINT" + { + $$ = mysql.TypeLonglong + } + + +BooleanType: + "BOOL" + { + $$ = mysql.TypeTiny + } +| "BOOLEAN" + { + $$ = mysql.TypeTiny + } + +OptInteger: + {} +| "INTEGER" +| "INT" + +FixedPointType: + "DECIMAL" + { + $$ = mysql.TypeNewDecimal + } +| "NUMERIC" + { + $$ = mysql.TypeNewDecimal + } + +FloatingPointType: + "FLOAT" + { + $$ = mysql.TypeFloat + } +| "REAL" + { + if parser.lexer.GetSQLMode().HasRealAsFloatMode() { + $$ = mysql.TypeFloat + } else { + $$ = mysql.TypeDouble + } + } +| "DOUBLE" + { + $$ = mysql.TypeDouble + } +| "DOUBLE" "PRECISION" + { + $$ = mysql.TypeDouble + } + +BitValueType: + "BIT" + { + $$ = mysql.TypeBit + } + +StringType: + Char FieldLen OptBinary + { + x := types.NewFieldType(mysql.TypeString) + x.Flen = $2.(int) + x.Charset = $3.(*ast.OptBinary).Charset + if $3.(*ast.OptBinary).IsBinary { + x.Flag |= mysql.BinaryFlag + } + $$ = x + } +| Char OptBinary + { + x := types.NewFieldType(mysql.TypeString) + x.Charset = $2.(*ast.OptBinary).Charset + if $2.(*ast.OptBinary).IsBinary { + x.Flag |= mysql.BinaryFlag + } + $$ = x + } +| NChar FieldLen OptBinary + { + x := types.NewFieldType(mysql.TypeString) + x.Flen = $2.(int) + x.Charset = $3.(*ast.OptBinary).Charset + if $3.(*ast.OptBinary).IsBinary { + x.Flag |= mysql.BinaryFlag + } + $$ = x + } +| NChar OptBinary + { + x := types.NewFieldType(mysql.TypeString) + x.Charset = $2.(*ast.OptBinary).Charset + if $2.(*ast.OptBinary).IsBinary { + x.Flag |= mysql.BinaryFlag + } + $$ = x + } +| Varchar FieldLen OptBinary + { + x := types.NewFieldType(mysql.TypeVarchar) + x.Flen = $2.(int) + x.Charset = $3.(*ast.OptBinary).Charset + if $3.(*ast.OptBinary).IsBinary { + x.Flag |= mysql.BinaryFlag + } + $$ = x + } +| NVarchar FieldLen OptBinary + { + x := types.NewFieldType(mysql.TypeVarchar) + x.Flen = $2.(int) + x.Charset = $3.(*ast.OptBinary).Charset + if $3.(*ast.OptBinary).IsBinary { + x.Flag |= mysql.BinaryFlag + } + $$ = x + } +| "BINARY" OptFieldLen + { + x := types.NewFieldType(mysql.TypeString) + x.Flen = $2.(int) + x.Charset = charset.CharsetBin + x.Collate = charset.CharsetBin + x.Flag |= mysql.BinaryFlag + $$ = x + } +| "VARBINARY" FieldLen + { + x := types.NewFieldType(mysql.TypeVarchar) + x.Flen = $2.(int) + x.Charset = charset.CharsetBin + x.Collate = charset.CharsetBin + x.Flag |= mysql.BinaryFlag + $$ = x + } +| BlobType + { + x := $1.(*types.FieldType) + x.Charset = charset.CharsetBin + x.Collate = charset.CharsetBin + x.Flag |= mysql.BinaryFlag + $$ = $1.(*types.FieldType) + } +| TextType OptBinary + { + x := $1.(*types.FieldType) + x.Charset = $2.(*ast.OptBinary).Charset + if $2.(*ast.OptBinary).IsBinary { + x.Flag |= mysql.BinaryFlag + } + $$ = x + } +| "ENUM" '(' StringList ')' OptCharset + { + x := types.NewFieldType(mysql.TypeEnum) + x.Elems = $3.([]string) + x.Charset = $5.(string) + $$ = x + } +| "SET" '(' StringList ')' OptCharset + { + x := types.NewFieldType(mysql.TypeSet) + x.Elems = $3.([]string) + x.Charset = $5.(string) + $$ = x + } +| "JSON" + { + x := types.NewFieldType(mysql.TypeJSON) + x.Decimal = 0 + x.Charset = charset.CharsetBin + x.Collate = charset.CollationBin + $$ = x + } +| "LONG" Varchar OptBinary + { + x := types.NewFieldType(mysql.TypeMediumBlob) + x.Charset = $3.(*ast.OptBinary).Charset + if $3.(*ast.OptBinary).IsBinary { + x.Flag |= mysql.BinaryFlag + } + $$ = x + } +| "LONG" OptBinary + { + x := types.NewFieldType(mysql.TypeMediumBlob) + x.Charset = $2.(*ast.OptBinary).Charset + if $2.(*ast.OptBinary).IsBinary { + x.Flag |= mysql.BinaryFlag + } + $$ = x + } + +Char: + "CHARACTER" +| "CHAR" + +NChar: + "NCHAR" +| "NATIONAL" "CHARACTER" +| "NATIONAL" "CHAR" + +Varchar: + "CHARACTER" "VARYING" +| "CHAR" "VARYING" +| "VARCHAR" +| "VARCHARACTER" + +NVarchar: + "NATIONAL" "VARCHAR" +| "NATIONAL" "VARCHARACTER" +| "NVARCHAR" +| "NCHAR" "VARCHAR" +| "NCHAR" "VARCHARACTER" +| "NATIONAL" "CHARACTER" "VARYING" +| "NATIONAL" "CHAR" "VARYING" +| "NCHAR" "VARYING" + + +BlobType: + "TINYBLOB" + { + x := types.NewFieldType(mysql.TypeTinyBlob) + $$ = x + } +| "BLOB" OptFieldLen + { + x := types.NewFieldType(mysql.TypeBlob) + x.Flen = $2.(int) + $$ = x + } +| "MEDIUMBLOB" + { + x := types.NewFieldType(mysql.TypeMediumBlob) + $$ = x + } +| "LONGBLOB" + { + x := types.NewFieldType(mysql.TypeLongBlob) + $$ = x + } +| "LONG" "VARBINARY" + { + x := types.NewFieldType(mysql.TypeMediumBlob) + $$ = x + } + +TextType: + "TINYTEXT" + { + x := types.NewFieldType(mysql.TypeTinyBlob) + $$ = x + + } +| "TEXT" OptFieldLen + { + x := types.NewFieldType(mysql.TypeBlob) + x.Flen = $2.(int) + $$ = x + } +| "MEDIUMTEXT" + { + x := types.NewFieldType(mysql.TypeMediumBlob) + $$ = x + } +| "LONGTEXT" + { + x := types.NewFieldType(mysql.TypeLongBlob) + $$ = x + } + + +DateAndTimeType: + "DATE" + { + x := types.NewFieldType(mysql.TypeDate) + $$ = x + } +| "DATETIME" OptFieldLen + { + x := types.NewFieldType(mysql.TypeDatetime) + x.Flen = mysql.MaxDatetimeWidthNoFsp + x.Decimal = $2.(int) + if x.Decimal > 0 { + x.Flen = x.Flen + 1 + x.Decimal + } + $$ = x + } +| "TIMESTAMP" OptFieldLen + { + x := types.NewFieldType(mysql.TypeTimestamp) + x.Flen = mysql.MaxDatetimeWidthNoFsp + x.Decimal = $2.(int) + if x.Decimal > 0 { + x.Flen = x.Flen + 1 + x.Decimal + } + $$ = x + } +| "TIME" OptFieldLen + { + x := types.NewFieldType(mysql.TypeDuration) + x.Flen = mysql.MaxDurationWidthNoFsp + x.Decimal = $2.(int) + if x.Decimal > 0 { + x.Flen = x.Flen + 1 + x.Decimal + } + $$ = x + } +| "YEAR" OptFieldLen FieldOpts + { + x := types.NewFieldType(mysql.TypeYear) + x.Flen = $2.(int) + if x.Flen != types.UnspecifiedLength && x.Flen != 4 { + yylex.AppendError(ErrInvalidYearColumnLength.GenWithStackByArgs()) + return -1 + } + $$ = x + } + +FieldLen: + '(' LengthNum ')' + { + $$ = int($2.(uint64)) + } + +OptFieldLen: + { + $$ = types.UnspecifiedLength + } +| FieldLen + { + $$ = $1.(int) + } + +FieldOpt: + "UNSIGNED" + { + $$ = &ast.TypeOpt{IsUnsigned: true} + } +| "SIGNED" + { + $$ = &ast.TypeOpt{IsUnsigned: false} + } +| "ZEROFILL" + { + $$ = &ast.TypeOpt{IsZerofill: true, IsUnsigned: true} + } + +FieldOpts: + { + $$ = []*ast.TypeOpt{} + } +| FieldOpts FieldOpt + { + $$ = append($1.([]*ast.TypeOpt), $2.(*ast.TypeOpt)) + } + +FloatOpt: + { + $$ = &ast.FloatOpt{Flen: types.UnspecifiedLength, Decimal: types.UnspecifiedLength} + } +| FieldLen + { + $$ = &ast.FloatOpt{Flen: $1.(int), Decimal: types.UnspecifiedLength} + } +| Precision + { + $$ = $1.(*ast.FloatOpt) + } + +Precision: + '(' LengthNum ',' LengthNum ')' + { + $$ = &ast.FloatOpt{Flen: int($2.(uint64)), Decimal: int($4.(uint64))} + } + +OptBinMod: + { + $$ = false + } +| "BINARY" + { + $$ = true + } + +OptBinary: + { + $$ = &ast.OptBinary{ + IsBinary: false, + Charset: "", + } + } +| "BINARY" OptCharset + { + $$ = &ast.OptBinary{ + IsBinary: true, + Charset: $2.(string), + } + } +| CharsetKw CharsetName OptBinMod + { + $$ = &ast.OptBinary{ + IsBinary: $3.(bool), + Charset: $2.(string), + } + } + +OptCharset: + { + $$ = "" + } +| CharsetKw CharsetName + { + $$ = $2.(string) + } + +CharsetKw: + "CHARACTER" "SET" +| "CHARSET" +| "CHAR" "SET" + +OptCollate: + { + $$ = "" + } +| "COLLATE" CollationName + { + $$ = $2.(string) + } + +StringList: + stringLit + { + $$ = []string{$1} + } +| StringList ',' stringLit + { + $$ = append($1.([]string), $3) + } + +StringName: + stringLit + { + $$ = $1 + } +| Identifier + { + $$ = $1 + } + +/*********************************************************************************** + * Update Statement + * See https://dev.mysql.com/doc/refman/5.7/en/update.html + ***********************************************************************************/ +UpdateStmt: + "UPDATE" TableOptimizerHints PriorityOpt IgnoreOptional TableRef "SET" AssignmentList WhereClauseOptional OrderByOptional LimitClause + { + var refs *ast.Join + if x, ok := $5.(*ast.Join); ok { + refs = x + } else { + refs = &ast.Join{Left: $5.(ast.ResultSetNode)} + } + st := &ast.UpdateStmt{ + Priority: $3.(mysql.PriorityEnum), + TableRefs: &ast.TableRefsClause{TableRefs: refs}, + List: $7.([]*ast.Assignment), + IgnoreErr: $4.(bool), + } + if $2 != nil { + st.TableHints = $2.([]*ast.TableOptimizerHint) + } + if $8 != nil { + st.Where = $8.(ast.ExprNode) + } + if $9 != nil { + st.Order = $9.(*ast.OrderByClause) + } + if $10 != nil { + st.Limit = $10.(*ast.Limit) + } + $$ = st + } +| "UPDATE" TableOptimizerHints PriorityOpt IgnoreOptional TableRefs "SET" AssignmentList WhereClauseOptional + { + st := &ast.UpdateStmt{ + Priority: $3.(mysql.PriorityEnum), + TableRefs: &ast.TableRefsClause{TableRefs: $5.(*ast.Join)}, + List: $7.([]*ast.Assignment), + IgnoreErr: $4.(bool), + } + if $2 != nil { + st.TableHints = $2.([]*ast.TableOptimizerHint) + } + if $8 != nil { + st.Where = $8.(ast.ExprNode) + } + $$ = st + } + +UseStmt: + "USE" DBName + { + $$ = &ast.UseStmt{DBName: $2.(string)} + } + +WhereClause: + "WHERE" Expression + { + $$ = $2 + } + +WhereClauseOptional: + { + $$ = nil + } +| WhereClause + { + $$ = $1 + } + +CommaOpt: + {} +| ',' + {} + +/************************************************************************************ + * Account Management Statements + * https://dev.mysql.com/doc/refman/5.7/en/account-management-sql.html + ************************************************************************************/ +CreateUserStmt: + "CREATE" "USER" IfNotExists UserSpecList RequireClauseOpt ConnectionOptions PasswordOrLockOptions + { + // See https://dev.mysql.com/doc/refman/5.7/en/create-user.html + $$ = &ast.CreateUserStmt{ + IsCreateRole: false, + IfNotExists: $3.(bool), + Specs: $4.([]*ast.UserSpec), + TslOptions: $5.([]*ast.TslOption), + ResourceOptions: $6.([]*ast.ResourceOption), + PasswordOrLockOptions: $7.([]*ast.PasswordOrLockOption), + } + } + +CreateRoleStmt: + "CREATE" "ROLE" IfNotExists RoleSpecList + { + // See https://dev.mysql.com/doc/refman/8.0/en/create-role.html + $$ = &ast.CreateUserStmt{ + IsCreateRole: true, + IfNotExists: $3.(bool), + Specs: $4.([]*ast.UserSpec), + } + } + +/* See http://dev.mysql.com/doc/refman/5.7/en/alter-user.html */ +AlterUserStmt: + "ALTER" "USER" IfExists UserSpecList RequireClauseOpt ConnectionOptions PasswordOrLockOptions + { + $$ = &ast.AlterUserStmt{ + IfExists: $3.(bool), + Specs: $4.([]*ast.UserSpec), + TslOptions: $5.([]*ast.TslOption), + ResourceOptions: $6.([]*ast.ResourceOption), + PasswordOrLockOptions: $7.([]*ast.PasswordOrLockOption), + } + } +| "ALTER" "USER" IfExists "USER" '(' ')' "IDENTIFIED" "BY" AuthString + { + auth := &ast.AuthOption { + AuthString: $9.(string), + ByAuthString: true, + } + $$ = &ast.AlterUserStmt{ + IfExists: $3.(bool), + CurrentAuth: auth, + } + } + +UserSpec: + Username AuthOption + { + userSpec := &ast.UserSpec{ + User: $1.(*auth.UserIdentity), + } + if $2 != nil { + userSpec.AuthOpt = $2.(*ast.AuthOption) + } + $$ = userSpec + } + +UserSpecList: + UserSpec + { + $$ = []*ast.UserSpec{$1.(*ast.UserSpec)} + } +| UserSpecList ',' UserSpec + { + $$ = append($1.([]*ast.UserSpec), $3.(*ast.UserSpec)) + } + +ConnectionOptions: + { + l := []*ast.ResourceOption{} + $$ = l + } +| "WITH" ConnectionOptionList + { + $$ = $2 + yylex.AppendError(yylex.Errorf("TiDB does not support WITH ConnectionOptions now, they would be parsed but ignored.")) + parser.lastErrorAsWarn() + } + +ConnectionOptionList: + ConnectionOption + { + $$ = []*ast.ResourceOption{$1.(*ast.ResourceOption)} + } +| ConnectionOptionList ConnectionOption + { + l := $1.([]*ast.ResourceOption) + l = append(l, $2.(*ast.ResourceOption)) + $$ = l + } + +ConnectionOption: + "MAX_QUERIES_PER_HOUR" NUM + { + $$ = &ast.ResourceOption { + Type: ast.MaxQueriesPerHour, + Count: $2.(int64), + } + } +| "MAX_UPDATES_PER_HOUR" NUM + { + $$ = &ast.ResourceOption { + Type: ast.MaxUpdatesPerHour, + Count: $2.(int64), + } + } +| "MAX_CONNECTIONS_PER_HOUR" NUM + { + $$ = &ast.ResourceOption { + Type: ast.MaxConnectionsPerHour, + Count: $2.(int64), + } + } +| "MAX_USER_CONNECTIONS" NUM + { + $$ = &ast.ResourceOption { + Type: ast.MaxUserConnections, + Count: $2.(int64), + } + } + +RequireClauseOpt: + { + $$ = []*ast.TslOption{} + } +| RequireClause + { + $$ = $1 + yylex.AppendError(yylex.Errorf("TiDB does not support REQUIRE now, they would be parsed but ignored.")) + parser.lastErrorAsWarn() + } + +RequireClause: + "REQUIRE" "NONE" + { + t := &ast.TslOption { + Type: ast.TslNone, + } + $$ = []*ast.TslOption{t} + } +| "REQUIRE" "SSL" + { + t := &ast.TslOption { + Type: ast.Ssl, + } + $$ = []*ast.TslOption{t} + } +| "REQUIRE" "X509" + { + t := &ast.TslOption { + Type: ast.X509, + } + $$ = []*ast.TslOption{t} + } +| "REQUIRE" RequireList + { + $$ = $2 + } + +RequireList: + RequireListElement + { + $$ = []*ast.TslOption{$1.(*ast.TslOption)} + } +| RequireListElement "AND" RequireList + { + l := $3.([]*ast.TslOption) + l = append(l, $1.(*ast.TslOption)) + $$ = l + } + +RequireListElement: + "ISSUER" stringLit + { + $$ = &ast.TslOption { + Type: ast.Issuer, + Value: $2, + } + } +| "SUBJECT" stringLit + { + $$ = &ast.TslOption { + Type: ast.Subject, + Value: $2, + } + } +| "CIPHER" stringLit + { + $$ = &ast.TslOption { + Type: ast.Cipher, + Value: $2, + } + } + +PasswordOrLockOptions: + { + l := []*ast.PasswordOrLockOption{} + $$ = l + } +| PasswordOrLockOptionList + { + $$ = $1 + yylex.AppendError(yylex.Errorf("TiDB does not support PASSWORD EXPIRE and ACCOUNT LOCK now, they would be parsed but ignored.")) + parser.lastErrorAsWarn() + } + +PasswordOrLockOptionList: + PasswordOrLockOption + { + $$ = []*ast.PasswordOrLockOption{$1.(*ast.PasswordOrLockOption)} + } +| PasswordOrLockOptionList PasswordOrLockOption + { + l := $1.([]*ast.PasswordOrLockOption) + l = append(l, $2.(*ast.PasswordOrLockOption)) + $$ = l + } + +PasswordOrLockOption: + "ACCOUNT" "UNLOCK" + { + $$ = &ast.PasswordOrLockOption { + Type: ast.Unlock, + } + } +| "ACCOUNT" "LOCK" + { + $$ = &ast.PasswordOrLockOption { + Type: ast.Lock, + } + } +| PasswordExpire + { + $$ = &ast.PasswordOrLockOption { + Type: ast.PasswordExpire, + } + } +| PasswordExpire "INTERVAL" NUM "DAY" + { + $$ = &ast.PasswordOrLockOption { + Type: ast.PasswordExpireInterval, + Count: $3.(int64), + } + } +| PasswordExpire "NEVER" + { + $$ = &ast.PasswordOrLockOption { + Type: ast.PasswordExpireNever, + } + } +| PasswordExpire "DEFAULT" + { + $$ = &ast.PasswordOrLockOption { + Type: ast.PasswordExpireDefault, + } + } + +PasswordExpire: + "PASSWORD" "EXPIRE" ClearPasswordExpireOptions + { + $$ = nil + } + +ClearPasswordExpireOptions: + { + $$ = nil + } + +AuthOption: + { + $$ = nil + } +| "IDENTIFIED" "BY" AuthString + { + $$ = &ast.AuthOption { + AuthString: $3.(string), + ByAuthString: true, + } + } +| "IDENTIFIED" "WITH" StringName + { + $$ = nil + } +| "IDENTIFIED" "WITH" StringName "BY" AuthString + { + $$ = &ast.AuthOption { + AuthString: $5.(string), + ByAuthString: true, + } + } +| "IDENTIFIED" "WITH" StringName "AS" HashString + { + $$ = &ast.AuthOption{ + HashString: $5.(string), + } + } +| "IDENTIFIED" "BY" "PASSWORD" HashString + { + $$ = &ast.AuthOption{ + HashString: $4.(string), + } + } + +HashString: + stringLit + { + $$ = $1 + } + +RoleSpec: + Rolename + { + role := $1.(*auth.RoleIdentity) + roleSpec := &ast.UserSpec{ + User: &auth.UserIdentity { + Username: role.Username, + Hostname: role.Hostname, + }, + IsRole: true, + } + $$ = roleSpec + } + +RoleSpecList: + RoleSpec + { + $$ = []*ast.UserSpec{$1.(*ast.UserSpec)} + } +| RoleSpecList ',' RoleSpec + { + $$ = append($1.([]*ast.UserSpec), $3.(*ast.UserSpec)) + } + +/******************************************************************* + * + * Create Binding Statement + * + * Example: + * CREATE GLOBAL BINDING FOR select Col1,Col2 from table USING select Col1,Col2 from table use index(Col1) + *******************************************************************/ +CreateBindingStmt: + "CREATE" GlobalScope "BINDING" "FOR" SelectStmt "USING" SelectStmt + { + startOffset := parser.startOffset(&yyS[yypt-2]) + endOffset := parser.startOffset(&yyS[yypt-1]) + selStmt := $5.(*ast.SelectStmt) + selStmt.SetText(strings.TrimSpace(parser.src[startOffset:endOffset])) + + startOffset = parser.startOffset(&yyS[yypt]) + hintedSelStmt := $7.(*ast.SelectStmt) + hintedSelStmt.SetText(strings.TrimSpace(parser.src[startOffset:])) + + x := &ast.CreateBindingStmt { + OriginSel: selStmt, + HintedSel: hintedSelStmt, + GlobalScope: $2.(bool), + } + + $$ = x + } +/******************************************************************* + * + * Drop Binding Statement + * + * Example: + * DROP GLOBAL BINDING FOR select Col1,Col2 from table + *******************************************************************/ +DropBindingStmt: + "DROP" GlobalScope "BINDING" "FOR" SelectStmt + { + startOffset := parser.startOffset(&yyS[yypt]) + selStmt := $5.(*ast.SelectStmt) + selStmt.SetText(strings.TrimSpace(parser.src[startOffset:])) + + x := &ast.DropBindingStmt { + OriginSel: selStmt, + GlobalScope: $2.(bool), + } + + $$ = x + } + +/************************************************************************************* + * Grant statement + * See https://dev.mysql.com/doc/refman/5.7/en/grant.html + *************************************************************************************/ +GrantStmt: + "GRANT" PrivElemList "ON" ObjectType PrivLevel "TO" UserSpecList WithGrantOptionOpt + { + $$ = &ast.GrantStmt{ + Privs: $2.([]*ast.PrivElem), + ObjectType: $4.(ast.ObjectTypeType), + Level: $5.(*ast.GrantLevel), + Users: $7.([]*ast.UserSpec), + WithGrant: $8.(bool), + } + } + +GrantRoleStmt: + "GRANT" RolenameList "TO" UsernameList + { + $$ = &ast.GrantRoleStmt { + Roles: $2.([]*auth.RoleIdentity), + Users: $4.([]*auth.UserIdentity), + } + } + +WithGrantOptionOpt: + { + $$ = false + } +| "WITH" "GRANT" "OPTION" + { + $$ = true + } +| "WITH" "MAX_QUERIES_PER_HOUR" NUM + { + $$ = false + } +| "WITH" "MAX_UPDATES_PER_HOUR" NUM + { + $$ = false + } +| "WITH" "MAX_CONNECTIONS_PER_HOUR" NUM + { + $$ = false + } +| "WITH" "MAX_USER_CONNECTIONS" NUM + { + $$ = false + } + +PrivElem: + PrivType + { + $$ = &ast.PrivElem{ + Priv: $1.(mysql.PrivilegeType), + } + } +| PrivType '(' ColumnNameList ')' + { + $$ = &ast.PrivElem{ + Priv: $1.(mysql.PrivilegeType), + Cols: $3.([]*ast.ColumnName), + } + } + +PrivElemList: + PrivElem + { + $$ = []*ast.PrivElem{$1.(*ast.PrivElem)} + } +| PrivElemList ',' PrivElem + { + $$ = append($1.([]*ast.PrivElem), $3.(*ast.PrivElem)) + } + +PrivType: + "ALL" + { + $$ = mysql.AllPriv + } +| "ALL" "PRIVILEGES" + { + $$ = mysql.AllPriv + } +| "ALTER" + { + $$ = mysql.AlterPriv + } +| "CREATE" + { + $$ = mysql.CreatePriv + } +| "CREATE" "USER" + { + $$ = mysql.CreateUserPriv + } +| "TRIGGER" + { + $$ = mysql.TriggerPriv + } +| "DELETE" + { + $$ = mysql.DeletePriv + } +| "DROP" + { + $$ = mysql.DropPriv + } +| "PROCESS" + { + $$ = mysql.ProcessPriv + } +| "EXECUTE" + { + $$ = mysql.ExecutePriv + } +| "INDEX" + { + $$ = mysql.IndexPriv + } +| "INSERT" + { + $$ = mysql.InsertPriv + } +| "SELECT" + { + $$ = mysql.SelectPriv + } +| "SUPER" + { + $$ = mysql.SuperPriv + } +| "SHOW" "DATABASES" + { + $$ = mysql.ShowDBPriv + } +| "UPDATE" + { + $$ = mysql.UpdatePriv + } +| "GRANT" "OPTION" + { + $$ = mysql.GrantPriv + } +| "REFERENCES" + { + $$ = mysql.ReferencesPriv + } +| "REPLICATION" "SLAVE" + { + $$ = mysql.PrivilegeType(0) + } +| "REPLICATION" "CLIENT" + { + $$ = mysql.PrivilegeType(0) + } +| "USAGE" + { + $$ = mysql.PrivilegeType(0) + } +| "RELOAD" + { + $$ = mysql.PrivilegeType(0) + } +| "CREATE" "TEMPORARY" "TABLES" + { + $$ = mysql.CreateTMPTablePriv + } +| "LOCK" "TABLES" + { + $$ = mysql.LockTablesPriv + } +| "CREATE" "VIEW" + { + $$ = mysql.CreateViewPriv + } +| "SHOW" "VIEW" + { + $$ = mysql.ShowViewPriv + } +| "CREATE" "ROLE" + { + $$ = mysql.CreateRolePriv + } +| "DROP" "ROLE" + { + $$ = mysql.DropRolePriv + } +| "CREATE" "ROUTINE" + { + $$ = mysql.CreateRoutinePriv + } +| "ALTER" "ROUTINE" + { + $$ = mysql.AlterRoutinePriv + } +| "EVENT" + { + $$ = mysql.EventPriv + } + +ObjectType: + { + $$ = ast.ObjectTypeNone + } +| "TABLE" + { + $$ = ast.ObjectTypeTable + } + +PrivLevel: + '*' + { + $$ = &ast.GrantLevel { + Level: ast.GrantLevelDB, + } + } +| '*' '.' '*' + { + $$ = &ast.GrantLevel { + Level: ast.GrantLevelGlobal, + } + } +| Identifier '.' '*' + { + $$ = &ast.GrantLevel { + Level: ast.GrantLevelDB, + DBName: $1, + } + } +| Identifier '.' Identifier + { + $$ = &ast.GrantLevel { + Level: ast.GrantLevelTable, + DBName: $1, + TableName: $3, + } + } +| Identifier + { + $$ = &ast.GrantLevel { + Level: ast.GrantLevelTable, + TableName: $1, + } + } + +/**************************************RevokeStmt******************************************* + * See https://dev.mysql.com/doc/refman/5.7/en/revoke.html + *******************************************************************************************/ +RevokeStmt: + "REVOKE" PrivElemList "ON" ObjectType PrivLevel "FROM" UserSpecList + { + $$ = &ast.RevokeStmt{ + Privs: $2.([]*ast.PrivElem), + ObjectType: $4.(ast.ObjectTypeType), + Level: $5.(*ast.GrantLevel), + Users: $7.([]*ast.UserSpec), + } + } + +RevokeRoleStmt: + "REVOKE" RolenameList "FROM" UsernameList + { + $$ = &ast.RevokeRoleStmt { + Roles: $2.([]*auth.RoleIdentity), + Users: $4.([]*auth.UserIdentity), + } + } + +/**************************************LoadDataStmt***************************************** + * See https://dev.mysql.com/doc/refman/5.7/en/load-data.html + *******************************************************************************************/ +LoadDataStmt: + "LOAD" "DATA" LocalOpt "INFILE" stringLit DuplicateOpt "INTO" "TABLE" TableName CharsetOpt Fields Lines IgnoreLines ColumnNameOrUserVarListOptWithBrackets LoadDataSetSpecOpt + { + x := &ast.LoadDataStmt{ + Path: $5, + OnDuplicate: $6.(ast.OnDuplicateKeyHandlingType), + Table: $9.(*ast.TableName), + ColumnsAndUserVars: $14.([]*ast.ColumnNameOrUserVar), + IgnoreLines: $13.(uint64), + } + if $3 != nil { + x.IsLocal = true + // See https://dev.mysql.com/doc/refman/5.7/en/load-data.html#load-data-duplicate-key-handling + // If you do not specify IGNORE or REPLACE modifier , then we set default behavior to IGNORE when LOCAL modifier is specified + if x.OnDuplicate == ast.OnDuplicateKeyHandlingError { + x.OnDuplicate = ast.OnDuplicateKeyHandlingIgnore + } + } + if $11 != nil { + x.FieldsInfo = $11.(*ast.FieldsClause) + } + if $12 != nil { + x.LinesInfo = $12.(*ast.LinesClause) + } + if $15 != nil { + x.ColumnAssignments = $15.([]*ast.Assignment) + } + columns := []*ast.ColumnName{} + for _, v := range x.ColumnsAndUserVars { + if v.ColumnName != nil { + columns = append(columns, v.ColumnName) + } + } + x.Columns = columns + + $$ = x + } + +IgnoreLines: + { + $$ = uint64(0) + } +| "IGNORE" NUM "LINES" + { + $$ = getUint64FromNUM($2) + } + +CharsetOpt: + {} +| "CHARACTER" "SET" CharsetName + +LocalOpt: + { + $$ = nil + } +| "LOCAL" + { + $$ = $1 + } + +Fields: + { + escape := "\\" + $$ = &ast.FieldsClause{ + Terminated: "\t", + Escaped: escape[0], + } + } +| FieldsOrColumns FieldItemList + { + fieldsClause := &ast.FieldsClause{ + Terminated: "\t", + Escaped: []byte("\\")[0], + } + fieldItems := $2.([]*ast.FieldItem) + for _, item := range fieldItems { + switch item.Type { + case ast.Terminated: + fieldsClause.Terminated = item.Value + case ast.Enclosed: + var enclosed byte + if len(item.Value) > 0 { + enclosed = item.Value[0] + } + fieldsClause.Enclosed = enclosed + case ast.Escaped: + var escaped byte + if len(item.Value) > 0 { + escaped = item.Value[0] + } + fieldsClause.Escaped = escaped + } + } + $$ = fieldsClause + } + +FieldsOrColumns: +"FIELDS" | "COLUMNS" + +FieldItemList: + FieldItemList FieldItem + { + fieldItems := $1.([]*ast.FieldItem) + $$ = append(fieldItems, $2.(*ast.FieldItem)) + } +| FieldItem + { + fieldItems := make([]*ast.FieldItem, 1, 1) + fieldItems[0] = $1.(*ast.FieldItem) + $$ = fieldItems + } + +FieldItem: + "TERMINATED" "BY" FieldTerminator + { + $$ = &ast.FieldItem{ + Type: ast.Terminated, + Value: $3.(string), + } + } +| "OPTIONALLY" "ENCLOSED" "BY" FieldTerminator + { + str := $4.(string) + if str != "\\" && len(str) > 1 { + yylex.AppendError(ErrWrongFieldTerminators.GenWithStackByArgs()) + return 1 + } + $$ = &ast.FieldItem{ + Type: ast.Enclosed, + Value: str, + } + } +| "ENCLOSED" "BY" FieldTerminator + { + str := $3.(string) + if str != "\\" && len(str) > 1 { + yylex.AppendError(ErrWrongFieldTerminators.GenWithStackByArgs()) + return 1 + } + $$ = &ast.FieldItem{ + Type: ast.Enclosed, + Value: str, + } + } +| "ESCAPED" "BY" FieldTerminator + { + str := $3.(string) + if str != "\\" && len(str) > 1 { + yylex.AppendError(ErrWrongFieldTerminators.GenWithStackByArgs()) + return 1 + } + $$ = &ast.FieldItem{ + Type: ast.Escaped, + Value: str, + } + } + +FieldTerminator: + stringLit + { + $$ = $1 + } +| hexLit + { + $$ = $1.(ast.BinaryLiteral).ToString() + } +| bitLit + { + $$ = $1.(ast.BinaryLiteral).ToString() + } + +Lines: + { + $$ = &ast.LinesClause{Terminated: "\n"} + } +| "LINES" Starting LinesTerminated + { + $$ = &ast.LinesClause{Starting: $2.(string), Terminated: $3.(string)} + } + +Starting: + { + $$ = "" + } +| "STARTING" "BY" stringLit + { + $$ = $3 + } + +LinesTerminated: + { + $$ = "\n" + } +| "TERMINATED" "BY" stringLit + { + $$ = $3 + } + +LoadDataSetSpecOpt: + { + $$ = nil + } +| "SET" LoadDataSetList + { + $$ = $2 + } + +LoadDataSetList: + LoadDataSetList ',' LoadDataSetItem + { + l := $1.([]*ast.Assignment) + $$ = append(l, $3.(*ast.Assignment)) + } +| LoadDataSetItem + { + $$ = []*ast.Assignment{$1.(*ast.Assignment)} + } + +LoadDataSetItem: + SimpleIdent "=" ExprOrDefault + { + $$ = &ast.Assignment{ + Column: $1.(*ast.ColumnNameExpr).Name, + Expr: $3, + } + + } + + + + +/********************************************************************* + * Lock/Unlock Tables + * See http://dev.mysql.com/doc/refman/5.7/en/lock-tables.html + * All the statement leaves empty. This is used to prevent mysqldump error. + *********************************************************************/ + +UnlockTablesStmt: + "UNLOCK" TablesTerminalSym + { + $$ = &ast.UnlockTablesStmt{} + } + +LockTablesStmt: + "LOCK" TablesTerminalSym TableLockList + { + $$ = &ast.LockTablesStmt{ + TableLocks: $3.([]ast.TableLock), + } + } + +TablesTerminalSym: + "TABLES" +| "TABLE" + +TableLock: + TableName LockType + { + $$ = ast.TableLock{ + Table: $1.(*ast.TableName), + Type: $2.(model.TableLockType), + } + } + +LockType: + "READ" + { + $$ = model.TableLockRead + } +| "READ" "LOCAL" + { + $$ = model.TableLockReadLocal + } +| "WRITE" + { + $$ = model.TableLockWrite + } +| "WRITE" "LOCAL" + { + $$ = model.TableLockWriteLocal + } + +TableLockList: + TableLock + { + $$ = []ast.TableLock{$1.(ast.TableLock)} + } +| TableLockList ',' TableLock + { + $$ = append($1.([]ast.TableLock), $3.(ast.TableLock)) + } + + +/******************************************************************** + * Kill Statement + * See https://dev.mysql.com/doc/refman/5.7/en/kill.html + *******************************************************************/ + +KillStmt: + KillOrKillTiDB NUM + { + $$ = &ast.KillStmt{ + ConnectionID: getUint64FromNUM($2), + TiDBExtension: $1.(bool), + } + } +| KillOrKillTiDB "CONNECTION" NUM + { + $$ = &ast.KillStmt{ + ConnectionID: getUint64FromNUM($3), + TiDBExtension: $1.(bool), + } + } +| KillOrKillTiDB "QUERY" NUM + { + $$ = &ast.KillStmt{ + ConnectionID: getUint64FromNUM($3), + Query: true, + TiDBExtension: $1.(bool), + } + } + +KillOrKillTiDB: + "KILL" + { + $$ = false + } +/* KILL TIDB is a special grammar extension in TiDB, it can be used only when + the client connect to TiDB directly, not proxied under LVS. */ +| "KILL" "TIDB" + { + $$ = true + } + +/*******************************************************************************************/ + +LoadStatsStmt: + "LOAD" "STATS" stringLit + { + $$ = &ast.LoadStatsStmt{ + Path: $3, + } + } + +%% diff --git a/vendor/github.com/pingcap/parser/terror/terror.go b/vendor/github.com/pingcap/parser/terror/terror.go new file mode 100644 index 0000000..91350dd --- /dev/null +++ b/vendor/github.com/pingcap/parser/terror/terror.go @@ -0,0 +1,359 @@ +// Copyright 2015 PingCAP, Inc. +// +// 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package terror + +import ( + "encoding/json" + "fmt" + "strconv" + + "github.com/pingcap/errors" + "github.com/pingcap/parser/mysql" + log "github.com/sirupsen/logrus" +) + +// Global error instances. +var ( + ErrCritical = ClassGlobal.New(CodeExecResultIsEmpty, "critical error %v") + ErrResultUndetermined = ClassGlobal.New(CodeResultUndetermined, "execution result undetermined") +) + +// ErrCode represents a specific error type in a error class. +// Same error code can be used in different error classes. +type ErrCode int + +const ( + // Executor error codes. + + // CodeUnknown is for errors of unknown reason. + CodeUnknown ErrCode = -1 + // CodeExecResultIsEmpty indicates execution result is empty. + CodeExecResultIsEmpty ErrCode = 3 + + // Expression error codes. + + // CodeMissConnectionID indicates connection id is missing. + CodeMissConnectionID ErrCode = 1 + + // Special error codes. + + // CodeResultUndetermined indicates the sql execution result is undetermined. + CodeResultUndetermined ErrCode = 2 +) + +// ErrClass represents a class of errors. +type ErrClass int + +// Error classes. +const ( + ClassAutoid ErrClass = iota + 1 + ClassDDL + ClassDomain + ClassEvaluator + ClassExecutor + ClassExpression + ClassAdmin + ClassKV + ClassMeta + ClassOptimizer + ClassParser + ClassPerfSchema + ClassPrivilege + ClassSchema + ClassServer + ClassStructure + ClassVariable + ClassXEval + ClassTable + ClassTypes + ClassGlobal + ClassMockTikv + ClassJSON + ClassTiKV + ClassSession + ClassPlugin + // Add more as needed. +) + +var errClz2Str = map[ErrClass]string{ + ClassAutoid: "autoid", + ClassDDL: "ddl", + ClassDomain: "domain", + ClassExecutor: "executor", + ClassExpression: "expression", + ClassAdmin: "admin", + ClassMeta: "meta", + ClassKV: "kv", + ClassOptimizer: "planner", + ClassParser: "parser", + ClassPerfSchema: "perfschema", + ClassPrivilege: "privilege", + ClassSchema: "schema", + ClassServer: "server", + ClassStructure: "structure", + ClassVariable: "variable", + ClassTable: "table", + ClassTypes: "types", + ClassGlobal: "global", + ClassMockTikv: "mocktikv", + ClassJSON: "json", + ClassTiKV: "tikv", + ClassSession: "session", + ClassPlugin: "plugin", +} + +// String implements fmt.Stringer interface. +func (ec ErrClass) String() string { + if s, exists := errClz2Str[ec]; exists { + return s + } + return strconv.Itoa(int(ec)) +} + +// EqualClass returns true if err is *Error with the same class. +func (ec ErrClass) EqualClass(err error) bool { + e := errors.Cause(err) + if e == nil { + return false + } + if te, ok := e.(*Error); ok { + return te.class == ec + } + return false +} + +// NotEqualClass returns true if err is not *Error with the same class. +func (ec ErrClass) NotEqualClass(err error) bool { + return !ec.EqualClass(err) +} + +// New creates an *Error with an error code and an error message. +// Usually used to create base *Error. +func (ec ErrClass) New(code ErrCode, message string) *Error { + return &Error{ + class: ec, + code: code, + message: message, + } +} + +// NewStd calls New using the standard message for the error code +func (ec ErrClass) NewStd(code ErrCode) *Error { + return ec.New(code, mysql.MySQLErrName[uint16(code)]) +} + +// Error implements error interface and adds integer Class and Code, so +// errors with different message can be compared. +type Error struct { + class ErrClass + code ErrCode + message string + args []interface{} + file string + line int +} + +// Class returns ErrClass +func (e *Error) Class() ErrClass { + return e.class +} + +// Code returns ErrCode +func (e *Error) Code() ErrCode { + return e.code +} + +// MarshalJSON implements json.Marshaler interface. +func (e *Error) MarshalJSON() ([]byte, error) { + return json.Marshal(&struct { + Class ErrClass `json:"class"` + Code ErrCode `json:"code"` + Msg string `json:"message"` + }{ + Class: e.class, + Code: e.code, + Msg: e.getMsg(), + }) +} + +// UnmarshalJSON implements json.Unmarshaler interface. +func (e *Error) UnmarshalJSON(data []byte) error { + err := &struct { + Class ErrClass `json:"class"` + Code ErrCode `json:"code"` + Msg string `json:"message"` + }{} + + if err := json.Unmarshal(data, &err); err != nil { + return errors.Trace(err) + } + + e.class = err.Class + e.code = err.Code + e.message = err.Msg + return nil +} + +// Location returns the location where the error is created, +// implements juju/errors locationer interface. +func (e *Error) Location() (file string, line int) { + return e.file, e.line +} + +// Error implements error interface. +func (e *Error) Error() string { + return fmt.Sprintf("[%s:%d]%s", e.class, e.code, e.getMsg()) +} + +func (e *Error) getMsg() string { + if len(e.args) > 0 { + return fmt.Sprintf(e.message, e.args...) + } + return e.message +} + +// GenWithStack generates a new *Error with the same class and code, and a new formatted message. +func (e *Error) GenWithStack(format string, args ...interface{}) error { + err := *e + err.message = format + err.args = args + return errors.AddStack(&err) +} + +// GenWithStackByArgs generates a new *Error with the same class and code, and new arguments. +func (e *Error) GenWithStackByArgs(args ...interface{}) error { + err := *e + err.args = args + return errors.AddStack(&err) +} + +// FastGen generates a new *Error with the same class and code, and a new formatted message. +// This will not call runtime.Caller to get file and line. +func (e *Error) FastGen(format string, args ...interface{}) error { + err := *e + err.message = format + err.args = args + return errors.SuspendStack(&err) +} + +// FastGen generates a new *Error with the same class and code, and a new arguments. +// This will not call runtime.Caller to get file and line. +func (e *Error) FastGenByArgs(args ...interface{}) error { + err := *e + err.args = args + return errors.SuspendStack(&err) +} + +// Equal checks if err is equal to e. +func (e *Error) Equal(err error) bool { + originErr := errors.Cause(err) + if originErr == nil { + return false + } + + if error(e) == originErr { + return true + } + inErr, ok := originErr.(*Error) + return ok && e.class == inErr.class && e.code == inErr.code +} + +// NotEqual checks if err is not equal to e. +func (e *Error) NotEqual(err error) bool { + return !e.Equal(err) +} + +// ToSQLError convert Error to mysql.SQLError. +func (e *Error) ToSQLError() *mysql.SQLError { + code := e.getMySQLErrorCode() + return mysql.NewErrf(code, "%s", e.getMsg()) +} + +var defaultMySQLErrorCode uint16 + +func (e *Error) getMySQLErrorCode() uint16 { + codeMap, ok := ErrClassToMySQLCodes[e.class] + if !ok { + log.Warnf("Unknown error class: %v", e.class) + return defaultMySQLErrorCode + } + code, ok := codeMap[e.code] + if !ok { + log.Debugf("Unknown error class: %v code: %v", e.class, e.code) + return defaultMySQLErrorCode + } + return code +} + +var ( + // ErrClassToMySQLCodes is the map of ErrClass to code-map. + ErrClassToMySQLCodes map[ErrClass]map[ErrCode]uint16 +) + +func init() { + ErrClassToMySQLCodes = make(map[ErrClass]map[ErrCode]uint16) + defaultMySQLErrorCode = mysql.ErrUnknown +} + +// ErrorEqual returns a boolean indicating whether err1 is equal to err2. +func ErrorEqual(err1, err2 error) bool { + e1 := errors.Cause(err1) + e2 := errors.Cause(err2) + + if e1 == e2 { + return true + } + + if e1 == nil || e2 == nil { + return e1 == e2 + } + + te1, ok1 := e1.(*Error) + te2, ok2 := e2.(*Error) + if ok1 && ok2 { + return te1.class == te2.class && te1.code == te2.code + } + + return e1.Error() == e2.Error() +} + +// ErrorNotEqual returns a boolean indicating whether err1 isn't equal to err2. +func ErrorNotEqual(err1, err2 error) bool { + return !ErrorEqual(err1, err2) +} + +// MustNil cleans up and fatals if err is not nil. +func MustNil(err error, closeFuns ...func()) { + if err != nil { + for _, f := range closeFuns { + f() + } + log.Fatalf(errors.ErrorStack(err)) + } +} + +// Call executes a function and checks the returned err. +func Call(fn func() error) { + err := fn() + if err != nil { + log.Error(errors.ErrorStack(err)) + } +} + +// Log logs the error if it is not nil. +func Log(err error) { + if err != nil { + log.Error(errors.ErrorStack(err)) + } +} diff --git a/vendor/github.com/pingcap/parser/test.sh b/vendor/github.com/pingcap/parser/test.sh new file mode 100644 index 0000000..5aa2786 --- /dev/null +++ b/vendor/github.com/pingcap/parser/test.sh @@ -0,0 +1,11 @@ +{ + mv go.mod1 go.mod + mv go.sum1 go.sum + GO111MODULE=on go test -p 1 -race -covermode=atomic -coverprofile=coverage.txt -coverpkg=./... ./... +} || { + mv go.mod go.mod1 + mv go.sum go.sum1 +} + +mv go.mod go.mod1 +mv go.sum go.sum1 diff --git a/vendor/github.com/pingcap/parser/types/etc.go b/vendor/github.com/pingcap/parser/types/etc.go new file mode 100644 index 0000000..84b2966 --- /dev/null +++ b/vendor/github.com/pingcap/parser/types/etc.go @@ -0,0 +1,112 @@ +// Copyright 2014 The ql Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSES/QL-LICENSE file. + +// Copyright 2015 PingCAP, Inc. +// +// 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package types + +import ( + "strings" + + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/terror" +) + +// IsTypeBlob returns a boolean indicating whether the tp is a blob type. +func IsTypeBlob(tp byte) bool { + switch tp { + case mysql.TypeTinyBlob, mysql.TypeMediumBlob, mysql.TypeBlob, mysql.TypeLongBlob: + return true + default: + return false + } +} + +// IsTypeChar returns a boolean indicating +// whether the tp is the char type like a string type or a varchar type. +func IsTypeChar(tp byte) bool { + return tp == mysql.TypeString || tp == mysql.TypeVarchar +} + +var type2Str = map[byte]string{ + mysql.TypeBit: "bit", + mysql.TypeBlob: "text", + mysql.TypeDate: "date", + mysql.TypeDatetime: "datetime", + mysql.TypeDecimal: "unspecified", + mysql.TypeNewDecimal: "decimal", + mysql.TypeDouble: "double", + mysql.TypeEnum: "enum", + mysql.TypeFloat: "float", + mysql.TypeGeometry: "geometry", + mysql.TypeInt24: "mediumint", + mysql.TypeJSON: "json", + mysql.TypeLong: "int", + mysql.TypeLonglong: "bigint", + mysql.TypeLongBlob: "longtext", + mysql.TypeMediumBlob: "mediumtext", + mysql.TypeNull: "null", + mysql.TypeSet: "set", + mysql.TypeShort: "smallint", + mysql.TypeString: "char", + mysql.TypeDuration: "time", + mysql.TypeTimestamp: "timestamp", + mysql.TypeTiny: "tinyint", + mysql.TypeTinyBlob: "tinytext", + mysql.TypeVarchar: "varchar", + mysql.TypeVarString: "var_string", + mysql.TypeYear: "year", +} + +// TypeStr converts tp to a string. +func TypeStr(tp byte) (r string) { + return type2Str[tp] +} + +// TypeToStr converts a field to a string. +// It is used for converting Text to Blob, +// or converting Char to Binary. +// Args: +// tp: type enum +// cs: charset +func TypeToStr(tp byte, cs string) (r string) { + ts := type2Str[tp] + if cs != "binary" { + return ts + } + if IsTypeBlob(tp) { + ts = strings.Replace(ts, "text", "blob", 1) + } else if IsTypeChar(tp) { + ts = strings.Replace(ts, "char", "binary", 1) + } + return ts +} + +var ( + dig2bytes = [10]int{0, 1, 1, 2, 2, 3, 3, 4, 4, 4} +) + +// constant values. +const ( + digitsPerWord = 9 // A word holds 9 digits. + wordSize = 4 // A word is 4 bytes int32. +) + +const ( + codeInvalidDefault = terror.ErrCode(mysql.ErrInvalidDefault) +) + +// ErrInvalidDefault is returned when meet a invalid default value. +var ErrInvalidDefault = terror.ClassTypes.New(codeInvalidDefault, "Invalid default value for '%s'") diff --git a/vendor/github.com/pingcap/parser/types/eval_type.go b/vendor/github.com/pingcap/parser/types/eval_type.go new file mode 100644 index 0000000..4777595 --- /dev/null +++ b/vendor/github.com/pingcap/parser/types/eval_type.go @@ -0,0 +1,42 @@ +// Copyright 2017 PingCAP, Inc. +// +// 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package types + +// EvalType indicates the specified types that arguments and result of a built-in function should be. +type EvalType byte + +const ( + // ETInt represents type INT in evaluation. + ETInt EvalType = iota + // ETReal represents type REAL in evaluation. + ETReal + // ETDecimal represents type DECIMAL in evaluation. + ETDecimal + // ETString represents type STRING in evaluation. + ETString + // ETDatetime represents type DATETIME in evaluation. + ETDatetime + // ETTimestamp represents type TIMESTAMP in evaluation. + ETTimestamp + // ETDuration represents type DURATION in evaluation. + ETDuration + // ETJson represents type JSON in evaluation. + ETJson +) + +// IsStringKind returns true for ETString, ETDatetime, ETTimestamp, ETDuration, ETJson EvalTypes. +func (et EvalType) IsStringKind() bool { + return et == ETString || et == ETDatetime || + et == ETTimestamp || et == ETDuration || et == ETJson +} diff --git a/vendor/github.com/pingcap/parser/types/field_type.go b/vendor/github.com/pingcap/parser/types/field_type.go new file mode 100644 index 0000000..e0d36ce --- /dev/null +++ b/vendor/github.com/pingcap/parser/types/field_type.go @@ -0,0 +1,349 @@ +// Copyright 2015 PingCAP, Inc. +// +// 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package types + +import ( + "fmt" + "io" + "strings" + + "github.com/pingcap/parser/charset" + "github.com/pingcap/parser/format" + "github.com/pingcap/parser/mysql" +) + +// UnspecifiedLength is unspecified length. +const ( + UnspecifiedLength = -1 +) + +// FieldType records field type information. +type FieldType struct { + Tp byte + Flag uint + Flen int + Decimal int + Charset string + Collate string + // Elems is the element list for enum and set type. + Elems []string +} + +// NewFieldType returns a FieldType, +// with a type and other information about field type. +func NewFieldType(tp byte) *FieldType { + return &FieldType{ + Tp: tp, + Flen: UnspecifiedLength, + Decimal: UnspecifiedLength, + } +} + +// Clone returns a copy of itself. +func (ft *FieldType) Clone() *FieldType { + ret := *ft + return &ret +} + +// Equal checks whether two FieldType objects are equal. +func (ft *FieldType) Equal(other *FieldType) bool { + // We do not need to compare whole `ft.Flag == other.Flag` when wrapping cast upon an Expression. + // but need compare unsigned_flag of ft.Flag. + partialEqual := ft.Tp == other.Tp && + ft.Flen == other.Flen && + ft.Decimal == other.Decimal && + ft.Charset == other.Charset && + ft.Collate == other.Collate && + mysql.HasUnsignedFlag(ft.Flag) == mysql.HasUnsignedFlag(other.Flag) + if !partialEqual || len(ft.Elems) != len(other.Elems) { + return false + } + for i := range ft.Elems { + if ft.Elems[i] != other.Elems[i] { + return false + } + } + return true +} + +// EvalType gets the type in evaluation. +func (ft *FieldType) EvalType() EvalType { + switch ft.Tp { + case mysql.TypeTiny, mysql.TypeShort, mysql.TypeInt24, mysql.TypeLong, mysql.TypeLonglong, + mysql.TypeBit, mysql.TypeYear: + return ETInt + case mysql.TypeFloat, mysql.TypeDouble: + return ETReal + case mysql.TypeNewDecimal: + return ETDecimal + case mysql.TypeDate, mysql.TypeDatetime: + return ETDatetime + case mysql.TypeTimestamp: + return ETTimestamp + case mysql.TypeDuration: + return ETDuration + case mysql.TypeJSON: + return ETJson + } + return ETString +} + +// Hybrid checks whether a type is a hybrid type, which can represent different types of value in specific context. +func (ft *FieldType) Hybrid() bool { + return ft.Tp == mysql.TypeEnum || ft.Tp == mysql.TypeBit || ft.Tp == mysql.TypeSet +} + +// Init initializes the FieldType data. +func (ft *FieldType) Init(tp byte) { + ft.Tp = tp + ft.Flen = UnspecifiedLength + ft.Decimal = UnspecifiedLength +} + +// CompactStr only considers Tp/CharsetBin/Flen/Deimal. +// This is used for showing column type in infoschema. +func (ft *FieldType) CompactStr() string { + ts := TypeToStr(ft.Tp, ft.Charset) + suffix := "" + + defaultFlen, defaultDecimal := mysql.GetDefaultFieldLengthAndDecimal(ft.Tp) + isDecimalNotDefault := ft.Decimal != defaultDecimal && ft.Decimal != 0 && ft.Decimal != UnspecifiedLength + + // displayFlen and displayDecimal are flen and decimal values with `-1` substituted with default value. + displayFlen, displayDecimal := ft.Flen, ft.Decimal + if displayFlen == 0 || displayFlen == UnspecifiedLength { + displayFlen = defaultFlen + } + if displayDecimal == 0 || displayDecimal == UnspecifiedLength { + displayDecimal = defaultDecimal + } + + switch ft.Tp { + case mysql.TypeEnum, mysql.TypeSet: + // Format is ENUM ('e1', 'e2') or SET ('e1', 'e2') + es := make([]string, 0, len(ft.Elems)) + for _, e := range ft.Elems { + e = format.OutputFormat(e) + es = append(es, e) + } + suffix = fmt.Sprintf("('%s')", strings.Join(es, "','")) + case mysql.TypeTimestamp, mysql.TypeDatetime, mysql.TypeDuration: + if isDecimalNotDefault { + suffix = fmt.Sprintf("(%d)", displayDecimal) + } + case mysql.TypeDouble, mysql.TypeFloat: + // 1. Flen Not Default, Decimal Not Default -> Valid + // 2. Flen Not Default, Decimal Default (-1) -> Invalid + // 3. Flen Default, Decimal Not Default -> Valid + // 4. Flen Default, Decimal Default -> Valid (hide) + if isDecimalNotDefault { + suffix = fmt.Sprintf("(%d,%d)", displayFlen, displayDecimal) + } + case mysql.TypeNewDecimal: + suffix = fmt.Sprintf("(%d,%d)", displayFlen, displayDecimal) + case mysql.TypeBit, mysql.TypeShort, mysql.TypeTiny, mysql.TypeInt24, mysql.TypeLong, mysql.TypeLonglong, mysql.TypeVarchar, mysql.TypeString, mysql.TypeVarString: + // Flen is always shown. + suffix = fmt.Sprintf("(%d)", displayFlen) + case mysql.TypeYear: + suffix = fmt.Sprintf("(%d)", ft.Flen) + } + return ts + suffix +} + +// InfoSchemaStr joins the CompactStr with unsigned flag and +// returns a string. +func (ft *FieldType) InfoSchemaStr() string { + suffix := "" + if mysql.HasUnsignedFlag(ft.Flag) { + suffix = " unsigned" + } + return ft.CompactStr() + suffix +} + +// String joins the information of FieldType and returns a string. +// Note: when flen or decimal is unspecified, this function will use the default value instead of -1. +func (ft *FieldType) String() string { + strs := []string{ft.CompactStr()} + if mysql.HasUnsignedFlag(ft.Flag) { + strs = append(strs, "UNSIGNED") + } + if mysql.HasZerofillFlag(ft.Flag) { + strs = append(strs, "ZEROFILL") + } + if mysql.HasBinaryFlag(ft.Flag) && ft.Tp != mysql.TypeString { + strs = append(strs, "BINARY") + } + + if IsTypeChar(ft.Tp) || IsTypeBlob(ft.Tp) { + if ft.Charset != "" && ft.Charset != charset.CharsetBin { + strs = append(strs, fmt.Sprintf("CHARACTER SET %s", ft.Charset)) + } + if ft.Collate != "" && ft.Collate != charset.CharsetBin { + strs = append(strs, fmt.Sprintf("COLLATE %s", ft.Collate)) + } + } + + return strings.Join(strs, " ") +} + +// Restore implements Node interface. +func (ft *FieldType) Restore(ctx *format.RestoreCtx) error { + ctx.WriteKeyWord(TypeToStr(ft.Tp, ft.Charset)) + + precision := UnspecifiedLength + scale := UnspecifiedLength + + switch ft.Tp { + case mysql.TypeEnum, mysql.TypeSet: + ctx.WritePlain("(") + for i, e := range ft.Elems { + if i != 0 { + ctx.WritePlain(",") + } + ctx.WriteString(e) + } + ctx.WritePlain(")") + case mysql.TypeTimestamp, mysql.TypeDatetime, mysql.TypeDuration: + precision = ft.Decimal + case mysql.TypeDecimal, mysql.TypeFloat, mysql.TypeDouble, mysql.TypeNewDecimal: + precision = ft.Flen + scale = ft.Decimal + default: + precision = ft.Flen + } + + if precision != UnspecifiedLength { + ctx.WritePlainf("(%d", precision) + if scale != UnspecifiedLength { + ctx.WritePlainf(",%d", scale) + } + ctx.WritePlain(")") + } + + if mysql.HasUnsignedFlag(ft.Flag) { + ctx.WriteKeyWord(" UNSIGNED") + } + if mysql.HasZerofillFlag(ft.Flag) { + ctx.WriteKeyWord(" ZEROFILL") + } + if mysql.HasBinaryFlag(ft.Flag) && ft.Charset != charset.CharsetBin { + ctx.WriteKeyWord(" BINARY") + } + + if IsTypeChar(ft.Tp) || IsTypeBlob(ft.Tp) { + if ft.Charset != "" && ft.Charset != charset.CharsetBin { + ctx.WriteKeyWord(" CHARACTER SET " + ft.Charset) + } + if ft.Collate != "" && ft.Collate != charset.CharsetBin { + ctx.WriteKeyWord(" COLLATE ") + ctx.WritePlain(ft.Collate) + } + } + + return nil +} + +// RestoreAsCastType is used for write AST back to string. +func (ft *FieldType) RestoreAsCastType(ctx *format.RestoreCtx) { + switch ft.Tp { + case mysql.TypeVarString: + if ft.Charset == charset.CharsetBin && ft.Collate == charset.CollationBin { + ctx.WriteKeyWord("BINARY") + } else { + ctx.WriteKeyWord("CHAR") + } + if ft.Flen != UnspecifiedLength { + ctx.WritePlainf("(%d)", ft.Flen) + } + if ft.Flag&mysql.BinaryFlag != 0 { + ctx.WriteKeyWord(" BINARY") + } + if ft.Charset != charset.CharsetBin && ft.Charset != mysql.DefaultCharset { + ctx.WriteKeyWord(" CHARSET ") + ctx.WriteKeyWord(ft.Charset) + } + case mysql.TypeDate: + ctx.WriteKeyWord("DATE") + case mysql.TypeDatetime: + ctx.WriteKeyWord("DATETIME") + if ft.Decimal > 0 { + ctx.WritePlainf("(%d)", ft.Decimal) + } + case mysql.TypeNewDecimal: + ctx.WriteKeyWord("DECIMAL") + if ft.Flen > 0 && ft.Decimal > 0 { + ctx.WritePlainf("(%d, %d)", ft.Flen, ft.Decimal) + } else if ft.Flen > 0 { + ctx.WritePlainf("(%d)", ft.Flen) + } + case mysql.TypeDuration: + ctx.WriteKeyWord("TIME") + if ft.Decimal > 0 { + ctx.WritePlainf("(%d)", ft.Decimal) + } + case mysql.TypeLonglong: + if ft.Flag&mysql.UnsignedFlag != 0 { + ctx.WriteKeyWord("UNSIGNED") + } else { + ctx.WriteKeyWord("SIGNED") + } + case mysql.TypeJSON: + ctx.WriteKeyWord("JSON") + case mysql.TypeDouble: + ctx.WriteKeyWord("DOUBLE") + case mysql.TypeFloat: + ctx.WriteKeyWord("FLOAT") + } +} + +// FormatAsCastType is used for write AST back to string. +func (ft *FieldType) FormatAsCastType(w io.Writer) { + var sb strings.Builder + restoreCtx := format.NewRestoreCtx(format.DefaultRestoreFlags, &sb) + ft.RestoreAsCastType(restoreCtx) + fmt.Fprint(w, sb.String()) +} + +// VarStorageLen indicates this column is a variable length column. +const VarStorageLen = -1 + +// StorageLength is the length of stored value for the type. +func (ft *FieldType) StorageLength() int { + switch ft.Tp { + case mysql.TypeTiny, mysql.TypeShort, mysql.TypeInt24, mysql.TypeLong, + mysql.TypeLonglong, mysql.TypeDouble, mysql.TypeFloat, mysql.TypeYear, mysql.TypeDuration, + mysql.TypeDate, mysql.TypeDatetime, mysql.TypeTimestamp, mysql.TypeEnum, mysql.TypeSet, + mysql.TypeBit: + // This may not be the accurate length, because we may encode them as varint. + return 8 + case mysql.TypeNewDecimal: + precision, frac := ft.Flen-ft.Decimal, ft.Decimal + return precision/digitsPerWord*wordSize + dig2bytes[precision%digitsPerWord] + frac/digitsPerWord*wordSize + dig2bytes[frac%digitsPerWord] + default: + return VarStorageLen + } +} + +// HasCharset indicates if a COLUMN has an associated charset. Returning false here prevents some information +// statements(like `SHOW CREATE TABLE`) from attaching a CHARACTER SET clause to the column. +func HasCharset(ft *FieldType) bool { + switch ft.Tp { + case mysql.TypeVarchar, mysql.TypeString, mysql.TypeVarString, mysql.TypeBlob, + mysql.TypeTinyBlob, mysql.TypeMediumBlob, mysql.TypeLongBlob: + return !mysql.HasBinaryFlag(ft.Flag) + case mysql.TypeEnum, mysql.TypeSet: + return true + } + return false +} diff --git a/vendor/github.com/pingcap/parser/yy_parser.go b/vendor/github.com/pingcap/parser/yy_parser.go new file mode 100644 index 0000000..46e6100 --- /dev/null +++ b/vendor/github.com/pingcap/parser/yy_parser.go @@ -0,0 +1,298 @@ +// Copyright 2015 PingCAP, Inc. +// +// 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package parser + +import ( + "fmt" + "math" + "regexp" + "strconv" + "unicode" + + "github.com/pingcap/errors" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/terror" +) + +const ( + codeErrParse = terror.ErrCode(mysql.ErrParse) + codeErrSyntax = terror.ErrCode(mysql.ErrSyntax) + codeErrUnknownCharacterSet = terror.ErrCode(mysql.ErrUnknownCharacterSet) + codeErrInvalidYearColumnLength = terror.ErrCode(mysql.ErrInvalidYearColumnLength) + codeWrongArgument = terror.ErrCode(mysql.ErrWrongArguments) + codeWrongFieldTerminators = terror.ErrCode(mysql.ErrWrongFieldTerminators) + codeTooBigDisplayWidth = terror.ErrCode(mysql.ErrTooBigDisplaywidth) + codeErrUnknownAlterLock = terror.ErrCode(mysql.ErrUnknownAlterLock) + codeErrUnknownAlterAlgorithm = terror.ErrCode(mysql.ErrUnknownAlterAlgorithm) + codeErrTooBigPrecision = terror.ErrCode(mysql.ErrTooBigPrecision) +) + +var ( + // ErrSyntax returns for sql syntax error. + ErrSyntax = terror.ClassParser.New(codeErrSyntax, mysql.MySQLErrName[mysql.ErrSyntax]) + // ErrParse returns for sql parse error. + ErrParse = terror.ClassParser.New(codeErrParse, mysql.MySQLErrName[mysql.ErrParse]) + // ErrUnknownCharacterSet returns for no character set found error. + ErrUnknownCharacterSet = terror.ClassParser.New(codeErrUnknownCharacterSet, mysql.MySQLErrName[mysql.ErrUnknownCharacterSet]) + // ErrInvalidYearColumnLength returns for illegal column length for year type. + ErrInvalidYearColumnLength = terror.ClassParser.New(codeErrInvalidYearColumnLength, mysql.MySQLErrName[mysql.ErrInvalidYearColumnLength]) + // ErrWrongArguments returns for illegal argument. + ErrWrongArguments = terror.ClassParser.New(codeWrongArgument, mysql.MySQLErrName[mysql.ErrWrongArguments]) + // ErrWrongFieldTerminators returns for illegal field terminators. + ErrWrongFieldTerminators = terror.ClassParser.New(codeWrongFieldTerminators, mysql.MySQLErrName[mysql.ErrWrongFieldTerminators]) + // ErrTooBigDisplayWidth returns for data display width exceed limit . + ErrTooBigDisplayWidth = terror.ClassParser.New(codeTooBigDisplayWidth, mysql.MySQLErrName[mysql.ErrTooBigDisplaywidth]) + // ErrTooBigPrecision returns for data precision exceed limit. + ErrTooBigPrecision = terror.ClassParser.New(codeErrTooBigPrecision, mysql.MySQLErrName[mysql.ErrTooBigPrecision]) + // ErrUnknownAlterLock returns for no alter lock type found error. + ErrUnknownAlterLock = terror.ClassParser.New(codeErrUnknownAlterLock, mysql.MySQLErrName[mysql.ErrUnknownAlterLock]) + // ErrUnknownAlterAlgorithm returns for no alter algorithm found error. + ErrUnknownAlterAlgorithm = terror.ClassParser.New(codeErrUnknownAlterAlgorithm, mysql.MySQLErrName[mysql.ErrUnknownAlterAlgorithm]) + // SpecFieldPattern special result field pattern + SpecFieldPattern = regexp.MustCompile(`(\/\*!(M?[0-9]{5,6})?|\*\/)`) + specCodePattern = regexp.MustCompile(`\/\*!(M?[0-9]{5,6})?([^*]|\*+[^*/])*\*+\/`) + specCodeStart = regexp.MustCompile(`^\/\*!(M?[0-9]{5,6})?[ \t]*`) + specCodeEnd = regexp.MustCompile(`[ \t]*\*\/$`) +) + +func init() { + parserMySQLErrCodes := map[terror.ErrCode]uint16{ + codeErrSyntax: mysql.ErrSyntax, + codeErrParse: mysql.ErrParse, + codeErrUnknownCharacterSet: mysql.ErrUnknownCharacterSet, + codeErrInvalidYearColumnLength: mysql.ErrInvalidYearColumnLength, + codeWrongArgument: mysql.ErrWrongArguments, + codeWrongFieldTerminators: mysql.ErrWrongFieldTerminators, + codeTooBigDisplayWidth: mysql.ErrTooBigDisplaywidth, + codeErrUnknownAlterLock: mysql.ErrUnknownAlterLock, + codeErrUnknownAlterAlgorithm: mysql.ErrUnknownAlterAlgorithm, + codeErrTooBigPrecision: mysql.ErrTooBigPrecision, + } + terror.ErrClassToMySQLCodes[terror.ClassParser] = parserMySQLErrCodes +} + +// TrimComment trim comment for special comment code of MySQL. +func TrimComment(txt string) string { + txt = specCodeStart.ReplaceAllString(txt, "") + return specCodeEnd.ReplaceAllString(txt, "") +} + +// Parser represents a parser instance. Some temporary objects are stored in it to reduce object allocation during Parse function. +type Parser struct { + charset string + collation string + result []ast.StmtNode + src string + lexer Scanner + + // the following fields are used by yyParse to reduce allocation. + cache []yySymType + yylval yySymType + yyVAL yySymType +} + +type stmtTexter interface { + stmtText() string +} + +// New returns a Parser object. +func New() *Parser { + if ast.NewValueExpr == nil || + ast.NewParamMarkerExpr == nil || + ast.NewHexLiteral == nil || + ast.NewBitLiteral == nil { + panic("no parser driver (forgotten import?) https://github.com/pingcap/parser/issues/43") + } + + return &Parser{ + cache: make([]yySymType, 200), + } +} + +// Parse parses a query string to raw ast.StmtNode. +// If charset or collation is "", default charset and collation will be used. +func (parser *Parser) Parse(sql, charset, collation string) (stmt []ast.StmtNode, warns []error, err error) { + if charset == "" { + charset = mysql.DefaultCharset + } + if collation == "" { + collation = mysql.DefaultCollationName + } + parser.charset = charset + parser.collation = collation + parser.src = sql + parser.result = parser.result[:0] + + var l yyLexer + parser.lexer.reset(sql) + l = &parser.lexer + yyParse(l, parser) + + warns, errs := l.Errors() + if len(warns) > 0 { + warns = append([]error(nil), warns...) + } else { + warns = nil + } + if len(errs) != 0 { + return nil, warns, errors.Trace(errs[0]) + } + for _, stmt := range parser.result { + ast.SetFlag(stmt) + } + return parser.result, warns, nil +} + +func (parser *Parser) lastErrorAsWarn() { + if len(parser.lexer.errs) == 0 { + return + } + parser.lexer.warns = append(parser.lexer.warns, parser.lexer.errs[len(parser.lexer.errs)-1]) + parser.lexer.errs = parser.lexer.errs[:len(parser.lexer.errs)-1] +} + +// ParseOneStmt parses a query and returns an ast.StmtNode. +// The query must have one statement, otherwise ErrSyntax is returned. +func (parser *Parser) ParseOneStmt(sql, charset, collation string) (ast.StmtNode, error) { + stmts, _, err := parser.Parse(sql, charset, collation) + if err != nil { + return nil, errors.Trace(err) + } + if len(stmts) != 1 { + return nil, ErrSyntax + } + ast.SetFlag(stmts[0]) + return stmts[0], nil +} + +// SetSQLMode sets the SQL mode for parser. +func (parser *Parser) SetSQLMode(mode mysql.SQLMode) { + parser.lexer.SetSQLMode(mode) +} + +// EnableWindowFunc controls whether the parser to parse syntax related with window function. +func (parser *Parser) EnableWindowFunc(val bool) { + parser.lexer.EnableWindowFunc(val) +} + +// ParseErrorWith returns "You have a syntax error near..." error message compatible with mysql. +func ParseErrorWith(errstr string, lineno int) error { + if len(errstr) > mysql.ErrTextLength { + errstr = errstr[:mysql.ErrTextLength] + } + return fmt.Errorf("near '%-.80s' at line %d", errstr, lineno) +} + +// The select statement is not at the end of the whole statement, if the last +// field text was set from its offset to the end of the src string, update +// the last field text. +func (parser *Parser) setLastSelectFieldText(st *ast.SelectStmt, lastEnd int) { + lastField := st.Fields.Fields[len(st.Fields.Fields)-1] + if lastField.Offset+len(lastField.Text()) >= len(parser.src)-1 { + lastField.SetText(parser.src[lastField.Offset:lastEnd]) + } +} + +func (parser *Parser) startOffset(v *yySymType) int { + return v.offset +} + +func (parser *Parser) endOffset(v *yySymType) int { + offset := v.offset + for offset > 0 && unicode.IsSpace(rune(parser.src[offset-1])) { + offset-- + } + return offset +} + +func toInt(l yyLexer, lval *yySymType, str string) int { + n, err := strconv.ParseUint(str, 10, 64) + if err != nil { + e := err.(*strconv.NumError) + if e.Err == strconv.ErrRange { + // TODO: toDecimal maybe out of range still. + // This kind of error should be throw to higher level, because truncated data maybe legal. + // For example, this SQL returns error: + // create table test (id decimal(30, 0)); + // insert into test values(123456789012345678901234567890123094839045793405723406801943850); + // While this SQL: + // select 1234567890123456789012345678901230948390457934057234068019438509023041874359081325875128590860234789847359871045943057; + // get value 99999999999999999999999999999999999999999999999999999999999999999 + return toDecimal(l, lval, str) + } + l.AppendError(l.Errorf("integer literal: %v", err)) + return int(unicode.ReplacementChar) + } + + switch { + case n <= math.MaxInt64: + lval.item = int64(n) + default: + lval.item = n + } + return intLit +} + +func toDecimal(l yyLexer, lval *yySymType, str string) int { + dec, err := ast.NewDecimal(str) + if err != nil { + l.AppendError(l.Errorf("decimal literal: %v", err)) + } + lval.item = dec + return decLit +} + +func toFloat(l yyLexer, lval *yySymType, str string) int { + n, err := strconv.ParseFloat(str, 64) + if err != nil { + l.AppendError(l.Errorf("float literal: %v", err)) + return int(unicode.ReplacementChar) + } + + lval.item = n + return floatLit +} + +// See https://dev.mysql.com/doc/refman/5.7/en/hexadecimal-literals.html +func toHex(l yyLexer, lval *yySymType, str string) int { + h, err := ast.NewHexLiteral(str) + if err != nil { + l.AppendError(l.Errorf("hex literal: %v", err)) + return int(unicode.ReplacementChar) + } + lval.item = h + return hexLit +} + +// See https://dev.mysql.com/doc/refman/5.7/en/bit-type.html +func toBit(l yyLexer, lval *yySymType, str string) int { + b, err := ast.NewBitLiteral(str) + if err != nil { + l.AppendError(l.Errorf("bit literal: %v", err)) + return int(unicode.ReplacementChar) + } + lval.item = b + return bitLit +} + +func getUint64FromNUM(num interface{}) uint64 { + switch v := num.(type) { + case int64: + return uint64(v) + case uint64: + return v + } + return 0 +} diff --git a/vendor/github.com/pingcap/tidb/LICENSE b/vendor/github.com/pingcap/tidb/LICENSE new file mode 100644 index 0000000..b67d909 --- /dev/null +++ b/vendor/github.com/pingcap/tidb/LICENSE @@ -0,0 +1,201 @@ +Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {} + + 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. diff --git a/vendor/github.com/pingcap/tidb/sessionctx/stmtctx/stmtctx.go b/vendor/github.com/pingcap/tidb/sessionctx/stmtctx/stmtctx.go new file mode 100644 index 0000000..a7ef3c7 --- /dev/null +++ b/vendor/github.com/pingcap/tidb/sessionctx/stmtctx/stmtctx.go @@ -0,0 +1,554 @@ +// Copyright 2017 PingCAP, Inc. +// +// 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package stmtctx + +import ( + "math" + "sort" + "strconv" + "sync" + "time" + + "github.com/pingcap/parser" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/tidb/util/execdetails" + "github.com/pingcap/tidb/util/memory" + "go.uber.org/zap" +) + +const ( + // WarnLevelError represents level "Error" for 'SHOW WARNINGS' syntax. + WarnLevelError = "Error" + // WarnLevelWarning represents level "Warning" for 'SHOW WARNINGS' syntax. + WarnLevelWarning = "Warning" + // WarnLevelNote represents level "Note" for 'SHOW WARNINGS' syntax. + WarnLevelNote = "Note" +) + +// SQLWarn relates a sql warning and it's level. +type SQLWarn struct { + Level string + Err error +} + +// StatementContext contains variables for a statement. +// It should be reset before executing a statement. +type StatementContext struct { + // Set the following variables before execution + + // IsDDLJobInQueue is used to mark whether the DDL job is put into the queue. + // If IsDDLJobInQueue is true, it means the DDL job is in the queue of storage, and it can be handled by the DDL worker. + IsDDLJobInQueue bool + InInsertStmt bool + InUpdateStmt bool + InDeleteStmt bool + InSelectStmt bool + InLoadDataStmt bool + InExplainStmt bool + IgnoreTruncate bool + IgnoreZeroInDate bool + DupKeyAsWarning bool + BadNullAsWarning bool + DividedByZeroAsWarning bool + TruncateAsWarning bool + OverflowAsWarning bool + InShowWarning bool + UseCache bool + PadCharToFullLength bool + BatchCheck bool + InNullRejectCheck bool + AllowInvalidDate bool + // CastStrToIntStrict is used to control the way we cast float format string to int. + // If ConvertStrToIntStrict is false, we convert it to a valid float string first, + // then cast the float string to int string. Otherwise, we cast string to integer + // prefix in a strict way, only extract 0-9 and (+ or - in first bit). + CastStrToIntStrict bool + + // mu struct holds variables that change during execution. + mu struct { + sync.Mutex + + affectedRows uint64 + foundRows uint64 + + /* + following variables are ported from 'COPY_INFO' struct of MySQL server source, + they are used to count rows for INSERT/REPLACE/UPDATE queries: + If a row is inserted then the copied variable is incremented. + If a row is updated by the INSERT ... ON DUPLICATE KEY UPDATE and the + new data differs from the old one then the copied and the updated + variables are incremented. + The touched variable is incremented if a row was touched by the update part + of the INSERT ... ON DUPLICATE KEY UPDATE no matter whether the row + was actually changed or not. + + see https://github.com/mysql/mysql-server/blob/d2029238d6d9f648077664e4cdd611e231a6dc14/sql/sql_data_change.h#L60 for more details + */ + records uint64 + updated uint64 + copied uint64 + touched uint64 + + message string + warnings []SQLWarn + errorCount uint16 + histogramsNotLoad bool + execDetails execdetails.ExecDetails + allExecDetails []*execdetails.ExecDetails + } + // PrevAffectedRows is the affected-rows value(DDL is 0, DML is the number of affected rows). + PrevAffectedRows int64 + // PrevLastInsertID is the last insert ID of previous statement. + PrevLastInsertID uint64 + // LastInsertID is the auto-generated ID in the current statement. + LastInsertID uint64 + // InsertID is the given insert ID of an auto_increment column. + InsertID uint64 + + // Copied from SessionVars.TimeZone. + TimeZone *time.Location + Priority mysql.PriorityEnum + NotFillCache bool + MemTracker *memory.Tracker + RuntimeStatsColl *execdetails.RuntimeStatsColl + TableIDs []int64 + IndexNames []string + nowTs time.Time // use this variable for now/current_timestamp calculation/cache for one stmt + stmtTimeCached bool + StmtType string + OriginalSQL string + digestMemo struct { + sync.Once + normalized string + digest string + } + Tables []TableEntry +} + +// GetNowTsCached getter for nowTs, if not set get now time and cache it +func (sc *StatementContext) GetNowTsCached() time.Time { + if !sc.stmtTimeCached { + now := time.Now() + sc.nowTs = now + sc.stmtTimeCached = true + } + return sc.nowTs +} + +// ResetNowTs resetter for nowTs, clear cached time flag +func (sc *StatementContext) ResetNowTs() { + sc.stmtTimeCached = false +} + +// SQLDigest gets normalized and digest for provided sql. +// it will cache result after first calling. +func (sc *StatementContext) SQLDigest() (normalized, sqlDigest string) { + sc.digestMemo.Do(func() { + sc.digestMemo.normalized, sc.digestMemo.digest = parser.NormalizeDigest(sc.OriginalSQL) + }) + return sc.digestMemo.normalized, sc.digestMemo.digest +} + +// TableEntry presents table in db. +type TableEntry struct { + DB string + Table string +} + +// AddAffectedRows adds affected rows. +func (sc *StatementContext) AddAffectedRows(rows uint64) { + sc.mu.Lock() + sc.mu.affectedRows += rows + sc.mu.Unlock() +} + +// AffectedRows gets affected rows. +func (sc *StatementContext) AffectedRows() uint64 { + sc.mu.Lock() + rows := sc.mu.affectedRows + sc.mu.Unlock() + return rows +} + +// FoundRows gets found rows. +func (sc *StatementContext) FoundRows() uint64 { + sc.mu.Lock() + rows := sc.mu.foundRows + sc.mu.Unlock() + return rows +} + +// AddFoundRows adds found rows. +func (sc *StatementContext) AddFoundRows(rows uint64) { + sc.mu.Lock() + sc.mu.foundRows += rows + sc.mu.Unlock() +} + +// RecordRows is used to generate info message +func (sc *StatementContext) RecordRows() uint64 { + sc.mu.Lock() + rows := sc.mu.records + sc.mu.Unlock() + return rows +} + +// AddRecordRows adds record rows. +func (sc *StatementContext) AddRecordRows(rows uint64) { + sc.mu.Lock() + sc.mu.records += rows + sc.mu.Unlock() +} + +// UpdatedRows is used to generate info message +func (sc *StatementContext) UpdatedRows() uint64 { + sc.mu.Lock() + rows := sc.mu.updated + sc.mu.Unlock() + return rows +} + +// AddUpdatedRows adds updated rows. +func (sc *StatementContext) AddUpdatedRows(rows uint64) { + sc.mu.Lock() + sc.mu.updated += rows + sc.mu.Unlock() +} + +// CopiedRows is used to generate info message +func (sc *StatementContext) CopiedRows() uint64 { + sc.mu.Lock() + rows := sc.mu.copied + sc.mu.Unlock() + return rows +} + +// AddCopiedRows adds copied rows. +func (sc *StatementContext) AddCopiedRows(rows uint64) { + sc.mu.Lock() + sc.mu.copied += rows + sc.mu.Unlock() +} + +// TouchedRows is used to generate info message +func (sc *StatementContext) TouchedRows() uint64 { + sc.mu.Lock() + rows := sc.mu.touched + sc.mu.Unlock() + return rows +} + +// AddTouchedRows adds touched rows. +func (sc *StatementContext) AddTouchedRows(rows uint64) { + sc.mu.Lock() + sc.mu.touched += rows + sc.mu.Unlock() +} + +// GetMessage returns the extra message of the last executed command, if there is no message, it returns empty string +func (sc *StatementContext) GetMessage() string { + sc.mu.Lock() + msg := sc.mu.message + sc.mu.Unlock() + return msg +} + +// SetMessage sets the info message generated by some commands +func (sc *StatementContext) SetMessage(msg string) { + sc.mu.Lock() + sc.mu.message = msg + sc.mu.Unlock() +} + +// GetWarnings gets warnings. +func (sc *StatementContext) GetWarnings() []SQLWarn { + sc.mu.Lock() + warns := make([]SQLWarn, len(sc.mu.warnings)) + copy(warns, sc.mu.warnings) + sc.mu.Unlock() + return warns +} + +// WarningCount gets warning count. +func (sc *StatementContext) WarningCount() uint16 { + if sc.InShowWarning { + return 0 + } + sc.mu.Lock() + wc := uint16(len(sc.mu.warnings)) + sc.mu.Unlock() + return wc +} + +const zero = "0" + +// NumErrorWarnings gets warning and error count. +func (sc *StatementContext) NumErrorWarnings() (ec, wc string) { + var ( + ecNum uint16 + wcNum int + ) + sc.mu.Lock() + ecNum = sc.mu.errorCount + wcNum = len(sc.mu.warnings) + sc.mu.Unlock() + + if ecNum == 0 { + ec = zero + } else { + ec = strconv.Itoa(int(ecNum)) + } + + if wcNum == 0 { + wc = zero + } else { + wc = strconv.Itoa(wcNum) + } + return +} + +// SetWarnings sets warnings. +func (sc *StatementContext) SetWarnings(warns []SQLWarn) { + sc.mu.Lock() + sc.mu.warnings = warns + for _, w := range warns { + if w.Level == WarnLevelError { + sc.mu.errorCount++ + } + } + sc.mu.Unlock() +} + +// AppendWarning appends a warning with level 'Warning'. +func (sc *StatementContext) AppendWarning(warn error) { + sc.mu.Lock() + if len(sc.mu.warnings) < math.MaxUint16 { + sc.mu.warnings = append(sc.mu.warnings, SQLWarn{WarnLevelWarning, warn}) + } + sc.mu.Unlock() +} + +// AppendNote appends a warning with level 'Note'. +func (sc *StatementContext) AppendNote(warn error) { + sc.mu.Lock() + if len(sc.mu.warnings) < math.MaxUint16 { + sc.mu.warnings = append(sc.mu.warnings, SQLWarn{WarnLevelNote, warn}) + } + sc.mu.Unlock() +} + +// AppendError appends a warning with level 'Error'. +func (sc *StatementContext) AppendError(warn error) { + sc.mu.Lock() + if len(sc.mu.warnings) < math.MaxUint16 { + sc.mu.warnings = append(sc.mu.warnings, SQLWarn{WarnLevelError, warn}) + sc.mu.errorCount++ + } + sc.mu.Unlock() +} + +// SetHistogramsNotLoad sets histogramsNotLoad. +func (sc *StatementContext) SetHistogramsNotLoad() { + sc.mu.Lock() + sc.mu.histogramsNotLoad = true + sc.mu.Unlock() +} + +// HandleTruncate ignores or returns the error based on the StatementContext state. +func (sc *StatementContext) HandleTruncate(err error) error { + // TODO: At present we have not checked whether the error can be ignored or treated as warning. + // We will do that later, and then append WarnDataTruncated instead of the error itself. + if err == nil { + return nil + } + if sc.IgnoreTruncate { + return nil + } + if sc.TruncateAsWarning { + sc.AppendWarning(err) + return nil + } + return err +} + +// HandleOverflow treats ErrOverflow as warnings or returns the error based on the StmtCtx.OverflowAsWarning state. +func (sc *StatementContext) HandleOverflow(err error, warnErr error) error { + if err == nil { + return nil + } + + if sc.OverflowAsWarning { + sc.AppendWarning(warnErr) + return nil + } + return err +} + +// ResetForRetry resets the changed states during execution. +func (sc *StatementContext) ResetForRetry() { + sc.mu.Lock() + sc.mu.affectedRows = 0 + sc.mu.foundRows = 0 + sc.mu.records = 0 + sc.mu.updated = 0 + sc.mu.copied = 0 + sc.mu.touched = 0 + sc.mu.message = "" + sc.mu.errorCount = 0 + sc.mu.warnings = nil + sc.mu.execDetails = execdetails.ExecDetails{} + sc.mu.allExecDetails = make([]*execdetails.ExecDetails, 0, 4) + sc.mu.Unlock() + sc.TableIDs = sc.TableIDs[:0] + sc.IndexNames = sc.IndexNames[:0] +} + +// MergeExecDetails merges a single region execution details into self, used to print +// the information in slow query log. +func (sc *StatementContext) MergeExecDetails(details *execdetails.ExecDetails, commitDetails *execdetails.CommitDetails) { + sc.mu.Lock() + if details != nil { + sc.mu.execDetails.ProcessTime += details.ProcessTime + sc.mu.execDetails.WaitTime += details.WaitTime + sc.mu.execDetails.BackoffTime += details.BackoffTime + sc.mu.execDetails.RequestCount++ + sc.mu.execDetails.TotalKeys += details.TotalKeys + sc.mu.execDetails.ProcessedKeys += details.ProcessedKeys + sc.mu.allExecDetails = append(sc.mu.allExecDetails, details) + } + sc.mu.execDetails.CommitDetail = commitDetails + sc.mu.Unlock() +} + +// GetExecDetails gets the execution details for the statement. +func (sc *StatementContext) GetExecDetails() execdetails.ExecDetails { + var details execdetails.ExecDetails + sc.mu.Lock() + details = sc.mu.execDetails + sc.mu.Unlock() + return details +} + +// ShouldClipToZero indicates whether values less than 0 should be clipped to 0 for unsigned integer types. +// This is the case for `insert`, `update`, `alter table` and `load data infile` statements, when not in strict SQL mode. +// see https://dev.mysql.com/doc/refman/5.7/en/out-of-range-and-overflow.html +func (sc *StatementContext) ShouldClipToZero() bool { + // TODO: Currently altering column of integer to unsigned integer is not supported. + // If it is supported one day, that case should be added here. + return sc.InInsertStmt || sc.InLoadDataStmt +} + +// ShouldIgnoreOverflowError indicates whether we should ignore the error when type conversion overflows, +// so we can leave it for further processing like clipping values less than 0 to 0 for unsigned integer types. +func (sc *StatementContext) ShouldIgnoreOverflowError() bool { + if (sc.InInsertStmt && sc.TruncateAsWarning) || sc.InLoadDataStmt { + return true + } + return false +} + +// PushDownFlags converts StatementContext to tipb.SelectRequest.Flags. +func (sc *StatementContext) PushDownFlags() uint64 { + var flags uint64 + if sc.InInsertStmt { + flags |= model.FlagInInsertStmt + } else if sc.InUpdateStmt || sc.InDeleteStmt { + flags |= model.FlagInUpdateOrDeleteStmt + } else if sc.InSelectStmt { + flags |= model.FlagInSelectStmt + } + if sc.IgnoreTruncate { + flags |= model.FlagIgnoreTruncate + } else if sc.TruncateAsWarning { + flags |= model.FlagTruncateAsWarning + } + if sc.OverflowAsWarning { + flags |= model.FlagOverflowAsWarning + } + if sc.IgnoreZeroInDate { + flags |= model.FlagIgnoreZeroInDate + } + if sc.DividedByZeroAsWarning { + flags |= model.FlagDividedByZeroAsWarning + } + if sc.PadCharToFullLength { + flags |= model.FlagPadCharToFullLength + } + if sc.InLoadDataStmt { + flags |= model.FlagInLoadDataStmt + } + return flags +} + +// CopTasksDetails returns some useful information of cop-tasks during execution. +func (sc *StatementContext) CopTasksDetails() *CopTasksDetails { + sc.mu.Lock() + defer sc.mu.Unlock() + n := len(sc.mu.allExecDetails) + d := &CopTasksDetails{NumCopTasks: n} + if n == 0 { + return d + } + d.AvgProcessTime = sc.mu.execDetails.ProcessTime / time.Duration(n) + d.AvgWaitTime = sc.mu.execDetails.WaitTime / time.Duration(n) + + sort.Slice(sc.mu.allExecDetails, func(i, j int) bool { + return sc.mu.allExecDetails[i].ProcessTime < sc.mu.allExecDetails[j].ProcessTime + }) + d.P90ProcessTime = sc.mu.allExecDetails[n*9/10].ProcessTime + d.MaxProcessTime = sc.mu.allExecDetails[n-1].ProcessTime + d.MaxProcessAddress = sc.mu.allExecDetails[n-1].CalleeAddress + + sort.Slice(sc.mu.allExecDetails, func(i, j int) bool { + return sc.mu.allExecDetails[i].WaitTime < sc.mu.allExecDetails[j].WaitTime + }) + d.P90WaitTime = sc.mu.allExecDetails[n*9/10].WaitTime + d.MaxWaitTime = sc.mu.allExecDetails[n-1].WaitTime + d.MaxWaitAddress = sc.mu.allExecDetails[n-1].CalleeAddress + return d +} + +//CopTasksDetails collects some useful information of cop-tasks during execution. +type CopTasksDetails struct { + NumCopTasks int + + AvgProcessTime time.Duration + P90ProcessTime time.Duration + MaxProcessAddress string + MaxProcessTime time.Duration + + AvgWaitTime time.Duration + P90WaitTime time.Duration + MaxWaitAddress string + MaxWaitTime time.Duration +} + +// ToZapFields wraps the CopTasksDetails as zap.Fileds. +func (d *CopTasksDetails) ToZapFields() (fields []zap.Field) { + if d.NumCopTasks == 0 { + return + } + fields = make([]zap.Field, 0, 10) + fields = append(fields, zap.Int("num_cop_tasks", d.NumCopTasks)) + fields = append(fields, zap.String("process_avg_time", strconv.FormatFloat(d.AvgProcessTime.Seconds(), 'f', -1, 64)+"s")) + fields = append(fields, zap.String("process_p90_time", strconv.FormatFloat(d.P90ProcessTime.Seconds(), 'f', -1, 64)+"s")) + fields = append(fields, zap.String("process_max_time", strconv.FormatFloat(d.MaxProcessTime.Seconds(), 'f', -1, 64)+"s")) + fields = append(fields, zap.String("process_max_addr", d.MaxProcessAddress)) + fields = append(fields, zap.String("wait_avg_time", strconv.FormatFloat(d.AvgWaitTime.Seconds(), 'f', -1, 64)+"s")) + fields = append(fields, zap.String("wait_p90_time", strconv.FormatFloat(d.P90WaitTime.Seconds(), 'f', -1, 64)+"s")) + fields = append(fields, zap.String("wait_max_time", strconv.FormatFloat(d.MaxWaitTime.Seconds(), 'f', -1, 64)+"s")) + fields = append(fields, zap.String("wait_max_addr", d.MaxWaitAddress)) + return fields +} diff --git a/vendor/github.com/pingcap/tidb/types/binary_literal.go b/vendor/github.com/pingcap/tidb/types/binary_literal.go new file mode 100644 index 0000000..5725b34 --- /dev/null +++ b/vendor/github.com/pingcap/tidb/types/binary_literal.go @@ -0,0 +1,237 @@ +// Copyright 2017 PingCAP, Inc. +// +// 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package types + +import ( + "bytes" + "encoding/binary" + "encoding/hex" + "fmt" + "math" + "strconv" + "strings" + + "github.com/pingcap/errors" + "github.com/pingcap/tidb/sessionctx/stmtctx" +) + +// BinaryLiteral is the internal type for storing bit / hex literal type. +type BinaryLiteral []byte + +// BitLiteral is the bit literal type. +type BitLiteral BinaryLiteral + +// HexLiteral is the hex literal type. +type HexLiteral BinaryLiteral + +// ZeroBinaryLiteral is a BinaryLiteral literal with zero value. +var ZeroBinaryLiteral = BinaryLiteral{} + +func trimLeadingZeroBytes(bytes []byte) []byte { + if len(bytes) == 0 { + return bytes + } + pos, posMax := 0, len(bytes)-1 + for ; pos < posMax; pos++ { + if bytes[pos] != 0 { + break + } + } + return bytes[pos:] +} + +// NewBinaryLiteralFromUint creates a new BinaryLiteral instance by the given uint value in BitEndian. +// byteSize will be used as the length of the new BinaryLiteral, with leading bytes filled to zero. +// If byteSize is -1, the leading zeros in new BinaryLiteral will be trimmed. +func NewBinaryLiteralFromUint(value uint64, byteSize int) BinaryLiteral { + if byteSize != -1 && (byteSize < 1 || byteSize > 8) { + panic("Invalid byteSize") + } + buf := make([]byte, 8) + binary.BigEndian.PutUint64(buf, value) + if byteSize == -1 { + buf = trimLeadingZeroBytes(buf) + } else { + buf = buf[8-byteSize:] + } + return buf +} + +// String implements fmt.Stringer interface. +func (b BinaryLiteral) String() string { + if len(b) == 0 { + return "" + } + return "0x" + hex.EncodeToString(b) +} + +// ToString returns the string representation for the literal. +func (b BinaryLiteral) ToString() string { + return string(b) +} + +// ToBitLiteralString returns the bit literal representation for the literal. +func (b BinaryLiteral) ToBitLiteralString(trimLeadingZero bool) string { + if len(b) == 0 { + return "b''" + } + var buf bytes.Buffer + for _, data := range b { + fmt.Fprintf(&buf, "%08b", data) + } + ret := buf.Bytes() + if trimLeadingZero { + ret = bytes.TrimLeft(ret, "0") + if len(ret) == 0 { + ret = []byte{'0'} + } + } + return fmt.Sprintf("b'%s'", string(ret)) +} + +// ToInt returns the int value for the literal. +func (b BinaryLiteral) ToInt(sc *stmtctx.StatementContext) (uint64, error) { + buf := trimLeadingZeroBytes(b) + length := len(buf) + if length == 0 { + return 0, nil + } + if length > 8 { + var err error = ErrTruncatedWrongVal.GenWithStackByArgs("BINARY", b) + if sc != nil { + err = sc.HandleTruncate(err) + } + return math.MaxUint64, err + } + // Note: the byte-order is BigEndian. + val := uint64(buf[0]) + for i := 1; i < length; i++ { + val = (val << 8) | uint64(buf[i]) + } + return val, nil +} + +// Compare compares BinaryLiteral to another one +func (b BinaryLiteral) Compare(b2 BinaryLiteral) int { + bufB := trimLeadingZeroBytes(b) + bufB2 := trimLeadingZeroBytes(b2) + if len(bufB) > len(bufB2) { + return 1 + } + if len(bufB) < len(bufB2) { + return -1 + } + return bytes.Compare(bufB, bufB2) +} + +// ParseBitStr parses bit string. +// The string format can be b'val', B'val' or 0bval, val must be 0 or 1. +// See https://dev.mysql.com/doc/refman/5.7/en/bit-value-literals.html +func ParseBitStr(s string) (BinaryLiteral, error) { + if len(s) == 0 { + return nil, errors.Errorf("invalid empty string for parsing bit type") + } + + if s[0] == 'b' || s[0] == 'B' { + // format is b'val' or B'val' + s = strings.Trim(s[1:], "'") + } else if strings.HasPrefix(s, "0b") { + s = s[2:] + } else { + // here means format is not b'val', B'val' or 0bval. + return nil, errors.Errorf("invalid bit type format %s", s) + } + + if len(s) == 0 { + return ZeroBinaryLiteral, nil + } + + alignedLength := (len(s) + 7) &^ 7 + s = ("00000000" + s)[len(s)+8-alignedLength:] // Pad with zero (slice from `-alignedLength`) + byteLength := len(s) >> 3 + buf := make([]byte, byteLength) + + for i := 0; i < byteLength; i++ { + strPosition := i << 3 + val, err := strconv.ParseUint(s[strPosition:strPosition+8], 2, 8) + if err != nil { + return nil, errors.Trace(err) + } + buf[i] = byte(val) + } + + return buf, nil +} + +// NewBitLiteral parses bit string as BitLiteral type. +func NewBitLiteral(s string) (BitLiteral, error) { + b, err := ParseBitStr(s) + if err != nil { + return BitLiteral{}, err + } + return BitLiteral(b), nil +} + +// ToString implement ast.BinaryLiteral interface +func (b BitLiteral) ToString() string { + return BinaryLiteral(b).ToString() +} + +// ParseHexStr parses hexadecimal string literal. +// See https://dev.mysql.com/doc/refman/5.7/en/hexadecimal-literals.html +func ParseHexStr(s string) (BinaryLiteral, error) { + if len(s) == 0 { + return nil, errors.Errorf("invalid empty string for parsing hexadecimal literal") + } + + if s[0] == 'x' || s[0] == 'X' { + // format is x'val' or X'val' + s = strings.Trim(s[1:], "'") + if len(s)%2 != 0 { + return nil, errors.Errorf("invalid hexadecimal format, must even numbers, but %d", len(s)) + } + } else if strings.HasPrefix(s, "0x") { + s = s[2:] + } else { + // here means format is not x'val', X'val' or 0xval. + return nil, errors.Errorf("invalid hexadecimal format %s", s) + } + + if len(s) == 0 { + return ZeroBinaryLiteral, nil + } + + if len(s)%2 != 0 { + s = "0" + s + } + buf, err := hex.DecodeString(s) + if err != nil { + return nil, errors.Trace(err) + } + return buf, nil +} + +// NewHexLiteral parses hexadecimal string as HexLiteral type. +func NewHexLiteral(s string) (HexLiteral, error) { + h, err := ParseHexStr(s) + if err != nil { + return HexLiteral{}, err + } + return HexLiteral(h), nil +} + +// ToString implement ast.BinaryLiteral interface +func (b HexLiteral) ToString() string { + return BinaryLiteral(b).ToString() +} diff --git a/vendor/github.com/pingcap/tidb/types/compare.go b/vendor/github.com/pingcap/tidb/types/compare.go new file mode 100644 index 0000000..6774d6f --- /dev/null +++ b/vendor/github.com/pingcap/tidb/types/compare.go @@ -0,0 +1,58 @@ +// Copyright 2015 PingCAP, Inc. +// +// 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package types + +// CompareInt64 returns an integer comparing the int64 x to y. +func CompareInt64(x, y int64) int { + if x < y { + return -1 + } else if x == y { + return 0 + } + + return 1 +} + +// CompareUint64 returns an integer comparing the uint64 x to y. +func CompareUint64(x, y uint64) int { + if x < y { + return -1 + } else if x == y { + return 0 + } + + return 1 +} + +// CompareFloat64 returns an integer comparing the float64 x to y. +func CompareFloat64(x, y float64) int { + if x < y { + return -1 + } else if x == y { + return 0 + } + + return 1 +} + +// CompareString returns an integer comparing the string x to y. +func CompareString(x, y string) int { + if x < y { + return -1 + } else if x == y { + return 0 + } + + return 1 +} diff --git a/vendor/github.com/pingcap/tidb/types/convert.go b/vendor/github.com/pingcap/tidb/types/convert.go new file mode 100644 index 0000000..db9c9df --- /dev/null +++ b/vendor/github.com/pingcap/tidb/types/convert.go @@ -0,0 +1,708 @@ +// Copyright 2014 The ql Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSES/QL-LICENSE file. + +// Copyright 2015 PingCAP, Inc. +// +// 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package types + +import ( + "math" + "strconv" + "strings" + + "github.com/pingcap/errors" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/terror" + "github.com/pingcap/tidb/sessionctx/stmtctx" + "github.com/pingcap/tidb/types/json" + "github.com/pingcap/tidb/util/hack" +) + +func truncateStr(str string, flen int) string { + if flen != UnspecifiedLength && len(str) > flen { + str = str[:flen] + } + return str +} + +// IntergerUnsignedUpperBound indicates the max uint64 values of different mysql types. +func IntergerUnsignedUpperBound(intType byte) uint64 { + switch intType { + case mysql.TypeTiny: + return math.MaxUint8 + case mysql.TypeShort: + return math.MaxUint16 + case mysql.TypeInt24: + return mysql.MaxUint24 + case mysql.TypeLong: + return math.MaxUint32 + case mysql.TypeLonglong: + return math.MaxUint64 + case mysql.TypeBit: + return math.MaxUint64 + case mysql.TypeEnum: + return math.MaxUint64 + case mysql.TypeSet: + return math.MaxUint64 + default: + panic("Input byte is not a mysql type") + } +} + +// IntergerSignedUpperBound indicates the max int64 values of different mysql types. +func IntergerSignedUpperBound(intType byte) int64 { + switch intType { + case mysql.TypeTiny: + return math.MaxInt8 + case mysql.TypeShort: + return math.MaxInt16 + case mysql.TypeInt24: + return mysql.MaxInt24 + case mysql.TypeLong: + return math.MaxInt32 + case mysql.TypeLonglong: + return math.MaxInt64 + default: + panic("Input byte is not a mysql type") + } +} + +// IntergerSignedLowerBound indicates the min int64 values of different mysql types. +func IntergerSignedLowerBound(intType byte) int64 { + switch intType { + case mysql.TypeTiny: + return math.MinInt8 + case mysql.TypeShort: + return math.MinInt16 + case mysql.TypeInt24: + return mysql.MinInt24 + case mysql.TypeLong: + return math.MinInt32 + case mysql.TypeLonglong: + return math.MinInt64 + default: + panic("Input byte is not a mysql type") + } +} + +// ConvertFloatToInt converts a float64 value to a int value. +// `tp` is used in err msg, if there is overflow, this func will report err according to `tp` +func ConvertFloatToInt(fval float64, lowerBound, upperBound int64, tp byte) (int64, error) { + val := RoundFloat(fval) + if val < float64(lowerBound) { + return lowerBound, overflow(val, tp) + } + + if val >= float64(upperBound) { + if val == float64(upperBound) { + return upperBound, nil + } + return upperBound, overflow(val, tp) + } + return int64(val), nil +} + +// ConvertIntToInt converts an int value to another int value of different precision. +func ConvertIntToInt(val int64, lowerBound int64, upperBound int64, tp byte) (int64, error) { + if val < lowerBound { + return lowerBound, overflow(val, tp) + } + + if val > upperBound { + return upperBound, overflow(val, tp) + } + + return val, nil +} + +// ConvertUintToInt converts an uint value to an int value. +func ConvertUintToInt(val uint64, upperBound int64, tp byte) (int64, error) { + if val > uint64(upperBound) { + return upperBound, overflow(val, tp) + } + + return int64(val), nil +} + +// ConvertIntToUint converts an int value to an uint value. +func ConvertIntToUint(sc *stmtctx.StatementContext, val int64, upperBound uint64, tp byte) (uint64, error) { + if sc.ShouldClipToZero() && val < 0 { + return 0, overflow(val, tp) + } + + if uint64(val) > upperBound { + return upperBound, overflow(val, tp) + } + + return uint64(val), nil +} + +// ConvertUintToUint converts an uint value to another uint value of different precision. +func ConvertUintToUint(val uint64, upperBound uint64, tp byte) (uint64, error) { + if val > upperBound { + return upperBound, overflow(val, tp) + } + + return val, nil +} + +// ConvertFloatToUint converts a float value to an uint value. +func ConvertFloatToUint(sc *stmtctx.StatementContext, fval float64, upperBound uint64, tp byte) (uint64, error) { + val := RoundFloat(fval) + if val < 0 { + if sc.ShouldClipToZero() { + return 0, overflow(val, tp) + } + return uint64(int64(val)), overflow(val, tp) + } + + if val > float64(upperBound) { + return upperBound, overflow(val, tp) + } + return uint64(val), nil +} + +// convertScientificNotation converts a decimal string with scientific notation to a normal decimal string. +// 1E6 => 1000000, .12345E+5 => 12345 +func convertScientificNotation(str string) (string, error) { + // https://golang.org/ref/spec#Floating-point_literals + eIdx := -1 + point := -1 + for i := 0; i < len(str); i++ { + if str[i] == '.' { + point = i + } + if str[i] == 'e' || str[i] == 'E' { + eIdx = i + if point == -1 { + point = i + } + break + } + } + if eIdx == -1 { + return str, nil + } + exp, err := strconv.ParseInt(str[eIdx+1:], 10, 64) + if err != nil { + return "", errors.WithStack(err) + } + + f := str[:eIdx] + if exp == 0 { + return f, nil + } else if exp > 0 { // move point right + if point+int(exp) == len(f)-1 { // 123.456 >> 3 = 123456. = 123456 + return f[:point] + f[point+1:], nil + } else if point+int(exp) < len(f)-1 { // 123.456 >> 2 = 12345.6 + return f[:point] + f[point+1:point+1+int(exp)] + "." + f[point+1+int(exp):], nil + } + // 123.456 >> 5 = 12345600 + return f[:point] + f[point+1:] + strings.Repeat("0", point+int(exp)-len(f)+1), nil + } else { // move point left + exp = -exp + if int(exp) < point { // 123.456 << 2 = 1.23456 + return f[:point-int(exp)] + "." + f[point-int(exp):point] + f[point+1:], nil + } + // 123.456 << 5 = 0.00123456 + return "0." + strings.Repeat("0", int(exp)-point) + f[:point] + f[point+1:], nil + } +} + +func convertDecimalStrToUint(sc *stmtctx.StatementContext, str string, upperBound uint64, tp byte) (uint64, error) { + str, err := convertScientificNotation(str) + if err != nil { + return 0, err + } + + var intStr, fracStr string + p := strings.Index(str, ".") + if p == -1 { + intStr = str + } else { + intStr = str[:p] + fracStr = str[p+1:] + } + intStr = strings.TrimLeft(intStr, "0") + if intStr == "" { + intStr = "0" + } + if sc.ShouldClipToZero() && intStr[0] == '-' { + return 0, overflow(str, tp) + } + + var round uint64 + if fracStr != "" && fracStr[0] >= '5' { + round++ + } + + upperBound -= round + upperStr := strconv.FormatUint(upperBound, 10) + if len(intStr) > len(upperStr) || + (len(intStr) == len(upperStr) && intStr > upperStr) { + return upperBound, overflow(str, tp) + } + + val, err := strconv.ParseUint(intStr, 10, 64) + if err != nil { + return val, err + } + return val + round, nil +} + +// ConvertDecimalToUint converts a decimal to a uint by converting it to a string first to avoid float overflow (#10181). +func ConvertDecimalToUint(sc *stmtctx.StatementContext, d *MyDecimal, upperBound uint64, tp byte) (uint64, error) { + return convertDecimalStrToUint(sc, string(d.ToString()), upperBound, tp) +} + +// StrToInt converts a string to an integer at the best-effort. +func StrToInt(sc *stmtctx.StatementContext, str string) (int64, error) { + str = strings.TrimSpace(str) + validPrefix, err := getValidIntPrefix(sc, str) + iVal, err1 := strconv.ParseInt(validPrefix, 10, 64) + if err1 != nil { + return iVal, ErrOverflow.GenWithStackByArgs("BIGINT", validPrefix) + } + return iVal, errors.Trace(err) +} + +// StrToUint converts a string to an unsigned integer at the best-effortt. +func StrToUint(sc *stmtctx.StatementContext, str string) (uint64, error) { + str = strings.TrimSpace(str) + validPrefix, err := getValidIntPrefix(sc, str) + if validPrefix[0] == '+' { + validPrefix = validPrefix[1:] + } + uVal, err1 := strconv.ParseUint(validPrefix, 10, 64) + if err1 != nil { + return uVal, ErrOverflow.GenWithStackByArgs("BIGINT UNSIGNED", validPrefix) + } + return uVal, errors.Trace(err) +} + +// StrToDateTime converts str to MySQL DateTime. +func StrToDateTime(sc *stmtctx.StatementContext, str string, fsp int8) (Time, error) { + return ParseTime(sc, str, mysql.TypeDatetime, fsp) +} + +// StrToDuration converts str to Duration. It returns Duration in normal case, +// and returns Time when str is in datetime format. +// when isDuration is true, the d is returned, when it is false, the t is returned. +// See https://dev.mysql.com/doc/refman/5.5/en/date-and-time-literals.html. +func StrToDuration(sc *stmtctx.StatementContext, str string, fsp int8) (d Duration, t Time, isDuration bool, err error) { + str = strings.TrimSpace(str) + length := len(str) + if length > 0 && str[0] == '-' { + length-- + } + // Timestamp format is 'YYYYMMDDHHMMSS' or 'YYMMDDHHMMSS', which length is 12. + // See #3923, it explains what we do here. + if length >= 12 { + t, err = StrToDateTime(sc, str, fsp) + if err == nil { + return d, t, false, nil + } + } + + d, err = ParseDuration(sc, str, fsp) + if ErrTruncatedWrongVal.Equal(err) { + err = sc.HandleTruncate(err) + } + return d, t, true, errors.Trace(err) +} + +// NumberToDuration converts number to Duration. +func NumberToDuration(number int64, fsp int8) (Duration, error) { + if number > TimeMaxValue { + // Try to parse DATETIME. + if number >= 10000000000 { // '2001-00-00 00-00-00' + if t, err := ParseDatetimeFromNum(nil, number); err == nil { + dur, err1 := t.ConvertToDuration() + return dur, errors.Trace(err1) + } + } + dur, err1 := MaxMySQLTime(fsp).ConvertToDuration() + terror.Log(err1) + return dur, ErrOverflow.GenWithStackByArgs("Duration", strconv.Itoa(int(number))) + } else if number < -TimeMaxValue { + dur, err1 := MaxMySQLTime(fsp).ConvertToDuration() + terror.Log(err1) + dur.Duration = -dur.Duration + return dur, ErrOverflow.GenWithStackByArgs("Duration", strconv.Itoa(int(number))) + } + var neg bool + if neg = number < 0; neg { + number = -number + } + + if number/10000 > TimeMaxHour || number%100 >= 60 || (number/100)%100 >= 60 { + return ZeroDuration, errors.Trace(ErrInvalidTimeFormat.GenWithStackByArgs(number)) + } + t := Time{Time: FromDate(0, 0, 0, int(number/10000), int((number/100)%100), int(number%100), 0), Type: mysql.TypeDuration, Fsp: fsp} + dur, err := t.ConvertToDuration() + if err != nil { + return ZeroDuration, errors.Trace(err) + } + if neg { + dur.Duration = -dur.Duration + } + return dur, nil +} + +// getValidIntPrefix gets prefix of the string which can be successfully parsed as int. +func getValidIntPrefix(sc *stmtctx.StatementContext, str string) (string, error) { + if !sc.CastStrToIntStrict { + floatPrefix, err := getValidFloatPrefix(sc, str) + if err != nil { + return floatPrefix, errors.Trace(err) + } + return floatStrToIntStr(sc, floatPrefix, str) + } + + validLen := 0 + + for i := 0; i < len(str); i++ { + c := str[i] + if (c == '+' || c == '-') && i == 0 { + continue + } + + if c >= '0' && c <= '9' { + validLen = i + 1 + continue + } + + break + } + valid := str[:validLen] + if valid == "" { + valid = "0" + } + if validLen == 0 || validLen != len(str) { + return valid, errors.Trace(handleTruncateError(sc, ErrTruncatedWrongVal.GenWithStackByArgs("INTEGER", str))) + } + return valid, nil +} + +// roundIntStr is to round a **valid int string** base on the number following dot. +func roundIntStr(numNextDot byte, intStr string) string { + if numNextDot < '5' { + return intStr + } + retStr := []byte(intStr) + idx := len(intStr) - 1 + for ; idx >= 1; idx-- { + if retStr[idx] != '9' { + retStr[idx]++ + break + } + retStr[idx] = '0' + } + if idx == 0 { + if intStr[0] == '9' { + retStr[0] = '1' + retStr = append(retStr, '0') + } else if isDigit(intStr[0]) { + retStr[0]++ + } else { + retStr[1] = '1' + retStr = append(retStr, '0') + } + } + return string(retStr) +} + +// floatStrToIntStr converts a valid float string into valid integer string which can be parsed by +// strconv.ParseInt, we can't parse float first then convert it to string because precision will +// be lost. For example, the string value "18446744073709551615" which is the max number of unsigned +// int will cause some precision to lose. intStr[0] may be a positive and negative sign like '+' or '-'. +// +// This func will find serious overflow such as the len of intStr > 20 (without prefix `+/-`) +// however, it will not check whether the intStr overflow BIGINT. +func floatStrToIntStr(sc *stmtctx.StatementContext, validFloat string, oriStr string) (intStr string, _ error) { + var dotIdx = -1 + var eIdx = -1 + for i := 0; i < len(validFloat); i++ { + switch validFloat[i] { + case '.': + dotIdx = i + case 'e', 'E': + eIdx = i + } + } + if eIdx == -1 { + if dotIdx == -1 { + return validFloat, nil + } + var digits []byte + if validFloat[0] == '-' || validFloat[0] == '+' { + dotIdx-- + digits = []byte(validFloat[1:]) + } else { + digits = []byte(validFloat) + } + if dotIdx == 0 { + intStr = "0" + } else { + intStr = string(digits)[:dotIdx] + } + if len(digits) > dotIdx+1 { + intStr = roundIntStr(digits[dotIdx+1], intStr) + } + if (len(intStr) > 1 || intStr[0] != '0') && validFloat[0] == '-' { + intStr = "-" + intStr + } + return intStr, nil + } + // intCnt and digits contain the prefix `+/-` if validFloat[0] is `+/-` + var intCnt int + digits := make([]byte, 0, len(validFloat)) + if dotIdx == -1 { + digits = append(digits, validFloat[:eIdx]...) + intCnt = len(digits) + } else { + digits = append(digits, validFloat[:dotIdx]...) + intCnt = len(digits) + digits = append(digits, validFloat[dotIdx+1:eIdx]...) + } + exp, err := strconv.Atoi(validFloat[eIdx+1:]) + if err != nil { + return validFloat, errors.Trace(err) + } + intCnt += exp + if exp >= 0 && (intCnt > 21 || intCnt < 0) { + // MaxInt64 has 19 decimal digits. + // MaxUint64 has 20 decimal digits. + // And the intCnt may contain the len of `+/-`, + // so I use 21 here as the early detection. + sc.AppendWarning(ErrOverflow.GenWithStackByArgs("BIGINT", oriStr)) + return validFloat[:eIdx], nil + } + if intCnt <= 0 { + intStr = "0" + if intCnt == 0 && len(digits) > 0 && isDigit(digits[0]) { + intStr = roundIntStr(digits[0], intStr) + } + return intStr, nil + } + if intCnt == 1 && (digits[0] == '-' || digits[0] == '+') { + intStr = "0" + if len(digits) > 1 { + intStr = roundIntStr(digits[1], intStr) + } + if intStr[0] == '1' { + intStr = string(digits[:1]) + intStr + } + return intStr, nil + } + if intCnt <= len(digits) { + intStr = string(digits[:intCnt]) + if intCnt < len(digits) { + intStr = roundIntStr(digits[intCnt], intStr) + } + } else { + // convert scientific notation decimal number + extraZeroCount := intCnt - len(digits) + intStr = string(digits) + strings.Repeat("0", extraZeroCount) + } + return intStr, nil +} + +// StrToFloat converts a string to a float64 at the best-effort. +func StrToFloat(sc *stmtctx.StatementContext, str string) (float64, error) { + str = strings.TrimSpace(str) + validStr, err := getValidFloatPrefix(sc, str) + f, err1 := strconv.ParseFloat(validStr, 64) + if err1 != nil { + if err2, ok := err1.(*strconv.NumError); ok { + // value will truncate to MAX/MIN if out of range. + if err2.Err == strconv.ErrRange { + err1 = sc.HandleTruncate(ErrTruncatedWrongVal.GenWithStackByArgs("DOUBLE", str)) + if math.IsInf(f, 1) { + f = math.MaxFloat64 + } else if math.IsInf(f, -1) { + f = -math.MaxFloat64 + } + } + } + return f, errors.Trace(err1) + } + return f, errors.Trace(err) +} + +// ConvertJSONToInt casts JSON into int64. +func ConvertJSONToInt(sc *stmtctx.StatementContext, j json.BinaryJSON, unsigned bool) (int64, error) { + switch j.TypeCode { + case json.TypeCodeObject, json.TypeCodeArray: + return 0, nil + case json.TypeCodeLiteral: + switch j.Value[0] { + case json.LiteralNil, json.LiteralFalse: + return 0, nil + default: + return 1, nil + } + case json.TypeCodeInt64, json.TypeCodeUint64: + return j.GetInt64(), nil + case json.TypeCodeFloat64: + f := j.GetFloat64() + if !unsigned { + lBound := IntergerSignedLowerBound(mysql.TypeLonglong) + uBound := IntergerSignedUpperBound(mysql.TypeLonglong) + return ConvertFloatToInt(f, lBound, uBound, mysql.TypeLonglong) + } + bound := IntergerUnsignedUpperBound(mysql.TypeLonglong) + u, err := ConvertFloatToUint(sc, f, bound, mysql.TypeLonglong) + return int64(u), errors.Trace(err) + case json.TypeCodeString: + str := string(hack.String(j.GetString())) + if !unsigned { + return StrToInt(sc, str) + } + u, err := StrToUint(sc, str) + return int64(u), errors.Trace(err) + } + return 0, errors.New("Unknown type code in JSON") +} + +// ConvertJSONToFloat casts JSON into float64. +func ConvertJSONToFloat(sc *stmtctx.StatementContext, j json.BinaryJSON) (float64, error) { + switch j.TypeCode { + case json.TypeCodeObject, json.TypeCodeArray: + return 0, nil + case json.TypeCodeLiteral: + switch j.Value[0] { + case json.LiteralNil, json.LiteralFalse: + return 0, nil + default: + return 1, nil + } + case json.TypeCodeInt64: + return float64(j.GetInt64()), nil + case json.TypeCodeUint64: + return float64(j.GetUint64()), nil + case json.TypeCodeFloat64: + return j.GetFloat64(), nil + case json.TypeCodeString: + str := string(hack.String(j.GetString())) + return StrToFloat(sc, str) + } + return 0, errors.New("Unknown type code in JSON") +} + +// ConvertJSONToDecimal casts JSON into decimal. +func ConvertJSONToDecimal(sc *stmtctx.StatementContext, j json.BinaryJSON) (*MyDecimal, error) { + res := new(MyDecimal) + if j.TypeCode != json.TypeCodeString { + f64, err := ConvertJSONToFloat(sc, j) + if err != nil { + return res, errors.Trace(err) + } + err = res.FromFloat64(f64) + return res, errors.Trace(err) + } + err := sc.HandleTruncate(res.FromString([]byte(j.GetString()))) + return res, errors.Trace(err) +} + +// getValidFloatPrefix gets prefix of string which can be successfully parsed as float. +func getValidFloatPrefix(sc *stmtctx.StatementContext, s string) (valid string, err error) { + if (sc.InDeleteStmt || sc.InSelectStmt || sc.InUpdateStmt) && s == "" { + return "0", nil + } + + var ( + sawDot bool + sawDigit bool + validLen int + eIdx int + ) + for i := 0; i < len(s); i++ { + c := s[i] + if c == '+' || c == '-' { + if i != 0 && i != eIdx+1 { // "1e+1" is valid. + break + } + } else if c == '.' { + if sawDot || eIdx > 0 { // "1.1." or "1e1.1" + break + } + sawDot = true + if sawDigit { // "123." is valid. + validLen = i + 1 + } + } else if c == 'e' || c == 'E' { + if !sawDigit { // "+.e" + break + } + if eIdx != 0 { // "1e5e" + break + } + eIdx = i + } else if c < '0' || c > '9' { + break + } else { + sawDigit = true + validLen = i + 1 + } + } + valid = s[:validLen] + if valid == "" { + valid = "0" + } + if validLen == 0 || validLen != len(s) { + err = errors.Trace(handleTruncateError(sc, ErrTruncated)) + } + return valid, err +} + +// ToString converts an interface to a string. +func ToString(value interface{}) (string, error) { + switch v := value.(type) { + case bool: + if v { + return "1", nil + } + return "0", nil + case int: + return strconv.FormatInt(int64(v), 10), nil + case int64: + return strconv.FormatInt(v, 10), nil + case uint64: + return strconv.FormatUint(v, 10), nil + case float32: + return strconv.FormatFloat(float64(v), 'f', -1, 32), nil + case float64: + return strconv.FormatFloat(v, 'f', -1, 64), nil + case string: + return v, nil + case []byte: + return string(v), nil + case Time: + return v.String(), nil + case Duration: + return v.String(), nil + case *MyDecimal: + return v.String(), nil + case BinaryLiteral: + return v.ToString(), nil + case Enum: + return v.String(), nil + case Set: + return v.String(), nil + default: + return "", errors.Errorf("cannot convert %v(type %T) to string", value, value) + } +} diff --git a/vendor/github.com/pingcap/tidb/types/datum.go b/vendor/github.com/pingcap/tidb/types/datum.go new file mode 100644 index 0000000..5e448d7 --- /dev/null +++ b/vendor/github.com/pingcap/tidb/types/datum.go @@ -0,0 +1,1846 @@ +// Copyright 2016 PingCAP, Inc. +// +// 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package types + +import ( + "fmt" + "math" + "sort" + "strconv" + "strings" + "time" + "unicode/utf8" + + "github.com/pingcap/errors" + "github.com/pingcap/parser/charset" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/terror" + "github.com/pingcap/tidb/sessionctx/stmtctx" + "github.com/pingcap/tidb/types/json" + "github.com/pingcap/tidb/util/hack" + "github.com/pingcap/tidb/util/logutil" + "go.uber.org/zap" +) + +// Kind constants. +const ( + KindNull byte = 0 + KindInt64 byte = 1 + KindUint64 byte = 2 + KindFloat32 byte = 3 + KindFloat64 byte = 4 + KindString byte = 5 + KindBytes byte = 6 + KindBinaryLiteral byte = 7 // Used for BIT / HEX literals. + KindMysqlDecimal byte = 8 + KindMysqlDuration byte = 9 + KindMysqlEnum byte = 10 + KindMysqlBit byte = 11 // Used for BIT table column values. + KindMysqlSet byte = 12 + KindMysqlTime byte = 13 + KindInterface byte = 14 + KindMinNotNull byte = 15 + KindMaxValue byte = 16 + KindRaw byte = 17 + KindMysqlJSON byte = 18 +) + +// Datum is a data box holds different kind of data. +// It has better performance and is easier to use than `interface{}`. +type Datum struct { + k byte // datum kind. + collation uint8 // collation can hold uint8 values. + decimal uint16 // decimal can hold uint16 values. + length uint32 // length can hold uint32 values. + i int64 // i can hold int64 uint64 float64 values. + b []byte // b can hold string or []byte values. + x interface{} // x hold all other types. +} + +// Copy deep copies a Datum. +func (d *Datum) Copy() *Datum { + ret := *d + if d.b != nil { + ret.b = make([]byte, len(d.b)) + copy(ret.b, d.b) + } + switch ret.Kind() { + case KindMysqlDecimal: + d := *d.GetMysqlDecimal() + ret.SetMysqlDecimal(&d) + case KindMysqlTime: + ret.SetMysqlTime(d.GetMysqlTime()) + } + return &ret +} + +// Kind gets the kind of the datum. +func (d *Datum) Kind() byte { + return d.k +} + +// Collation gets the collation of the datum. +func (d *Datum) Collation() byte { + return d.collation +} + +// SetCollation sets the collation of the datum. +func (d *Datum) SetCollation(collation byte) { + d.collation = collation +} + +// Frac gets the frac of the datum. +func (d *Datum) Frac() int { + return int(d.decimal) +} + +// SetFrac sets the frac of the datum. +func (d *Datum) SetFrac(frac int) { + d.decimal = uint16(frac) +} + +// Length gets the length of the datum. +func (d *Datum) Length() int { + return int(d.length) +} + +// SetLength sets the length of the datum. +func (d *Datum) SetLength(l int) { + d.length = uint32(l) +} + +// IsNull checks if datum is null. +func (d *Datum) IsNull() bool { + return d.k == KindNull +} + +// GetInt64 gets int64 value. +func (d *Datum) GetInt64() int64 { + return d.i +} + +// SetInt64 sets int64 value. +func (d *Datum) SetInt64(i int64) { + d.k = KindInt64 + d.i = i +} + +// GetUint64 gets uint64 value. +func (d *Datum) GetUint64() uint64 { + return uint64(d.i) +} + +// SetUint64 sets uint64 value. +func (d *Datum) SetUint64(i uint64) { + d.k = KindUint64 + d.i = int64(i) +} + +// GetFloat64 gets float64 value. +func (d *Datum) GetFloat64() float64 { + return math.Float64frombits(uint64(d.i)) +} + +// SetFloat64 sets float64 value. +func (d *Datum) SetFloat64(f float64) { + d.k = KindFloat64 + d.i = int64(math.Float64bits(f)) +} + +// GetFloat32 gets float32 value. +func (d *Datum) GetFloat32() float32 { + return float32(math.Float64frombits(uint64(d.i))) +} + +// SetFloat32 sets float32 value. +func (d *Datum) SetFloat32(f float32) { + d.k = KindFloat32 + d.i = int64(math.Float64bits(float64(f))) +} + +// GetString gets string value. +func (d *Datum) GetString() string { + return string(hack.String(d.b)) +} + +// SetString sets string value. +func (d *Datum) SetString(s string) { + d.k = KindString + sink(s) + d.b = hack.Slice(s) +} + +// sink prevents s from being allocated on the stack. +var sink = func(s string) { +} + +// GetBytes gets bytes value. +func (d *Datum) GetBytes() []byte { + return d.b +} + +// SetBytes sets bytes value to datum. +func (d *Datum) SetBytes(b []byte) { + d.k = KindBytes + d.b = b +} + +// SetBytesAsString sets bytes value to datum as string type. +func (d *Datum) SetBytesAsString(b []byte) { + d.k = KindString + d.b = b +} + +// GetInterface gets interface value. +func (d *Datum) GetInterface() interface{} { + return d.x +} + +// SetInterface sets interface to datum. +func (d *Datum) SetInterface(x interface{}) { + d.k = KindInterface + d.x = x +} + +// SetNull sets datum to nil. +func (d *Datum) SetNull() { + d.k = KindNull + d.x = nil +} + +// SetMinNotNull sets datum to minNotNull value. +func (d *Datum) SetMinNotNull() { + d.k = KindMinNotNull + d.x = nil +} + +// GetBinaryLiteral gets Bit value +func (d *Datum) GetBinaryLiteral() BinaryLiteral { + return d.b +} + +// GetMysqlBit gets MysqlBit value +func (d *Datum) GetMysqlBit() BinaryLiteral { + return d.GetBinaryLiteral() +} + +// SetBinaryLiteral sets Bit value +func (d *Datum) SetBinaryLiteral(b BinaryLiteral) { + d.k = KindBinaryLiteral + d.b = b +} + +// SetMysqlBit sets MysqlBit value +func (d *Datum) SetMysqlBit(b BinaryLiteral) { + d.k = KindMysqlBit + d.b = b +} + +// GetMysqlDecimal gets Decimal value +func (d *Datum) GetMysqlDecimal() *MyDecimal { + return d.x.(*MyDecimal) +} + +// SetMysqlDecimal sets Decimal value +func (d *Datum) SetMysqlDecimal(b *MyDecimal) { + d.k = KindMysqlDecimal + d.x = b +} + +// GetMysqlDuration gets Duration value +func (d *Datum) GetMysqlDuration() Duration { + return Duration{Duration: time.Duration(d.i), Fsp: int8(d.decimal)} +} + +// SetMysqlDuration sets Duration value +func (d *Datum) SetMysqlDuration(b Duration) { + d.k = KindMysqlDuration + d.i = int64(b.Duration) + d.decimal = uint16(b.Fsp) +} + +// GetMysqlEnum gets Enum value +func (d *Datum) GetMysqlEnum() Enum { + str := string(hack.String(d.b)) + return Enum{Value: uint64(d.i), Name: str} +} + +// SetMysqlEnum sets Enum value +func (d *Datum) SetMysqlEnum(b Enum) { + d.k = KindMysqlEnum + d.i = int64(b.Value) + sink(b.Name) + d.b = hack.Slice(b.Name) +} + +// GetMysqlSet gets Set value +func (d *Datum) GetMysqlSet() Set { + str := string(hack.String(d.b)) + return Set{Value: uint64(d.i), Name: str} +} + +// SetMysqlSet sets Set value +func (d *Datum) SetMysqlSet(b Set) { + d.k = KindMysqlSet + d.i = int64(b.Value) + sink(b.Name) + d.b = hack.Slice(b.Name) +} + +// GetMysqlJSON gets json.BinaryJSON value +func (d *Datum) GetMysqlJSON() json.BinaryJSON { + return json.BinaryJSON{TypeCode: byte(d.i), Value: d.b} +} + +// SetMysqlJSON sets json.BinaryJSON value +func (d *Datum) SetMysqlJSON(b json.BinaryJSON) { + d.k = KindMysqlJSON + d.i = int64(b.TypeCode) + d.b = b.Value +} + +// GetMysqlTime gets types.Time value +func (d *Datum) GetMysqlTime() Time { + return d.x.(Time) +} + +// SetMysqlTime sets types.Time value +func (d *Datum) SetMysqlTime(b Time) { + d.k = KindMysqlTime + d.x = b +} + +// SetRaw sets raw value. +func (d *Datum) SetRaw(b []byte) { + d.k = KindRaw + d.b = b +} + +// GetRaw gets raw value. +func (d *Datum) GetRaw() []byte { + return d.b +} + +// SetAutoID set the auto increment ID according to its int flag. +func (d *Datum) SetAutoID(id int64, flag uint) { + if mysql.HasUnsignedFlag(flag) { + d.SetUint64(uint64(id)) + } else { + d.SetInt64(id) + } +} + +// GetValue gets the value of the datum of any kind. +func (d *Datum) GetValue() interface{} { + switch d.k { + case KindInt64: + return d.GetInt64() + case KindUint64: + return d.GetUint64() + case KindFloat32: + return d.GetFloat32() + case KindFloat64: + return d.GetFloat64() + case KindString: + return d.GetString() + case KindBytes: + return d.GetBytes() + case KindMysqlDecimal: + return d.GetMysqlDecimal() + case KindMysqlDuration: + return d.GetMysqlDuration() + case KindMysqlEnum: + return d.GetMysqlEnum() + case KindBinaryLiteral, KindMysqlBit: + return d.GetBinaryLiteral() + case KindMysqlSet: + return d.GetMysqlSet() + case KindMysqlJSON: + return d.GetMysqlJSON() + case KindMysqlTime: + return d.GetMysqlTime() + default: + return d.GetInterface() + } +} + +// SetValue sets any kind of value. +func (d *Datum) SetValue(val interface{}) { + switch x := val.(type) { + case nil: + d.SetNull() + case bool: + if x { + d.SetInt64(1) + } else { + d.SetInt64(0) + } + case int: + d.SetInt64(int64(x)) + case int64: + d.SetInt64(x) + case uint64: + d.SetUint64(x) + case float32: + d.SetFloat32(x) + case float64: + d.SetFloat64(x) + case string: + d.SetString(x) + case []byte: + d.SetBytes(x) + case *MyDecimal: + d.SetMysqlDecimal(x) + case Duration: + d.SetMysqlDuration(x) + case Enum: + d.SetMysqlEnum(x) + case BinaryLiteral: + d.SetBinaryLiteral(x) + case BitLiteral: // Store as BinaryLiteral for Bit and Hex literals + d.SetBinaryLiteral(BinaryLiteral(x)) + case HexLiteral: + d.SetBinaryLiteral(BinaryLiteral(x)) + case Set: + d.SetMysqlSet(x) + case json.BinaryJSON: + d.SetMysqlJSON(x) + case Time: + d.SetMysqlTime(x) + default: + d.SetInterface(x) + } +} + +// CompareDatum compares datum to another datum. +// TODO: return error properly. +func (d *Datum) CompareDatum(sc *stmtctx.StatementContext, ad *Datum) (int, error) { + if d.k == KindMysqlJSON && ad.k != KindMysqlJSON { + cmp, err := ad.CompareDatum(sc, d) + return cmp * -1, errors.Trace(err) + } + switch ad.k { + case KindNull: + if d.k == KindNull { + return 0, nil + } + return 1, nil + case KindMinNotNull: + if d.k == KindNull { + return -1, nil + } else if d.k == KindMinNotNull { + return 0, nil + } + return 1, nil + case KindMaxValue: + if d.k == KindMaxValue { + return 0, nil + } + return -1, nil + case KindInt64: + return d.compareInt64(sc, ad.GetInt64()) + case KindUint64: + return d.compareUint64(sc, ad.GetUint64()) + case KindFloat32, KindFloat64: + return d.compareFloat64(sc, ad.GetFloat64()) + case KindString: + return d.compareString(sc, ad.GetString()) + case KindBytes: + return d.compareBytes(sc, ad.GetBytes()) + case KindMysqlDecimal: + return d.compareMysqlDecimal(sc, ad.GetMysqlDecimal()) + case KindMysqlDuration: + return d.compareMysqlDuration(sc, ad.GetMysqlDuration()) + case KindMysqlEnum: + return d.compareMysqlEnum(sc, ad.GetMysqlEnum()) + case KindBinaryLiteral, KindMysqlBit: + return d.compareBinaryLiteral(sc, ad.GetBinaryLiteral()) + case KindMysqlSet: + return d.compareMysqlSet(sc, ad.GetMysqlSet()) + case KindMysqlJSON: + return d.compareMysqlJSON(sc, ad.GetMysqlJSON()) + case KindMysqlTime: + return d.compareMysqlTime(sc, ad.GetMysqlTime()) + default: + return 0, nil + } +} + +func (d *Datum) compareInt64(sc *stmtctx.StatementContext, i int64) (int, error) { + switch d.k { + case KindMaxValue: + return 1, nil + case KindInt64: + return CompareInt64(d.i, i), nil + case KindUint64: + if i < 0 || d.GetUint64() > math.MaxInt64 { + return 1, nil + } + return CompareInt64(d.i, i), nil + default: + return d.compareFloat64(sc, float64(i)) + } +} + +func (d *Datum) compareUint64(sc *stmtctx.StatementContext, u uint64) (int, error) { + switch d.k { + case KindMaxValue: + return 1, nil + case KindInt64: + if d.i < 0 || u > math.MaxInt64 { + return -1, nil + } + return CompareInt64(d.i, int64(u)), nil + case KindUint64: + return CompareUint64(d.GetUint64(), u), nil + default: + return d.compareFloat64(sc, float64(u)) + } +} + +func (d *Datum) compareFloat64(sc *stmtctx.StatementContext, f float64) (int, error) { + switch d.k { + case KindNull, KindMinNotNull: + return -1, nil + case KindMaxValue: + return 1, nil + case KindInt64: + return CompareFloat64(float64(d.i), f), nil + case KindUint64: + return CompareFloat64(float64(d.GetUint64()), f), nil + case KindFloat32, KindFloat64: + return CompareFloat64(d.GetFloat64(), f), nil + case KindString, KindBytes: + fVal, err := StrToFloat(sc, d.GetString()) + return CompareFloat64(fVal, f), errors.Trace(err) + case KindMysqlDecimal: + fVal, err := d.GetMysqlDecimal().ToFloat64() + return CompareFloat64(fVal, f), errors.Trace(err) + case KindMysqlDuration: + fVal := d.GetMysqlDuration().Seconds() + return CompareFloat64(fVal, f), nil + case KindMysqlEnum: + fVal := d.GetMysqlEnum().ToNumber() + return CompareFloat64(fVal, f), nil + case KindBinaryLiteral, KindMysqlBit: + val, err := d.GetBinaryLiteral().ToInt(sc) + fVal := float64(val) + return CompareFloat64(fVal, f), errors.Trace(err) + case KindMysqlSet: + fVal := d.GetMysqlSet().ToNumber() + return CompareFloat64(fVal, f), nil + case KindMysqlTime: + fVal, err := d.GetMysqlTime().ToNumber().ToFloat64() + return CompareFloat64(fVal, f), errors.Trace(err) + default: + return -1, nil + } +} + +func (d *Datum) compareString(sc *stmtctx.StatementContext, s string) (int, error) { + switch d.k { + case KindNull, KindMinNotNull: + return -1, nil + case KindMaxValue: + return 1, nil + case KindString, KindBytes: + return CompareString(d.GetString(), s), nil + case KindMysqlDecimal: + dec := new(MyDecimal) + err := sc.HandleTruncate(dec.FromString(hack.Slice(s))) + return d.GetMysqlDecimal().Compare(dec), errors.Trace(err) + case KindMysqlTime: + dt, err := ParseDatetime(sc, s) + return d.GetMysqlTime().Compare(dt), errors.Trace(err) + case KindMysqlDuration: + dur, err := ParseDuration(sc, s, MaxFsp) + return d.GetMysqlDuration().Compare(dur), errors.Trace(err) + case KindMysqlSet: + return CompareString(d.GetMysqlSet().String(), s), nil + case KindMysqlEnum: + return CompareString(d.GetMysqlEnum().String(), s), nil + case KindBinaryLiteral, KindMysqlBit: + return CompareString(d.GetBinaryLiteral().ToString(), s), nil + default: + fVal, err := StrToFloat(sc, s) + if err != nil { + return 0, errors.Trace(err) + } + return d.compareFloat64(sc, fVal) + } +} + +func (d *Datum) compareBytes(sc *stmtctx.StatementContext, b []byte) (int, error) { + str := string(hack.String(b)) + return d.compareString(sc, str) +} + +func (d *Datum) compareMysqlDecimal(sc *stmtctx.StatementContext, dec *MyDecimal) (int, error) { + switch d.k { + case KindNull, KindMinNotNull: + return -1, nil + case KindMaxValue: + return 1, nil + case KindMysqlDecimal: + return d.GetMysqlDecimal().Compare(dec), nil + case KindString, KindBytes: + dDec := new(MyDecimal) + err := sc.HandleTruncate(dDec.FromString(d.GetBytes())) + return dDec.Compare(dec), errors.Trace(err) + default: + dVal, err := d.ConvertTo(sc, NewFieldType(mysql.TypeNewDecimal)) + if err != nil { + return 0, errors.Trace(err) + } + return dVal.GetMysqlDecimal().Compare(dec), nil + } +} + +func (d *Datum) compareMysqlDuration(sc *stmtctx.StatementContext, dur Duration) (int, error) { + switch d.k { + case KindMysqlDuration: + return d.GetMysqlDuration().Compare(dur), nil + case KindString, KindBytes: + dDur, err := ParseDuration(sc, d.GetString(), MaxFsp) + return dDur.Compare(dur), errors.Trace(err) + default: + return d.compareFloat64(sc, dur.Seconds()) + } +} + +func (d *Datum) compareMysqlEnum(sc *stmtctx.StatementContext, enum Enum) (int, error) { + switch d.k { + case KindString, KindBytes: + return CompareString(d.GetString(), enum.String()), nil + default: + return d.compareFloat64(sc, enum.ToNumber()) + } +} + +func (d *Datum) compareBinaryLiteral(sc *stmtctx.StatementContext, b BinaryLiteral) (int, error) { + switch d.k { + case KindString, KindBytes: + return CompareString(d.GetString(), b.ToString()), nil + case KindBinaryLiteral, KindMysqlBit: + return CompareString(d.GetBinaryLiteral().ToString(), b.ToString()), nil + default: + val, err := b.ToInt(sc) + if err != nil { + return 0, errors.Trace(err) + } + result, err := d.compareFloat64(sc, float64(val)) + return result, errors.Trace(err) + } +} + +func (d *Datum) compareMysqlSet(sc *stmtctx.StatementContext, set Set) (int, error) { + switch d.k { + case KindString, KindBytes: + return CompareString(d.GetString(), set.String()), nil + default: + return d.compareFloat64(sc, set.ToNumber()) + } +} + +func (d *Datum) compareMysqlJSON(sc *stmtctx.StatementContext, target json.BinaryJSON) (int, error) { + origin, err := d.ToMysqlJSON() + if err != nil { + return 0, errors.Trace(err) + } + return json.CompareBinary(origin, target), nil +} + +func (d *Datum) compareMysqlTime(sc *stmtctx.StatementContext, time Time) (int, error) { + switch d.k { + case KindString, KindBytes: + dt, err := ParseDatetime(sc, d.GetString()) + return dt.Compare(time), errors.Trace(err) + case KindMysqlTime: + return d.GetMysqlTime().Compare(time), nil + default: + fVal, err := time.ToNumber().ToFloat64() + if err != nil { + return 0, errors.Trace(err) + } + return d.compareFloat64(sc, fVal) + } +} + +// ConvertTo converts a datum to the target field type. +func (d *Datum) ConvertTo(sc *stmtctx.StatementContext, target *FieldType) (Datum, error) { + if d.k == KindNull { + return Datum{}, nil + } + switch target.Tp { // TODO: implement mysql types convert when "CAST() AS" syntax are supported. + case mysql.TypeTiny, mysql.TypeShort, mysql.TypeInt24, mysql.TypeLong, mysql.TypeLonglong: + unsigned := mysql.HasUnsignedFlag(target.Flag) + if unsigned { + return d.convertToUint(sc, target) + } + return d.convertToInt(sc, target) + case mysql.TypeFloat, mysql.TypeDouble: + return d.convertToFloat(sc, target) + case mysql.TypeBlob, mysql.TypeTinyBlob, mysql.TypeMediumBlob, mysql.TypeLongBlob, + mysql.TypeString, mysql.TypeVarchar, mysql.TypeVarString: + return d.convertToString(sc, target) + case mysql.TypeTimestamp: + return d.convertToMysqlTimestamp(sc, target) + case mysql.TypeDatetime, mysql.TypeDate: + return d.convertToMysqlTime(sc, target) + case mysql.TypeDuration: + return d.convertToMysqlDuration(sc, target) + case mysql.TypeNewDecimal: + return d.convertToMysqlDecimal(sc, target) + case mysql.TypeYear: + return d.convertToMysqlYear(sc, target) + case mysql.TypeEnum: + return d.convertToMysqlEnum(sc, target) + case mysql.TypeBit: + return d.convertToMysqlBit(sc, target) + case mysql.TypeSet: + return d.convertToMysqlSet(sc, target) + case mysql.TypeJSON: + return d.convertToMysqlJSON(sc, target) + case mysql.TypeNull: + return Datum{}, nil + default: + panic("should never happen") + } +} + +func (d *Datum) convertToFloat(sc *stmtctx.StatementContext, target *FieldType) (Datum, error) { + var ( + f float64 + ret Datum + err error + ) + switch d.k { + case KindNull: + return ret, nil + case KindInt64: + f = float64(d.GetInt64()) + case KindUint64: + f = float64(d.GetUint64()) + case KindFloat32, KindFloat64: + f = d.GetFloat64() + case KindString, KindBytes: + f, err = StrToFloat(sc, d.GetString()) + case KindMysqlTime: + f, err = d.GetMysqlTime().ToNumber().ToFloat64() + case KindMysqlDuration: + f, err = d.GetMysqlDuration().ToNumber().ToFloat64() + case KindMysqlDecimal: + f, err = d.GetMysqlDecimal().ToFloat64() + case KindMysqlSet: + f = d.GetMysqlSet().ToNumber() + case KindMysqlEnum: + f = d.GetMysqlEnum().ToNumber() + case KindBinaryLiteral, KindMysqlBit: + val, err1 := d.GetBinaryLiteral().ToInt(sc) + f, err = float64(val), err1 + case KindMysqlJSON: + f, err = ConvertJSONToFloat(sc, d.GetMysqlJSON()) + default: + return invalidConv(d, target.Tp) + } + var err1 error + f, err1 = ProduceFloatWithSpecifiedTp(f, target, sc) + if err == nil && err1 != nil { + err = err1 + } + if target.Tp == mysql.TypeFloat { + ret.SetFloat32(float32(f)) + } else { + ret.SetFloat64(f) + } + return ret, errors.Trace(err) +} + +// ProduceFloatWithSpecifiedTp produces a new float64 according to `flen` and `decimal`. +func ProduceFloatWithSpecifiedTp(f float64, target *FieldType, sc *stmtctx.StatementContext) (_ float64, err error) { + // For float and following double type, we will only truncate it for float(M, D) format. + // If no D is set, we will handle it like origin float whether M is set or not. + if target.Flen != UnspecifiedLength && target.Decimal != UnspecifiedLength { + f, err = TruncateFloat(f, target.Flen, target.Decimal) + if err = sc.HandleOverflow(err, err); err != nil { + return f, errors.Trace(err) + } + } + if mysql.HasUnsignedFlag(target.Flag) && f < 0 { + return 0, overflow(f, target.Tp) + } + return f, nil +} + +func (d *Datum) convertToString(sc *stmtctx.StatementContext, target *FieldType) (Datum, error) { + var ret Datum + var s string + switch d.k { + case KindInt64: + s = strconv.FormatInt(d.GetInt64(), 10) + case KindUint64: + s = strconv.FormatUint(d.GetUint64(), 10) + case KindFloat32: + s = strconv.FormatFloat(d.GetFloat64(), 'f', -1, 32) + case KindFloat64: + s = strconv.FormatFloat(d.GetFloat64(), 'f', -1, 64) + case KindString, KindBytes: + s = d.GetString() + case KindMysqlTime: + s = d.GetMysqlTime().String() + case KindMysqlDuration: + s = d.GetMysqlDuration().String() + case KindMysqlDecimal: + s = d.GetMysqlDecimal().String() + case KindMysqlEnum: + s = d.GetMysqlEnum().String() + case KindMysqlSet: + s = d.GetMysqlSet().String() + case KindBinaryLiteral, KindMysqlBit: + s = d.GetBinaryLiteral().ToString() + case KindMysqlJSON: + s = d.GetMysqlJSON().String() + default: + return invalidConv(d, target.Tp) + } + s, err := ProduceStrWithSpecifiedTp(s, target, sc, true) + ret.SetString(s) + if target.Charset == charset.CharsetBin { + ret.k = KindBytes + } + return ret, errors.Trace(err) +} + +// ProduceStrWithSpecifiedTp produces a new string according to `flen` and `chs`. Param `padZero` indicates +// whether we should pad `\0` for `binary(flen)` type. +func ProduceStrWithSpecifiedTp(s string, tp *FieldType, sc *stmtctx.StatementContext, padZero bool) (_ string, err error) { + flen, chs := tp.Flen, tp.Charset + if flen >= 0 { + // Flen is the rune length, not binary length, for UTF8 charset, we need to calculate the + // rune count and truncate to Flen runes if it is too long. + if chs == charset.CharsetUTF8 || chs == charset.CharsetUTF8MB4 { + characterLen := utf8.RuneCountInString(s) + if characterLen > flen { + // 1. If len(s) is 0 and flen is 0, truncateLen will be 0, don't truncate s. + // CREATE TABLE t (a char(0)); + // INSERT INTO t VALUES (``); + // 2. If len(s) is 10 and flen is 0, truncateLen will be 0 too, but we still need to truncate s. + // SELECT 1, CAST(1234 AS CHAR(0)); + // So truncateLen is not a suitable variable to determine to do truncate or not. + var runeCount int + var truncateLen int + for i := range s { + if runeCount == flen { + truncateLen = i + break + } + runeCount++ + } + err = ErrDataTooLong.GenWithStack("Data Too Long, field len %d, data len %d", flen, characterLen) + s = truncateStr(s, truncateLen) + } + } else if len(s) > flen { + err = ErrDataTooLong.GenWithStack("Data Too Long, field len %d, data len %d", flen, len(s)) + s = truncateStr(s, flen) + } else if tp.Tp == mysql.TypeString && IsBinaryStr(tp) && len(s) < flen && padZero { + padding := make([]byte, flen-len(s)) + s = string(append([]byte(s), padding...)) + } + } + return s, errors.Trace(sc.HandleTruncate(err)) +} + +func (d *Datum) convertToInt(sc *stmtctx.StatementContext, target *FieldType) (Datum, error) { + i64, err := d.toSignedInteger(sc, target.Tp) + return NewIntDatum(i64), errors.Trace(err) +} + +func (d *Datum) convertToUint(sc *stmtctx.StatementContext, target *FieldType) (Datum, error) { + tp := target.Tp + upperBound := IntergerUnsignedUpperBound(tp) + var ( + val uint64 + err error + ret Datum + ) + switch d.k { + case KindInt64: + val, err = ConvertIntToUint(sc, d.GetInt64(), upperBound, tp) + case KindUint64: + val, err = ConvertUintToUint(d.GetUint64(), upperBound, tp) + case KindFloat32, KindFloat64: + val, err = ConvertFloatToUint(sc, d.GetFloat64(), upperBound, tp) + case KindString, KindBytes: + uval, err1 := StrToUint(sc, d.GetString()) + if err1 != nil && ErrOverflow.Equal(err1) && !sc.ShouldIgnoreOverflowError() { + return ret, errors.Trace(err1) + } + val, err = ConvertUintToUint(uval, upperBound, tp) + if err != nil { + return ret, errors.Trace(err) + } + err = err1 + case KindMysqlTime: + dec := d.GetMysqlTime().ToNumber() + err = dec.Round(dec, 0, ModeHalfEven) + ival, err1 := dec.ToInt() + if err == nil { + err = err1 + } + val, err1 = ConvertIntToUint(sc, ival, upperBound, tp) + if err == nil { + err = err1 + } + case KindMysqlDuration: + dec := d.GetMysqlDuration().ToNumber() + err = dec.Round(dec, 0, ModeHalfEven) + ival, err1 := dec.ToInt() + if err1 == nil { + val, err = ConvertIntToUint(sc, ival, upperBound, tp) + } + case KindMysqlDecimal: + val, err = ConvertDecimalToUint(sc, d.GetMysqlDecimal(), upperBound, tp) + case KindMysqlEnum: + val, err = ConvertFloatToUint(sc, d.GetMysqlEnum().ToNumber(), upperBound, tp) + case KindMysqlSet: + val, err = ConvertFloatToUint(sc, d.GetMysqlSet().ToNumber(), upperBound, tp) + case KindBinaryLiteral, KindMysqlBit: + val, err = d.GetBinaryLiteral().ToInt(sc) + case KindMysqlJSON: + var i64 int64 + i64, err = ConvertJSONToInt(sc, d.GetMysqlJSON(), true) + val = uint64(i64) + default: + return invalidConv(d, target.Tp) + } + ret.SetUint64(val) + if err != nil { + return ret, errors.Trace(err) + } + return ret, nil +} + +func (d *Datum) convertToMysqlTimestamp(sc *stmtctx.StatementContext, target *FieldType) (Datum, error) { + var ( + ret Datum + t Time + err error + ) + fsp := DefaultFsp + if target.Decimal != UnspecifiedLength { + fsp = int8(target.Decimal) + } + switch d.k { + case KindMysqlTime: + t = d.GetMysqlTime() + t, err = t.RoundFrac(sc, fsp) + case KindMysqlDuration: + t, err = d.GetMysqlDuration().ConvertToTime(sc, mysql.TypeTimestamp) + if err != nil { + ret.SetValue(t) + return ret, errors.Trace(err) + } + t, err = t.RoundFrac(sc, fsp) + case KindString, KindBytes: + t, err = ParseTime(sc, d.GetString(), mysql.TypeTimestamp, fsp) + case KindInt64: + t, err = ParseTimeFromNum(sc, d.GetInt64(), mysql.TypeTimestamp, fsp) + case KindMysqlDecimal: + t, err = ParseTimeFromFloatString(sc, d.GetMysqlDecimal().String(), mysql.TypeTimestamp, fsp) + default: + return invalidConv(d, mysql.TypeTimestamp) + } + t.Type = mysql.TypeTimestamp + ret.SetMysqlTime(t) + if err != nil { + return ret, errors.Trace(err) + } + return ret, nil +} + +func (d *Datum) convertToMysqlTime(sc *stmtctx.StatementContext, target *FieldType) (Datum, error) { + tp := target.Tp + fsp := DefaultFsp + if target.Decimal != UnspecifiedLength { + fsp = int8(target.Decimal) + } + var ( + ret Datum + t Time + err error + ) + switch d.k { + case KindMysqlTime: + t, err = d.GetMysqlTime().Convert(sc, tp) + if err != nil { + ret.SetValue(t) + return ret, errors.Trace(err) + } + t, err = t.RoundFrac(sc, fsp) + case KindMysqlDuration: + t, err = d.GetMysqlDuration().ConvertToTime(sc, tp) + if err != nil { + ret.SetValue(t) + return ret, errors.Trace(err) + } + t, err = t.RoundFrac(sc, fsp) + case KindMysqlDecimal: + t, err = ParseTimeFromFloatString(sc, d.GetMysqlDecimal().String(), tp, fsp) + case KindString, KindBytes: + t, err = ParseTime(sc, d.GetString(), tp, fsp) + case KindInt64: + t, err = ParseTimeFromNum(sc, d.GetInt64(), tp, fsp) + default: + return invalidConv(d, tp) + } + if tp == mysql.TypeDate { + // Truncate hh:mm:ss part if the type is Date. + t.Time = FromDate(t.Time.Year(), t.Time.Month(), t.Time.Day(), 0, 0, 0, 0) + } + ret.SetValue(t) + if err != nil { + return ret, errors.Trace(err) + } + return ret, nil +} + +func (d *Datum) convertToMysqlDuration(sc *stmtctx.StatementContext, target *FieldType) (Datum, error) { + tp := target.Tp + fsp := DefaultFsp + if target.Decimal != UnspecifiedLength { + fsp = int8(target.Decimal) + } + var ret Datum + switch d.k { + case KindMysqlTime: + dur, err := d.GetMysqlTime().ConvertToDuration() + if err != nil { + ret.SetValue(dur) + return ret, errors.Trace(err) + } + dur, err = dur.RoundFrac(fsp) + ret.SetValue(dur) + if err != nil { + return ret, errors.Trace(err) + } + case KindMysqlDuration: + dur, err := d.GetMysqlDuration().RoundFrac(fsp) + ret.SetValue(dur) + if err != nil { + return ret, errors.Trace(err) + } + case KindInt64, KindFloat32, KindFloat64, KindMysqlDecimal: + // TODO: We need a ParseDurationFromNum to avoid the cost of converting a num to string. + timeStr, err := d.ToString() + if err != nil { + return ret, errors.Trace(err) + } + timeNum, err := d.ToInt64(sc) + if err != nil { + return ret, errors.Trace(err) + } + // For huge numbers(>'0001-00-00 00-00-00') try full DATETIME in ParseDuration. + if timeNum > MaxDuration && timeNum < 10000000000 { + // mysql return max in no strict sql mode. + ret.SetValue(Duration{Duration: MaxTime, Fsp: 0}) + return ret, ErrInvalidTimeFormat.GenWithStack("Incorrect time value: '%s'", timeStr) + } + if timeNum < -MaxDuration { + return ret, ErrInvalidTimeFormat.GenWithStack("Incorrect time value: '%s'", timeStr) + } + t, err := ParseDuration(sc, timeStr, fsp) + ret.SetValue(t) + if err != nil { + return ret, errors.Trace(err) + } + case KindString, KindBytes: + t, err := ParseDuration(sc, d.GetString(), fsp) + ret.SetValue(t) + if err != nil { + return ret, errors.Trace(err) + } + default: + return invalidConv(d, tp) + } + return ret, nil +} + +func (d *Datum) convertToMysqlDecimal(sc *stmtctx.StatementContext, target *FieldType) (Datum, error) { + var ret Datum + ret.SetLength(target.Flen) + ret.SetFrac(target.Decimal) + var dec = &MyDecimal{} + var err error + switch d.k { + case KindInt64: + dec.FromInt(d.GetInt64()) + case KindUint64: + dec.FromUint(d.GetUint64()) + case KindFloat32, KindFloat64: + err = dec.FromFloat64(d.GetFloat64()) + case KindString, KindBytes: + err = dec.FromString(d.GetBytes()) + case KindMysqlDecimal: + *dec = *d.GetMysqlDecimal() + case KindMysqlTime: + dec = d.GetMysqlTime().ToNumber() + case KindMysqlDuration: + dec = d.GetMysqlDuration().ToNumber() + case KindMysqlEnum: + err = dec.FromFloat64(d.GetMysqlEnum().ToNumber()) + case KindMysqlSet: + err = dec.FromFloat64(d.GetMysqlSet().ToNumber()) + case KindBinaryLiteral, KindMysqlBit: + val, err1 := d.GetBinaryLiteral().ToInt(sc) + err = err1 + dec.FromUint(val) + case KindMysqlJSON: + f, err1 := ConvertJSONToFloat(sc, d.GetMysqlJSON()) + if err1 != nil { + return ret, errors.Trace(err1) + } + err = dec.FromFloat64(f) + default: + return invalidConv(d, target.Tp) + } + var err1 error + dec, err1 = ProduceDecWithSpecifiedTp(dec, target, sc) + if err == nil && err1 != nil { + err = err1 + } + if dec.negative && mysql.HasUnsignedFlag(target.Flag) { + *dec = zeroMyDecimal + if err == nil { + err = ErrOverflow.GenWithStackByArgs("DECIMAL", fmt.Sprintf("(%d, %d)", target.Flen, target.Decimal)) + } + } + ret.SetValue(dec) + return ret, err +} + +// ProduceDecWithSpecifiedTp produces a new decimal according to `flen` and `decimal`. +func ProduceDecWithSpecifiedTp(dec *MyDecimal, tp *FieldType, sc *stmtctx.StatementContext) (_ *MyDecimal, err error) { + flen, decimal := tp.Flen, tp.Decimal + if flen != UnspecifiedLength && decimal != UnspecifiedLength { + if flen < decimal { + return nil, ErrMBiggerThanD.GenWithStackByArgs("") + } + prec, frac := dec.PrecisionAndFrac() + if !dec.IsZero() && prec-frac > flen-decimal { + dec = NewMaxOrMinDec(dec.IsNegative(), flen, decimal) + // select (cast 111 as decimal(1)) causes a warning in MySQL. + err = ErrOverflow.GenWithStackByArgs("DECIMAL", fmt.Sprintf("(%d, %d)", flen, decimal)) + } else if frac != decimal { + old := *dec + err = dec.Round(dec, decimal, ModeHalfEven) + if err != nil { + return nil, err + } + if !dec.IsZero() && frac > decimal && dec.Compare(&old) != 0 { + if sc.InInsertStmt || sc.InUpdateStmt || sc.InDeleteStmt { + // fix https://github.com/pingcap/tidb/issues/3895 + // fix https://github.com/pingcap/tidb/issues/5532 + sc.AppendWarning(ErrTruncated) + err = nil + } else { + err = sc.HandleTruncate(ErrTruncated) + } + } + } + } + + if ErrOverflow.Equal(err) { + // TODO: warnErr need to be ErrWarnDataOutOfRange + err = sc.HandleOverflow(err, err) + } + unsigned := mysql.HasUnsignedFlag(tp.Flag) + if unsigned && dec.IsNegative() { + dec = dec.FromUint(0) + } + return dec, err +} + +func (d *Datum) convertToMysqlYear(sc *stmtctx.StatementContext, target *FieldType) (Datum, error) { + var ( + ret Datum + y int64 + err error + adjust bool + ) + switch d.k { + case KindString, KindBytes: + s := d.GetString() + y, err = StrToInt(sc, s) + if err != nil { + return ret, errors.Trace(err) + } + if len(s) != 4 && len(s) > 0 && s[0:1] == "0" { + adjust = true + } + case KindMysqlTime: + y = int64(d.GetMysqlTime().Time.Year()) + case KindMysqlDuration: + y = int64(time.Now().Year()) + default: + ret, err = d.convertToInt(sc, NewFieldType(mysql.TypeLonglong)) + if err != nil { + return invalidConv(d, target.Tp) + } + y = ret.GetInt64() + } + y, err = AdjustYear(y, adjust) + if err != nil { + return invalidConv(d, target.Tp) + } + ret.SetInt64(y) + return ret, nil +} + +func (d *Datum) convertToMysqlBit(sc *stmtctx.StatementContext, target *FieldType) (Datum, error) { + var ret Datum + var uintValue uint64 + var err error + switch d.k { + case KindString, KindBytes: + uintValue, err = BinaryLiteral(d.b).ToInt(sc) + default: + uintDatum, err1 := d.convertToUint(sc, target) + uintValue, err = uintDatum.GetUint64(), err1 + } + if target.Flen < 64 && uintValue >= 1<<(uint64(target.Flen)) { + return Datum{}, errors.Trace(ErrOverflow.GenWithStackByArgs("BIT", fmt.Sprintf("(%d)", target.Flen))) + } + byteSize := (target.Flen + 7) >> 3 + ret.SetMysqlBit(NewBinaryLiteralFromUint(uintValue, byteSize)) + return ret, errors.Trace(err) +} + +func (d *Datum) convertToMysqlEnum(sc *stmtctx.StatementContext, target *FieldType) (Datum, error) { + var ( + ret Datum + e Enum + err error + ) + switch d.k { + case KindString, KindBytes: + e, err = ParseEnumName(target.Elems, d.GetString()) + default: + var uintDatum Datum + uintDatum, err = d.convertToUint(sc, target) + if err != nil { + return ret, errors.Trace(err) + } + e, err = ParseEnumValue(target.Elems, uintDatum.GetUint64()) + } + if err != nil { + logutil.BgLogger().Error("convert to MySQL enum failed", zap.Error(err)) + err = errors.Trace(ErrTruncated) + } + ret.SetValue(e) + return ret, err +} + +func (d *Datum) convertToMysqlSet(sc *stmtctx.StatementContext, target *FieldType) (Datum, error) { + var ( + ret Datum + s Set + err error + ) + switch d.k { + case KindString, KindBytes: + s, err = ParseSetName(target.Elems, d.GetString()) + default: + var uintDatum Datum + uintDatum, err = d.convertToUint(sc, target) + if err != nil { + return ret, errors.Trace(err) + } + s, err = ParseSetValue(target.Elems, uintDatum.GetUint64()) + } + + if err != nil { + return invalidConv(d, target.Tp) + } + ret.SetValue(s) + return ret, nil +} + +func (d *Datum) convertToMysqlJSON(sc *stmtctx.StatementContext, target *FieldType) (ret Datum, err error) { + switch d.k { + case KindString, KindBytes: + var j json.BinaryJSON + if j, err = json.ParseBinaryFromString(d.GetString()); err == nil { + ret.SetMysqlJSON(j) + } + case KindInt64: + i64 := d.GetInt64() + ret.SetMysqlJSON(json.CreateBinary(i64)) + case KindUint64: + u64 := d.GetUint64() + ret.SetMysqlJSON(json.CreateBinary(u64)) + case KindFloat32, KindFloat64: + f64 := d.GetFloat64() + ret.SetMysqlJSON(json.CreateBinary(f64)) + case KindMysqlDecimal: + var f64 float64 + if f64, err = d.GetMysqlDecimal().ToFloat64(); err == nil { + ret.SetMysqlJSON(json.CreateBinary(f64)) + } + case KindMysqlJSON: + ret = *d + default: + var s string + if s, err = d.ToString(); err == nil { + // TODO: fix precision of MysqlTime. For example, + // On MySQL 5.7 CAST(NOW() AS JSON) -> "2011-11-11 11:11:11.111111", + // But now we can only return "2011-11-11 11:11:11". + ret.SetMysqlJSON(json.CreateBinary(s)) + } + } + return ret, errors.Trace(err) +} + +// ToBool converts to a bool. +// We will use 1 for true, and 0 for false. +func (d *Datum) ToBool(sc *stmtctx.StatementContext) (int64, error) { + var err error + isZero := false + switch d.Kind() { + case KindInt64: + isZero = d.GetInt64() == 0 + case KindUint64: + isZero = d.GetUint64() == 0 + case KindFloat32: + isZero = RoundFloat(d.GetFloat64()) == 0 + case KindFloat64: + isZero = RoundFloat(d.GetFloat64()) == 0 + case KindString, KindBytes: + iVal, err1 := StrToInt(sc, d.GetString()) + isZero, err = iVal == 0, err1 + case KindMysqlTime: + isZero = d.GetMysqlTime().IsZero() + case KindMysqlDuration: + isZero = d.GetMysqlDuration().Duration == 0 + case KindMysqlDecimal: + v, err1 := d.GetMysqlDecimal().ToFloat64() + isZero, err = RoundFloat(v) == 0, err1 + case KindMysqlEnum: + isZero = d.GetMysqlEnum().ToNumber() == 0 + case KindMysqlSet: + isZero = d.GetMysqlSet().ToNumber() == 0 + case KindBinaryLiteral, KindMysqlBit: + val, err1 := d.GetBinaryLiteral().ToInt(sc) + isZero, err = val == 0, err1 + default: + return 0, errors.Errorf("cannot convert %v(type %T) to bool", d.GetValue(), d.GetValue()) + } + var ret int64 + if isZero { + ret = 0 + } else { + ret = 1 + } + if err != nil { + return ret, errors.Trace(err) + } + return ret, nil +} + +// ConvertDatumToDecimal converts datum to decimal. +func ConvertDatumToDecimal(sc *stmtctx.StatementContext, d Datum) (*MyDecimal, error) { + dec := new(MyDecimal) + var err error + switch d.Kind() { + case KindInt64: + dec.FromInt(d.GetInt64()) + case KindUint64: + dec.FromUint(d.GetUint64()) + case KindFloat32: + err = dec.FromFloat64(float64(d.GetFloat32())) + case KindFloat64: + err = dec.FromFloat64(d.GetFloat64()) + case KindString: + err = sc.HandleTruncate(dec.FromString(d.GetBytes())) + case KindMysqlDecimal: + *dec = *d.GetMysqlDecimal() + case KindMysqlEnum: + dec.FromUint(d.GetMysqlEnum().Value) + case KindMysqlSet: + dec.FromUint(d.GetMysqlSet().Value) + case KindBinaryLiteral, KindMysqlBit: + val, err1 := d.GetBinaryLiteral().ToInt(sc) + dec.FromUint(val) + err = err1 + case KindMysqlJSON: + f, err1 := ConvertJSONToFloat(sc, d.GetMysqlJSON()) + if err1 != nil { + return nil, errors.Trace(err1) + } + err = dec.FromFloat64(f) + default: + err = fmt.Errorf("can't convert %v to decimal", d.GetValue()) + } + return dec, errors.Trace(err) +} + +// ToDecimal converts to a decimal. +func (d *Datum) ToDecimal(sc *stmtctx.StatementContext) (*MyDecimal, error) { + switch d.Kind() { + case KindMysqlTime: + return d.GetMysqlTime().ToNumber(), nil + case KindMysqlDuration: + return d.GetMysqlDuration().ToNumber(), nil + default: + return ConvertDatumToDecimal(sc, *d) + } +} + +// ToInt64 converts to a int64. +func (d *Datum) ToInt64(sc *stmtctx.StatementContext) (int64, error) { + return d.toSignedInteger(sc, mysql.TypeLonglong) +} + +func (d *Datum) toSignedInteger(sc *stmtctx.StatementContext, tp byte) (int64, error) { + lowerBound := IntergerSignedLowerBound(tp) + upperBound := IntergerSignedUpperBound(tp) + switch d.Kind() { + case KindInt64: + return ConvertIntToInt(d.GetInt64(), lowerBound, upperBound, tp) + case KindUint64: + return ConvertUintToInt(d.GetUint64(), upperBound, tp) + case KindFloat32: + return ConvertFloatToInt(float64(d.GetFloat32()), lowerBound, upperBound, tp) + case KindFloat64: + return ConvertFloatToInt(d.GetFloat64(), lowerBound, upperBound, tp) + case KindString, KindBytes: + iVal, err := StrToInt(sc, d.GetString()) + iVal, err2 := ConvertIntToInt(iVal, lowerBound, upperBound, tp) + if err == nil { + err = err2 + } + return iVal, errors.Trace(err) + case KindMysqlTime: + // 2011-11-10 11:11:11.999999 -> 20111110111112 + // 2011-11-10 11:59:59.999999 -> 20111110120000 + t, err := d.GetMysqlTime().RoundFrac(sc, DefaultFsp) + if err != nil { + return 0, errors.Trace(err) + } + ival, err := t.ToNumber().ToInt() + ival, err2 := ConvertIntToInt(ival, lowerBound, upperBound, tp) + if err == nil { + err = err2 + } + return ival, errors.Trace(err) + case KindMysqlDuration: + // 11:11:11.999999 -> 111112 + // 11:59:59.999999 -> 120000 + dur, err := d.GetMysqlDuration().RoundFrac(DefaultFsp) + if err != nil { + return 0, errors.Trace(err) + } + ival, err := dur.ToNumber().ToInt() + ival, err2 := ConvertIntToInt(ival, lowerBound, upperBound, tp) + if err == nil { + err = err2 + } + return ival, errors.Trace(err) + case KindMysqlDecimal: + var to MyDecimal + err := d.GetMysqlDecimal().Round(&to, 0, ModeHalfEven) + ival, err1 := to.ToInt() + if err == nil { + err = err1 + } + ival, err2 := ConvertIntToInt(ival, lowerBound, upperBound, tp) + if err == nil { + err = err2 + } + return ival, errors.Trace(err) + case KindMysqlEnum: + fval := d.GetMysqlEnum().ToNumber() + return ConvertFloatToInt(fval, lowerBound, upperBound, tp) + case KindMysqlSet: + fval := d.GetMysqlSet().ToNumber() + return ConvertFloatToInt(fval, lowerBound, upperBound, tp) + case KindMysqlJSON: + return ConvertJSONToInt(sc, d.GetMysqlJSON(), false) + case KindBinaryLiteral, KindMysqlBit: + val, err := d.GetBinaryLiteral().ToInt(sc) + return int64(val), errors.Trace(err) + default: + return 0, errors.Errorf("cannot convert %v(type %T) to int64", d.GetValue(), d.GetValue()) + } +} + +// ToFloat64 converts to a float64 +func (d *Datum) ToFloat64(sc *stmtctx.StatementContext) (float64, error) { + switch d.Kind() { + case KindInt64: + return float64(d.GetInt64()), nil + case KindUint64: + return float64(d.GetUint64()), nil + case KindFloat32: + return float64(d.GetFloat32()), nil + case KindFloat64: + return d.GetFloat64(), nil + case KindString: + return StrToFloat(sc, d.GetString()) + case KindBytes: + return StrToFloat(sc, string(d.GetBytes())) + case KindMysqlTime: + f, err := d.GetMysqlTime().ToNumber().ToFloat64() + return f, errors.Trace(err) + case KindMysqlDuration: + f, err := d.GetMysqlDuration().ToNumber().ToFloat64() + return f, errors.Trace(err) + case KindMysqlDecimal: + f, err := d.GetMysqlDecimal().ToFloat64() + return f, errors.Trace(err) + case KindMysqlEnum: + return d.GetMysqlEnum().ToNumber(), nil + case KindMysqlSet: + return d.GetMysqlSet().ToNumber(), nil + case KindBinaryLiteral, KindMysqlBit: + val, err := d.GetBinaryLiteral().ToInt(sc) + return float64(val), errors.Trace(err) + case KindMysqlJSON: + f, err := ConvertJSONToFloat(sc, d.GetMysqlJSON()) + return f, errors.Trace(err) + default: + return 0, errors.Errorf("cannot convert %v(type %T) to float64", d.GetValue(), d.GetValue()) + } +} + +// ToString gets the string representation of the datum. +func (d *Datum) ToString() (string, error) { + switch d.Kind() { + case KindInt64: + return strconv.FormatInt(d.GetInt64(), 10), nil + case KindUint64: + return strconv.FormatUint(d.GetUint64(), 10), nil + case KindFloat32: + return strconv.FormatFloat(float64(d.GetFloat32()), 'f', -1, 32), nil + case KindFloat64: + return strconv.FormatFloat(d.GetFloat64(), 'f', -1, 64), nil + case KindString: + return d.GetString(), nil + case KindBytes: + return d.GetString(), nil + case KindMysqlTime: + return d.GetMysqlTime().String(), nil + case KindMysqlDuration: + return d.GetMysqlDuration().String(), nil + case KindMysqlDecimal: + return d.GetMysqlDecimal().String(), nil + case KindMysqlEnum: + return d.GetMysqlEnum().String(), nil + case KindMysqlSet: + return d.GetMysqlSet().String(), nil + case KindMysqlJSON: + return d.GetMysqlJSON().String(), nil + case KindBinaryLiteral, KindMysqlBit: + return d.GetBinaryLiteral().ToString(), nil + default: + return "", errors.Errorf("cannot convert %v(type %T) to string", d.GetValue(), d.GetValue()) + } +} + +// ToBytes gets the bytes representation of the datum. +func (d *Datum) ToBytes() ([]byte, error) { + switch d.k { + case KindString, KindBytes: + return d.GetBytes(), nil + default: + str, err := d.ToString() + if err != nil { + return nil, errors.Trace(err) + } + return []byte(str), nil + } +} + +// ToMysqlJSON is similar to convertToMysqlJSON, except the +// latter parses from string, but the former uses it as primitive. +func (d *Datum) ToMysqlJSON() (j json.BinaryJSON, err error) { + var in interface{} + switch d.Kind() { + case KindMysqlJSON: + j = d.GetMysqlJSON() + return + case KindInt64: + in = d.GetInt64() + case KindUint64: + in = d.GetUint64() + case KindFloat32, KindFloat64: + in = d.GetFloat64() + case KindMysqlDecimal: + in, err = d.GetMysqlDecimal().ToFloat64() + case KindString, KindBytes: + in = d.GetString() + case KindBinaryLiteral, KindMysqlBit: + in = d.GetBinaryLiteral().ToString() + case KindNull: + in = nil + default: + in, err = d.ToString() + } + if err != nil { + err = errors.Trace(err) + return + } + j = json.CreateBinary(in) + return +} + +func invalidConv(d *Datum, tp byte) (Datum, error) { + return Datum{}, errors.Errorf("cannot convert datum from %s to type %s.", KindStr(d.Kind()), TypeStr(tp)) +} + +func (d *Datum) convergeType(hasUint, hasDecimal, hasFloat *bool) (x Datum) { + x = *d + switch d.Kind() { + case KindUint64: + *hasUint = true + case KindFloat32: + f := d.GetFloat32() + x.SetFloat64(float64(f)) + *hasFloat = true + case KindFloat64: + *hasFloat = true + case KindMysqlDecimal: + *hasDecimal = true + } + return x +} + +// NewDatum creates a new Datum from an interface{}. +func NewDatum(in interface{}) (d Datum) { + switch x := in.(type) { + case []interface{}: + d.SetValue(MakeDatums(x...)) + default: + d.SetValue(in) + } + return d +} + +// NewIntDatum creates a new Datum from an int64 value. +func NewIntDatum(i int64) (d Datum) { + d.SetInt64(i) + return d +} + +// NewUintDatum creates a new Datum from an uint64 value. +func NewUintDatum(i uint64) (d Datum) { + d.SetUint64(i) + return d +} + +// NewBytesDatum creates a new Datum from a byte slice. +func NewBytesDatum(b []byte) (d Datum) { + d.SetBytes(b) + return d +} + +// NewStringDatum creates a new Datum from a string. +func NewStringDatum(s string) (d Datum) { + d.SetString(s) + return d +} + +// NewFloat64Datum creates a new Datum from a float64 value. +func NewFloat64Datum(f float64) (d Datum) { + d.SetFloat64(f) + return d +} + +// NewFloat32Datum creates a new Datum from a float32 value. +func NewFloat32Datum(f float32) (d Datum) { + d.SetFloat32(f) + return d +} + +// NewDurationDatum creates a new Datum from a Duration value. +func NewDurationDatum(dur Duration) (d Datum) { + d.SetMysqlDuration(dur) + return d +} + +// NewTimeDatum creates a new Time from a Time value. +func NewTimeDatum(t Time) (d Datum) { + d.SetMysqlTime(t) + return d +} + +// NewDecimalDatum creates a new Datum form a MyDecimal value. +func NewDecimalDatum(dec *MyDecimal) (d Datum) { + d.SetMysqlDecimal(dec) + return d +} + +// NewBinaryLiteralDatum creates a new BinaryLiteral Datum for a BinaryLiteral value. +func NewBinaryLiteralDatum(b BinaryLiteral) (d Datum) { + d.SetBinaryLiteral(b) + return d +} + +// NewMysqlBitDatum creates a new MysqlBit Datum for a BinaryLiteral value. +func NewMysqlBitDatum(b BinaryLiteral) (d Datum) { + d.SetMysqlBit(b) + return d +} + +// NewMysqlEnumDatum creates a new MysqlEnum Datum for a Enum value. +func NewMysqlEnumDatum(e Enum) (d Datum) { + d.SetMysqlEnum(e) + return d +} + +// MakeDatums creates datum slice from interfaces. +func MakeDatums(args ...interface{}) []Datum { + datums := make([]Datum, len(args)) + for i, v := range args { + datums[i] = NewDatum(v) + } + return datums +} + +// MinNotNullDatum returns a datum represents minimum not null value. +func MinNotNullDatum() Datum { + return Datum{k: KindMinNotNull} +} + +// MaxValueDatum returns a datum represents max value. +func MaxValueDatum() Datum { + return Datum{k: KindMaxValue} +} + +// EqualDatums compare if a and b contains the same datum values. +func EqualDatums(sc *stmtctx.StatementContext, a []Datum, b []Datum) (bool, error) { + if len(a) != len(b) { + return false, nil + } + if a == nil && b == nil { + return true, nil + } + if a == nil || b == nil { + return false, nil + } + for i, ai := range a { + v, err := ai.CompareDatum(sc, &b[i]) + if err != nil { + return false, errors.Trace(err) + } + if v != 0 { + return false, nil + } + } + return true, nil +} + +// SortDatums sorts a slice of datum. +func SortDatums(sc *stmtctx.StatementContext, datums []Datum) error { + sorter := datumsSorter{datums: datums, sc: sc} + sort.Sort(&sorter) + return sorter.err +} + +type datumsSorter struct { + datums []Datum + sc *stmtctx.StatementContext + err error +} + +func (ds *datumsSorter) Len() int { + return len(ds.datums) +} + +func (ds *datumsSorter) Less(i, j int) bool { + cmp, err := ds.datums[i].CompareDatum(ds.sc, &ds.datums[j]) + if err != nil { + ds.err = errors.Trace(err) + return true + } + return cmp < 0 +} + +func (ds *datumsSorter) Swap(i, j int) { + ds.datums[i], ds.datums[j] = ds.datums[j], ds.datums[i] +} + +func handleTruncateError(sc *stmtctx.StatementContext, err error) error { + if sc.IgnoreTruncate { + return nil + } + if !sc.TruncateAsWarning { + return err + } + sc.AppendWarning(err) + return nil +} + +// DatumsToString converts several datums to formatted string. +func DatumsToString(datums []Datum, handleSpecialValue bool) (string, error) { + strs := make([]string, 0, len(datums)) + for _, datum := range datums { + if handleSpecialValue { + switch datum.Kind() { + case KindNull: + strs = append(strs, "NULL") + continue + case KindMinNotNull: + strs = append(strs, "-inf") + continue + case KindMaxValue: + strs = append(strs, "+inf") + continue + } + } + str, err := datum.ToString() + if err != nil { + return "", errors.Trace(err) + } + strs = append(strs, str) + } + size := len(datums) + if size > 1 { + strs[0] = "(" + strs[0] + strs[size-1] = strs[size-1] + ")" + } + return strings.Join(strs, ", "), nil +} + +// DatumsToStrNoErr converts some datums to a formatted string. +// If an error occurs, it will print a log instead of returning an error. +func DatumsToStrNoErr(datums []Datum) string { + str, err := DatumsToString(datums, true) + terror.Log(errors.Trace(err)) + return str +} + +// CloneDatum returns a new copy of the datum. +// TODO: Abandon this function. +func CloneDatum(datum Datum) Datum { + return *datum.Copy() +} + +// CloneRow deep copies a Datum slice. +func CloneRow(dr []Datum) []Datum { + c := make([]Datum, len(dr)) + for i, d := range dr { + c[i] = *d.Copy() + } + return c +} diff --git a/vendor/github.com/pingcap/tidb/types/datum_eval.go b/vendor/github.com/pingcap/tidb/types/datum_eval.go new file mode 100644 index 0000000..a2d4d74 --- /dev/null +++ b/vendor/github.com/pingcap/tidb/types/datum_eval.go @@ -0,0 +1,66 @@ +// Copyright 2016 PingCAP, Inc. +// +// 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package types + +import ( + "github.com/cznic/mathutil" + "github.com/pingcap/errors" + "github.com/pingcap/parser/opcode" +) + +// ComputePlus computes the result of a+b. +func ComputePlus(a, b Datum) (d Datum, err error) { + switch a.Kind() { + case KindInt64: + switch b.Kind() { + case KindInt64: + r, err1 := AddInt64(a.GetInt64(), b.GetInt64()) + d.SetInt64(r) + return d, errors.Trace(err1) + case KindUint64: + r, err1 := AddInteger(b.GetUint64(), a.GetInt64()) + d.SetUint64(r) + return d, errors.Trace(err1) + } + case KindUint64: + switch b.Kind() { + case KindInt64: + r, err1 := AddInteger(a.GetUint64(), b.GetInt64()) + d.SetUint64(r) + return d, errors.Trace(err1) + case KindUint64: + r, err1 := AddUint64(a.GetUint64(), b.GetUint64()) + d.SetUint64(r) + return d, errors.Trace(err1) + } + case KindFloat64: + switch b.Kind() { + case KindFloat64: + r := a.GetFloat64() + b.GetFloat64() + d.SetFloat64(r) + return d, nil + } + case KindMysqlDecimal: + switch b.Kind() { + case KindMysqlDecimal: + r := new(MyDecimal) + err = DecimalAdd(a.GetMysqlDecimal(), b.GetMysqlDecimal(), r) + d.SetMysqlDecimal(r) + d.SetFrac(mathutil.Max(a.Frac(), b.Frac())) + return d, err + } + } + _, err = InvOp2(a.GetValue(), b.GetValue(), opcode.Plus) + return d, err +} diff --git a/vendor/github.com/pingcap/tidb/types/enum.go b/vendor/github.com/pingcap/tidb/types/enum.go new file mode 100644 index 0000000..45c15a3 --- /dev/null +++ b/vendor/github.com/pingcap/tidb/types/enum.go @@ -0,0 +1,62 @@ +// Copyright 2015 PingCAP, Inc. +// +// 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package types + +import ( + "strconv" + "strings" + + "github.com/pingcap/errors" +) + +// Enum is for MySQL enum type. +type Enum struct { + Name string + Value uint64 +} + +// String implements fmt.Stringer interface. +func (e Enum) String() string { + return e.Name +} + +// ToNumber changes enum index to float64 for numeric operation. +func (e Enum) ToNumber() float64 { + return float64(e.Value) +} + +// ParseEnumName creates a Enum with item name. +func ParseEnumName(elems []string, name string) (Enum, error) { + for i, n := range elems { + if strings.EqualFold(n, name) { + return Enum{Name: n, Value: uint64(i) + 1}, nil + } + } + + // name doesn't exist, maybe an integer? + if num, err := strconv.ParseUint(name, 0, 64); err == nil { + return ParseEnumValue(elems, num) + } + + return Enum{}, errors.Errorf("item %s is not in enum %v", name, elems) +} + +// ParseEnumValue creates a Enum with special number. +func ParseEnumValue(elems []string, number uint64) (Enum, error) { + if number == 0 || number > uint64(len(elems)) { + return Enum{}, errors.Errorf("number %d overflow enum boundary [1, %d]", number, len(elems)) + } + + return Enum{Name: elems[number-1], Value: number}, nil +} diff --git a/vendor/github.com/pingcap/tidb/types/errors.go b/vendor/github.com/pingcap/tidb/types/errors.go new file mode 100644 index 0000000..2881595 --- /dev/null +++ b/vendor/github.com/pingcap/tidb/types/errors.go @@ -0,0 +1,134 @@ +// Copyright 2016 PingCAP, Inc. +// +// 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package types + +import ( + "github.com/pingcap/errors" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/terror" + parser_types "github.com/pingcap/parser/types" +) + +var ( + // ErrDataTooLong is returned when converts a string value that is longer than field type length. + ErrDataTooLong = terror.ClassTypes.New(codeDataTooLong, "Data Too Long") + // ErrIllegalValueForType is returned when value of type is illegal. + ErrIllegalValueForType = terror.ClassTypes.New(codeIllegalValueForType, mysql.MySQLErrName[mysql.ErrIllegalValueForType]) + // ErrTruncated is returned when data has been truncated during conversion. + ErrTruncated = terror.ClassTypes.New(codeTruncated, "Data Truncated") + // ErrTruncatedWrongVal is returned when data has been truncated during conversion. + ErrTruncatedWrongVal = terror.ClassTypes.New(codeTruncatedWrongValue, msgTruncatedWrongVal) + // ErrOverflow is returned when data is out of range for a field type. + ErrOverflow = terror.ClassTypes.New(codeOverflow, msgOverflow) + // ErrDivByZero is return when do division by 0. + ErrDivByZero = terror.ClassTypes.New(codeDivByZero, "Division by 0") + // ErrTooBigDisplayWidth is return when display width out of range for column. + ErrTooBigDisplayWidth = terror.ClassTypes.New(codeTooBigDisplayWidth, mysql.MySQLErrName[mysql.ErrTooBigDisplaywidth]) + // ErrTooBigFieldLength is return when column length too big for column. + ErrTooBigFieldLength = terror.ClassTypes.New(codeTooBigFieldLength, "Too Big Field length") + // ErrTooBigSet is returned when too many strings for column. + ErrTooBigSet = terror.ClassTypes.New(codeTooBigSet, "Too Big Set") + // ErrTooBigScale is returned when type DECIMAL/NUMERIC scale is bigger than mysql.MaxDecimalScale. + ErrTooBigScale = terror.ClassTypes.New(codeTooBigScale, mysql.MySQLErrName[mysql.ErrTooBigScale]) + // ErrTooBigPrecision is returned when type DECIMAL/NUMERIC precision is bigger than mysql.MaxDecimalWidth + ErrTooBigPrecision = terror.ClassTypes.New(codeTooBigPrecision, mysql.MySQLErrName[mysql.ErrTooBigPrecision]) + // ErrWrongFieldSpec is return when incorrect column specifier for column. + ErrWrongFieldSpec = terror.ClassTypes.New(codeWrongFieldSpec, "Wrong Field Spec") + // ErrBadNumber is return when parsing an invalid binary decimal number. + ErrBadNumber = terror.ClassTypes.New(codeBadNumber, "Bad Number") + // ErrInvalidDefault is returned when meet a invalid default value. + ErrInvalidDefault = parser_types.ErrInvalidDefault + // ErrInvalidFieldSize is returned when the precision of a column is out of range. + ErrInvalidFieldSize = terror.ClassTypes.New(codeInvalidFieldSize, mysql.MySQLErrName[mysql.ErrInvalidFieldSize]) + // ErrCastAsSignedOverflow is returned when positive out-of-range integer, and convert to it's negative complement. + ErrCastAsSignedOverflow = terror.ClassTypes.New(codeUnknown, msgCastAsSignedOverflow) + // ErrCastNegIntAsUnsigned is returned when a negative integer be casted to an unsigned int. + ErrCastNegIntAsUnsigned = terror.ClassTypes.New(codeUnknown, msgCastNegIntAsUnsigned) + // ErrMBiggerThanD is returned when precision less than the scale. + ErrMBiggerThanD = terror.ClassTypes.New(codeMBiggerThanD, mysql.MySQLErrName[mysql.ErrMBiggerThanD]) + // ErrWarnDataOutOfRange is returned when the value in a numeric column that is outside the permissible range of the column data type. + // See https://dev.mysql.com/doc/refman/5.5/en/out-of-range-and-overflow.html for details + ErrWarnDataOutOfRange = terror.ClassTypes.New(codeDataOutOfRange, mysql.MySQLErrName[mysql.ErrWarnDataOutOfRange]) + // ErrDuplicatedValueInType is returned when enum column has duplicated value. + ErrDuplicatedValueInType = terror.ClassTypes.New(codeDuplicatedValueInType, mysql.MySQLErrName[mysql.ErrDuplicatedValueInType]) + // ErrDatetimeFunctionOverflow is returned when the calculation in datetime function cause overflow. + ErrDatetimeFunctionOverflow = terror.ClassTypes.New(codeDatetimeFunctionOverflow, mysql.MySQLErrName[mysql.ErrDatetimeFunctionOverflow]) + // ErrInvalidTimeFormat is returned when the time format is not correct. + ErrInvalidTimeFormat = terror.ClassTypes.New(mysql.ErrTruncatedWrongValue, "invalid time format: '%v'") + // ErrInvalidWeekModeFormat is returned when the week mode is wrong. + ErrInvalidWeekModeFormat = terror.ClassTypes.New(mysql.ErrTruncatedWrongValue, "invalid week mode format: '%v'") + // ErrInvalidYearFormat is returned when the input is not a valid year format. + ErrInvalidYearFormat = errors.New("invalid year format") + // ErrInvalidYear is returned when the input value is not a valid year. + ErrInvalidYear = errors.New("invalid year") + // ErrIncorrectDatetimeValue is returned when the input is not valid date time value. + ErrIncorrectDatetimeValue = terror.ClassTypes.New(mysql.ErrTruncatedWrongValue, "Incorrect datetime value: '%s'") + // ErrTruncatedWrongValue is returned then + ErrTruncatedWrongValue = terror.ClassTypes.New(mysql.ErrTruncatedWrongValue, mysql.MySQLErrName[mysql.ErrTruncatedWrongValue]) +) + +const ( + codeBadNumber terror.ErrCode = 1 + + codeDataTooLong = terror.ErrCode(mysql.ErrDataTooLong) + codeIllegalValueForType = terror.ErrCode(mysql.ErrIllegalValueForType) + codeTruncated = terror.ErrCode(mysql.WarnDataTruncated) + codeOverflow = terror.ErrCode(mysql.ErrDataOutOfRange) + codeDivByZero = terror.ErrCode(mysql.ErrDivisionByZero) + codeTooBigDisplayWidth = terror.ErrCode(mysql.ErrTooBigDisplaywidth) + codeTooBigFieldLength = terror.ErrCode(mysql.ErrTooBigFieldlength) + codeTooBigSet = terror.ErrCode(mysql.ErrTooBigSet) + codeTooBigScale = terror.ErrCode(mysql.ErrTooBigScale) + codeTooBigPrecision = terror.ErrCode(mysql.ErrTooBigPrecision) + codeWrongFieldSpec = terror.ErrCode(mysql.ErrWrongFieldSpec) + codeTruncatedWrongValue = terror.ErrCode(mysql.ErrTruncatedWrongValue) + codeUnknown = terror.ErrCode(mysql.ErrUnknown) + codeInvalidDefault = terror.ErrCode(mysql.ErrInvalidDefault) + codeInvalidFieldSize = terror.ErrCode(mysql.ErrInvalidFieldSize) + codeMBiggerThanD = terror.ErrCode(mysql.ErrMBiggerThanD) + codeDataOutOfRange = terror.ErrCode(mysql.ErrWarnDataOutOfRange) + codeDuplicatedValueInType = terror.ErrCode(mysql.ErrDuplicatedValueInType) + codeDatetimeFunctionOverflow = terror.ErrCode(mysql.ErrDatetimeFunctionOverflow) +) + +var ( + msgOverflow = mysql.MySQLErrName[mysql.ErrDataOutOfRange] + msgTruncatedWrongVal = mysql.MySQLErrName[mysql.ErrTruncatedWrongValue] + msgCastAsSignedOverflow = "Cast to signed converted positive out-of-range integer to it's negative complement" + msgCastNegIntAsUnsigned = "Cast to unsigned converted negative integer to it's positive complement" +) + +func init() { + typesMySQLErrCodes := map[terror.ErrCode]uint16{ + codeDataTooLong: mysql.ErrDataTooLong, + codeIllegalValueForType: mysql.ErrIllegalValueForType, + codeTruncated: mysql.WarnDataTruncated, + codeOverflow: mysql.ErrDataOutOfRange, + codeDivByZero: mysql.ErrDivisionByZero, + codeTooBigDisplayWidth: mysql.ErrTooBigDisplaywidth, + codeTooBigFieldLength: mysql.ErrTooBigFieldlength, + codeTooBigSet: mysql.ErrTooBigSet, + codeTooBigScale: mysql.ErrTooBigScale, + codeTooBigPrecision: mysql.ErrTooBigPrecision, + codeWrongFieldSpec: mysql.ErrWrongFieldSpec, + codeTruncatedWrongValue: mysql.ErrTruncatedWrongValue, + codeUnknown: mysql.ErrUnknown, + codeInvalidDefault: mysql.ErrInvalidDefault, + codeMBiggerThanD: mysql.ErrMBiggerThanD, + codeDataOutOfRange: mysql.ErrWarnDataOutOfRange, + codeDuplicatedValueInType: mysql.ErrDuplicatedValueInType, + codeDatetimeFunctionOverflow: mysql.ErrDatetimeFunctionOverflow, + } + terror.ErrClassToMySQLCodes[terror.ClassTypes] = typesMySQLErrCodes +} diff --git a/vendor/github.com/pingcap/tidb/types/etc.go b/vendor/github.com/pingcap/tidb/types/etc.go new file mode 100644 index 0000000..e29c911 --- /dev/null +++ b/vendor/github.com/pingcap/tidb/types/etc.go @@ -0,0 +1,169 @@ +// Copyright 2014 The ql Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSES/QL-LICENSE file. + +// Copyright 2015 PingCAP, Inc. +// +// 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package types + +import ( + "io" + + "github.com/pingcap/errors" + "github.com/pingcap/parser/charset" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/opcode" + "github.com/pingcap/parser/terror" + ast "github.com/pingcap/parser/types" +) + +// IsTypeBlob returns a boolean indicating whether the tp is a blob type. +var IsTypeBlob = ast.IsTypeBlob + +// IsTypeChar returns a boolean indicating +// whether the tp is the char type like a string type or a varchar type. +var IsTypeChar = ast.IsTypeChar + +// IsTypeVarchar returns a boolean indicating +// whether the tp is the varchar type like a varstring type or a varchar type. +func IsTypeVarchar(tp byte) bool { + return tp == mysql.TypeVarString || tp == mysql.TypeVarchar +} + +// IsTypeUnspecified returns a boolean indicating whether the tp is the Unspecified type. +func IsTypeUnspecified(tp byte) bool { + return tp == mysql.TypeUnspecified +} + +// IsTypePrefixable returns a boolean indicating +// whether an index on a column with the tp can be defined with a prefix. +func IsTypePrefixable(tp byte) bool { + return IsTypeBlob(tp) || IsTypeChar(tp) +} + +// IsTypeFractionable returns a boolean indicating +// whether the tp can has time fraction. +func IsTypeFractionable(tp byte) bool { + return tp == mysql.TypeDatetime || tp == mysql.TypeDuration || tp == mysql.TypeTimestamp +} + +// IsTypeTime returns a boolean indicating +// whether the tp is time type like datetime, date or timestamp. +func IsTypeTime(tp byte) bool { + return tp == mysql.TypeDatetime || tp == mysql.TypeDate || tp == mysql.TypeTimestamp +} + +// IsTypeNumeric returns a boolean indicating whether the tp is numeric type. +func IsTypeNumeric(tp byte) bool { + switch tp { + case mysql.TypeBit, mysql.TypeTiny, mysql.TypeInt24, mysql.TypeLong, mysql.TypeLonglong, mysql.TypeNewDecimal, + mysql.TypeDecimal, mysql.TypeFloat, mysql.TypeDouble, mysql.TypeShort: + return true + } + return false +} + +// IsTemporalWithDate returns a boolean indicating +// whether the tp is time type with date. +func IsTemporalWithDate(tp byte) bool { + return IsTypeTime(tp) +} + +// IsBinaryStr returns a boolean indicating +// whether the field type is a binary string type. +func IsBinaryStr(ft *FieldType) bool { + return ft.Collate == charset.CollationBin && IsString(ft.Tp) +} + +// IsNonBinaryStr returns a boolean indicating +// whether the field type is a non-binary string type. +func IsNonBinaryStr(ft *FieldType) bool { + if ft.Collate != charset.CollationBin && IsString(ft.Tp) { + return true + } + return false +} + +// IsString returns a boolean indicating +// whether the field type is a string type. +func IsString(tp byte) bool { + return IsTypeChar(tp) || IsTypeBlob(tp) || IsTypeVarchar(tp) || IsTypeUnspecified(tp) +} + +var kind2Str = map[byte]string{ + KindNull: "null", + KindInt64: "bigint", + KindUint64: "unsigned bigint", + KindFloat32: "float", + KindFloat64: "double", + KindString: "char", + KindBytes: "bytes", + KindBinaryLiteral: "bit/hex literal", + KindMysqlDecimal: "decimal", + KindMysqlDuration: "time", + KindMysqlEnum: "enum", + KindMysqlBit: "bit", + KindMysqlSet: "set", + KindMysqlTime: "datetime", + KindInterface: "interface", + KindMinNotNull: "min_not_null", + KindMaxValue: "max_value", + KindRaw: "raw", + KindMysqlJSON: "json", +} + +// TypeStr converts tp to a string. +var TypeStr = ast.TypeStr + +// KindStr converts kind to a string. +func KindStr(kind byte) (r string) { + return kind2Str[kind] +} + +// TypeToStr converts a field to a string. +// It is used for converting Text to Blob, +// or converting Char to Binary. +// Args: +// tp: type enum +// cs: charset +var TypeToStr = ast.TypeToStr + +// EOFAsNil filtrates errors, +// If err is equal to io.EOF returns nil. +func EOFAsNil(err error) error { + if terror.ErrorEqual(err, io.EOF) { + return nil + } + return errors.Trace(err) +} + +// InvOp2 returns an invalid operation error. +func InvOp2(x, y interface{}, o opcode.Op) (interface{}, error) { + return nil, errors.Errorf("Invalid operation: %v %v %v (mismatched types %T and %T)", x, o, y, x, y) +} + +// overflow returns an overflowed error. +func overflow(v interface{}, tp byte) error { + return ErrOverflow.GenWithStack("constant %v overflows %s", v, TypeStr(tp)) +} + +// IsTypeTemporal checks if a type is a temporal type. +func IsTypeTemporal(tp byte) bool { + switch tp { + case mysql.TypeDuration, mysql.TypeDatetime, mysql.TypeTimestamp, + mysql.TypeDate, mysql.TypeNewDate: + return true + } + return false +} diff --git a/vendor/github.com/pingcap/tidb/types/eval_type.go b/vendor/github.com/pingcap/tidb/types/eval_type.go new file mode 100644 index 0000000..3eb17ca --- /dev/null +++ b/vendor/github.com/pingcap/tidb/types/eval_type.go @@ -0,0 +1,38 @@ +// Copyright 2017 PingCAP, Inc. +// +// 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package types + +import ast "github.com/pingcap/parser/types" + +// EvalType indicates the specified types that arguments and result of a built-in function should be. +type EvalType = ast.EvalType + +const ( + // ETInt represents type INT in evaluation. + ETInt = ast.ETInt + // ETReal represents type REAL in evaluation. + ETReal = ast.ETReal + // ETDecimal represents type DECIMAL in evaluation. + ETDecimal = ast.ETDecimal + // ETString represents type STRING in evaluation. + ETString = ast.ETString + // ETDatetime represents type DATETIME in evaluation. + ETDatetime = ast.ETDatetime + // ETTimestamp represents type TIMESTAMP in evaluation. + ETTimestamp = ast.ETTimestamp + // ETDuration represents type DURATION in evaluation. + ETDuration = ast.ETDuration + // ETJson represents type JSON in evaluation. + ETJson = ast.ETJson +) diff --git a/vendor/github.com/pingcap/tidb/types/field_name.go b/vendor/github.com/pingcap/tidb/types/field_name.go new file mode 100644 index 0000000..6affe85 --- /dev/null +++ b/vendor/github.com/pingcap/tidb/types/field_name.go @@ -0,0 +1,42 @@ +// Copyright 2019 PingCAP, Inc. +// +// 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package types + +import ( + "strings" + + "github.com/pingcap/parser/model" +) + +// FieldName records the names used for mysql protocol. +type FieldName struct { + OrigTblName model.CIStr + OrigColName model.CIStr + DBName model.CIStr + TblName model.CIStr + ColName model.CIStr +} + +// String implements Stringer interface. +func (name *FieldName) String() string { + builder := strings.Builder{} + if name.TblName.L != "" { + builder.WriteString(name.TblName.L + ".") + } + if name.DBName.L != "" { + builder.WriteString(name.DBName.L + ".") + } + builder.WriteString(name.ColName.L) + return builder.String() +} diff --git a/vendor/github.com/pingcap/tidb/types/field_type.go b/vendor/github.com/pingcap/tidb/types/field_type.go new file mode 100644 index 0000000..f8d51d1 --- /dev/null +++ b/vendor/github.com/pingcap/tidb/types/field_type.go @@ -0,0 +1,1241 @@ +// Copyright 2015 PingCAP, Inc. +// +// 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package types + +import ( + "strconv" + + "github.com/pingcap/parser/charset" + "github.com/pingcap/parser/mysql" + ast "github.com/pingcap/parser/types" + "github.com/pingcap/tidb/types/json" + utilMath "github.com/pingcap/tidb/util/math" +) + +// UnspecifiedLength is unspecified length. +const ( + UnspecifiedLength = -1 +) + +// FieldType records field type information. +type FieldType = ast.FieldType + +// NewFieldType returns a FieldType, +// with a type and other information about field type. +func NewFieldType(tp byte) *FieldType { + return &FieldType{ + Tp: tp, + Flen: UnspecifiedLength, + Decimal: UnspecifiedLength, + } +} + +// AggFieldType aggregates field types for a multi-argument function like `IF`, `IFNULL`, `COALESCE` +// whose return type is determined by the arguments' FieldTypes. +// Aggregation is performed by MergeFieldType function. +func AggFieldType(tps []*FieldType) *FieldType { + var currType FieldType + for i, t := range tps { + if i == 0 && currType.Tp == mysql.TypeUnspecified { + currType = *t + continue + } + mtp := MergeFieldType(currType.Tp, t.Tp) + currType.Tp = mtp + } + + return &currType +} + +// AggregateEvalType aggregates arguments' EvalType of a multi-argument function. +func AggregateEvalType(fts []*FieldType, flag *uint) EvalType { + var ( + aggregatedEvalType = ETString + unsigned bool + gotFirst bool + gotBinString bool + ) + lft := fts[0] + for _, ft := range fts { + if ft.Tp == mysql.TypeNull { + continue + } + et := ft.EvalType() + rft := ft + if (IsTypeBlob(ft.Tp) || IsTypeVarchar(ft.Tp) || IsTypeChar(ft.Tp)) && mysql.HasBinaryFlag(ft.Flag) { + gotBinString = true + } + if !gotFirst { + gotFirst = true + aggregatedEvalType = et + unsigned = mysql.HasUnsignedFlag(ft.Flag) + } else { + aggregatedEvalType = mergeEvalType(aggregatedEvalType, et, lft, rft, unsigned, mysql.HasUnsignedFlag(ft.Flag)) + unsigned = unsigned && mysql.HasUnsignedFlag(ft.Flag) + } + lft = rft + } + setTypeFlag(flag, mysql.UnsignedFlag, unsigned) + setTypeFlag(flag, mysql.BinaryFlag, !aggregatedEvalType.IsStringKind() || gotBinString) + return aggregatedEvalType +} + +func mergeEvalType(lhs, rhs EvalType, lft, rft *FieldType, isLHSUnsigned, isRHSUnsigned bool) EvalType { + if lft.Tp == mysql.TypeUnspecified || rft.Tp == mysql.TypeUnspecified { + if lft.Tp == rft.Tp { + return ETString + } + if lft.Tp == mysql.TypeUnspecified { + lhs = rhs + } else { + rhs = lhs + } + } + if lhs.IsStringKind() || rhs.IsStringKind() { + return ETString + } else if lhs == ETReal || rhs == ETReal { + return ETReal + } else if lhs == ETDecimal || rhs == ETDecimal || isLHSUnsigned != isRHSUnsigned { + return ETDecimal + } + return ETInt +} + +func setTypeFlag(flag *uint, flagItem uint, on bool) { + if on { + *flag |= flagItem + } else { + *flag &= ^flagItem + } +} + +// DefaultParamTypeForValue returns the default FieldType for the parameterized value. +func DefaultParamTypeForValue(value interface{}, tp *FieldType) { + switch value.(type) { + case nil: + tp.Tp = mysql.TypeVarString + tp.Flen = UnspecifiedLength + tp.Decimal = UnspecifiedLength + default: + DefaultTypeForValue(value, tp) + if hasVariantFieldLength(tp) { + tp.Flen = UnspecifiedLength + } + if tp.Tp == mysql.TypeUnspecified { + tp.Tp = mysql.TypeVarString + } + } +} + +func hasVariantFieldLength(tp *FieldType) bool { + switch tp.Tp { + case mysql.TypeLonglong, mysql.TypeVarString, mysql.TypeDouble, mysql.TypeBlob, + mysql.TypeBit, mysql.TypeDuration, mysql.TypeNewDecimal, mysql.TypeEnum, mysql.TypeSet: + return true + } + return false +} + +// DefaultTypeForValue returns the default FieldType for the value. +func DefaultTypeForValue(value interface{}, tp *FieldType) { + switch x := value.(type) { + case nil: + tp.Tp = mysql.TypeNull + tp.Flen = 0 + tp.Decimal = 0 + SetBinChsClnFlag(tp) + case bool: + tp.Tp = mysql.TypeLonglong + tp.Flen = 1 + tp.Decimal = 0 + tp.Flag |= mysql.IsBooleanFlag + SetBinChsClnFlag(tp) + case int: + tp.Tp = mysql.TypeLonglong + tp.Flen = utilMath.StrLenOfInt64Fast(int64(x)) + tp.Decimal = 0 + SetBinChsClnFlag(tp) + case int64: + tp.Tp = mysql.TypeLonglong + tp.Flen = utilMath.StrLenOfInt64Fast(x) + tp.Decimal = 0 + SetBinChsClnFlag(tp) + case uint64: + tp.Tp = mysql.TypeLonglong + tp.Flag |= mysql.UnsignedFlag + tp.Flen = utilMath.StrLenOfUint64Fast(x) + tp.Decimal = 0 + SetBinChsClnFlag(tp) + case string: + tp.Tp = mysql.TypeVarString + // TODO: tp.Flen should be len(x) * 3 (max bytes length of CharsetUTF8) + tp.Flen = len(x) + tp.Decimal = UnspecifiedLength + tp.Charset, tp.Collate = charset.GetDefaultCharsetAndCollate() + case float32: + tp.Tp = mysql.TypeFloat + s := strconv.FormatFloat(float64(x), 'f', -1, 32) + tp.Flen = len(s) + tp.Decimal = UnspecifiedLength + SetBinChsClnFlag(tp) + case float64: + tp.Tp = mysql.TypeDouble + s := strconv.FormatFloat(x, 'f', -1, 64) + tp.Flen = len(s) + tp.Decimal = UnspecifiedLength + SetBinChsClnFlag(tp) + case []byte: + tp.Tp = mysql.TypeBlob + tp.Flen = len(x) + tp.Decimal = UnspecifiedLength + SetBinChsClnFlag(tp) + case BitLiteral: + tp.Tp = mysql.TypeVarString + tp.Flen = len(x) + tp.Decimal = 0 + SetBinChsClnFlag(tp) + case HexLiteral: + tp.Tp = mysql.TypeVarString + tp.Flen = len(x) * 3 + tp.Decimal = 0 + tp.Flag |= mysql.UnsignedFlag + SetBinChsClnFlag(tp) + case BinaryLiteral: + tp.Tp = mysql.TypeBit + tp.Flen = len(x) * 8 + tp.Decimal = 0 + SetBinChsClnFlag(tp) + tp.Flag &= ^mysql.BinaryFlag + tp.Flag |= mysql.UnsignedFlag + case Time: + tp.Tp = x.Type + switch x.Type { + case mysql.TypeDate: + tp.Flen = mysql.MaxDateWidth + tp.Decimal = UnspecifiedLength + case mysql.TypeDatetime, mysql.TypeTimestamp: + tp.Flen = mysql.MaxDatetimeWidthNoFsp + if x.Fsp > DefaultFsp { // consider point('.') and the fractional part. + tp.Flen += int(x.Fsp) + 1 + } + tp.Decimal = int(x.Fsp) + } + SetBinChsClnFlag(tp) + case Duration: + tp.Tp = mysql.TypeDuration + tp.Flen = len(x.String()) + if x.Fsp > DefaultFsp { // consider point('.') and the fractional part. + tp.Flen = int(x.Fsp) + 1 + } + tp.Decimal = int(x.Fsp) + SetBinChsClnFlag(tp) + case *MyDecimal: + tp.Tp = mysql.TypeNewDecimal + tp.Flen = len(x.ToString()) + tp.Decimal = int(x.digitsFrac) + SetBinChsClnFlag(tp) + case Enum: + tp.Tp = mysql.TypeEnum + tp.Flen = len(x.Name) + tp.Decimal = UnspecifiedLength + SetBinChsClnFlag(tp) + case Set: + tp.Tp = mysql.TypeSet + tp.Flen = len(x.Name) + tp.Decimal = UnspecifiedLength + SetBinChsClnFlag(tp) + case json.BinaryJSON: + tp.Tp = mysql.TypeJSON + tp.Flen = UnspecifiedLength + tp.Decimal = 0 + tp.Charset = charset.CharsetBin + tp.Collate = charset.CollationBin + default: + tp.Tp = mysql.TypeUnspecified + tp.Flen = UnspecifiedLength + tp.Decimal = UnspecifiedLength + } +} + +// DefaultCharsetForType returns the default charset/collation for mysql type. +func DefaultCharsetForType(tp byte) (string, string) { + switch tp { + case mysql.TypeVarString, mysql.TypeString, mysql.TypeVarchar: + // Default charset for string types is utf8. + return mysql.DefaultCharset, mysql.DefaultCollationName + } + return charset.CharsetBin, charset.CollationBin +} + +// MergeFieldType merges two MySQL type to a new type. +// This is used in hybrid field type expression. +// For example "select case c when 1 then 2 when 2 then 'tidb' from t;" +// The result field type of the case expression is the merged type of the two when clause. +// See https://github.com/mysql/mysql-server/blob/5.7/sql/field.cc#L1042 +func MergeFieldType(a byte, b byte) byte { + ia := getFieldTypeIndex(a) + ib := getFieldTypeIndex(b) + return fieldTypeMergeRules[ia][ib] +} + +func getFieldTypeIndex(tp byte) int { + itp := int(tp) + if itp < fieldTypeTearFrom { + return itp + } + return fieldTypeTearFrom + itp - fieldTypeTearTo - 1 +} + +const ( + fieldTypeTearFrom = int(mysql.TypeBit) + 1 + fieldTypeTearTo = int(mysql.TypeJSON) - 1 + fieldTypeNum = fieldTypeTearFrom + (255 - fieldTypeTearTo) +) + +var fieldTypeMergeRules = [fieldTypeNum][fieldTypeNum]byte{ + /* mysql.TypeDecimal -> */ + { + //mysql.TypeDecimal mysql.TypeTiny + mysql.TypeNewDecimal, mysql.TypeNewDecimal, + //mysql.TypeShort mysql.TypeLong + mysql.TypeNewDecimal, mysql.TypeNewDecimal, + //mysql.TypeFloat mysql.TypeDouble + mysql.TypeDouble, mysql.TypeDouble, + //mysql.TypeNull mysql.TypeTimestamp + mysql.TypeNewDecimal, mysql.TypeVarchar, + //mysql.TypeLonglong mysql.TypeInt24 + mysql.TypeDecimal, mysql.TypeDecimal, + //mysql.TypeDate mysql.TypeTime + mysql.TypeVarchar, mysql.TypeVarchar, + //mysql.TypeDatetime mysql.TypeYear + mysql.TypeVarchar, mysql.TypeVarchar, + //mysql.TypeNewDate mysql.TypeVarchar + mysql.TypeVarchar, mysql.TypeVarchar, + //mysql.TypeBit <16>-<244> + mysql.TypeVarchar, + //mysql.TypeJSON + mysql.TypeVarchar, + //mysql.TypeNewDecimal mysql.TypeEnum + mysql.TypeNewDecimal, mysql.TypeVarchar, + //mysql.TypeSet mysql.TypeTinyBlob + mysql.TypeVarchar, mysql.TypeTinyBlob, + //mysql.TypeMediumBlob mysql.TypeLongBlob + mysql.TypeMediumBlob, mysql.TypeLongBlob, + //mysql.TypeBlob mysql.TypeVarString + mysql.TypeBlob, mysql.TypeVarchar, + //mysql.TypeString mysql.TypeGeometry + mysql.TypeString, mysql.TypeVarchar, + }, + /* mysql.TypeTiny -> */ + { + //mysql.TypeDecimal mysql.TypeTiny + mysql.TypeNewDecimal, mysql.TypeTiny, + //mysql.TypeShort mysql.TypeLong + mysql.TypeShort, mysql.TypeLong, + //mysql.TypeFloat mysql.TypeDouble + mysql.TypeFloat, mysql.TypeDouble, + //mysql.TypeNull mysql.TypeTimestamp + mysql.TypeTiny, mysql.TypeVarchar, + //mysql.TypeLonglong mysql.TypeInt24 + mysql.TypeLonglong, mysql.TypeInt24, + //mysql.TypeDate mysql.TypeTime + mysql.TypeVarchar, mysql.TypeVarchar, + //mysql.TypeDatetime mysql.TypeYear + mysql.TypeVarchar, mysql.TypeTiny, + //mysql.TypeNewDate mysql.TypeVarchar + mysql.TypeVarchar, mysql.TypeVarchar, + //mysql.TypeBit <16>-<244> + mysql.TypeVarchar, + //mysql.TypeJSON + mysql.TypeVarchar, + //mysql.TypeNewDecimal mysql.TypeEnum + mysql.TypeNewDecimal, mysql.TypeVarchar, + //mysql.TypeSet mysql.TypeTinyBlob + mysql.TypeVarchar, mysql.TypeTinyBlob, + //mysql.TypeMediumBlob mysql.TypeLongBlob + mysql.TypeMediumBlob, mysql.TypeLongBlob, + //mysql.TypeBlob mysql.TypeVarString + mysql.TypeBlob, mysql.TypeVarchar, + //mysql.TypeString mysql.TypeGeometry + mysql.TypeString, mysql.TypeVarchar, + }, + /* mysql.TypeShort -> */ + { + //mysql.TypeDecimal mysql.TypeTiny + mysql.TypeNewDecimal, mysql.TypeShort, + //mysql.TypeShort mysql.TypeLong + mysql.TypeShort, mysql.TypeLong, + //mysql.TypeFloat mysql.TypeDouble + mysql.TypeFloat, mysql.TypeDouble, + //mysql.TypeNull mysql.TypeTimestamp + mysql.TypeShort, mysql.TypeVarchar, + //mysql.TypeLonglong mysql.TypeInt24 + mysql.TypeLonglong, mysql.TypeInt24, + //mysql.TypeDate mysql.TypeTime + mysql.TypeVarchar, mysql.TypeVarchar, + //mysql.TypeDatetime mysql.TypeYear + mysql.TypeVarchar, mysql.TypeShort, + //mysql.TypeNewDate mysql.TypeVarchar + mysql.TypeVarchar, mysql.TypeVarchar, + //mysql.TypeBit <16>-<244> + mysql.TypeVarchar, + //mysql.TypeJSON + mysql.TypeVarchar, + //mysql.TypeNewDecimal mysql.TypeEnum + mysql.TypeNewDecimal, mysql.TypeVarchar, + //mysql.TypeSet mysql.TypeTinyBlob + mysql.TypeVarchar, mysql.TypeTinyBlob, + //mysql.TypeMediumBlob mysql.TypeLongBlob + mysql.TypeMediumBlob, mysql.TypeLongBlob, + //mysql.TypeBlob mysql.TypeVarString + mysql.TypeBlob, mysql.TypeVarchar, + //mysql.TypeString mysql.TypeGeometry + mysql.TypeString, mysql.TypeVarchar, + }, + /* mysql.TypeLong -> */ + { + //mysql.TypeDecimal mysql.TypeTiny + mysql.TypeNewDecimal, mysql.TypeLong, + //mysql.TypeShort mysql.TypeLong + mysql.TypeLong, mysql.TypeLong, + //mysql.TypeFloat mysql.TypeDouble + mysql.TypeDouble, mysql.TypeDouble, + //mysql.TypeNull mysql.TypeTimestamp + mysql.TypeLong, mysql.TypeVarchar, + //mysql.TypeLonglong mysql.TypeInt24 + mysql.TypeLonglong, mysql.TypeLong, + //mysql.TypeDate mysql.TypeTime + mysql.TypeVarchar, mysql.TypeVarchar, + //mysql.TypeDatetime mysql.TypeYear + mysql.TypeVarchar, mysql.TypeLong, + //mysql.TypeNewDate mysql.TypeVarchar + mysql.TypeVarchar, mysql.TypeVarchar, + //mysql.TypeBit <16>-<244> + mysql.TypeVarchar, + //mysql.TypeJSON + mysql.TypeVarchar, + //mysql.TypeNewDecimal mysql.TypeEnum + mysql.TypeNewDecimal, mysql.TypeVarchar, + //mysql.TypeSet mysql.TypeTinyBlob + mysql.TypeVarchar, mysql.TypeTinyBlob, + //mysql.TypeMediumBlob mysql.TypeLongBlob + mysql.TypeMediumBlob, mysql.TypeLongBlob, + //mysql.TypeBlob mysql.TypeVarString + mysql.TypeBlob, mysql.TypeVarchar, + //mysql.TypeString mysql.TypeGeometry + mysql.TypeString, mysql.TypeVarchar, + }, + /* mysql.TypeFloat -> */ + { + //mysql.TypeDecimal mysql.TypeTiny + mysql.TypeDouble, mysql.TypeFloat, + //mysql.TypeShort mysql.TypeLong + mysql.TypeFloat, mysql.TypeDouble, + //mysql.TypeFloat mysql.TypeDouble + mysql.TypeFloat, mysql.TypeDouble, + //mysql.TypeNull mysql.TypeTimestamp + mysql.TypeFloat, mysql.TypeVarchar, + //mysql.TypeLonglong mysql.TypeInt24 + mysql.TypeFloat, mysql.TypeFloat, + //mysql.TypeDate mysql.TypeTime + mysql.TypeVarchar, mysql.TypeVarchar, + //mysql.TypeDatetime mysql.TypeYear + mysql.TypeVarchar, mysql.TypeFloat, + //mysql.TypeNewDate mysql.TypeVarchar + mysql.TypeVarchar, mysql.TypeVarchar, + //mysql.TypeBit <16>-<244> + mysql.TypeVarchar, + //mysql.TypeJSON + mysql.TypeVarchar, + //mysql.TypeNewDecimal mysql.TypeEnum + mysql.TypeDouble, mysql.TypeVarchar, + //mysql.TypeSet mysql.TypeTinyBlob + mysql.TypeVarchar, mysql.TypeTinyBlob, + //mysql.TypeMediumBlob mysql.TypeLongBlob + mysql.TypeMediumBlob, mysql.TypeLongBlob, + //mysql.TypeBlob mysql.TypeVarString + mysql.TypeBlob, mysql.TypeVarchar, + //mysql.TypeString mysql.TypeGeometry + mysql.TypeString, mysql.TypeVarchar, + }, + /* mysql.TypeDouble -> */ + { + //mysql.TypeDecimal mysql.TypeTiny + mysql.TypeDouble, mysql.TypeDouble, + //mysql.TypeShort mysql.TypeLong + mysql.TypeDouble, mysql.TypeDouble, + //mysql.TypeFloat mysql.TypeDouble + mysql.TypeDouble, mysql.TypeDouble, + //mysql.TypeNull mysql.TypeTimestamp + mysql.TypeDouble, mysql.TypeVarchar, + //mysql.TypeLonglong mysql.TypeInt24 + mysql.TypeDouble, mysql.TypeDouble, + //mysql.TypeDate mysql.TypeTime + mysql.TypeVarchar, mysql.TypeVarchar, + //mysql.TypeDatetime mysql.TypeYear + mysql.TypeVarchar, mysql.TypeDouble, + //mysql.TypeNewDate mysql.TypeVarchar + mysql.TypeVarchar, mysql.TypeVarchar, + //mysql.TypeBit <16>-<244> + mysql.TypeVarchar, + //mysql.TypeJSON + mysql.TypeVarchar, + //mysql.TypeNewDecimal mysql.TypeEnum + mysql.TypeDouble, mysql.TypeVarchar, + //mysql.TypeSet mysql.TypeTinyBlob + mysql.TypeVarchar, mysql.TypeTinyBlob, + //mysql.TypeMediumBlob mysql.TypeLongBlob + mysql.TypeMediumBlob, mysql.TypeLongBlob, + //mysql.TypeBlob mysql.TypeVarString + mysql.TypeBlob, mysql.TypeVarchar, + //mysql.TypeString mysql.TypeGeometry + mysql.TypeString, mysql.TypeVarchar, + }, + /* mysql.TypeNull -> */ + { + //mysql.TypeDecimal mysql.TypeTiny + mysql.TypeNewDecimal, mysql.TypeTiny, + //mysql.TypeShort mysql.TypeLong + mysql.TypeShort, mysql.TypeLong, + //mysql.TypeFloat mysql.TypeDouble + mysql.TypeFloat, mysql.TypeDouble, + //mysql.TypeNull mysql.TypeTimestamp + mysql.TypeNull, mysql.TypeTimestamp, + //mysql.TypeLonglong mysql.TypeInt24 + mysql.TypeLonglong, mysql.TypeLonglong, + //mysql.TypeDate mysql.TypeTime + mysql.TypeDate, mysql.TypeDuration, + //mysql.TypeDatetime mysql.TypeYear + mysql.TypeDatetime, mysql.TypeYear, + //mysql.TypeNewDate mysql.TypeVarchar + mysql.TypeNewDate, mysql.TypeVarchar, + //mysql.TypeBit <16>-<244> + mysql.TypeBit, + //mysql.TypeJSON + mysql.TypeJSON, + //mysql.TypeNewDecimal mysql.TypeEnum + mysql.TypeNewDecimal, mysql.TypeEnum, + //mysql.TypeSet mysql.TypeTinyBlob + mysql.TypeSet, mysql.TypeTinyBlob, + //mysql.TypeMediumBlob mysql.TypeLongBlob + mysql.TypeMediumBlob, mysql.TypeLongBlob, + //mysql.TypeBlob mysql.TypeVarString + mysql.TypeBlob, mysql.TypeVarchar, + //mysql.TypeString mysql.TypeGeometry + mysql.TypeString, mysql.TypeGeometry, + }, + /* mysql.TypeTimestamp -> */ + { + //mysql.TypeDecimal mysql.TypeTiny + mysql.TypeVarchar, mysql.TypeVarchar, + //mysql.TypeShort mysql.TypeLong + mysql.TypeVarchar, mysql.TypeVarchar, + //mysql.TypeFloat mysql.TypeDouble + mysql.TypeVarchar, mysql.TypeVarchar, + //mysql.TypeNull mysql.TypeTimestamp + mysql.TypeTimestamp, mysql.TypeTimestamp, + //mysql.TypeLonglong mysql.TypeInt24 + mysql.TypeVarchar, mysql.TypeVarchar, + //mysql.TypeDate mysql.TypeTime + mysql.TypeDatetime, mysql.TypeDatetime, + //mysql.TypeDatetime mysql.TypeYear + mysql.TypeDatetime, mysql.TypeVarchar, + //mysql.TypeNewDate mysql.TypeVarchar + mysql.TypeNewDate, mysql.TypeVarchar, + //mysql.TypeBit <16>-<244> + mysql.TypeVarchar, + //mysql.TypeJSON + mysql.TypeVarchar, + //mysql.TypeNewDecimal mysql.TypeEnum + mysql.TypeVarchar, mysql.TypeVarchar, + //mysql.TypeSet mysql.TypeTinyBlob + mysql.TypeVarchar, mysql.TypeTinyBlob, + //mysql.TypeMediumBlob mysql.TypeLongBlob + mysql.TypeMediumBlob, mysql.TypeLongBlob, + //mysql.TypeBlob mysql.TypeVarString + mysql.TypeBlob, mysql.TypeVarchar, + //mysql.TypeString mysql.TypeGeometry + mysql.TypeString, mysql.TypeVarchar, + }, + /* mysql.TypeLonglong -> */ + { + //mysql.TypeDecimal mysql.TypeTiny + mysql.TypeNewDecimal, mysql.TypeLonglong, + //mysql.TypeShort mysql.TypeLong + mysql.TypeLonglong, mysql.TypeLonglong, + //mysql.TypeFloat mysql.TypeDouble + mysql.TypeDouble, mysql.TypeDouble, + //mysql.TypeNull mysql.TypeTimestamp + mysql.TypeLonglong, mysql.TypeVarchar, + //mysql.TypeLonglong mysql.TypeInt24 + mysql.TypeLonglong, mysql.TypeLong, + //mysql.TypeDate mysql.TypeTime + mysql.TypeVarchar, mysql.TypeVarchar, + //mysql.TypeDatetime mysql.TypeYear + mysql.TypeVarchar, mysql.TypeLonglong, + //mysql.TypeNewDate mysql.TypeVarchar + mysql.TypeNewDate, mysql.TypeVarchar, + //mysql.TypeBit <16>-<244> + mysql.TypeVarchar, + //mysql.TypeJSON + mysql.TypeVarchar, + //mysql.TypeNewDecimal mysql.TypeEnum + mysql.TypeNewDecimal, mysql.TypeVarchar, + //mysql.TypeSet mysql.TypeTinyBlob + mysql.TypeVarchar, mysql.TypeTinyBlob, + //mysql.TypeMediumBlob mysql.TypeLongBlob + mysql.TypeMediumBlob, mysql.TypeLongBlob, + //mysql.TypeBlob mysql.TypeVarString + mysql.TypeBlob, mysql.TypeVarchar, + //mysql.TypeString mysql.TypeGeometry + mysql.TypeString, mysql.TypeVarchar, + }, + /* mysql.TypeInt24 -> */ + { + //mysql.TypeDecimal mysql.TypeTiny + mysql.TypeNewDecimal, mysql.TypeInt24, + //mysql.TypeShort mysql.TypeLong + mysql.TypeInt24, mysql.TypeLong, + //mysql.TypeFloat mysql.TypeDouble + mysql.TypeFloat, mysql.TypeDouble, + //mysql.TypeNull mysql.TypeTimestamp + mysql.TypeInt24, mysql.TypeVarchar, + //mysql.TypeLonglong mysql.TypeInt24 + mysql.TypeLonglong, mysql.TypeInt24, + //mysql.TypeDate mysql.TypeTime + mysql.TypeVarchar, mysql.TypeVarchar, + //mysql.TypeDatetime mysql.TypeYear + mysql.TypeVarchar, mysql.TypeInt24, + //mysql.TypeNewDate mysql.TypeVarchar + mysql.TypeNewDate, mysql.TypeVarchar, + //mysql.TypeBit <16>-<244> + mysql.TypeVarchar, + //mysql.TypeJSON + mysql.TypeVarchar, + //mysql.TypeNewDecimal mysql.TypeEnum + mysql.TypeNewDecimal, mysql.TypeVarchar, + //mysql.TypeSet mysql.TypeTinyBlob + mysql.TypeVarchar, mysql.TypeTinyBlob, + //mysql.TypeMediumBlob mysql.TypeLongBlob + mysql.TypeMediumBlob, mysql.TypeLongBlob, + //mysql.TypeBlob mysql.TypeVarString + mysql.TypeBlob, mysql.TypeVarchar, + //mysql.TypeString mysql.TypeGeometry + mysql.TypeString, mysql.TypeVarchar, + }, + /* mysql.TypeDate -> */ + { + //mysql.TypeDecimal mysql.TypeTiny + mysql.TypeVarchar, mysql.TypeVarchar, + //mysql.TypeShort mysql.TypeLong + mysql.TypeVarchar, mysql.TypeVarchar, + //mysql.TypeFloat mysql.TypeDouble + mysql.TypeVarchar, mysql.TypeVarchar, + //mysql.TypeNull mysql.TypeTimestamp + mysql.TypeDate, mysql.TypeDatetime, + //mysql.TypeLonglong mysql.TypeInt24 + mysql.TypeVarchar, mysql.TypeVarchar, + //mysql.TypeDate mysql.TypeTime + mysql.TypeDate, mysql.TypeDatetime, + //mysql.TypeDatetime mysql.TypeYear + mysql.TypeDatetime, mysql.TypeVarchar, + //mysql.TypeNewDate mysql.TypeVarchar + mysql.TypeNewDate, mysql.TypeVarchar, + //mysql.TypeBit <16>-<244> + mysql.TypeVarchar, + //mysql.TypeJSON + mysql.TypeVarchar, + //mysql.TypeNewDecimal mysql.TypeEnum + mysql.TypeVarchar, mysql.TypeVarchar, + //mysql.TypeSet mysql.TypeTinyBlob + mysql.TypeVarchar, mysql.TypeTinyBlob, + //mysql.TypeMediumBlob mysql.TypeLongBlob + mysql.TypeMediumBlob, mysql.TypeLongBlob, + //mysql.TypeBlob mysql.TypeVarString + mysql.TypeBlob, mysql.TypeVarchar, + //mysql.TypeString mysql.TypeGeometry + mysql.TypeString, mysql.TypeVarchar, + }, + /* mysql.TypeTime -> */ + { + //mysql.TypeDecimal mysql.TypeTiny + mysql.TypeVarchar, mysql.TypeVarchar, + //mysql.TypeShort mysql.TypeLong + mysql.TypeVarchar, mysql.TypeVarchar, + //mysql.TypeFloat mysql.TypeDouble + mysql.TypeVarchar, mysql.TypeVarchar, + //mysql.TypeNull mysql.TypeTimestamp + mysql.TypeDuration, mysql.TypeDatetime, + //mysql.TypeLonglong mysql.TypeInt24 + mysql.TypeVarchar, mysql.TypeVarchar, + //mysql.TypeDate mysql.TypeTime + mysql.TypeDatetime, mysql.TypeDuration, + //mysql.TypeDatetime mysql.TypeYear + mysql.TypeDatetime, mysql.TypeVarchar, + //mysql.TypeNewDate mysql.TypeVarchar + mysql.TypeNewDate, mysql.TypeVarchar, + //mysql.TypeBit <16>-<244> + mysql.TypeVarchar, + //mysql.TypeJSON + mysql.TypeVarchar, + //mysql.TypeNewDecimal mysql.TypeEnum + mysql.TypeVarchar, mysql.TypeVarchar, + //mysql.TypeSet mysql.TypeTinyBlob + mysql.TypeVarchar, mysql.TypeTinyBlob, + //mysql.TypeMediumBlob mysql.TypeLongBlob + mysql.TypeMediumBlob, mysql.TypeLongBlob, + //mysql.TypeBlob mysql.TypeVarString + mysql.TypeBlob, mysql.TypeVarchar, + //mysql.TypeString mysql.TypeGeometry + mysql.TypeString, mysql.TypeVarchar, + }, + /* mysql.TypeDatetime -> */ + { + //mysql.TypeDecimal mysql.TypeTiny + mysql.TypeVarchar, mysql.TypeVarchar, + //mysql.TypeShort mysql.TypeLong + mysql.TypeVarchar, mysql.TypeVarchar, + //mysql.TypeFloat mysql.TypeDouble + mysql.TypeVarchar, mysql.TypeVarchar, + //mysql.TypeNull mysql.TypeTimestamp + mysql.TypeDatetime, mysql.TypeDatetime, + //mysql.TypeLonglong mysql.TypeInt24 + mysql.TypeVarchar, mysql.TypeVarchar, + //mysql.TypeDate mysql.TypeTime + mysql.TypeDatetime, mysql.TypeDatetime, + //mysql.TypeDatetime mysql.TypeYear + mysql.TypeDatetime, mysql.TypeVarchar, + //mysql.TypeNewDate mysql.TypeVarchar + mysql.TypeNewDate, mysql.TypeVarchar, + //mysql.TypeBit <16>-<244> + mysql.TypeVarchar, + //mysql.TypeJSON + mysql.TypeVarchar, + //mysql.TypeNewDecimal mysql.TypeEnum + mysql.TypeVarchar, mysql.TypeVarchar, + //mysql.TypeSet mysql.TypeTinyBlob + mysql.TypeVarchar, mysql.TypeTinyBlob, + //mysql.TypeMediumBlob mysql.TypeLongBlob + mysql.TypeMediumBlob, mysql.TypeLongBlob, + //mysql.TypeBlob mysql.TypeVarString + mysql.TypeBlob, mysql.TypeVarchar, + //mysql.TypeString mysql.TypeGeometry + mysql.TypeString, mysql.TypeVarchar, + }, + /* mysql.TypeYear -> */ + { + //mysql.TypeDecimal mysql.TypeTiny + mysql.TypeDecimal, mysql.TypeTiny, + //mysql.TypeShort mysql.TypeLong + mysql.TypeShort, mysql.TypeLong, + //mysql.TypeFloat mysql.TypeDouble + mysql.TypeFloat, mysql.TypeDouble, + //mysql.TypeNull mysql.TypeTimestamp + mysql.TypeYear, mysql.TypeVarchar, + //mysql.TypeLonglong mysql.TypeInt24 + mysql.TypeLonglong, mysql.TypeInt24, + //mysql.TypeDate mysql.TypeTime + mysql.TypeVarchar, mysql.TypeVarchar, + //mysql.TypeDatetime mysql.TypeYear + mysql.TypeVarchar, mysql.TypeYear, + //mysql.TypeNewDate mysql.TypeVarchar + mysql.TypeVarchar, mysql.TypeVarchar, + //mysql.TypeBit <16>-<244> + mysql.TypeVarchar, + //mysql.TypeJSON + mysql.TypeVarchar, + //mysql.TypeNewDecimal mysql.TypeEnum + mysql.TypeNewDecimal, mysql.TypeVarchar, + //mysql.TypeSet mysql.TypeTinyBlob + mysql.TypeVarchar, mysql.TypeTinyBlob, + //mysql.TypeMediumBlob mysql.TypeLongBlob + mysql.TypeMediumBlob, mysql.TypeLongBlob, + //mysql.TypeBlob mysql.TypeVarString + mysql.TypeBlob, mysql.TypeVarchar, + //mysql.TypeString mysql.TypeGeometry + mysql.TypeString, mysql.TypeVarchar, + }, + /* mysql.TypeNewDate -> */ + { + //mysql.TypeDecimal mysql.TypeTiny + mysql.TypeVarchar, mysql.TypeVarchar, + //mysql.TypeShort mysql.TypeLong + mysql.TypeVarchar, mysql.TypeVarchar, + //mysql.TypeFloat mysql.TypeDouble + mysql.TypeVarchar, mysql.TypeVarchar, + //mysql.TypeNull mysql.TypeTimestamp + mysql.TypeNewDate, mysql.TypeDatetime, + //mysql.TypeLonglong mysql.TypeInt24 + mysql.TypeVarchar, mysql.TypeVarchar, + //mysql.TypeDate mysql.TypeTime + mysql.TypeNewDate, mysql.TypeDatetime, + //mysql.TypeDatetime mysql.TypeYear + mysql.TypeDatetime, mysql.TypeVarchar, + //mysql.TypeNewDate mysql.TypeVarchar + mysql.TypeNewDate, mysql.TypeVarchar, + //mysql.TypeBit <16>-<244> + mysql.TypeVarchar, + //mysql.TypeJSON + mysql.TypeVarchar, + //mysql.TypeNewDecimal mysql.TypeEnum + mysql.TypeVarchar, mysql.TypeVarchar, + //mysql.TypeSet mysql.TypeTinyBlob + mysql.TypeVarchar, mysql.TypeTinyBlob, + //mysql.TypeMediumBlob mysql.TypeLongBlob + mysql.TypeMediumBlob, mysql.TypeLongBlob, + //mysql.TypeBlob mysql.TypeVarString + mysql.TypeBlob, mysql.TypeVarchar, + //mysql.TypeString mysql.TypeGeometry + mysql.TypeString, mysql.TypeVarchar, + }, + /* mysql.TypeVarchar -> */ + { + //mysql.TypeDecimal mysql.TypeTiny + mysql.TypeVarchar, mysql.TypeVarchar, + //mysql.TypeShort mysql.TypeLong + mysql.TypeVarchar, mysql.TypeVarchar, + //mysql.TypeFloat mysql.TypeDouble + mysql.TypeVarchar, mysql.TypeVarchar, + //mysql.TypeNull mysql.TypeTimestamp + mysql.TypeVarchar, mysql.TypeVarchar, + //mysql.TypeLonglong mysql.TypeInt24 + mysql.TypeVarchar, mysql.TypeVarchar, + //mysql.TypeDate mysql.TypeTime + mysql.TypeVarchar, mysql.TypeVarchar, + //mysql.TypeDatetime mysql.TypeYear + mysql.TypeVarchar, mysql.TypeVarchar, + //mysql.TypeNewDate mysql.TypeVarchar + mysql.TypeVarchar, mysql.TypeVarchar, + //mysql.TypeBit <16>-<244> + mysql.TypeVarchar, + //mysql.TypeJSON + mysql.TypeVarchar, + //mysql.TypeNewDecimal mysql.TypeEnum + mysql.TypeVarchar, mysql.TypeVarchar, + //mysql.TypeSet mysql.TypeTinyBlob + mysql.TypeVarchar, mysql.TypeTinyBlob, + //mysql.TypeMediumBlob mysql.TypeLongBlob + mysql.TypeMediumBlob, mysql.TypeLongBlob, + //mysql.TypeBlob mysql.TypeVarString + mysql.TypeBlob, mysql.TypeVarchar, + //mysql.TypeString mysql.TypeGeometry + mysql.TypeVarchar, mysql.TypeVarchar, + }, + /* mysql.TypeBit -> */ + { + //mysql.TypeDecimal mysql.TypeTiny + mysql.TypeVarchar, mysql.TypeVarchar, + //mysql.TypeShort mysql.TypeLong + mysql.TypeVarchar, mysql.TypeVarchar, + //mysql.TypeFloat mysql.TypeDouble + mysql.TypeVarchar, mysql.TypeVarchar, + //mysql.TypeNull mysql.TypeTimestamp + mysql.TypeBit, mysql.TypeVarchar, + //mysql.TypeLonglong mysql.TypeInt24 + mysql.TypeVarchar, mysql.TypeVarchar, + //mysql.TypeDate mysql.TypeTime + mysql.TypeVarchar, mysql.TypeVarchar, + //mysql.TypeDatetime mysql.TypeYear + mysql.TypeVarchar, mysql.TypeVarchar, + //mysql.TypeNewDate mysql.TypeVarchar + mysql.TypeVarchar, mysql.TypeVarchar, + //mysql.TypeBit <16>-<244> + mysql.TypeBit, + //mysql.TypeJSON + mysql.TypeVarchar, + //mysql.TypeNewDecimal mysql.TypeEnum + mysql.TypeVarchar, mysql.TypeVarchar, + //mysql.TypeSet mysql.TypeTinyBlob + mysql.TypeVarchar, mysql.TypeTinyBlob, + //mysql.TypeMediumBlob mysql.TypeLongBlob + mysql.TypeMediumBlob, mysql.TypeLongBlob, + //mysql.TypeBlob mysql.TypeVarString + mysql.TypeBlob, mysql.TypeVarchar, + //mysql.TypeString mysql.TypeGeometry + mysql.TypeString, mysql.TypeVarchar, + }, + /* mysql.TypeJSON -> */ + { + //mysql.TypeDecimal mysql.TypeTiny + mysql.TypeVarchar, mysql.TypeVarchar, + //mysql.TypeShort mysql.TypeLong + mysql.TypeVarchar, mysql.TypeVarchar, + //mysql.TypeNewFloat mysql.TypeDouble + mysql.TypeVarchar, mysql.TypeVarchar, + //mysql.TypeNull mysql.TypeTimestamp + mysql.TypeJSON, mysql.TypeVarchar, + //mysql.TypeLongLONG mysql.TypeInt24 + mysql.TypeVarchar, mysql.TypeVarchar, + //mysql.TypeDate MYSQL_TYPE_TIME + mysql.TypeVarchar, mysql.TypeVarchar, + //mysql.TypeDatetime MYSQL_TYPE_YEAR + mysql.TypeVarchar, mysql.TypeVarchar, + //mysql.TypeNewDate mysql.TypeVarchar + mysql.TypeVarchar, mysql.TypeVarchar, + //mysql.TypeBit <16>-<244> + mysql.TypeVarchar, + //mysql.TypeJSON + mysql.TypeJSON, + //mysql.TypeNewDecimal MYSQL_TYPE_ENUM + mysql.TypeVarchar, mysql.TypeVarchar, + //mysql.TypeSet mysql.TypeTinyBlob + mysql.TypeVarchar, mysql.TypeLongBlob, + //mysql.TypeMediumBlob mysql.TypeLongBlob + mysql.TypeLongBlob, mysql.TypeLongBlob, + //mysql.TypeBlob mysql.TypeVarString + mysql.TypeLongBlob, mysql.TypeVarchar, + //mysql.TypeString MYSQL_TYPE_GEOMETRY + mysql.TypeString, mysql.TypeVarchar, + }, + /* mysql.TypeNewDecimal -> */ + { + //mysql.TypeDecimal mysql.TypeTiny + mysql.TypeNewDecimal, mysql.TypeNewDecimal, + //mysql.TypeShort mysql.TypeLong + mysql.TypeNewDecimal, mysql.TypeNewDecimal, + //mysql.TypeFloat mysql.TypeDouble + mysql.TypeDouble, mysql.TypeDouble, + //mysql.TypeNull mysql.TypeTimestamp + mysql.TypeNewDecimal, mysql.TypeVarchar, + //mysql.TypeLonglong mysql.TypeInt24 + mysql.TypeNewDecimal, mysql.TypeNewDecimal, + //mysql.TypeDate mysql.TypeTime + mysql.TypeVarchar, mysql.TypeVarchar, + //mysql.TypeDatetime mysql.TypeYear + mysql.TypeVarchar, mysql.TypeNewDecimal, + //mysql.TypeNewDate mysql.TypeVarchar + mysql.TypeVarchar, mysql.TypeVarchar, + //mysql.TypeBit <16>-<244> + mysql.TypeVarchar, + //mysql.TypeJSON + mysql.TypeVarchar, + //mysql.TypeNewDecimal mysql.TypeEnum + mysql.TypeNewDecimal, mysql.TypeVarchar, + //mysql.TypeSet mysql.TypeTinyBlob + mysql.TypeVarchar, mysql.TypeTinyBlob, + //mysql.TypeMediumBlob mysql.TypeLongBlob + mysql.TypeMediumBlob, mysql.TypeLongBlob, + //mysql.TypeBlob mysql.TypeVarString + mysql.TypeBlob, mysql.TypeVarchar, + //mysql.TypeString mysql.TypeGeometry + mysql.TypeString, mysql.TypeVarchar, + }, + /* mysql.TypeEnum -> */ + { + //mysql.TypeDecimal mysql.TypeTiny + mysql.TypeVarchar, mysql.TypeVarchar, + //mysql.TypeShort mysql.TypeLong + mysql.TypeVarchar, mysql.TypeVarchar, + //mysql.TypeFloat mysql.TypeDouble + mysql.TypeVarchar, mysql.TypeVarchar, + //mysql.TypeNull mysql.TypeTimestamp + mysql.TypeEnum, mysql.TypeVarchar, + //mysql.TypeLonglong mysql.TypeInt24 + mysql.TypeVarchar, mysql.TypeVarchar, + //mysql.TypeDate mysql.TypeTime + mysql.TypeVarchar, mysql.TypeVarchar, + //mysql.TypeDatetime mysql.TypeYear + mysql.TypeVarchar, mysql.TypeVarchar, + //mysql.TypeNewDate mysql.TypeVarchar + mysql.TypeVarchar, mysql.TypeVarchar, + //mysql.TypeBit <16>-<244> + mysql.TypeVarchar, + //mysql.TypeJSON + mysql.TypeVarchar, + //mysql.TypeNewDecimal mysql.TypeEnum + mysql.TypeVarchar, mysql.TypeVarchar, + //mysql.TypeSet mysql.TypeTinyBlob + mysql.TypeVarchar, mysql.TypeTinyBlob, + //mysql.TypeMediumBlob mysql.TypeLongBlob + mysql.TypeMediumBlob, mysql.TypeLongBlob, + //mysql.TypeBlob mysql.TypeVarString + mysql.TypeBlob, mysql.TypeVarchar, + //mysql.TypeString mysql.TypeGeometry + mysql.TypeString, mysql.TypeVarchar, + }, + /* mysql.TypeSet -> */ + { + //mysql.TypeDecimal mysql.TypeTiny + mysql.TypeVarchar, mysql.TypeVarchar, + //mysql.TypeShort mysql.TypeLong + mysql.TypeVarchar, mysql.TypeVarchar, + //mysql.TypeFloat mysql.TypeDouble + mysql.TypeVarchar, mysql.TypeVarchar, + //mysql.TypeNull mysql.TypeTimestamp + mysql.TypeSet, mysql.TypeVarchar, + //mysql.TypeLonglong mysql.TypeInt24 + mysql.TypeVarchar, mysql.TypeVarchar, + //mysql.TypeDate mysql.TypeTime + mysql.TypeVarchar, mysql.TypeVarchar, + //mysql.TypeDatetime mysql.TypeYear + mysql.TypeVarchar, mysql.TypeVarchar, + //mysql.TypeNewDate mysql.TypeVarchar + mysql.TypeVarchar, mysql.TypeVarchar, + //mysql.TypeBit <16>-<244> + mysql.TypeVarchar, + //mysql.TypeJSON + mysql.TypeVarchar, + //mysql.TypeNewDecimal mysql.TypeEnum + mysql.TypeVarchar, mysql.TypeVarchar, + //mysql.TypeSet mysql.TypeTinyBlob + mysql.TypeVarchar, mysql.TypeTinyBlob, + //mysql.TypeMediumBlob mysql.TypeLongBlob + mysql.TypeMediumBlob, mysql.TypeLongBlob, + //mysql.TypeBlob mysql.TypeVarString + mysql.TypeBlob, mysql.TypeVarchar, + //mysql.TypeString mysql.TypeGeometry + mysql.TypeString, mysql.TypeVarchar, + }, + /* mysql.TypeTinyBlob -> */ + { + //mysql.TypeDecimal mysql.TypeTiny + mysql.TypeTinyBlob, mysql.TypeTinyBlob, + //mysql.TypeShort mysql.TypeLong + mysql.TypeTinyBlob, mysql.TypeTinyBlob, + //mysql.TypeFloat mysql.TypeDouble + mysql.TypeTinyBlob, mysql.TypeTinyBlob, + //mysql.TypeNull mysql.TypeTimestamp + mysql.TypeTinyBlob, mysql.TypeTinyBlob, + //mysql.TypeLonglong mysql.TypeInt24 + mysql.TypeTinyBlob, mysql.TypeTinyBlob, + //mysql.TypeDate mysql.TypeTime + mysql.TypeTinyBlob, mysql.TypeTinyBlob, + //mysql.TypeDatetime mysql.TypeYear + mysql.TypeTinyBlob, mysql.TypeTinyBlob, + //mysql.TypeNewDate mysql.TypeVarchar + mysql.TypeTinyBlob, mysql.TypeTinyBlob, + //mysql.TypeBit <16>-<244> + mysql.TypeTinyBlob, + //mysql.TypeJSON + mysql.TypeLongBlob, + //mysql.TypeNewDecimal mysql.TypeEnum + mysql.TypeTinyBlob, mysql.TypeTinyBlob, + //mysql.TypeSet mysql.TypeTinyBlob + mysql.TypeTinyBlob, mysql.TypeTinyBlob, + //mysql.TypeMediumBlob mysql.TypeLongBlob + mysql.TypeMediumBlob, mysql.TypeLongBlob, + //mysql.TypeBlob mysql.TypeVarString + mysql.TypeBlob, mysql.TypeTinyBlob, + //mysql.TypeString mysql.TypeGeometry + mysql.TypeTinyBlob, mysql.TypeTinyBlob, + }, + /* mysql.TypeMediumBlob -> */ + { + //mysql.TypeDecimal mysql.TypeTiny + mysql.TypeMediumBlob, mysql.TypeMediumBlob, + //mysql.TypeShort mysql.TypeLong + mysql.TypeMediumBlob, mysql.TypeMediumBlob, + //mysql.TypeFloat mysql.TypeDouble + mysql.TypeMediumBlob, mysql.TypeMediumBlob, + //mysql.TypeNull mysql.TypeTimestamp + mysql.TypeMediumBlob, mysql.TypeMediumBlob, + //mysql.TypeLonglong mysql.TypeInt24 + mysql.TypeMediumBlob, mysql.TypeMediumBlob, + //mysql.TypeDate mysql.TypeTime + mysql.TypeMediumBlob, mysql.TypeMediumBlob, + //mysql.TypeDatetime mysql.TypeYear + mysql.TypeMediumBlob, mysql.TypeMediumBlob, + //mysql.TypeNewDate mysql.TypeVarchar + mysql.TypeMediumBlob, mysql.TypeMediumBlob, + //mysql.TypeBit <16>-<244> + mysql.TypeMediumBlob, + //mysql.TypeJSON + mysql.TypeLongBlob, + //mysql.TypeNewDecimal mysql.TypeEnum + mysql.TypeMediumBlob, mysql.TypeMediumBlob, + //mysql.TypeSet mysql.TypeTinyBlob + mysql.TypeMediumBlob, mysql.TypeMediumBlob, + //mysql.TypeMediumBlob mysql.TypeLongBlob + mysql.TypeMediumBlob, mysql.TypeLongBlob, + //mysql.TypeBlob mysql.TypeVarString + mysql.TypeMediumBlob, mysql.TypeMediumBlob, + //mysql.TypeString mysql.TypeGeometry + mysql.TypeMediumBlob, mysql.TypeMediumBlob, + }, + /* mysql.TypeLongBlob -> */ + { + //mysql.TypeDecimal mysql.TypeTiny + mysql.TypeLongBlob, mysql.TypeLongBlob, + //mysql.TypeShort mysql.TypeLong + mysql.TypeLongBlob, mysql.TypeLongBlob, + //mysql.TypeFloat mysql.TypeDouble + mysql.TypeLongBlob, mysql.TypeLongBlob, + //mysql.TypeNull mysql.TypeTimestamp + mysql.TypeLongBlob, mysql.TypeLongBlob, + //mysql.TypeLonglong mysql.TypeInt24 + mysql.TypeLongBlob, mysql.TypeLongBlob, + //mysql.TypeDate mysql.TypeTime + mysql.TypeLongBlob, mysql.TypeLongBlob, + //mysql.TypeDatetime mysql.TypeYear + mysql.TypeLongBlob, mysql.TypeLongBlob, + //mysql.TypeNewDate mysql.TypeVarchar + mysql.TypeLongBlob, mysql.TypeLongBlob, + //mysql.TypeBit <16>-<244> + mysql.TypeLongBlob, + //mysql.TypeJSON + mysql.TypeLongBlob, + //mysql.TypeNewDecimal mysql.TypeEnum + mysql.TypeLongBlob, mysql.TypeLongBlob, + //mysql.TypeSet mysql.TypeTinyBlob + mysql.TypeLongBlob, mysql.TypeLongBlob, + //mysql.TypeMediumBlob mysql.TypeLongBlob + mysql.TypeLongBlob, mysql.TypeLongBlob, + //mysql.TypeBlob mysql.TypeVarString + mysql.TypeLongBlob, mysql.TypeLongBlob, + //mysql.TypeString mysql.TypeGeometry + mysql.TypeLongBlob, mysql.TypeLongBlob, + }, + /* mysql.TypeBlob -> */ + { + //mysql.TypeDecimal mysql.TypeTiny + mysql.TypeBlob, mysql.TypeBlob, + //mysql.TypeShort mysql.TypeLong + mysql.TypeBlob, mysql.TypeBlob, + //mysql.TypeFloat mysql.TypeDouble + mysql.TypeBlob, mysql.TypeBlob, + //mysql.TypeNull mysql.TypeTimestamp + mysql.TypeBlob, mysql.TypeBlob, + //mysql.TypeLonglong mysql.TypeInt24 + mysql.TypeBlob, mysql.TypeBlob, + //mysql.TypeDate mysql.TypeTime + mysql.TypeBlob, mysql.TypeBlob, + //mysql.TypeDatetime mysql.TypeYear + mysql.TypeBlob, mysql.TypeBlob, + //mysql.TypeNewDate mysql.TypeVarchar + mysql.TypeBlob, mysql.TypeBlob, + //mysql.TypeBit <16>-<244> + mysql.TypeBlob, + //mysql.TypeJSON + mysql.TypeLongBlob, + //mysql.TypeNewDecimal mysql.TypeEnum + mysql.TypeBlob, mysql.TypeBlob, + //mysql.TypeSet mysql.TypeTinyBlob + mysql.TypeBlob, mysql.TypeBlob, + //mysql.TypeMediumBlob mysql.TypeLongBlob + mysql.TypeMediumBlob, mysql.TypeLongBlob, + //mysql.TypeBlob mysql.TypeVarString + mysql.TypeBlob, mysql.TypeBlob, + //mysql.TypeString mysql.TypeGeometry + mysql.TypeBlob, mysql.TypeBlob, + }, + /* mysql.TypeVarString -> */ + { + //mysql.TypeDecimal mysql.TypeTiny + mysql.TypeVarchar, mysql.TypeVarchar, + //mysql.TypeShort mysql.TypeLong + mysql.TypeVarchar, mysql.TypeVarchar, + //mysql.TypeFloat mysql.TypeDouble + mysql.TypeVarchar, mysql.TypeVarchar, + //mysql.TypeNull mysql.TypeTimestamp + mysql.TypeVarchar, mysql.TypeVarchar, + //mysql.TypeLonglong mysql.TypeInt24 + mysql.TypeVarchar, mysql.TypeVarchar, + //mysql.TypeDate mysql.TypeTime + mysql.TypeVarchar, mysql.TypeVarchar, + //mysql.TypeDatetime mysql.TypeYear + mysql.TypeVarchar, mysql.TypeVarchar, + //mysql.TypeNewDate mysql.TypeVarchar + mysql.TypeVarchar, mysql.TypeVarchar, + //mysql.TypeBit <16>-<244> + mysql.TypeVarchar, + //mysql.TypeJSON + mysql.TypeVarchar, + //mysql.TypeNewDecimal mysql.TypeEnum + mysql.TypeVarchar, mysql.TypeVarchar, + //mysql.TypeSet mysql.TypeTinyBlob + mysql.TypeVarchar, mysql.TypeTinyBlob, + //mysql.TypeMediumBlob mysql.TypeLongBlob + mysql.TypeMediumBlob, mysql.TypeLongBlob, + //mysql.TypeBlob mysql.TypeVarString + mysql.TypeBlob, mysql.TypeVarchar, + //mysql.TypeString mysql.TypeGeometry + mysql.TypeVarchar, mysql.TypeVarchar, + }, + /* mysql.TypeString -> */ + { + //mysql.TypeDecimal mysql.TypeTiny + mysql.TypeString, mysql.TypeString, + //mysql.TypeShort mysql.TypeLong + mysql.TypeString, mysql.TypeString, + //mysql.TypeFloat mysql.TypeDouble + mysql.TypeString, mysql.TypeString, + //mysql.TypeNull mysql.TypeTimestamp + mysql.TypeString, mysql.TypeString, + //mysql.TypeLonglong mysql.TypeInt24 + mysql.TypeString, mysql.TypeString, + //mysql.TypeDate mysql.TypeTime + mysql.TypeString, mysql.TypeString, + //mysql.TypeDatetime mysql.TypeYear + mysql.TypeString, mysql.TypeString, + //mysql.TypeNewDate mysql.TypeVarchar + mysql.TypeString, mysql.TypeVarchar, + //mysql.TypeBit <16>-<244> + mysql.TypeString, + //mysql.TypeJSON + mysql.TypeString, + //mysql.TypeNewDecimal mysql.TypeEnum + mysql.TypeString, mysql.TypeString, + //mysql.TypeSet mysql.TypeTinyBlob + mysql.TypeString, mysql.TypeTinyBlob, + //mysql.TypeMediumBlob mysql.TypeLongBlob + mysql.TypeMediumBlob, mysql.TypeLongBlob, + //mysql.TypeBlob mysql.TypeVarString + mysql.TypeBlob, mysql.TypeVarchar, + //mysql.TypeString mysql.TypeGeometry + mysql.TypeString, mysql.TypeString, + }, + /* mysql.TypeGeometry -> */ + { + //mysql.TypeDecimal mysql.TypeTiny + mysql.TypeVarchar, mysql.TypeVarchar, + //mysql.TypeShort mysql.TypeLong + mysql.TypeVarchar, mysql.TypeVarchar, + //mysql.TypeFloat mysql.TypeDouble + mysql.TypeVarchar, mysql.TypeVarchar, + //mysql.TypeNull mysql.TypeTimestamp + mysql.TypeGeometry, mysql.TypeVarchar, + //mysql.TypeLonglong mysql.TypeInt24 + mysql.TypeVarchar, mysql.TypeVarchar, + //mysql.TypeDate mysql.TypeTime + mysql.TypeVarchar, mysql.TypeVarchar, + //mysql.TypeDatetime mysql.TypeYear + mysql.TypeVarchar, mysql.TypeVarchar, + //mysql.TypeNewDate mysql.TypeVarchar + mysql.TypeVarchar, mysql.TypeVarchar, + //mysql.TypeBit <16>-<244> + mysql.TypeVarchar, + //mysql.TypeJSON + mysql.TypeVarchar, + //mysql.TypeNewDecimal mysql.TypeEnum + mysql.TypeVarchar, mysql.TypeVarchar, + //mysql.TypeSet mysql.TypeTinyBlob + mysql.TypeVarchar, mysql.TypeTinyBlob, + //mysql.TypeMediumBlob mysql.TypeLongBlob + mysql.TypeMediumBlob, mysql.TypeLongBlob, + //mysql.TypeBlob mysql.TypeVarString + mysql.TypeBlob, mysql.TypeVarchar, + //mysql.TypeString mysql.TypeGeometry + mysql.TypeString, mysql.TypeGeometry, + }, +} + +// SetBinChsClnFlag sets charset, collation as 'binary' and adds binaryFlag to FieldType. +func SetBinChsClnFlag(ft *FieldType) { + ft.Charset = charset.CharsetBin + ft.Collate = charset.CollationBin + ft.Flag |= mysql.BinaryFlag +} + +// VarStorageLen indicates this column is a variable length column. +const VarStorageLen = ast.VarStorageLen diff --git a/vendor/github.com/pingcap/tidb/types/fsp.go b/vendor/github.com/pingcap/tidb/types/fsp.go new file mode 100644 index 0000000..1059c9d --- /dev/null +++ b/vendor/github.com/pingcap/tidb/types/fsp.go @@ -0,0 +1,100 @@ +// Copyright 2015 PingCAP, Inc. +// +// 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package types + +import ( + "math" + "strconv" + "strings" + + "github.com/pingcap/errors" +) + +const ( + // UnspecifiedFsp is the unspecified fractional seconds part. + UnspecifiedFsp = int8(-1) + // MaxFsp is the maximum digit of fractional seconds part. + MaxFsp = int8(6) + // MinFsp is the minimum digit of fractional seconds part. + MinFsp = int8(0) + // DefaultFsp is the default digit of fractional seconds part. + // MySQL use 0 as the default Fsp. + DefaultFsp = int8(0) +) + +// CheckFsp checks whether fsp is in valid range. +func CheckFsp(fsp int) (int8, error) { + if fsp == int(UnspecifiedFsp) { + return DefaultFsp, nil + } + if fsp < int(MinFsp) || fsp > int(MaxFsp) { + return DefaultFsp, errors.Errorf("Invalid fsp %d", fsp) + } + return int8(fsp), nil +} + +// ParseFrac parses the input string according to fsp, returns the microsecond, +// and also a bool value to indice overflow. eg: +// "999" fsp=2 will overflow. +func ParseFrac(s string, fsp int8) (v int, overflow bool, err error) { + if len(s) == 0 { + return 0, false, nil + } + + fsp, err = CheckFsp(int(fsp)) + if err != nil { + return 0, false, errors.Trace(err) + } + + if int(fsp) >= len(s) { + tmp, e := strconv.ParseInt(s, 10, 64) + if e != nil { + return 0, false, errors.Trace(e) + } + v = int(float64(tmp) * math.Pow10(int(MaxFsp)-len(s))) + return + } + + // Round when fsp < string length. + tmp, e := strconv.ParseInt(s[:fsp+1], 10, 64) + if e != nil { + return 0, false, errors.Trace(e) + } + tmp = (tmp + 5) / 10 + + if float64(tmp) >= math.Pow10(int(fsp)) { + // overflow + return 0, true, nil + } + + // Get the final frac, with 6 digit number + // 1236 round 3 -> 124 -> 124000 + // 0312 round 2 -> 3 -> 30000 + // 999 round 2 -> 100 -> overflow + v = int(float64(tmp) * math.Pow10(int(MaxFsp-fsp))) + return +} + +// alignFrac is used to generate alignment frac, like `100` -> `100000` ,`-100` -> `-100000` +func alignFrac(s string, fsp int) string { + sl := len(s) + if sl > 0 && s[0] == '-' { + sl = sl - 1 + } + if sl < fsp { + return s + strings.Repeat("0", fsp-sl) + } + + return s +} diff --git a/vendor/github.com/pingcap/tidb/types/helper.go b/vendor/github.com/pingcap/tidb/types/helper.go new file mode 100644 index 0000000..f03dc13 --- /dev/null +++ b/vendor/github.com/pingcap/tidb/types/helper.go @@ -0,0 +1,195 @@ +// Copyright 2015 PingCAP, Inc. +// +// 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package types + +import ( + "math" + "strings" + "unicode" + + "github.com/pingcap/errors" +) + +// RoundFloat rounds float val to the nearest integer value with float64 format, like MySQL Round function. +// RoundFloat uses default rounding mode, see https://dev.mysql.com/doc/refman/5.7/en/precision-math-rounding.html +// so rounding use "round half away from zero". +// e.g, 1.5 -> 2, -1.5 -> -2. +func RoundFloat(f float64) float64 { + if math.Abs(f) < 0.5 { + return 0 + } + + return math.Trunc(f + math.Copysign(0.5, f)) +} + +// Round rounds the argument f to dec decimal places. +// dec defaults to 0 if not specified. dec can be negative +// to cause dec digits left of the decimal point of the +// value f to become zero. +func Round(f float64, dec int) float64 { + shift := math.Pow10(dec) + tmp := f * shift + if math.IsInf(tmp, 0) { + return f + } + return RoundFloat(tmp) / shift +} + +// Truncate truncates the argument f to dec decimal places. +// dec defaults to 0 if not specified. dec can be negative +// to cause dec digits left of the decimal point of the +// value f to become zero. +func Truncate(f float64, dec int) float64 { + shift := math.Pow10(dec) + tmp := f * shift + if math.IsInf(tmp, 0) { + return f + } + return math.Trunc(tmp) / shift +} + +// GetMaxFloat gets the max float for given flen and decimal. +func GetMaxFloat(flen int, decimal int) float64 { + intPartLen := flen - decimal + f := math.Pow10(intPartLen) + f -= math.Pow10(-decimal) + return f +} + +// TruncateFloat tries to truncate f. +// If the result exceeds the max/min float that flen/decimal allowed, returns the max/min float allowed. +func TruncateFloat(f float64, flen int, decimal int) (float64, error) { + if math.IsNaN(f) { + // nan returns 0 + return 0, ErrOverflow.GenWithStackByArgs("DOUBLE", "") + } + + maxF := GetMaxFloat(flen, decimal) + + if !math.IsInf(f, 0) { + f = Round(f, decimal) + } + + var err error + if f > maxF { + f = maxF + err = ErrOverflow.GenWithStackByArgs("DOUBLE", "") + } else if f < -maxF { + f = -maxF + err = ErrOverflow.GenWithStackByArgs("DOUBLE", "") + } + + return f, errors.Trace(err) +} + +func isSpace(c byte) bool { + return c == ' ' || c == '\t' +} + +func isDigit(c byte) bool { + return c >= '0' && c <= '9' +} + +func myMax(a, b int) int { + if a > b { + return a + } + return b +} + +func myMaxInt8(a, b int8) int8 { + if a > b { + return a + } + return b +} + +func myMin(a, b int) int { + if a < b { + return a + } + return b +} + +func myMinInt8(a, b int8) int8 { + if a < b { + return a + } + return b +} + +const ( + maxUint = uint64(math.MaxUint64) + uintCutOff = maxUint/uint64(10) + 1 + intCutOff = uint64(math.MaxInt64) + 1 +) + +// strToInt converts a string to an integer in best effort. +func strToInt(str string) (int64, error) { + str = strings.TrimSpace(str) + if len(str) == 0 { + return 0, ErrTruncated + } + negative := false + i := 0 + if str[i] == '-' { + negative = true + i++ + } else if str[i] == '+' { + i++ + } + + var ( + err error + hasNum = false + ) + r := uint64(0) + for ; i < len(str); i++ { + if !unicode.IsDigit(rune(str[i])) { + err = ErrTruncated + break + } + hasNum = true + if r >= uintCutOff { + r = 0 + err = errors.Trace(ErrBadNumber) + break + } + r = r * uint64(10) + + r1 := r + uint64(str[i]-'0') + if r1 < r || r1 > maxUint { + r = 0 + err = errors.Trace(ErrBadNumber) + break + } + r = r1 + } + if !hasNum { + err = ErrTruncated + } + + if !negative && r >= intCutOff { + return math.MaxInt64, errors.Trace(ErrBadNumber) + } + + if negative && r > intCutOff { + return math.MinInt64, errors.Trace(ErrBadNumber) + } + + if negative { + r = -r + } + return int64(r), err +} diff --git a/vendor/github.com/pingcap/tidb/types/json/binary.go b/vendor/github.com/pingcap/tidb/types/json/binary.go new file mode 100644 index 0000000..84b2a1e --- /dev/null +++ b/vendor/github.com/pingcap/tidb/types/json/binary.go @@ -0,0 +1,635 @@ +// Copyright 2017 PingCAP, Inc. +// +// 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package json + +import ( + "bytes" + "encoding/binary" + "encoding/json" + "fmt" + "math" + "reflect" + "sort" + "strconv" + "strings" + "unicode/utf8" + + "github.com/pingcap/errors" + "github.com/pingcap/parser/terror" + "github.com/pingcap/tidb/util/hack" +) + +/* + The binary JSON format from MySQL 5.7 is as follows: + + JSON doc ::= type value + type ::= + 0x01 | // large JSON object + 0x03 | // large JSON array + 0x04 | // literal (true/false/null) + 0x05 | // int16 + 0x06 | // uint16 + 0x07 | // int32 + 0x08 | // uint32 + 0x09 | // int64 + 0x0a | // uint64 + 0x0b | // double + 0x0c | // utf8mb4 string + + value ::= + object | + array | + literal | + number | + string | + + object ::= element-count size key-entry* value-entry* key* value* + + array ::= element-count size value-entry* value* + + // number of members in object or number of elements in array + element-count ::= uint32 + + // number of bytes in the binary representation of the object or array + size ::= uint32 + + key-entry ::= key-offset key-length + + key-offset ::= uint32 + + key-length ::= uint16 // key length must be less than 64KB + + value-entry ::= type offset-or-inlined-value + + // This field holds either the offset to where the value is stored, + // or the value itself if it is small enough to be inlined (that is, + // if it is a JSON literal or a small enough [u]int). + offset-or-inlined-value ::= uint32 + + key ::= utf8mb4-data + + literal ::= + 0x00 | // JSON null literal + 0x01 | // JSON true literal + 0x02 | // JSON false literal + + number ::= .... // little-endian format for [u]int(16|32|64), whereas + // double is stored in a platform-independent, eight-byte + // format using float8store() + + string ::= data-length utf8mb4-data + + data-length ::= uint8* // If the high bit of a byte is 1, the length + // field is continued in the next byte, + // otherwise it is the last byte of the length + // field. So we need 1 byte to represent + // lengths up to 127, 2 bytes to represent + // lengths up to 16383, and so on... +*/ + +// BinaryJSON represents a binary encoded JSON object. +// It can be randomly accessed without deserialization. +type BinaryJSON struct { + TypeCode TypeCode + Value []byte +} + +// String implements fmt.Stringer interface. +func (bj BinaryJSON) String() string { + out, err := bj.MarshalJSON() + terror.Log(err) + return string(out) +} + +// Copy makes a copy of the BinaryJSON +func (bj BinaryJSON) Copy() BinaryJSON { + buf := make([]byte, len(bj.Value)) + copy(buf, bj.Value) + return BinaryJSON{TypeCode: bj.TypeCode, Value: buf} +} + +// MarshalJSON implements the json.Marshaler interface. +func (bj BinaryJSON) MarshalJSON() ([]byte, error) { + buf := make([]byte, 0, len(bj.Value)*3/2) + return bj.marshalTo(buf) +} + +func (bj BinaryJSON) marshalTo(buf []byte) ([]byte, error) { + switch bj.TypeCode { + case TypeCodeString: + return marshalStringTo(buf, bj.GetString()), nil + case TypeCodeLiteral: + return marshalLiteralTo(buf, bj.Value[0]), nil + case TypeCodeInt64: + return strconv.AppendInt(buf, bj.GetInt64(), 10), nil + case TypeCodeUint64: + return strconv.AppendUint(buf, bj.GetUint64(), 10), nil + case TypeCodeFloat64: + return bj.marshalFloat64To(buf) + case TypeCodeArray: + return bj.marshalArrayTo(buf) + case TypeCodeObject: + return bj.marshalObjTo(buf) + } + return buf, nil +} + +// GetInt64 gets the int64 value. +func (bj BinaryJSON) GetInt64() int64 { + return int64(endian.Uint64(bj.Value)) +} + +// GetUint64 gets the uint64 value. +func (bj BinaryJSON) GetUint64() uint64 { + return endian.Uint64(bj.Value) +} + +// GetFloat64 gets the float64 value. +func (bj BinaryJSON) GetFloat64() float64 { + return math.Float64frombits(bj.GetUint64()) +} + +// GetString gets the string value. +func (bj BinaryJSON) GetString() []byte { + strLen, lenLen := uint64(bj.Value[0]), 1 + if strLen >= utf8.RuneSelf { + strLen, lenLen = binary.Uvarint(bj.Value) + } + return bj.Value[lenLen : lenLen+int(strLen)] +} + +// GetKeys gets the keys of the object +func (bj BinaryJSON) GetKeys() BinaryJSON { + count := bj.GetElemCount() + ret := make([]BinaryJSON, 0, count) + for i := 0; i < count; i++ { + ret = append(ret, CreateBinary(string(bj.objectGetKey(i)))) + } + return buildBinaryArray(ret) +} + +// GetElemCount gets the count of Object or Array. +func (bj BinaryJSON) GetElemCount() int { + return int(endian.Uint32(bj.Value)) +} + +func (bj BinaryJSON) arrayGetElem(idx int) BinaryJSON { + return bj.valEntryGet(headerSize + idx*valEntrySize) +} + +func (bj BinaryJSON) objectGetKey(i int) []byte { + keyOff := int(endian.Uint32(bj.Value[headerSize+i*keyEntrySize:])) + keyLen := int(endian.Uint16(bj.Value[headerSize+i*keyEntrySize+keyLenOff:])) + return bj.Value[keyOff : keyOff+keyLen] +} + +func (bj BinaryJSON) objectGetVal(i int) BinaryJSON { + elemCount := bj.GetElemCount() + return bj.valEntryGet(headerSize + elemCount*keyEntrySize + i*valEntrySize) +} + +func (bj BinaryJSON) valEntryGet(valEntryOff int) BinaryJSON { + tpCode := bj.Value[valEntryOff] + valOff := endian.Uint32(bj.Value[valEntryOff+valTypeSize:]) + switch tpCode { + case TypeCodeLiteral: + return BinaryJSON{TypeCode: TypeCodeLiteral, Value: bj.Value[valEntryOff+valTypeSize : valEntryOff+valTypeSize+1]} + case TypeCodeUint64, TypeCodeInt64, TypeCodeFloat64: + return BinaryJSON{TypeCode: tpCode, Value: bj.Value[valOff : valOff+8]} + case TypeCodeString: + strLen, lenLen := uint64(bj.Value[valOff]), 1 + if strLen >= utf8.RuneSelf { + strLen, lenLen = binary.Uvarint(bj.Value[valOff:]) + } + totalLen := uint32(lenLen) + uint32(strLen) + return BinaryJSON{TypeCode: tpCode, Value: bj.Value[valOff : valOff+totalLen]} + } + dataSize := endian.Uint32(bj.Value[valOff+dataSizeOff:]) + return BinaryJSON{TypeCode: tpCode, Value: bj.Value[valOff : valOff+dataSize]} +} + +func (bj BinaryJSON) marshalFloat64To(buf []byte) ([]byte, error) { + // NOTE: copied from Go standard library. + f := bj.GetFloat64() + if math.IsInf(f, 0) || math.IsNaN(f) { + return buf, &json.UnsupportedValueError{Str: strconv.FormatFloat(f, 'g', -1, 64)} + } + + // Convert as if by ES6 number to string conversion. + // This matches most other JSON generators. + // See golang.org/issue/6384 and golang.org/issue/14135. + // Like fmt %g, but the exponent cutoffs are different + // and exponents themselves are not padded to two digits. + abs := math.Abs(f) + ffmt := byte('f') + // Note: Must use float32 comparisons for underlying float32 value to get precise cutoffs right. + if abs != 0 { + if abs < 1e-6 || abs >= 1e21 { + ffmt = 'e' + } + } + buf = strconv.AppendFloat(buf, f, ffmt, -1, 64) + if ffmt == 'e' { + // clean up e-09 to e-9 + n := len(buf) + if n >= 4 && buf[n-4] == 'e' && buf[n-3] == '-' && buf[n-2] == '0' { + buf[n-2] = buf[n-1] + buf = buf[:n-1] + } + } + return buf, nil +} + +func (bj BinaryJSON) marshalArrayTo(buf []byte) ([]byte, error) { + elemCount := int(endian.Uint32(bj.Value)) + buf = append(buf, '[') + for i := 0; i < elemCount; i++ { + if i != 0 { + buf = append(buf, ", "...) + } + var err error + buf, err = bj.arrayGetElem(i).marshalTo(buf) + if err != nil { + return nil, errors.Trace(err) + } + } + return append(buf, ']'), nil +} + +func (bj BinaryJSON) marshalObjTo(buf []byte) ([]byte, error) { + elemCount := int(endian.Uint32(bj.Value)) + buf = append(buf, '{') + for i := 0; i < elemCount; i++ { + if i != 0 { + buf = append(buf, ", "...) + } + buf = marshalStringTo(buf, bj.objectGetKey(i)) + buf = append(buf, ": "...) + var err error + buf, err = bj.objectGetVal(i).marshalTo(buf) + if err != nil { + return nil, errors.Trace(err) + } + } + return append(buf, '}'), nil +} + +func marshalStringTo(buf, s []byte) []byte { + // NOTE: copied from Go standard library. + // NOTE: keep in sync with string above. + buf = append(buf, '"') + start := 0 + for i := 0; i < len(s); { + if b := s[i]; b < utf8.RuneSelf { + if htmlSafeSet[b] { + i++ + continue + } + if start < i { + buf = append(buf, s[start:i]...) + } + switch b { + case '\\', '"': + buf = append(buf, '\\', b) + case '\n': + buf = append(buf, '\\', 'n') + case '\r': + buf = append(buf, '\\', 'r') + case '\t': + buf = append(buf, '\\', 't') + default: + // This encodes bytes < 0x20 except for \t, \n and \r. + // If escapeHTML is set, it also escapes <, >, and & + // because they can lead to security holes when + // user-controlled strings are rendered into JSON + // and served to some browsers. + buf = append(buf, `\u00`...) + buf = append(buf, hexChars[b>>4], hexChars[b&0xF]) + } + i++ + start = i + continue + } + c, size := utf8.DecodeRune(s[i:]) + if c == utf8.RuneError && size == 1 { + if start < i { + buf = append(buf, s[start:i]...) + } + buf = append(buf, `\ufffd`...) + i += size + start = i + continue + } + // U+2028 is LINE SEPARATOR. + // U+2029 is PARAGRAPH SEPARATOR. + // They are both technically valid characters in JSON strings, + // but don't work in JSONP, which has to be evaluated as JavaScript, + // and can lead to security holes there. It is valid JSON to + // escape them, so we do so unconditionally. + // See http://timelessrepo.com/json-isnt-a-javascript-subset for discussion. + if c == '\u2028' || c == '\u2029' { + if start < i { + buf = append(buf, s[start:i]...) + } + buf = append(buf, `\u202`...) + buf = append(buf, hexChars[c&0xF]) + i += size + start = i + continue + } + i += size + } + if start < len(s) { + buf = append(buf, s[start:]...) + } + buf = append(buf, '"') + return buf +} + +func (bj BinaryJSON) marshalValueEntryTo(buf []byte, entryOff int) ([]byte, error) { + tpCode := bj.Value[entryOff] + switch tpCode { + case TypeCodeLiteral: + buf = marshalLiteralTo(buf, bj.Value[entryOff+1]) + default: + offset := endian.Uint32(bj.Value[entryOff+1:]) + tmp := BinaryJSON{TypeCode: tpCode, Value: bj.Value[offset:]} + var err error + buf, err = tmp.marshalTo(buf) + if err != nil { + return nil, errors.Trace(err) + } + } + return buf, nil +} + +func marshalLiteralTo(b []byte, litType byte) []byte { + switch litType { + case LiteralFalse: + return append(b, "false"...) + case LiteralTrue: + return append(b, "true"...) + case LiteralNil: + return append(b, "null"...) + } + return b +} + +// ParseBinaryFromString parses a json from string. +func ParseBinaryFromString(s string) (bj BinaryJSON, err error) { + if len(s) == 0 { + err = ErrInvalidJSONText.GenWithStackByArgs("The document is empty") + return + } + data := hack.Slice(s) + if !json.Valid(data) { + err = ErrInvalidJSONText.GenWithStackByArgs("The document root must not be followed by other values.") + return + } + if err = bj.UnmarshalJSON(data); err != nil { + err = ErrInvalidJSONText.GenWithStackByArgs(err) + } + return +} + +// UnmarshalJSON implements the json.Unmarshaler interface. +func (bj *BinaryJSON) UnmarshalJSON(data []byte) error { + var decoder = json.NewDecoder(bytes.NewReader(data)) + decoder.UseNumber() + var in interface{} + err := decoder.Decode(&in) + if err != nil { + return errors.Trace(err) + } + buf := make([]byte, 0, len(data)) + var typeCode TypeCode + typeCode, buf, err = appendBinary(buf, in) + if err != nil { + return errors.Trace(err) + } + bj.TypeCode = typeCode + bj.Value = buf + return nil +} + +// CreateBinary creates a BinaryJSON from interface. +func CreateBinary(in interface{}) BinaryJSON { + typeCode, buf, err := appendBinary(nil, in) + if err != nil { + panic(err) + } + return BinaryJSON{TypeCode: typeCode, Value: buf} +} + +func appendBinary(buf []byte, in interface{}) (TypeCode, []byte, error) { + var typeCode byte + var err error + switch x := in.(type) { + case nil: + typeCode = TypeCodeLiteral + buf = append(buf, LiteralNil) + case bool: + typeCode = TypeCodeLiteral + if x { + buf = append(buf, LiteralTrue) + } else { + buf = append(buf, LiteralFalse) + } + case int64: + typeCode = TypeCodeInt64 + buf = appendBinaryUint64(buf, uint64(x)) + case uint64: + typeCode = TypeCodeUint64 + buf = appendBinaryUint64(buf, x) + case float64: + typeCode = TypeCodeFloat64 + buf = appendBinaryFloat64(buf, x) + case json.Number: + typeCode, buf, err = appendBinaryNumber(buf, x) + if err != nil { + return typeCode, nil, errors.Trace(err) + } + case string: + typeCode = TypeCodeString + buf = appendBinaryString(buf, x) + case BinaryJSON: + typeCode = x.TypeCode + buf = append(buf, x.Value...) + case []interface{}: + typeCode = TypeCodeArray + buf, err = appendBinaryArray(buf, x) + if err != nil { + return typeCode, nil, errors.Trace(err) + } + case map[string]interface{}: + typeCode = TypeCodeObject + buf, err = appendBinaryObject(buf, x) + if err != nil { + return typeCode, nil, errors.Trace(err) + } + default: + msg := fmt.Sprintf(unknownTypeErrorMsg, reflect.TypeOf(in)) + err = errors.New(msg) + } + return typeCode, buf, err +} + +func appendZero(buf []byte, length int) []byte { + var tmp [8]byte + rem := length % 8 + loop := length / 8 + for i := 0; i < loop; i++ { + buf = append(buf, tmp[:]...) + } + for i := 0; i < rem; i++ { + buf = append(buf, 0) + } + return buf +} + +func appendUint32(buf []byte, v uint32) []byte { + var tmp [4]byte + endian.PutUint32(tmp[:], v) + return append(buf, tmp[:]...) +} + +func appendBinaryNumber(buf []byte, x json.Number) (TypeCode, []byte, error) { + var typeCode TypeCode + if strings.ContainsAny(string(x), "Ee.") { + typeCode = TypeCodeFloat64 + f64, err := x.Float64() + if err != nil { + return typeCode, nil, errors.Trace(err) + } + buf = appendBinaryFloat64(buf, f64) + } else { + typeCode = TypeCodeInt64 + i64, err := x.Int64() + if err != nil { + typeCode = TypeCodeFloat64 + f64, err := x.Float64() + if err != nil { + return typeCode, nil, errors.Trace(err) + } + buf = appendBinaryFloat64(buf, f64) + } else { + buf = appendBinaryUint64(buf, uint64(i64)) + } + } + return typeCode, buf, nil +} + +func appendBinaryString(buf []byte, v string) []byte { + begin := len(buf) + buf = appendZero(buf, binary.MaxVarintLen64) + lenLen := binary.PutUvarint(buf[begin:], uint64(len(v))) + buf = buf[:len(buf)-binary.MaxVarintLen64+lenLen] + buf = append(buf, v...) + return buf +} + +func appendBinaryFloat64(buf []byte, v float64) []byte { + off := len(buf) + buf = appendZero(buf, 8) + endian.PutUint64(buf[off:], math.Float64bits(v)) + return buf +} + +func appendBinaryUint64(buf []byte, v uint64) []byte { + off := len(buf) + buf = appendZero(buf, 8) + endian.PutUint64(buf[off:], v) + return buf +} + +func appendBinaryArray(buf []byte, array []interface{}) ([]byte, error) { + docOff := len(buf) + buf = appendUint32(buf, uint32(len(array))) + buf = appendZero(buf, dataSizeOff) + valEntryBegin := len(buf) + buf = appendZero(buf, len(array)*valEntrySize) + for i, val := range array { + var err error + buf, err = appendBinaryValElem(buf, docOff, valEntryBegin+i*valEntrySize, val) + if err != nil { + return nil, errors.Trace(err) + } + } + docSize := len(buf) - docOff + endian.PutUint32(buf[docOff+dataSizeOff:], uint32(docSize)) + return buf, nil +} + +func appendBinaryValElem(buf []byte, docOff, valEntryOff int, val interface{}) ([]byte, error) { + var typeCode TypeCode + var err error + elemDocOff := len(buf) + typeCode, buf, err = appendBinary(buf, val) + if err != nil { + return nil, errors.Trace(err) + } + switch typeCode { + case TypeCodeLiteral: + litCode := buf[elemDocOff] + buf = buf[:elemDocOff] + buf[valEntryOff] = TypeCodeLiteral + buf[valEntryOff+1] = litCode + return buf, nil + } + buf[valEntryOff] = typeCode + valOff := elemDocOff - docOff + endian.PutUint32(buf[valEntryOff+1:], uint32(valOff)) + return buf, nil +} + +type field struct { + key string + val interface{} +} + +func appendBinaryObject(buf []byte, x map[string]interface{}) ([]byte, error) { + docOff := len(buf) + buf = appendUint32(buf, uint32(len(x))) + buf = appendZero(buf, dataSizeOff) + keyEntryBegin := len(buf) + buf = appendZero(buf, len(x)*keyEntrySize) + valEntryBegin := len(buf) + buf = appendZero(buf, len(x)*valEntrySize) + + fields := make([]field, 0, len(x)) + for key, val := range x { + fields = append(fields, field{key: key, val: val}) + } + sort.Slice(fields, func(i, j int) bool { + return fields[i].key < fields[j].key + }) + for i, field := range fields { + keyEntryOff := keyEntryBegin + i*keyEntrySize + keyOff := len(buf) - docOff + keyLen := uint32(len(field.key)) + endian.PutUint32(buf[keyEntryOff:], uint32(keyOff)) + endian.PutUint16(buf[keyEntryOff+keyLenOff:], uint16(keyLen)) + buf = append(buf, field.key...) + } + for i, field := range fields { + var err error + buf, err = appendBinaryValElem(buf, docOff, valEntryBegin+i*valEntrySize, field.val) + if err != nil { + return nil, errors.Trace(err) + } + } + docSize := len(buf) - docOff + endian.PutUint32(buf[docOff+dataSizeOff:], uint32(docSize)) + return buf, nil +} diff --git a/vendor/github.com/pingcap/tidb/types/json/binary_functions.go b/vendor/github.com/pingcap/tidb/types/json/binary_functions.go new file mode 100644 index 0000000..4a0cfd5 --- /dev/null +++ b/vendor/github.com/pingcap/tidb/types/json/binary_functions.go @@ -0,0 +1,1027 @@ +// Copyright 2017 PingCAP, Inc. +// +// 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package json + +import ( + "bytes" + "encoding/binary" + "encoding/hex" + "fmt" + "sort" + "strconv" + "unicode/utf8" + "unsafe" + + "github.com/pingcap/errors" + "github.com/pingcap/tidb/util/hack" +) + +// Type returns type of BinaryJSON as string. +func (bj BinaryJSON) Type() string { + switch bj.TypeCode { + case TypeCodeObject: + return "OBJECT" + case TypeCodeArray: + return "ARRAY" + case TypeCodeLiteral: + switch bj.Value[0] { + case LiteralNil: + return "NULL" + default: + return "BOOLEAN" + } + case TypeCodeInt64: + return "INTEGER" + case TypeCodeUint64: + return "UNSIGNED INTEGER" + case TypeCodeFloat64: + return "DOUBLE" + case TypeCodeString: + return "STRING" + default: + msg := fmt.Sprintf(unknownTypeCodeErrorMsg, bj.TypeCode) + panic(msg) + } +} + +// Quote is for JSON_QUOTE +func (bj BinaryJSON) Quote() string { + str := hack.String(bj.GetString()) + return strconv.Quote(string(str)) +} + +// Unquote is for JSON_UNQUOTE. +func (bj BinaryJSON) Unquote() (string, error) { + switch bj.TypeCode { + case TypeCodeString: + tmp := string(hack.String(bj.GetString())) + tlen := len(tmp) + if tlen < 2 { + return tmp, nil + } + head, tail := tmp[0], tmp[tlen-1] + if head == '"' && tail == '"' { + // Remove prefix and suffix '"' before unquoting + return unquoteString(tmp[1 : tlen-1]) + } + // if value is not double quoted, do nothing + return tmp, nil + default: + return bj.String(), nil + } +} + +// unquoteString recognizes the escape sequences shown in: +// https://dev.mysql.com/doc/refman/5.7/en/json-modification-functions.html#json-unquote-character-escape-sequences +func unquoteString(s string) (string, error) { + ret := new(bytes.Buffer) + for i := 0; i < len(s); i++ { + if s[i] == '\\' { + i++ + if i == len(s) { + return "", errors.New("Missing a closing quotation mark in string") + } + switch s[i] { + case '"': + ret.WriteByte('"') + case 'b': + ret.WriteByte('\b') + case 'f': + ret.WriteByte('\f') + case 'n': + ret.WriteByte('\n') + case 'r': + ret.WriteByte('\r') + case 't': + ret.WriteByte('\t') + case '\\': + ret.WriteByte('\\') + case 'u': + if i+4 > len(s) { + return "", errors.Errorf("Invalid unicode: %s", s[i+1:]) + } + char, size, err := decodeEscapedUnicode(hack.Slice(s[i+1 : i+5])) + if err != nil { + return "", errors.Trace(err) + } + ret.Write(char[0:size]) + i += 4 + default: + // For all other escape sequences, backslash is ignored. + ret.WriteByte(s[i]) + } + } else { + ret.WriteByte(s[i]) + } + } + return ret.String(), nil +} + +// decodeEscapedUnicode decodes unicode into utf8 bytes specified in RFC 3629. +// According RFC 3629, the max length of utf8 characters is 4 bytes. +// And MySQL use 4 bytes to represent the unicode which must be in [0, 65536). +func decodeEscapedUnicode(s []byte) (char [4]byte, size int, err error) { + size, err = hex.Decode(char[0:2], s) + if err != nil || size != 2 { + // The unicode must can be represented in 2 bytes. + return char, 0, errors.Trace(err) + } + var unicode uint16 + err = binary.Read(bytes.NewReader(char[0:2]), binary.BigEndian, &unicode) + if err != nil { + return char, 0, errors.Trace(err) + } + size = utf8.RuneLen(rune(unicode)) + utf8.EncodeRune(char[0:size], rune(unicode)) + return +} + +// quoteString escapes interior quote and other characters for JSON_QUOTE +// https://dev.mysql.com/doc/refman/5.7/en/json-creation-functions.html#function_json-quote +// TODO: add JSON_QUOTE builtin +func quoteString(s string) string { + var escapeByteMap = map[byte]string{ + '\\': "\\\\", + '"': "\\\"", + '\b': "\\b", + '\f': "\\f", + '\n': "\\n", + '\r': "\\r", + '\t': "\\t", + } + + ret := new(bytes.Buffer) + ret.WriteByte('"') + + start := 0 + hasEscaped := false + + for i := 0; i < len(s); { + if b := s[i]; b < utf8.RuneSelf { + escaped, ok := escapeByteMap[b] + if ok { + if start < i { + ret.WriteString(s[start:i]) + } + hasEscaped = true + ret.WriteString(escaped) + i++ + start = i + } else { + i++ + } + } else { + c, size := utf8.DecodeRune([]byte(s[i:])) + if c == utf8.RuneError && size == 1 { // refer to codes of `binary.marshalStringTo` + if start < i { + ret.WriteString(s[start:i]) + } + hasEscaped = true + ret.WriteString(`\ufffd`) + i += size + start = i + continue + } + i += size + } + } + + if start < len(s) { + ret.WriteString(s[start:]) + } + + if hasEscaped { + ret.WriteByte('"') + return ret.String() + } + return ret.String()[1:] +} + +// Extract receives several path expressions as arguments, matches them in bj, and returns: +// ret: target JSON matched any path expressions. maybe autowrapped as an array. +// found: true if any path expressions matched. +func (bj BinaryJSON) Extract(pathExprList []PathExpression) (ret BinaryJSON, found bool) { + buf := make([]BinaryJSON, 0, 1) + for _, pathExpr := range pathExprList { + buf = bj.extractTo(buf, pathExpr) + } + if len(buf) == 0 { + found = false + } else if len(pathExprList) == 1 && len(buf) == 1 { + // If pathExpr contains asterisks, len(elemList) won't be 1 + // even if len(pathExprList) equals to 1. + found = true + ret = buf[0] + } else { + found = true + ret = buildBinaryArray(buf) + } + return +} + +func (bj BinaryJSON) extractTo(buf []BinaryJSON, pathExpr PathExpression) []BinaryJSON { + if len(pathExpr.legs) == 0 { + return append(buf, bj) + } + currentLeg, subPathExpr := pathExpr.popOneLeg() + if currentLeg.typ == pathLegIndex { + if bj.TypeCode != TypeCodeArray { + if currentLeg.arrayIndex <= 0 && currentLeg.arrayIndex != arrayIndexAsterisk { + buf = bj.extractTo(buf, subPathExpr) + } + return buf + } + elemCount := bj.GetElemCount() + if currentLeg.arrayIndex == arrayIndexAsterisk { + for i := 0; i < elemCount; i++ { + buf = bj.arrayGetElem(i).extractTo(buf, subPathExpr) + } + } else if currentLeg.arrayIndex < elemCount { + buf = bj.arrayGetElem(currentLeg.arrayIndex).extractTo(buf, subPathExpr) + } + } else if currentLeg.typ == pathLegKey && bj.TypeCode == TypeCodeObject { + elemCount := bj.GetElemCount() + if currentLeg.dotKey == "*" { + for i := 0; i < elemCount; i++ { + buf = bj.objectGetVal(i).extractTo(buf, subPathExpr) + } + } else { + child, ok := bj.objectSearchKey(hack.Slice(currentLeg.dotKey)) + if ok { + buf = child.extractTo(buf, subPathExpr) + } + } + } else if currentLeg.typ == pathLegDoubleAsterisk { + buf = bj.extractTo(buf, subPathExpr) + if bj.TypeCode == TypeCodeArray { + elemCount := bj.GetElemCount() + for i := 0; i < elemCount; i++ { + buf = bj.arrayGetElem(i).extractTo(buf, pathExpr) + } + } else if bj.TypeCode == TypeCodeObject { + elemCount := bj.GetElemCount() + for i := 0; i < elemCount; i++ { + buf = bj.objectGetVal(i).extractTo(buf, pathExpr) + } + } + } + return buf +} + +func (bj BinaryJSON) objectSearchKey(key []byte) (BinaryJSON, bool) { + elemCount := bj.GetElemCount() + idx := sort.Search(elemCount, func(i int) bool { + return bytes.Compare(bj.objectGetKey(i), key) >= 0 + }) + if idx < elemCount && bytes.Equal(bj.objectGetKey(idx), key) { + return bj.objectGetVal(idx), true + } + return BinaryJSON{}, false +} + +func buildBinaryArray(elems []BinaryJSON) BinaryJSON { + totalSize := headerSize + len(elems)*valEntrySize + for _, elem := range elems { + if elem.TypeCode != TypeCodeLiteral { + totalSize += len(elem.Value) + } + } + buf := make([]byte, headerSize+len(elems)*valEntrySize, totalSize) + endian.PutUint32(buf, uint32(len(elems))) + endian.PutUint32(buf[dataSizeOff:], uint32(totalSize)) + buf = buildBinaryElements(buf, headerSize, elems) + return BinaryJSON{TypeCode: TypeCodeArray, Value: buf} +} + +func buildBinaryElements(buf []byte, entryStart int, elems []BinaryJSON) []byte { + for i, elem := range elems { + buf[entryStart+i*valEntrySize] = elem.TypeCode + if elem.TypeCode == TypeCodeLiteral { + buf[entryStart+i*valEntrySize+valTypeSize] = elem.Value[0] + } else { + endian.PutUint32(buf[entryStart+i*valEntrySize+valTypeSize:], uint32(len(buf))) + buf = append(buf, elem.Value...) + } + } + return buf +} + +func buildBinaryObject(keys [][]byte, elems []BinaryJSON) BinaryJSON { + totalSize := headerSize + len(elems)*(keyEntrySize+valEntrySize) + for i, elem := range elems { + if elem.TypeCode != TypeCodeLiteral { + totalSize += len(elem.Value) + } + totalSize += len(keys[i]) + } + buf := make([]byte, headerSize+len(elems)*(keyEntrySize+valEntrySize), totalSize) + endian.PutUint32(buf, uint32(len(elems))) + endian.PutUint32(buf[dataSizeOff:], uint32(totalSize)) + for i, key := range keys { + endian.PutUint32(buf[headerSize+i*keyEntrySize:], uint32(len(buf))) + endian.PutUint16(buf[headerSize+i*keyEntrySize+keyLenOff:], uint16(len(key))) + buf = append(buf, key...) + } + entryStart := headerSize + len(elems)*keyEntrySize + buf = buildBinaryElements(buf, entryStart, elems) + return BinaryJSON{TypeCode: TypeCodeObject, Value: buf} +} + +// Modify modifies a JSON object by insert, replace or set. +// All path expressions cannot contain * or ** wildcard. +// If any error occurs, the input won't be changed. +func (bj BinaryJSON) Modify(pathExprList []PathExpression, values []BinaryJSON, mt ModifyType) (retj BinaryJSON, err error) { + if len(pathExprList) != len(values) { + // TODO: should return 1582(42000) + return retj, errors.New("Incorrect parameter count") + } + for _, pathExpr := range pathExprList { + if pathExpr.flags.containsAnyAsterisk() { + // TODO: should return 3149(42000) + return retj, errors.New("Invalid path expression") + } + } + for i := 0; i < len(pathExprList); i++ { + pathExpr, value := pathExprList[i], values[i] + modifier := &binaryModifier{bj: bj} + switch mt { + case ModifyInsert: + bj = modifier.insert(pathExpr, value) + case ModifyReplace: + bj = modifier.replace(pathExpr, value) + case ModifySet: + bj = modifier.set(pathExpr, value) + } + } + return bj, nil +} + +// ArrayInsert insert a BinaryJSON into the given array cell. +// All path expressions cannot contain * or ** wildcard. +// If any error occurs, the input won't be changed. +func (bj BinaryJSON) ArrayInsert(pathExpr PathExpression, value BinaryJSON) (res BinaryJSON, err error) { + // Check the path is a index + if len(pathExpr.legs) < 1 { + return bj, ErrInvalidJSONPathArrayCell + } + parentPath, lastLeg := pathExpr.popOneLastLeg() + if lastLeg.typ != pathLegIndex { + return bj, ErrInvalidJSONPathArrayCell + } + // Find the target array + obj, exists := bj.Extract([]PathExpression{parentPath}) + if !exists || obj.TypeCode != TypeCodeArray { + return bj, nil + } + + idx := lastLeg.arrayIndex + count := obj.GetElemCount() + if idx >= count { + idx = count + } + // Insert into the array + newArray := make([]BinaryJSON, 0, count+1) + for i := 0; i < idx; i++ { + elem := obj.arrayGetElem(i) + newArray = append(newArray, elem) + } + newArray = append(newArray, value) + for i := idx; i < count; i++ { + elem := obj.arrayGetElem(i) + newArray = append(newArray, elem) + } + obj = buildBinaryArray(newArray) + + bj, err = bj.Modify([]PathExpression{parentPath}, []BinaryJSON{obj}, ModifySet) + if err != nil { + return bj, err + } + return bj, nil +} + +// Remove removes the elements indicated by pathExprList from JSON. +func (bj BinaryJSON) Remove(pathExprList []PathExpression) (BinaryJSON, error) { + for _, pathExpr := range pathExprList { + if len(pathExpr.legs) == 0 { + // TODO: should return 3153(42000) + return bj, errors.New("Invalid path expression") + } + if pathExpr.flags.containsAnyAsterisk() { + // TODO: should return 3149(42000) + return bj, errors.New("Invalid path expression") + } + modifer := &binaryModifier{bj: bj} + bj = modifer.remove(pathExpr) + } + return bj, nil +} + +type binaryModifier struct { + bj BinaryJSON + modifyPtr *byte + modifyValue BinaryJSON +} + +func (bm *binaryModifier) set(path PathExpression, newBj BinaryJSON) BinaryJSON { + result := make([]BinaryJSON, 0, 1) + result = bm.bj.extractTo(result, path) + if len(result) > 0 { + bm.modifyPtr = &result[0].Value[0] + bm.modifyValue = newBj + return bm.rebuild() + } + bm.doInsert(path, newBj) + return bm.rebuild() +} + +func (bm *binaryModifier) replace(path PathExpression, newBj BinaryJSON) BinaryJSON { + result := make([]BinaryJSON, 0, 1) + result = bm.bj.extractTo(result, path) + if len(result) == 0 { + return bm.bj + } + bm.modifyPtr = &result[0].Value[0] + bm.modifyValue = newBj + return bm.rebuild() +} + +func (bm *binaryModifier) insert(path PathExpression, newBj BinaryJSON) BinaryJSON { + result := make([]BinaryJSON, 0, 1) + result = bm.bj.extractTo(result, path) + if len(result) > 0 { + return bm.bj + } + bm.doInsert(path, newBj) + return bm.rebuild() +} + +// doInsert inserts the newBj to its parent, and builds the new parent. +func (bm *binaryModifier) doInsert(path PathExpression, newBj BinaryJSON) { + parentPath, lastLeg := path.popOneLastLeg() + result := make([]BinaryJSON, 0, 1) + result = bm.bj.extractTo(result, parentPath) + if len(result) == 0 { + return + } + parentBj := result[0] + if lastLeg.typ == pathLegIndex { + bm.modifyPtr = &parentBj.Value[0] + if parentBj.TypeCode != TypeCodeArray { + bm.modifyValue = buildBinaryArray([]BinaryJSON{parentBj, newBj}) + return + } + elemCount := parentBj.GetElemCount() + elems := make([]BinaryJSON, 0, elemCount+1) + for i := 0; i < elemCount; i++ { + elems = append(elems, parentBj.arrayGetElem(i)) + } + elems = append(elems, newBj) + bm.modifyValue = buildBinaryArray(elems) + return + } + if parentBj.TypeCode != TypeCodeObject { + return + } + bm.modifyPtr = &parentBj.Value[0] + elemCount := parentBj.GetElemCount() + insertKey := hack.Slice(lastLeg.dotKey) + insertIdx := sort.Search(elemCount, func(i int) bool { + return bytes.Compare(parentBj.objectGetKey(i), insertKey) >= 0 + }) + keys := make([][]byte, 0, elemCount+1) + elems := make([]BinaryJSON, 0, elemCount+1) + for i := 0; i < elemCount; i++ { + if i == insertIdx { + keys = append(keys, insertKey) + elems = append(elems, newBj) + } + keys = append(keys, parentBj.objectGetKey(i)) + elems = append(elems, parentBj.objectGetVal(i)) + } + if insertIdx == elemCount { + keys = append(keys, insertKey) + elems = append(elems, newBj) + } + bm.modifyValue = buildBinaryObject(keys, elems) +} + +func (bm *binaryModifier) remove(path PathExpression) BinaryJSON { + result := make([]BinaryJSON, 0, 1) + result = bm.bj.extractTo(result, path) + if len(result) == 0 { + return bm.bj + } + bm.doRemove(path) + return bm.rebuild() +} + +func (bm *binaryModifier) doRemove(path PathExpression) { + parentPath, lastLeg := path.popOneLastLeg() + result := make([]BinaryJSON, 0, 1) + result = bm.bj.extractTo(result, parentPath) + if len(result) == 0 { + return + } + parentBj := result[0] + if lastLeg.typ == pathLegIndex { + if parentBj.TypeCode != TypeCodeArray { + return + } + bm.modifyPtr = &parentBj.Value[0] + elemCount := parentBj.GetElemCount() + elems := make([]BinaryJSON, 0, elemCount-1) + for i := 0; i < elemCount; i++ { + if i != lastLeg.arrayIndex { + elems = append(elems, parentBj.arrayGetElem(i)) + } + } + bm.modifyValue = buildBinaryArray(elems) + return + } + if parentBj.TypeCode != TypeCodeObject { + return + } + bm.modifyPtr = &parentBj.Value[0] + elemCount := parentBj.GetElemCount() + removeKey := hack.Slice(lastLeg.dotKey) + keys := make([][]byte, 0, elemCount+1) + elems := make([]BinaryJSON, 0, elemCount+1) + for i := 0; i < elemCount; i++ { + key := parentBj.objectGetKey(i) + if !bytes.Equal(key, removeKey) { + keys = append(keys, parentBj.objectGetKey(i)) + elems = append(elems, parentBj.objectGetVal(i)) + } + } + bm.modifyValue = buildBinaryObject(keys, elems) +} + +// rebuild merges the old and the modified JSON into a new BinaryJSON +func (bm *binaryModifier) rebuild() BinaryJSON { + buf := make([]byte, 0, len(bm.bj.Value)+len(bm.modifyValue.Value)) + value, tpCode := bm.rebuildTo(buf) + return BinaryJSON{TypeCode: tpCode, Value: value} +} + +func (bm *binaryModifier) rebuildTo(buf []byte) ([]byte, TypeCode) { + if bm.modifyPtr == &bm.bj.Value[0] { + bm.modifyPtr = nil + return append(buf, bm.modifyValue.Value...), bm.modifyValue.TypeCode + } else if bm.modifyPtr == nil { + return append(buf, bm.bj.Value...), bm.bj.TypeCode + } + bj := bm.bj + switch bj.TypeCode { + case TypeCodeLiteral, TypeCodeInt64, TypeCodeUint64, TypeCodeFloat64, TypeCodeString: + return append(buf, bj.Value...), bj.TypeCode + } + docOff := len(buf) + elemCount := bj.GetElemCount() + var valEntryStart int + if bj.TypeCode == TypeCodeArray { + copySize := headerSize + elemCount*valEntrySize + valEntryStart = headerSize + buf = append(buf, bj.Value[:copySize]...) + } else { + copySize := headerSize + elemCount*(keyEntrySize+valEntrySize) + valEntryStart = headerSize + elemCount*keyEntrySize + buf = append(buf, bj.Value[:copySize]...) + if elemCount > 0 { + firstKeyOff := int(endian.Uint32(bj.Value[headerSize:])) + lastKeyOff := int(endian.Uint32(bj.Value[headerSize+(elemCount-1)*keyEntrySize:])) + lastKeyLen := int(endian.Uint16(bj.Value[headerSize+(elemCount-1)*keyEntrySize+keyLenOff:])) + buf = append(buf, bj.Value[firstKeyOff:lastKeyOff+lastKeyLen]...) + } + } + for i := 0; i < elemCount; i++ { + valEntryOff := valEntryStart + i*valEntrySize + elem := bj.valEntryGet(valEntryOff) + bm.bj = elem + var tpCode TypeCode + valOff := len(buf) - docOff + buf, tpCode = bm.rebuildTo(buf) + buf[docOff+valEntryOff] = tpCode + if tpCode == TypeCodeLiteral { + lastIdx := len(buf) - 1 + endian.PutUint32(buf[docOff+valEntryOff+valTypeSize:], uint32(buf[lastIdx])) + buf = buf[:lastIdx] + } else { + endian.PutUint32(buf[docOff+valEntryOff+valTypeSize:], uint32(valOff)) + } + } + endian.PutUint32(buf[docOff+dataSizeOff:], uint32(len(buf)-docOff)) + return buf, bj.TypeCode +} + +// floatEpsilon is the acceptable error quantity when comparing two float numbers. +const floatEpsilon = 1.e-8 + +// compareFloat64 returns an integer comparing the float64 x to y, +// allowing precision loss. +func compareFloat64PrecisionLoss(x, y float64) int { + if x-y < floatEpsilon && y-x < floatEpsilon { + return 0 + } else if x-y < 0 { + return -1 + } + return 1 +} + +// CompareBinary compares two binary json objects. Returns -1 if left < right, +// 0 if left == right, else returns 1. +func CompareBinary(left, right BinaryJSON) int { + precedence1 := jsonTypePrecedences[left.Type()] + precedence2 := jsonTypePrecedences[right.Type()] + var cmp int + if precedence1 == precedence2 { + if precedence1 == jsonTypePrecedences["NULL"] { + // for JSON null. + cmp = 0 + } + switch left.TypeCode { + case TypeCodeLiteral: + // false is less than true. + cmp = int(right.Value[0]) - int(left.Value[0]) + case TypeCodeInt64, TypeCodeUint64, TypeCodeFloat64: + leftFloat := i64AsFloat64(left.GetInt64(), left.TypeCode) + rightFloat := i64AsFloat64(right.GetInt64(), right.TypeCode) + cmp = compareFloat64PrecisionLoss(leftFloat, rightFloat) + case TypeCodeString: + cmp = bytes.Compare(left.GetString(), right.GetString()) + case TypeCodeArray: + leftCount := left.GetElemCount() + rightCount := right.GetElemCount() + for i := 0; i < leftCount && i < rightCount; i++ { + elem1 := left.arrayGetElem(i) + elem2 := right.arrayGetElem(i) + cmp = CompareBinary(elem1, elem2) + if cmp != 0 { + return cmp + } + } + cmp = leftCount - rightCount + case TypeCodeObject: + // only equal is defined on two json objects. + // larger and smaller are not defined. + cmp = bytes.Compare(left.Value, right.Value) + } + } else { + cmp = precedence1 - precedence2 + } + return cmp +} + +func i64AsFloat64(i64 int64, typeCode TypeCode) float64 { + switch typeCode { + case TypeCodeLiteral, TypeCodeInt64: + return float64(i64) + case TypeCodeUint64: + u64 := *(*uint64)(unsafe.Pointer(&i64)) + return float64(u64) + case TypeCodeFloat64: + return *(*float64)(unsafe.Pointer(&i64)) + default: + msg := fmt.Sprintf(unknownTypeCodeErrorMsg, typeCode) + panic(msg) + } +} + +// MergeBinary merges multiple BinaryJSON into one according the following rules: +// 1) adjacent arrays are merged to a single array; +// 2) adjacent object are merged to a single object; +// 3) a scalar value is autowrapped as an array before merge; +// 4) an adjacent array and object are merged by autowrapping the object as an array. +func MergeBinary(bjs []BinaryJSON) BinaryJSON { + var remain = bjs + var objects []BinaryJSON + var results []BinaryJSON + for len(remain) > 0 { + if remain[0].TypeCode != TypeCodeObject { + results = append(results, remain[0]) + remain = remain[1:] + } else { + objects, remain = getAdjacentObjects(remain) + results = append(results, mergeBinaryObject(objects)) + } + } + if len(results) == 1 { + return results[0] + } + return mergeBinaryArray(results) +} + +func getAdjacentObjects(bjs []BinaryJSON) (objects, remain []BinaryJSON) { + for i := 0; i < len(bjs); i++ { + if bjs[i].TypeCode != TypeCodeObject { + return bjs[:i], bjs[i:] + } + } + return bjs, nil +} + +func mergeBinaryArray(elems []BinaryJSON) BinaryJSON { + buf := make([]BinaryJSON, 0, len(elems)) + for i := 0; i < len(elems); i++ { + elem := elems[i] + if elem.TypeCode != TypeCodeArray { + buf = append(buf, elem) + } else { + childCount := elem.GetElemCount() + for j := 0; j < childCount; j++ { + buf = append(buf, elem.arrayGetElem(j)) + } + } + } + return buildBinaryArray(buf) +} + +func mergeBinaryObject(objects []BinaryJSON) BinaryJSON { + keyValMap := make(map[string]BinaryJSON) + keys := make([][]byte, 0, len(keyValMap)) + for _, obj := range objects { + elemCount := obj.GetElemCount() + for i := 0; i < elemCount; i++ { + key := obj.objectGetKey(i) + val := obj.objectGetVal(i) + if old, ok := keyValMap[string(key)]; ok { + keyValMap[string(key)] = MergeBinary([]BinaryJSON{old, val}) + } else { + keyValMap[string(key)] = val + keys = append(keys, key) + } + } + } + sort.Slice(keys, func(i, j int) bool { + return bytes.Compare(keys[i], keys[j]) < 0 + }) + values := make([]BinaryJSON, len(keys)) + for i, key := range keys { + values[i] = keyValMap[string(key)] + } + return buildBinaryObject(keys, values) +} + +// PeekBytesAsJSON trys to peek some bytes from b, until +// we can deserialize a JSON from those bytes. +func PeekBytesAsJSON(b []byte) (n int, err error) { + if len(b) <= 0 { + err = errors.New("Cant peek from empty bytes") + return + } + switch c := TypeCode(b[0]); c { + case TypeCodeObject, TypeCodeArray: + if len(b) >= valTypeSize+headerSize { + size := endian.Uint32(b[valTypeSize+dataSizeOff:]) + n = valTypeSize + int(size) + return + } + case TypeCodeString: + strLen, lenLen := binary.Uvarint(b[valTypeSize:]) + return valTypeSize + int(strLen) + lenLen, nil + case TypeCodeInt64, TypeCodeUint64, TypeCodeFloat64: + n = valTypeSize + 8 + return + case TypeCodeLiteral: + n = valTypeSize + 1 + return + } + err = errors.New("Invalid JSON bytes") + return +} + +// ContainsBinary check whether JSON document contains specific target according the following rules: +// 1) object contains a target object if and only if every key is contained in source object and the value associated with the target key is contained in the value associated with the source key; +// 2) array contains a target nonarray if and only if the target is contained in some element of the array; +// 3) array contains a target array if and only if every element is contained in some element of the array; +// 4) scalar contains a target scalar if and only if they are comparable and are equal; +func ContainsBinary(obj, target BinaryJSON) bool { + switch obj.TypeCode { + case TypeCodeObject: + if target.TypeCode == TypeCodeObject { + len := target.GetElemCount() + for i := 0; i < len; i++ { + key := target.objectGetKey(i) + val := target.objectGetVal(i) + if exp, exists := obj.objectSearchKey(key); !exists || !ContainsBinary(exp, val) { + return false + } + } + return true + } + return false + case TypeCodeArray: + if target.TypeCode == TypeCodeArray { + len := target.GetElemCount() + for i := 0; i < len; i++ { + if !ContainsBinary(obj, target.arrayGetElem(i)) { + return false + } + } + return true + } + len := obj.GetElemCount() + for i := 0; i < len; i++ { + if ContainsBinary(obj.arrayGetElem(i), target) { + return true + } + } + return false + default: + return CompareBinary(obj, target) == 0 + } +} + +// GetElemDepth for JSON_DEPTH +// Returns the maximum depth of a JSON document +// rules referenced by MySQL JSON_DEPTH function +// [https://dev.mysql.com/doc/refman/5.7/en/json-attribute-functions.html#function_json-depth] +// 1) An empty array, empty object, or scalar value has depth 1. +// 2) A nonempty array containing only elements of depth 1 or nonempty object containing only member values of depth 1 has depth 2. +// 3) Otherwise, a JSON document has depth greater than 2. +// e.g. depth of '{}', '[]', 'true': 1 +// e.g. depth of '[10, 20]', '[[], {}]': 2 +// e.g. depth of '[10, {"a": 20}]': 3 +func (bj BinaryJSON) GetElemDepth() int { + switch bj.TypeCode { + case TypeCodeObject: + len := bj.GetElemCount() + maxDepth := 0 + for i := 0; i < len; i++ { + obj := bj.objectGetVal(i) + depth := obj.GetElemDepth() + if depth > maxDepth { + maxDepth = depth + } + } + return maxDepth + 1 + case TypeCodeArray: + len := bj.GetElemCount() + maxDepth := 0 + for i := 0; i < len; i++ { + obj := bj.arrayGetElem(i) + depth := obj.GetElemDepth() + if depth > maxDepth { + maxDepth = depth + } + } + return maxDepth + 1 + default: + return 1 + } +} + +// extractCallbackFn: the type of CALLBACK function for extractToCallback +type extractCallbackFn func(fullpath PathExpression, bj BinaryJSON) (stop bool, err error) + +// extractToCallback: callback alternative of extractTo +// would be more effective when walk through the whole JSON is unnecessary +// NOTICE: path [0] & [*] for JSON object other than array is INVALID, which is different from extractTo. +func (bj BinaryJSON) extractToCallback(pathExpr PathExpression, callbackFn extractCallbackFn, fullpath PathExpression) (stop bool, err error) { + if len(pathExpr.legs) == 0 { + return callbackFn(fullpath, bj) + } + + currentLeg, subPathExpr := pathExpr.popOneLeg() + if currentLeg.typ == pathLegIndex && bj.TypeCode == TypeCodeArray { + elemCount := bj.GetElemCount() + if currentLeg.arrayIndex == arrayIndexAsterisk { + for i := 0; i < elemCount; i++ { + //buf = bj.arrayGetElem(i).extractTo(buf, subPathExpr) + path := fullpath.pushBackOneIndexLeg(i) + stop, err = bj.arrayGetElem(i).extractToCallback(subPathExpr, callbackFn, path) + if stop || err != nil { + return + } + } + } else if currentLeg.arrayIndex < elemCount { + //buf = bj.arrayGetElem(currentLeg.arrayIndex).extractTo(buf, subPathExpr) + path := fullpath.pushBackOneIndexLeg(currentLeg.arrayIndex) + stop, err = bj.arrayGetElem(currentLeg.arrayIndex).extractToCallback(subPathExpr, callbackFn, path) + if stop || err != nil { + return + } + } + } else if currentLeg.typ == pathLegKey && bj.TypeCode == TypeCodeObject { + elemCount := bj.GetElemCount() + if currentLeg.dotKey == "*" { + for i := 0; i < elemCount; i++ { + //buf = bj.objectGetVal(i).extractTo(buf, subPathExpr) + path := fullpath.pushBackOneKeyLeg(string(bj.objectGetKey(i))) + stop, err = bj.objectGetVal(i).extractToCallback(subPathExpr, callbackFn, path) + if stop || err != nil { + return + } + } + } else { + child, ok := bj.objectSearchKey(hack.Slice(currentLeg.dotKey)) + if ok { + //buf = child.extractTo(buf, subPathExpr) + path := fullpath.pushBackOneKeyLeg(currentLeg.dotKey) + stop, err = child.extractToCallback(subPathExpr, callbackFn, path) + if stop || err != nil { + return + } + } + } + } else if currentLeg.typ == pathLegDoubleAsterisk { + //buf = bj.extractTo(buf, subPathExpr) + stop, err = bj.extractToCallback(subPathExpr, callbackFn, fullpath) + if stop || err != nil { + return + } + + if bj.TypeCode == TypeCodeArray { + elemCount := bj.GetElemCount() + for i := 0; i < elemCount; i++ { + //buf = bj.arrayGetElem(i).extractTo(buf, pathExpr) + path := fullpath.pushBackOneIndexLeg(i) + stop, err = bj.arrayGetElem(i).extractToCallback(pathExpr, callbackFn, path) + if stop || err != nil { + return + } + } + } else if bj.TypeCode == TypeCodeObject { + elemCount := bj.GetElemCount() + for i := 0; i < elemCount; i++ { + //buf = bj.objectGetVal(i).extractTo(buf, pathExpr) + path := fullpath.pushBackOneKeyLeg(string(bj.objectGetKey(i))) + stop, err = bj.objectGetVal(i).extractToCallback(pathExpr, callbackFn, path) + if stop || err != nil { + return + } + } + } + } + return false, nil +} + +// BinaryJSONWalkFunc is used as callback function for BinaryJSON.Walk +type BinaryJSONWalkFunc func(fullpath PathExpression, bj BinaryJSON) (stop bool, err error) + +// Walk traverse BinaryJSON objects +func (bj BinaryJSON) Walk(walkFn BinaryJSONWalkFunc, pathExprList ...PathExpression) (err error) { + pathSet := make(map[string]bool) + + var doWalk extractCallbackFn + doWalk = func(fullpath PathExpression, bj BinaryJSON) (stop bool, err error) { + pathStr := fullpath.String() + if _, ok := pathSet[pathStr]; ok { + return false, nil + } + + stop, err = walkFn(fullpath, bj) + pathSet[pathStr] = true + if stop || err != nil { + return + } + + if bj.TypeCode == TypeCodeArray { + elemCount := bj.GetElemCount() + for i := 0; i < elemCount; i++ { + path := fullpath.pushBackOneIndexLeg(i) + stop, err = doWalk(path, bj.arrayGetElem(i)) + if stop || err != nil { + return + } + } + } else if bj.TypeCode == TypeCodeObject { + elemCount := bj.GetElemCount() + for i := 0; i < elemCount; i++ { + path := fullpath.pushBackOneKeyLeg(string(bj.objectGetKey(i))) + stop, err = doWalk(path, bj.objectGetVal(i)) + if stop || err != nil { + return + } + } + } + return false, nil + } + + fullpath := PathExpression{legs: make([]pathLeg, 0, 32), flags: pathExpressionFlag(0)} + if len(pathExprList) > 0 { + for _, pathExpr := range pathExprList { + var stop bool + stop, err = bj.extractToCallback(pathExpr, doWalk, fullpath) + if stop || err != nil { + return err + } + } + } else { + _, err = doWalk(fullpath, bj) + if err != nil { + return + } + } + return nil +} diff --git a/vendor/github.com/pingcap/tidb/types/json/constants.go b/vendor/github.com/pingcap/tidb/types/json/constants.go new file mode 100644 index 0000000..1f8186f --- /dev/null +++ b/vendor/github.com/pingcap/tidb/types/json/constants.go @@ -0,0 +1,241 @@ +// Copyright 2017 PingCAP, Inc. +// +// 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package json + +import ( + "encoding/binary" + "unicode/utf8" + + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/terror" +) + +// TypeCode indicates JSON type. +type TypeCode = byte + +const ( + // TypeCodeObject indicates the JSON is an object. + TypeCodeObject TypeCode = 0x01 + // TypeCodeArray indicates the JSON is an array. + TypeCodeArray TypeCode = 0x03 + // TypeCodeLiteral indicates the JSON is a literal. + TypeCodeLiteral TypeCode = 0x04 + // TypeCodeInt64 indicates the JSON is a signed integer. + TypeCodeInt64 TypeCode = 0x09 + // TypeCodeUint64 indicates the JSON is a unsigned integer. + TypeCodeUint64 TypeCode = 0x0a + // TypeCodeFloat64 indicates the JSON is a double float number. + TypeCodeFloat64 TypeCode = 0x0b + // TypeCodeString indicates the JSON is a string. + TypeCodeString TypeCode = 0x0c +) + +const ( + // LiteralNil represents JSON null. + LiteralNil byte = 0x00 + // LiteralTrue represents JSON true. + LiteralTrue byte = 0x01 + // LiteralFalse represents JSON false. + LiteralFalse byte = 0x02 +) + +const unknownTypeCodeErrorMsg = "unknown type code: %d" +const unknownTypeErrorMsg = "unknown type: %s" + +// htmlSafeSet holds the value true if the ASCII character with the given +// array position can be safely represented inside a JSON string, embedded +// inside of HTML