From 6870a04df4ea323e7a0dbd1a43e35381b3f66e93 Mon Sep 17 00:00:00 2001 From: Wang Jing Date: Tue, 3 Mar 2015 17:09:59 +0800 Subject: [PATCH 1/7] add first commit --- README | 1 + bootstrap.sh | 11 + client/conn.go | 694 +++++++++++++++ client/conn_test.go | 151 ++++ client/db.go | 203 +++++ client/stmt.go | 154 ++++ client/stmt_test.go | 308 +++++++ cmd/proxy/.gitignore | 1 + cmd/proxy/proxy.go | 64 ++ config/config.go | 58 ++ config/config_test.go | 110 +++ dev.env | 21 + doc/mysql-proxy/protocol.txt | 1582 +++++++++++++++++++++++++++++++++ doc/mysql-proxy/scripting.txt | 326 +++++++ doc/protocol.txt | 927 +++++++++++++++++++ hack/hack.go | 27 + hack/hack_test.go | 36 + log/logger.go | 123 +++ makefile | 17 + mysql/charset.go | 542 +++++++++++ mysql/const.go | 152 ++++ mysql/debug.go | 46 + mysql/errcode.go | 870 ++++++++++++++++++ mysql/errname.go | 868 ++++++++++++++++++ mysql/error.go | 62 ++ mysql/field.go | 154 ++++ mysql/packet.go | 17 + mysql/packetio.go | 113 +++ mysql/result.go | 11 + mysql/resultset.go | 393 ++++++++ mysql/resultset_sort.go | 142 +++ mysql/resultset_sort_test.go | 98 ++ mysql/state.go | 233 +++++ mysql/util.go | 308 +++++++ pool/.gitignore | 1 + pool/slice.go | 101 +++ pool/slice1.go | 88 ++ pool/slice1_test.go | 82 ++ pool/slice_test.go | 168 ++++ pool/utils.go | 10 + proxy/auth.go | 57 ++ proxy/conn.go | 398 +++++++++ proxy/conn_auth.go | 44 + proxy/conn_query.go | 166 ++++ proxy/conn_resultset.go | 140 +++ proxy/conn_select.go | 111 +++ proxy/conn_set.go | 90 ++ proxy/conn_shard_test.go | 339 +++++++ proxy/conn_show.go | 61 ++ proxy/conn_stmt.go | 269 ++++++ proxy/conn_stmt_test.go | 286 ++++++ proxy/conn_test.go | 379 ++++++++ proxy/conn_tx.go | 72 ++ proxy/node.go | 305 +++++++ proxy/schema.go | 62 ++ proxy/server.go | 103 +++ proxy/server/server.go | 18 + proxy/server_test.go | 124 +++ proxy/signal.go | 46 + run.sh | 3 + signal/signal.go | 46 + sql/.gitignore | 1 + sql/ast_expr.go | 21 + sql/lex.go | 2 +- sql/lex_ident_test.go | 12 + sql/parser_dml_test.go | 2 + sqltypes/sqltypes.go | 3 +- testfiles/locate.go | 34 + 68 files changed, 12464 insertions(+), 3 deletions(-) create mode 100644 README create mode 100755 bootstrap.sh create mode 100644 client/conn.go create mode 100644 client/conn_test.go create mode 100644 client/db.go create mode 100644 client/stmt.go create mode 100644 client/stmt_test.go create mode 100644 cmd/proxy/.gitignore create mode 100644 cmd/proxy/proxy.go create mode 100644 config/config.go create mode 100644 config/config_test.go create mode 100644 dev.env create mode 100644 doc/mysql-proxy/protocol.txt create mode 100644 doc/mysql-proxy/scripting.txt create mode 100644 doc/protocol.txt create mode 100644 hack/hack.go create mode 100644 hack/hack_test.go create mode 100644 log/logger.go create mode 100644 makefile create mode 100644 mysql/charset.go create mode 100644 mysql/const.go create mode 100644 mysql/debug.go create mode 100644 mysql/errcode.go create mode 100644 mysql/errname.go create mode 100644 mysql/error.go create mode 100644 mysql/field.go create mode 100644 mysql/packet.go create mode 100644 mysql/packetio.go create mode 100644 mysql/result.go create mode 100644 mysql/resultset.go create mode 100644 mysql/resultset_sort.go create mode 100644 mysql/resultset_sort_test.go create mode 100644 mysql/state.go create mode 100644 mysql/util.go create mode 100644 pool/.gitignore create mode 100644 pool/slice.go create mode 100644 pool/slice1.go create mode 100644 pool/slice1_test.go create mode 100644 pool/slice_test.go create mode 100644 pool/utils.go create mode 100644 proxy/auth.go create mode 100644 proxy/conn.go create mode 100644 proxy/conn_auth.go create mode 100644 proxy/conn_query.go create mode 100644 proxy/conn_resultset.go create mode 100644 proxy/conn_select.go create mode 100644 proxy/conn_set.go create mode 100644 proxy/conn_shard_test.go create mode 100644 proxy/conn_show.go create mode 100644 proxy/conn_stmt.go create mode 100644 proxy/conn_stmt_test.go create mode 100644 proxy/conn_test.go create mode 100644 proxy/conn_tx.go create mode 100644 proxy/node.go create mode 100644 proxy/schema.go create mode 100644 proxy/server.go create mode 100644 proxy/server/server.go create mode 100644 proxy/server_test.go create mode 100644 proxy/signal.go create mode 100644 run.sh create mode 100644 signal/signal.go create mode 100644 testfiles/locate.go diff --git a/README b/README new file mode 100644 index 0000000..40b79de --- /dev/null +++ b/README @@ -0,0 +1 @@ +一个go语言开发的mysql proxy diff --git a/bootstrap.sh b/bootstrap.sh new file mode 100755 index 0000000..a172720 --- /dev/null +++ b/bootstrap.sh @@ -0,0 +1,11 @@ +#!/bin/bash + +if [ ! -f bootstrap.sh ]; then + echo "bootstrap.sh must be run from its current directory" 1>&2 + exit 1 +fi + +source ./dev.env + +go get micode.be.xiaomi.com/golib/v1/log +go get gopkg.in/yaml.v2 diff --git a/client/conn.go b/client/conn.go new file mode 100644 index 0000000..d0a2291 --- /dev/null +++ b/client/conn.go @@ -0,0 +1,694 @@ +package client + +import ( + "bytes" + "encoding/binary" + "errors" + "fmt" + . "github.com/wangjild/go-mysql-proxy/mysql" + "net" + "strings" + "time" +) + +var ( + pingPeriod = int64(time.Second * 30) +) + +const ( + autoCommit = "set autocommit = 1" + noautoCommit = "set autocommit = 0" +) + +//proxy <-> mysql server +type Conn struct { + conn net.Conn + + pkg *PacketIO + + addr string + user string + password string + db string + + capability uint32 + + status uint16 + + collation CollationId + charset string + salt []byte + + lastPing int64 + + pkgErr error +} + +func (c *Conn) Connect(addr string, user string, password string, db string) error { + c.addr = addr + c.user = user + c.password = password + c.db = db + + //use utf8 + c.collation = DEFAULT_COLLATION_ID + c.charset = DEFAULT_CHARSET + + return c.ReConnect() +} + +func (c *Conn) ReConnect() error { + if c.conn != nil { + c.conn.Close() + } + + n := "tcp" + if strings.Contains(c.addr, "/") { + n = "unix" + } + + netConn, err := net.Dial(n, c.addr) + if err != nil { + return err + } + + c.conn = netConn + c.pkg = NewPacketIO(netConn) + + if err := c.readInitialHandshake(); err != nil { + c.conn.Close() + return err + } + + if err := c.writeAuthHandshake(); err != nil { + c.conn.Close() + + return err + } + + if _, err := c.readOK(); err != nil { + c.conn.Close() + + return err + } + + //we must always use autocommit + if !c.IsAutoCommit() { + if err := c.SetAutocommit(true); err != nil { + c.conn.Close() + return err + } + } + + c.lastPing = time.Now().Unix() + + return nil +} + +func (c *Conn) Close() error { + if c.conn != nil { + c.conn.Close() + c.conn = nil + } + + return nil +} + +func (c *Conn) readPacket() ([]byte, error) { + d, err := c.pkg.ReadPacket() + c.pkgErr = err + return d, err +} + +func (c *Conn) writePacket(data []byte) error { + err := c.pkg.WritePacket(data) + c.pkgErr = err + return err +} + +func (c *Conn) readInitialHandshake() error { + data, err := c.readPacket() + if err != nil { + return err + } + + if data[0] == ERR_HEADER { + return errors.New("read initial handshake error") + } + + if data[0] < MinProtocolVersion { + return fmt.Errorf("invalid protocol version %d, must >= 10", data[0]) + } + + //skip mysql version and connection id + //mysql version end with 0x00 + //connection id length is 4 + pos := 1 + bytes.IndexByte(data[1:], 0x00) + 1 + 4 + + c.salt = append(c.salt, data[pos:pos+8]...) + + //skip filter + pos += 8 + 1 + + //capability lower 2 bytes + c.capability = uint32(binary.LittleEndian.Uint16(data[pos : pos+2])) + + pos += 2 + + if len(data) > pos { + //skip server charset + //c.charset = data[pos] + pos += 1 + + c.status = binary.LittleEndian.Uint16(data[pos : pos+2]) + pos += 2 + + c.capability = uint32(binary.LittleEndian.Uint16(data[pos:pos+2]))<<16 | c.capability + + pos += 2 + + //skip auth data len or [00] + //skip reserved (all [00]) + pos += 10 + 1 + + // The documentation is ambiguous about the length. + // The official Python library uses the fixed length 12 + // mysql-proxy also use 12 + // which is not documented but seems to work. + c.salt = append(c.salt, data[pos:pos+12]...) + } + + return nil +} + +func (c *Conn) writeAuthHandshake() error { + // Adjust client capability flags based on server support + capability := CLIENT_PROTOCOL_41 | CLIENT_SECURE_CONNECTION | + CLIENT_LONG_PASSWORD | CLIENT_TRANSACTIONS | CLIENT_LONG_FLAG + + capability &= c.capability + + //packet length + //capbility 4 + //max-packet size 4 + //charset 1 + //reserved all[0] 23 + length := 4 + 4 + 1 + 23 + + //username + length += len(c.user) + 1 + + //we only support secure connection + auth := CalcPassword(c.salt, []byte(c.password)) + + length += 1 + len(auth) + + if len(c.db) > 0 { + capability |= CLIENT_CONNECT_WITH_DB + + length += len(c.db) + 1 + } + + c.capability = capability + + data := make([]byte, length+4) + + //capability [32 bit] + data[4] = byte(capability) + data[5] = byte(capability >> 8) + data[6] = byte(capability >> 16) + data[7] = byte(capability >> 24) + + //MaxPacketSize [32 bit] (none) + //data[8] = 0x00 + //data[9] = 0x00 + //data[10] = 0x00 + //data[11] = 0x00 + + //Charset [1 byte] + data[12] = byte(c.collation) + + //Filler [23 bytes] (all 0x00) + pos := 13 + 23 + + //User [null terminated string] + if len(c.user) > 0 { + pos += copy(data[pos:], c.user) + } + //data[pos] = 0x00 + pos++ + + // auth [length encoded integer] + data[pos] = byte(len(auth)) + pos += 1 + copy(data[pos+1:], auth) + + // db [null terminated string] + if len(c.db) > 0 { + pos += copy(data[pos:], c.db) + //data[pos] = 0x00 + } + + return c.writePacket(data) +} + +func (c *Conn) writeCommand(command byte) error { + c.pkg.Sequence = 0 + + return c.writePacket([]byte{ + 0x01, //1 bytes long + 0x00, + 0x00, + 0x00, //sequence + command, + }) +} + +func (c *Conn) writeCommandBuf(command byte, arg []byte) error { + c.pkg.Sequence = 0 + + length := len(arg) + 1 + + data := make([]byte, length+4) + + data[4] = command + + copy(data[5:], arg) + + return c.writePacket(data) +} + +func (c *Conn) writeCommandStr(command byte, arg string) error { + + c.pkg.Sequence = 0 + + length := len(arg) + 1 + + data := make([]byte, length+4) + + data[4] = command + + copy(data[5:], arg) + + return c.writePacket(data) +} + +func (c *Conn) writeCommandUint32(command byte, arg uint32) error { + c.pkg.Sequence = 0 + + return c.writePacket([]byte{ + 0x05, //5 bytes long + 0x00, + 0x00, + 0x00, //sequence + + command, + + byte(arg), + byte(arg >> 8), + byte(arg >> 16), + byte(arg >> 24), + }) +} + +func (c *Conn) writeCommandStrStr(command byte, arg1 string, arg2 string) error { + c.pkg.Sequence = 0 + + data := make([]byte, 4, 6+len(arg1)+len(arg2)) + + data = append(data, command) + data = append(data, arg1...) + data = append(data, 0) + data = append(data, arg2...) + + return c.writePacket(data) +} + +func (c *Conn) Ping() error { + n := time.Now().Unix() + + if n-c.lastPing > pingPeriod { + if err := c.writeCommand(COM_PING); err != nil { + return err + } + + if _, err := c.readOK(); err != nil { + return err + } + } + + c.lastPing = n + + return nil +} + +func (c *Conn) UseDB(dbName string) error { + if c.db == dbName { + return nil + } + + if err := c.writeCommandStr(COM_INIT_DB, dbName); err != nil { + return err + } + + if _, err := c.readOK(); err != nil { + return err + } + + c.db = dbName + return nil +} + +func (c *Conn) GetDB() string { + return c.db +} + +func (c *Conn) Execute(command string) (*Result, error) { + return c.exec(command) +} + +func (c *Conn) Begin() error { + _, err := c.exec("begin") + return err +} + +func (c *Conn) Commit() error { + _, err := c.exec("commit") + return err +} + +func (c *Conn) Rollback() error { + _, err := c.exec("rollback") + return err +} + +func (c *Conn) SetCharset(charset string) error { + charset = strings.Trim(charset, "\"'`") + if c.charset == charset { + return nil + } + + cid, ok := CharsetIds[charset] + if !ok { + return fmt.Errorf("invalid charset %s", charset) + } + + if _, err := c.exec(fmt.Sprintf("set names %s", charset)); err != nil { + return err + } else { + c.collation = cid + return nil + } +} + +func (c *Conn) FieldList(table string, wildcard string) ([]*Field, error) { + if err := c.writeCommandStrStr(COM_FIELD_LIST, table, wildcard); err != nil { + return nil, err + } + + data, err := c.readPacket() + if err != nil { + return nil, err + } + + fs := make([]*Field, 0, 8) + var f *Field + if data[0] == ERR_HEADER { + return nil, c.handleErrorPacket(data) + } else { + for { + // EOF Packet + if c.isEOFPacket(data) { + return fs, nil + } + + if f, err = FieldData(data).Parse(); err != nil { + return nil, err + } + fs = append(fs, f) + + if data, err = c.readPacket(); err != nil { + return nil, err + } + } + } + + return nil, fmt.Errorf("field list error") +} + +func (c *Conn) exec(query string) (*Result, error) { + if err := c.writeCommandStr(COM_QUERY, query); err != nil { + return nil, err + } + + return c.readResult(false) +} + +func (c *Conn) readResultset(data []byte, binary bool) (*Result, error) { + result := &Result{ + Warnings: 0, + Status: 0, + InsertId: 0, + AffectedRows: 0, + + Resultset: &Resultset{}, + } + + // column count + count, _, n := LengthEncodedInt(data) + + if n-len(data) != 0 { + return nil, ErrMalformPacket + } + + result.Fields = make([]*Field, count) + result.FieldNames = make(map[string]int, count) + + if err := c.readResultColumns(result); err != nil { + return nil, err + } + + if err := c.readResultRows(result, binary); err != nil { + return nil, err + } + + return result, nil +} + +func (c *Conn) readResultColumns(result *Result) (err error) { + var i int = 0 + var data []byte + + for { + data, err = c.readPacket() + if err != nil { + return + } + + // EOF Packet + if c.isEOFPacket(data) { + if c.capability&CLIENT_PROTOCOL_41 > 0 { + //result.Warnings = binary.LittleEndian.Uint16(data[1:]) + //todo add strict_mode, warning will be treat as error + result.Status = binary.LittleEndian.Uint16(data[3:]) + c.status = result.Status + } + + if i != len(result.Fields) { + err = ErrMalformPacket + } + + return + } + + if c.isErrPacket(data) { + + } + + result.Fields[i], err = FieldData(data).Parse() + if err != nil { + return + } + + result.FieldNames[string(result.Fields[i].Name)] = i + + i++ + } +} + +func (c *Conn) readResultRows(result *Result, isBinary bool) (err error) { + var data []byte + + for { + data, err = c.readPacket() + if err != nil { + return + } + + // EOF Packet + if c.isEOFPacket(data) { + if c.capability&CLIENT_PROTOCOL_41 > 0 { + //result.Warnings = binary.LittleEndian.Uint16(data[1:]) + //todo add strict_mode, warning will be treat as error + result.Status = binary.LittleEndian.Uint16(data[3:]) + c.status = result.Status + } + + break + } + + if c.isErrPacket(data) { + return c.handleErrorPacket(data) + } + + result.RowDatas = append(result.RowDatas, data) + } + + result.Values = make([][]interface{}, len(result.RowDatas)) + + for i := range result.Values { + result.Values[i], err = result.RowDatas[i].Parse(result.Fields, isBinary) + + if err != nil { + return err + } + } + + return nil +} + +func (c *Conn) readUntilEOF(predict int) (ret [][]byte, err error) { + + ret = make([][]byte, 0, predict+1) + var data []byte + + for { + data, err = c.readPacket() + + if err != nil { + return + } + + ret = append(ret, data) + // EOF Packet + if c.isEOFPacket(data) { + return + } + } + return +} + +func (c *Conn) isEOFPacket(data []byte) bool { + return data[0] == EOF_HEADER && len(data) <= 5 +} + +func (c *Conn) isErrPacket(data []byte) bool { + return data[0] == ERR_HEADER +} + +func (c *Conn) handleOKPacket(data []byte) (*Result, error) { + var n int + var pos int = 1 + + r := new(Result) + + r.AffectedRows, _, n = LengthEncodedInt(data[pos:]) + pos += n + r.InsertId, _, n = LengthEncodedInt(data[pos:]) + pos += n + + if c.capability&CLIENT_PROTOCOL_41 > 0 { + r.Status = binary.LittleEndian.Uint16(data[pos:]) + c.status = r.Status + pos += 2 + + //todo:strict_mode, check warnings as error + r.Warnings = binary.LittleEndian.Uint16(data[pos:]) + pos += 2 + } else if c.capability&CLIENT_TRANSACTIONS > 0 { + r.Status = binary.LittleEndian.Uint16(data[pos:]) + c.status = r.Status + pos += 2 + } + + //info + return r, nil +} + +func (c *Conn) handleErrorPacket(data []byte) error { + e := new(SqlError) + + var pos int = 1 + + e.Code = binary.LittleEndian.Uint16(data[pos:]) + pos += 2 + + if c.capability&CLIENT_PROTOCOL_41 > 0 { + //skip '#' + pos++ + e.State = string(data[pos : pos+5]) + pos += 5 + } + + e.Message = string(data[pos:]) + + return e +} + +func (c *Conn) readOK() (*Result, error) { + data, err := c.readPacket() + if err != nil { + return nil, err + } + + if data[0] == OK_HEADER { + return c.handleOKPacket(data) + } else if data[0] == ERR_HEADER { + return nil, c.handleErrorPacket(data) + } else { + return nil, errors.New("invalid ok packet") + } +} + +func (c *Conn) readResult(binary bool) (*Result, error) { + data, err := c.readPacket() + if err != nil { + return nil, err + } + + if data[0] == OK_HEADER { + return c.handleOKPacket(data) + } else if data[0] == ERR_HEADER { + return nil, c.handleErrorPacket(data) + } else if data[0] == LocalInFile_HEADER { + return nil, ErrMalformPacket + } + + return c.readResultset(data, binary) +} + +func (c *Conn) IsAutoCommit() bool { + return c.status&SERVER_STATUS_AUTOCOMMIT > 0 +} + +func (c *Conn) IsInTransaction() bool { + return c.status&SERVER_STATUS_IN_TRANS > 0 +} + +func (c *Conn) GetCharset() string { + return c.charset +} + +func (c *Conn) SetAutocommit(f bool) (err error) { + + if f == c.IsAutoCommit() { + return + } + + if f { + _, err = c.exec(autoCommit) + } else { + _, err = c.exec(noautoCommit) + } + + return +} diff --git a/client/conn_test.go b/client/conn_test.go new file mode 100644 index 0000000..b3cfb7d --- /dev/null +++ b/client/conn_test.go @@ -0,0 +1,151 @@ +package client + +import ( + "fmt" + . "github.com/wangjild/go-mysql-proxy/mysql" + "testing" +) + +func newTestConn() *Conn { + c := new(Conn) + + if err := c.Connect("127.0.0.1:4306", "root", "", "go_proxy"); err != nil { + panic(err) + } + + return c +} + +func TestConn_Connect(t *testing.T) { + c := newTestConn() + defer c.Close() +} + +func TestConn_Ping(t *testing.T) { + c := newTestConn() + defer c.Close() + + if err := c.Ping(); err != nil { + t.Fatal(err) + } +} + +func TestConn_DeleteTable(t *testing.T) { + c := newTestConn() + defer c.Close() + + if _, err := c.Execute("drop table if exists go_proxy_test_conn"); err != nil { + t.Fatal(err) + } +} + +func TestConn_CreateTable(t *testing.T) { + s := `CREATE TABLE IF NOT EXISTS go_proxy_test_conn ( + id BIGINT(64) UNSIGNED NOT NULL, + str VARCHAR(256), + f DOUBLE, + e enum("test1", "test2"), + u tinyint unsigned, + i tinyint, + PRIMARY KEY (id) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8` + + c := newTestConn() + defer c.Close() + + if _, err := c.Execute(s); err != nil { + t.Fatal(err) + } +} + +func TestConn_Insert(t *testing.T) { + s := `insert into go_proxy_test_conn (id, str, f, e) values(1, "a", 3.14, "test1")` + + c := newTestConn() + defer c.Close() + + if pkg, err := c.Execute(s); err != nil { + t.Fatal(err) + } else { + if pkg.AffectedRows != 1 { + t.Fatal(pkg.AffectedRows) + } + } +} + +func TestConn_Select(t *testing.T) { + s := `select str, f, e from go_proxy_test_conn where id = 1` + + c := newTestConn() + defer c.Close() + + if result, err := c.Execute(s); err != nil { + t.Fatal(err) + } else { + if len(result.Fields) != 3 { + t.Fatal(len(result.Fields)) + } + + if len(result.Values) != 1 { + t.Fatal(len(result.Values)) + } + + if str, _ := result.GetString(0, 0); str != "a" { + t.Fatal("invalid str", str) + } + + if f, _ := result.GetFloat(0, 1); f != float64(3.14) { + t.Fatal("invalid f", f) + } + + if e, _ := result.GetString(0, 2); e != "test1" { + t.Fatal("invalid e", e) + } + + if str, _ := result.GetStringByName(0, "str"); str != "a" { + t.Fatal("invalid str", str) + } + + if f, _ := result.GetFloatByName(0, "f"); f != float64(3.14) { + t.Fatal("invalid f", f) + } + + if e, _ := result.GetStringByName(0, "e"); e != "test1" { + t.Fatal("invalid e", e) + } + + } +} + +func TestConn_Escape(t *testing.T) { + c := newTestConn() + defer c.Close() + + e := `""''\abc` + s := fmt.Sprintf(`insert into go_proxy_test_conn (id, str) values(5, "%s")`, + Escape(e)) + + if _, err := c.Execute(s); err != nil { + t.Fatal(err) + } + + s = `select str from go_proxy_test_conn where id = ?` + + if r, err := c.Execute(s, 5); err != nil { + t.Fatal(err) + } else { + str, _ := r.GetString(0, 0) + if str != e { + t.Fatal(str) + } + } +} + +func TestConn_SetCharset(t *testing.T) { + c := newTestConn() + defer c.Close() + + if err := c.SetCharset("gb2312"); err != nil { + t.Fatal(err) + } +} diff --git a/client/db.go b/client/db.go new file mode 100644 index 0000000..4f72f31 --- /dev/null +++ b/client/db.go @@ -0,0 +1,203 @@ +package client + +import ( + "container/list" + "fmt" + "math/rand" + . "github.com/wangjild/go-mysql-proxy/mysql" + "runtime" + "sync" + "sync/atomic" +) + +type DB struct { + sync.Mutex + + addr string + user string + password string + db string + maxIdleConns int + + idleConns []*list.List + + connNum int32 + barrel int +} + +func Open(addr string, user string, password string, dbName string) (*DB, error) { + db := new(DB) + + db.addr = addr + db.user = user + db.password = password + db.db = dbName + + db.barrel = runtime.NumCPU() + db.idleConns = make([]*list.List, db.barrel, db.barrel) + for i := range db.idleConns { + db.idleConns[i] = list.New() + } + + db.connNum = 0 + return db, nil +} + +func (db *DB) Addr() string { + return db.addr +} + +func (db *DB) String() string { + return fmt.Sprintf("%s:%s@%s/%s?maxIdleConns=%v", + db.user, db.password, db.addr, db.db, db.maxIdleConns) +} + +func (db *DB) Close() error { + db.Lock() + defer db.Unlock() + + for i := range db.idleConns { + if db.idleConns[i].Len() > 0 { + v := db.idleConns[i].Back() + co := v.Value.(*Conn) + db.idleConns[i].Remove(v) + co.Close() + } else { + break + } + } + + db.connNum = 0 + return nil +} + +func (db *DB) Ping() error { + c, err := db.PopConn() + if err != nil { + return err + } + + err = c.Ping() + db.PushConn(c, err) + return err +} + +func (db *DB) SetMaxIdleConnNum(num int) { + db.maxIdleConns = num +} + +func (db *DB) GetConnNum() int { + return int(db.connNum) +} + +func (db *DB) newConn() (*Conn, error) { + co := new(Conn) + + if err := co.Connect(db.addr, db.user, db.password, db.db); err != nil { + return nil, err + } + + return co, nil +} + +func (db *DB) tryReuse(co *Conn) error { + if co.IsInTransaction() { + //we can not reuse a connection in transaction status + if err := co.Rollback(); err != nil { + return err + } + } + + if !co.IsAutoCommit() { + //we can not reuse a connection not in autocomit + if _, err := co.exec("set autocommit = 1"); err != nil { + return err + } + } + + //connection may be set names early + //we must use default utf8 + if co.GetCharset() != DEFAULT_CHARSET { + if err := co.SetCharset(DEFAULT_CHARSET); err != nil { + return err + } + } + + return nil +} + +func (db *DB) PopConn() (co *Conn, err error) { + idx := rand.Intn(db.barrel) + + db.Lock() + if db.idleConns[idx].Len() > 0 { + v := db.idleConns[idx].Front() + co = v.Value.(*Conn) + db.idleConns[idx].Remove(v) + } + db.Unlock() + + if co != nil { + if err := co.Ping(); err == nil { + if err := db.tryReuse(co); err == nil { + //connection may alive + return co, nil + } + } + co.Close() + } + + co, err = db.newConn() + if err == nil { + atomic.AddInt32(&db.connNum, 1) + } + return +} + +func (db *DB) PushConn(co *Conn, err error) { + var closeConn *Conn = nil + + if err != nil { + closeConn = co + } else { + if db.maxIdleConns > 0 { + idx := rand.Intn(db.barrel) + db.Lock() + if db.idleConns[idx].Len() >= db.maxIdleConns { + v := db.idleConns[idx].Front() + closeConn = v.Value.(*Conn) + db.idleConns[idx].Remove(v) + } + db.idleConns[idx].PushBack(co) + db.Unlock() + + } else { + closeConn = co + } + + } + + if closeConn != nil { + atomic.AddInt32(&db.connNum, -1) + + closeConn.Close() + } +} + +type SqlConn struct { + *Conn + + db *DB +} + +func (p *SqlConn) Close() { + if p.Conn != nil { + p.db.PushConn(p.Conn, p.Conn.pkgErr) + p.Conn = nil + } +} + +func (db *DB) GetConn() (*SqlConn, error) { + c, err := db.PopConn() + return &SqlConn{c, db}, err +} diff --git a/client/stmt.go b/client/stmt.go new file mode 100644 index 0000000..560d672 --- /dev/null +++ b/client/stmt.go @@ -0,0 +1,154 @@ +package client + +import ( + "encoding/binary" + . "github.com/wangjild/go-mysql-proxy/mysql" +) + +type Stmt struct { + conn *Conn + id uint32 + query string + + params int + ParamDefs [][]byte + + columns int + ColDefs [][]byte + + flag byte +} + +func (s *Stmt) ID() uint32 { + return s.id +} + +func (s *Stmt) ParamNum() int { + return s.params +} + +func (s *Stmt) ColumnNum() int { + return s.columns +} + +func (s *Stmt) Execute(data []byte) (*Result, error) { + if err := s.write(data); err != nil { + return nil, err + } + + return s.conn.readResult(true) +} + +func (s *Stmt) Close(closeConn bool) error { + if err := s.conn.writeCommandUint32(COM_STMT_CLOSE, s.id); err != nil { + return err + } + + if closeConn { + s.conn.Close() + s.conn = nil + } + + return nil +} + +func (s *Stmt) write(param []byte) error { + + data := make([]byte, 4, 4+9+len(param)) + + data = append(data, COM_STMT_EXECUTE) + + data = append(data, byte(s.id), byte(s.id>>8), byte(s.id>>16), byte(s.id>>24)) + + //flag: CURSOR_TYPE_NO_CURSOR + data = append(data, s.flag) + + data = append(data, 1, 0, 0, 0) + + data = append(data, param...) + + s.conn.pkg.Sequence = 0 + return s.conn.writePacket(data) +} + +func (s *Stmt) SendLongData(pid uint16, payload []byte) error { + + data := make([]byte, 4, 4+7+len(payload)) + data = append(data, COM_STMT_SEND_LONG_DATA) + data = append(data, byte(s.id), byte(s.id>>8), byte(s.id>>16), byte(s.id>>24)) + data = append(data, byte(pid), byte(pid>>8)) + + data = append(data, payload...) + + s.conn.pkg.Sequence = 0 + return s.conn.writePacket(data) +} + +func (s *Stmt) Reset() (*Result, error) { + if err := s.conn.writeCommandUint32(COM_STMT_RESET, s.id); err != nil { + return nil, err + } + + s.flag = CURSOR_TYPE_NO_CURSOR + return s.conn.readOK() +} + +func (c *Conn) Prepare(query string) (*Stmt, error) { + if err := c.writeCommandStr(COM_STMT_PREPARE, query); err != nil { + return nil, err + } + + data, err := c.readPacket() + if err != nil { + return nil, err + } + + if data[0] == ERR_HEADER { + return nil, c.handleErrorPacket(data) + } else if data[0] != OK_HEADER { + return nil, ErrMalformPacket + } + + s := new(Stmt) + s.conn = c + + pos := 1 + + //for statement id + s.id = binary.LittleEndian.Uint32(data[pos:]) + pos += 4 + + //number columns + s.columns = int(binary.LittleEndian.Uint16(data[pos:])) + pos += 2 + + //number params + s.params = int(binary.LittleEndian.Uint16(data[pos:])) + pos += 2 + + //warnings + //warnings = binary.LittleEndian.Uint16(data[pos:]) + + if s.params > 0 { + if ps, err := s.conn.readUntilEOF(s.params); err != nil { + return nil, err + } else { + s.ParamDefs = ps + } + } + + if s.columns > 0 { + if cs, err := s.conn.readUntilEOF(s.columns); err != nil { + return nil, err + } else { + s.ColDefs = cs + } + } + + s.query = query + return s, nil +} + +func (s *Stmt) SetAttr(f byte) { + s.flag = f +} diff --git a/client/stmt_test.go b/client/stmt_test.go new file mode 100644 index 0000000..3ef185f --- /dev/null +++ b/client/stmt_test.go @@ -0,0 +1,308 @@ +package client + +import ( + "testing" +) + +func TestStmt_DropTable(t *testing.T) { + str := `drop table if exists go_proxy_test_stmt` + + c := newTestConn() + + s, err := c.Prepare(str) + if err != nil { + t.Fatal(err) + } + + if _, err := s.Execute(); err != nil { + t.Fatal(err) + } + + s.Close() +} + +func TestStmt_CreateTable(t *testing.T) { + str := `CREATE TABLE IF NOT EXISTS go_proxy_test_stmt ( + id BIGINT(64) UNSIGNED NOT NULL, + str VARCHAR(256), + f DOUBLE, + e enum("test1", "test2"), + u tinyint unsigned, + i tinyint, + PRIMARY KEY (id) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8` + + c := newTestConn() + defer c.Close() + + s, err := c.Prepare(str) + + if err != nil { + t.Fatal(err) + } + + if _, err = s.Execute(); err != nil { + t.Fatal(err) + } + + s.Close() +} + +func TestStmt_Delete(t *testing.T) { + str := `delete from go_proxy_test_stmt` + + c := newTestConn() + defer c.Close() + + s, err := c.Prepare(str) + + if err != nil { + t.Fatal(err) + } + + if _, err := s.Execute(); err != nil { + t.Fatal(err) + } + + s.Close() +} + +func TestStmt_Insert(t *testing.T) { + str := `insert into go_proxy_test_stmt (id, str, f, e, u, i) values (?, ?, ?, ?, ?, ?)` + + c := newTestConn() + defer c.Close() + + s, err := c.Prepare(str) + + if err != nil { + t.Fatal(err) + } + + if pkg, err := s.Execute(1, "a", 3.14, "test1", 255, -127); err != nil { + t.Fatal(err) + } else { + if pkg.AffectedRows != 1 { + t.Fatal(pkg.AffectedRows) + } + } + + s.Close() +} + +func TestStmt_Select(t *testing.T) { + str := `select str, f, e from go_proxy_test_stmt where id = ?` + + c := newTestConn() + defer c.Close() + + s, err := c.Prepare(str) + if err != nil { + t.Fatal(err) + } + + if result, err := s.Execute(1); err != nil { + t.Fatal(err) + } else { + if len(result.Values) != 1 { + t.Fatal(len(result.Values)) + } + + if len(result.Fields) != 3 { + t.Fatal(len(result.Fields)) + } + + if str, _ := result.GetString(0, 0); str != "a" { + t.Fatal("invalid str", str) + } + + if f, _ := result.GetFloat(0, 1); f != float64(3.14) { + t.Fatal("invalid f", f) + } + + if e, _ := result.GetString(0, 2); e != "test1" { + t.Fatal("invalid e", e) + } + + if str, _ := result.GetStringByName(0, "str"); str != "a" { + t.Fatal("invalid str", str) + } + + if f, _ := result.GetFloatByName(0, "f"); f != float64(3.14) { + t.Fatal("invalid f", f) + } + + if e, _ := result.GetStringByName(0, "e"); e != "test1" { + t.Fatal("invalid e", e) + } + + } + + s.Close() +} + +func TestStmt_NULL(t *testing.T) { + str := `insert into go_proxy_test_stmt (id, str, f, e) values (?, ?, ?, ?)` + + c := newTestConn() + defer c.Close() + + s, err := c.Prepare(str) + + if err != nil { + t.Fatal(err) + } + + if pkg, err := s.Execute(2, nil, 3.14, nil); err != nil { + t.Fatal(err) + } else { + if pkg.AffectedRows != 1 { + t.Fatal(pkg.AffectedRows) + } + } + + s.Close() + + str = `select * from go_proxy_test_stmt where id = ?` + s, err = c.Prepare(str) + + if err != nil { + t.Fatal(err) + } + + if r, err := s.Execute(2); err != nil { + t.Fatal(err) + } else { + if b, err := r.IsNullByName(0, "id"); err != nil { + t.Fatal(err) + } else if b == true { + t.Fatal(b) + } + + if b, err := r.IsNullByName(0, "str"); err != nil { + t.Fatal(err) + } else if b == false { + t.Fatal(b) + } + + if b, err := r.IsNullByName(0, "f"); err != nil { + t.Fatal(err) + } else if b == true { + t.Fatal(b) + } + + if b, err := r.IsNullByName(0, "e"); err != nil { + t.Fatal(err) + } else if b == false { + t.Fatal(b) + } + } + + s.Close() +} + +func TestStmt_Unsigned(t *testing.T) { + str := `insert into go_proxy_test_stmt (id, u) values (?, ?)` + + c := newTestConn() + defer c.Close() + + s, err := c.Prepare(str) + + if err != nil { + t.Fatal(err) + } + + if pkg, err := s.Execute(3, uint8(255)); err != nil { + t.Fatal(err) + } else { + if pkg.AffectedRows != 1 { + t.Fatal(pkg.AffectedRows) + } + } + + s.Close() + + str = `select u from go_proxy_test_stmt where id = ?` + + s, err = c.Prepare(str) + if err != nil { + t.Fatal(err) + } + + if r, err := s.Execute(3); err != nil { + t.Fatal(err) + } else { + if u, err := r.GetUint(0, 0); err != nil { + t.Fatal(err) + } else if u != uint64(255) { + t.Fatal(u) + } + } + + s.Close() +} + +func TestStmt_Signed(t *testing.T) { + str := `insert into go_proxy_test_stmt (id, i) values (?, ?)` + + c := newTestConn() + defer c.Close() + + s, err := c.Prepare(str) + + if err != nil { + t.Fatal(err) + } + + if _, err := s.Execute(4, 127); err != nil { + t.Fatal(err) + } + + if _, err := s.Execute(uint64(18446744073709551516), int8(-128)); err != nil { + t.Fatal(err) + } + + s.Close() + +} + +func TestStmt_Trans(t *testing.T) { + c := newTestConn() + defer c.Close() + + if _, err := c.Execute(`insert into go_proxy_test_stmt (id, str) values (1002, "abc")`); err != nil { + t.Fatal(err) + } + + if err := c.Begin(); err != nil { + t.Fatal(err) + } + + str := `select str from go_proxy_test_stmt where id = ?` + + s, err := c.Prepare(str) + if err != nil { + t.Fatal(err) + } + + if _, err := s.Execute(1002); err != nil { + t.Fatal(err) + } + + if err := c.Commit(); err != nil { + t.Fatal(err) + } + + if r, err := s.Execute(1002); err != nil { + t.Fatal(err) + } else { + if str, _ := r.GetString(0, 0); str != `abc` { + t.Fatal(str) + } + } + + if err := s.Close(); err != nil { + t.Fatal(err) + } +} diff --git a/cmd/proxy/.gitignore b/cmd/proxy/.gitignore new file mode 100644 index 0000000..125f526 --- /dev/null +++ b/cmd/proxy/.gitignore @@ -0,0 +1 @@ +proxy diff --git a/cmd/proxy/proxy.go b/cmd/proxy/proxy.go new file mode 100644 index 0000000..d947b45 --- /dev/null +++ b/cmd/proxy/proxy.go @@ -0,0 +1,64 @@ +package main + +import ( + "flag" + "github.com/wangjild/go-mysql-proxy/config" + . "github.com/wangjild/go-mysql-proxy/log" + "github.com/wangjild/go-mysql-proxy/proxy" + "net/http" + _ "net/http/pprof" + "os" + "os/signal" + "runtime" + "syscall" +) + +var configFile *string = flag.String("config", "etc/proxy.yaml", "go mysql proxy config file") +var logLevel *int = flag.Int("loglevel", 0, "0-debug| 1-notice|2-warn|3-fatal") +var logFile *string = flag.String("logfile", "log/proxy.log", "go mysql proxy logfile") + +func main() { + runtime.GOMAXPROCS(runtime.NumCPU()) + + flag.Parse() + + if len(*configFile) == 0 { + SysLog.Fatal("must use a config file") + return + } + + cfg, err := config.ParseConfigFile(*configFile) + if err != nil { + SysLog.Fatal(err.Error()) + return + } + + //Init(&Config{FilePath: *logFile, LogLevel: *logLevel}, + // &Config{FilePath: *logFile, LogLevel: *logLevel}) + + var svr *proxy.Server + svr, err = proxy.NewServer(cfg) + if err != nil { + SysLog.Fatal(err.Error()) + return + } + + sc := make(chan os.Signal, 1) + signal.Notify(sc, + syscall.SIGHUP, + syscall.SIGINT, + syscall.SIGTERM, + syscall.SIGQUIT) + + go func() { + http.ListenAndServe(":11888", nil) + }() + + go func() { + sig := <-sc + SysLog.Notice("Got signal [%d] to exit.", sig) + svr.Close() + }() + + svr.Run() +} diff --git a/config/config.go b/config/config.go new file mode 100644 index 0000000..4eb1541 --- /dev/null +++ b/config/config.go @@ -0,0 +1,58 @@ +package config + +import ( + "gopkg.in/yaml.v2" + "io/ioutil" +) + +type NodeConfig struct { + Name string `yaml:"name"` + DownAfterNoAlive int `yaml:"down_after_noalive"` + IdleConns int `yaml:"idle_conns"` + RWSplit bool `yaml:"rw_split"` + + User string `yaml:"user"` + Password string `yaml:"password"` + + Master string `yaml:"master"` + Slave string `yaml:"slave"` +} + +type SchemaConfig struct { + DB string `yaml:"db"` + Node string `yaml:"node"` + Auths []Auth `yaml:"auths"` +} + +type Auth struct { + User string `yaml:"user"` + Passwd string `yaml:"passwd"` +} + +type Config struct { + Addr string `yaml:"addr"` + User string `yaml:"user"` + Password string `yaml:"password"` + LogLevel string `yaml:"log_level"` + + Nodes []NodeConfig `yaml:"nodes"` + + Schemas []SchemaConfig `yaml:"schemas"` +} + +func ParseConfigData(data []byte) (*Config, error) { + var cfg Config + if err := yaml.Unmarshal([]byte(data), &cfg); err != nil { + return nil, err + } + return &cfg, nil +} + +func ParseConfigFile(fileName string) (*Config, error) { + data, err := ioutil.ReadFile(fileName) + if err != nil { + return nil, err + } + + return ParseConfigData(data) +} diff --git a/config/config_test.go b/config/config_test.go new file mode 100644 index 0000000..13dc4f1 --- /dev/null +++ b/config/config_test.go @@ -0,0 +1,110 @@ +package config + +import ( + "fmt" + "reflect" + "testing" +) + +func TestConfig(t *testing.T) { + var testConfigData = []byte( + ` +addr : 127.0.0.1:4000 +user : root +password : +log_level : error + +nodes : +- + name : node1 + down_after_noalive : 300 + idle_conns : 16 + rw_split: true + user: root + password: + master : 127.0.0.1:3306 + slave : 127.0.0.1:4306 +- + name : node2 + user: root + master : 127.0.0.1:3307 + +- + name : node3 + down_after_noalive : 300 + idle_conns : 16 + rw_split: false + user: root + password: + master : 127.0.0.1:3308 + +schemas : +- + db : go_proxy + node: node1 + auths : + - + user: xm_test + passwd: xiaomi + - + user: xm_test1 + passwd: xiaomi + +`) + + cfg, err := ParseConfigData(testConfigData) + if err != nil { + t.Fatal(err) + } + + if len(cfg.Nodes) != 3 { + t.Fatal(len(cfg.Nodes)) + } + + if len(cfg.Schemas) != 1 { + t.Fatal(len(cfg.Schemas)) + } + + testNode := NodeConfig{ + Name: "node1", + DownAfterNoAlive: 300, + IdleConns: 16, + RWSplit: true, + + User: "root", + Password: "", + + Master: "127.0.0.1:3306", + Slave: "127.0.0.1:4306", + } + + if !reflect.DeepEqual(cfg.Nodes[0], testNode) { + fmt.Printf("%v\n", cfg.Nodes[0]) + t.Fatal("node1 must equal") + } + + testNode_2 := NodeConfig{ + Name: "node2", + User: "root", + Master: "127.0.0.1:3307", + } + + if !reflect.DeepEqual(cfg.Nodes[1], testNode_2) { + t.Fatal("node2 must equal") + } + + testSchema := SchemaConfig{ + DB: "go_proxy", + Node: "node1", + Auths: []Auth{Auth{User: "xm_test", Passwd: "xiaomi"}, Auth{User: "xm_test1", Passwd: "xiaomi"}}, + } + + fmt.Println(cfg.Schemas[0]) + if !reflect.DeepEqual(cfg.Schemas[0], testSchema) { + t.Fatal("schema must equal") + } + + if cfg.LogLevel != "error" || cfg.User != "root" || cfg.Password != "" || cfg.Addr != "127.0.0.1:4000" { + t.Fatal("Top Config not equal.") + } +} diff --git a/dev.env b/dev.env new file mode 100644 index 0000000..e19121d --- /dev/null +++ b/dev.env @@ -0,0 +1,21 @@ +export VTTOP=$(pwd) +export VTROOT="${VTROOT:-${VTTOP/\/src\/micode.be.xiaomi.com\/wangjing1\/go-mysql-proxy/}}" +# VTTOP sanity check +if [[ "$VTTOP" == "${VTTOP/\/src\/micode.be.xiaomi.com\/wangjing1\/go-mysql-proxy/}" ]]; then + echo "WARNING: VTTOP($VTTOP) does not contain src/github.com/wangjild/go-mysql-proxy" +fi + +export GOTOP=$VTTOP + +function prepend_path() +{ + # $1 path variable + # $2 path to add + if [ -d "$2" ] && [[ ":$1:" != *":$2:"* ]]; then + echo "$2:$1" + else + echo "$1" + fi +} + +export GOPATH=$(prepend_path $GOPATH $VTROOT) diff --git a/doc/mysql-proxy/protocol.txt b/doc/mysql-proxy/protocol.txt new file mode 100644 index 0000000..4da8027 --- /dev/null +++ b/doc/mysql-proxy/protocol.txt @@ -0,0 +1,1582 @@ +The MySQL protocol is used between the MySQL Clients and the MySQL Server. It is implemented by + +* the Connectors (Connector/C, ...) +* MySQL Proxy +* the MySQL Server itself for the slaves + +The documentation is sparse and is split between: + + http://forge.mysql.com/wiki/MySQL_Internals_ClientServer_Protocol + +and the source files of the MySQL Server: + +* sql/sql_parse.cc for the protocol basics + + * dispatch_command() + +* sql/sql_prepare.cc for the prepared statement protocol + + * mysqld_stmt_prepare() + * mysqld_stmt_execute() + * mysqld_stmt_close() + * mysqld_stmt_reset() + * mysqld_stmt_fetch() + * mysql_stmt_get_longdata() + +* sql/sql_repl.cc for the binlog protocol + + * mysql_binlog_send() + +* sql/protocol.cc for the value and type encoding + +Tracking the MySQL Protocol +=========================== + +All the examples here are captured with:: + + $ ngrep -x -q -d lo0 '' 'port 3306' + +A mysql client logs in +---------------------- + +Taking a look at the packet dump when a mysql-client logs in:: + + client -> server + + +The client initiates the communication by connecting to the server.:: + + server -> client + 36 00 00 00 0a 35 2e 35 2e 32 2d 6d 32 00 03 00 6....5.5.2-m2... + 00 00 27 75 3e 6f 38 66 79 4e 00 ff f7 08 02 00 ..'u>o8fyN...... + 00 00 00 00 00 00 00 00 00 00 00 00 00 57 4d 5d .............WM] + 6a 7c 53 68 32 5c 59 2e 73 00 j|Sh2\Y.s. + +which responds with a handshake packet which contains the version, some flags and a password challenge.:: + + client -> server + 3a 00 00 01 05 a6 03 00 00 00 00 01 08 00 00 00 :............... + 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ + 00 00 00 00 72 6f 6f 74 00 14 cb b5 ea 68 eb 6b ....root.....h.k + 3b 03 cb ae fb 9b df 5a cb 0f 6d b5 de fd ;......Z..m... + +The client answers with username, some flags and the response to the challenge.:: + + server -> client + 07 00 00 02 00 00 00 02 00 00 00 ........... + +As the client provided the right password and the flags are fine, the server responds with a `OK packet`_. That closes auth-phase +and switches to the command-phase.:: + + client -> server + 21 00 00 00 03 73 65 6c 65 63 74 20 40 40 76 65 !....select @@ve + 72 73 69 6f 6e 5f 63 6f 6d 6d 65 6e 74 20 6c 69 rsion_comment li + 6d 69 74 20 31 mit 1 + +The mysql client first checks the version string of the server and sends a `COM_QUERY`_ packet.:: + + server -> client + 01 00 00 01 01 27 00 00 02 03 64 65 66 00 00 00 .....'....def... + 11 40 40 76 65 72 73 69 6f 6e 5f 63 6f 6d 6d 65 .@@version_comme + 6e 74 00 0c 08 00 1c 00 00 00 fd 00 00 1f 00 00 nt.............. + 05 00 00 03 fe 00 00 02 00 1d 00 00 04 1c 4d 79 ..............My + 53 51 4c 20 43 6f 6d 6d 75 6e 69 74 79 20 53 65 SQL Community Se + 72 76 65 72 20 28 47 50 4c 29 05 00 00 05 fe 00 rver (GPL)...... + 00 02 00 ... + +The server responds with a resultset containing the version-string.:: + + client -> server + 0e 00 00 00 03 73 65 6c 65 63 74 20 55 53 45 52 .....select USER + 28 29 () + +For the prompt (\u ...) the mysql client also asks for the current username.:: + + server -> client + 01 00 00 01 01 1c 00 00 02 03 64 65 66 00 00 00 ..........def... + 06 55 53 45 52 28 29 00 0c 08 00 4d 00 00 00 fd .USER()....M.... + 01 00 1f 00 00 05 00 00 03 fe 00 00 02 00 0f 00 ................ + 00 04 0e 72 6f 6f 74 40 6c 6f 63 61 6c 68 6f 73 ...root@localhos + 74 05 00 00 05 fe 00 00 02 00 t......... + +which is 'root@localhost' in this example. + +MySQL Packet header +------------------- + +The packets that are exchanged between client and server look like:: + + ... + T 127.0.0.1:51656 -> 127.0.0.1:3306 [AP] + 01 00 00 00 01 + +The example shows a COM_QUIT packet. It starts (like all packets) with a 4 byte packet header: + +* 3 byte length +* 1 byte sequence-id + +The length is the length of the payload of the packet. If the payload is larger than 2^24-2 bytes the length is set to 2^24-1 +and a additional packets are sent with the rest of the payload until the payload of a packet is less than 2^24-2 bytes. + +The sequence-id is incremented with each packet for a sequence of packets. It is reset, when a new command begins. + +Basic Types +=========== + +Integer +------- + +The MySQL Protocol has a set of possible encodings for integers: + +* fixed length intergers +* length encoded integers + +fixed length integer +.................... + +The fixed length integers can be of a byte-length 1, 2, 3, 4 or 8 and send their first byte first. The packet length +for example is:: + + 01 00 00 + +is a 3-byte fixed length integer with the value `1`. + +length encoded integer +...................... + +In other places integers have a variable size of 1, 3, 4 or 9 bytes depending on their value: + +========================== ====== +value bytes +========================== ====== +``< 251`` 1 +``>= 251 < (2^16 - 1)`` 3 +``>= (2^16) < (2^24 - 1)`` 4 +``>= (2^24)`` 9 +========================== ====== + +The 1-byte values from 251 to 255 have a special meaning and aren't used for integers. Instead they +signal special packets or the 3 other variable length integer types: + +======== === =========== +hex dec description +======== === =========== +``0xfb`` 251 NULL in the `Text Resultset Row`_ +``0xfc`` 252 indicator for a 2-byte integer +``0xfd`` 253 indicator for a 3-byte integer +``0xfe`` 254 indicator for a 8-byte integer or first byte of a `EOF packet`_ +``0xff`` 255 first byte of a `ERR packet`_ +======== === =========== + +They also send least significant byte first. + +String +------ + +Strings appear in a few forms in the protocol: + +_`Fixed Length String` + Fixed length strings have a known, hardcoded length. An example is the `sql-state` of the `ERR packet`_ which is always 5 byte long. + +_`NUL-terminated String` + Strings that are terminated by a [00] byte. + +_`Length Encoded String` + A length encoded string is a string that is prefixed with `length encoded integer`_ describing the length of the string. + +_`End-of-packet String` + If a string is the last component of a packet, its length can be calculated from the overall-packet length minus the current position. + +Describing packets +------------------ + +In this document we describe the packets by first defining their payload and provide examples with packet header and payload as +you would see it on the wire.:: + + + + + direction: client -> server + + payload: + + + Example: + 01 00 00 00 01 + +The `` describes the sequence of bytes of the packet: + +============== =========== +type description +============== =========== +1 1 byte `fixed length integer`_ +2 2 byte `fixed length integer`_ +3 3 byte `fixed length integer`_ +4 4 byte `fixed length integer`_ +8 8 byte `fixed length integer`_ +lenenc-int `length encoded integer`_ +string `NUL-terminated string`_ +string[p] `End-of-packet string`_ +string[``] fixed length string with the length `` +lenenc-str `length encoded string`_ +n a byte sequence of any length +============== =========== + +.. attention:: + Some packets have optional fields or a different layout depending on the `capability flags`_ that are sent as part of the + `Auth Response Packet`_. + +If a field has a fixed value its description will show it as hex value in brackets like `[00]`. + +Generic Response Packets +======================== + +For most of the commands the client sends to the server one of two packets is returned as response: + +* `OK packet`_ +* `ERR packet`_ + +OK packet +--------- + +:: + + OK + + direction: server -> client + + payload: + 1 [00] the OK header + lenenc-int affected rows + lenenc-int last-insert-id + 2 status flags + if capabilities & PROTOCOL_41: + 2 warnings + + example: + 07 00 00 02 00 00 00 02 00 00 00 ........... + +Status Flags +............ + +The status flags are a bit-field: + +====== ============= +flag constant name +====== ============= +0x0001 SERVER_STATUS_IN_TRANS +0x0002 SERVER_STATUS_AUTOCOMMIT +0x0008 _`SERVER_MORE_RESULTS_EXISTS` +0x0010 SERVER_STATUS_NO_GOOD_INDEX_USED +0x0020 SERVER_STATUS_NO_INDEX_USED +0x0040 SERVER_STATUS_CURSOR_EXISTS +0x0080 SERVER_STATUS_LAST_ROW_SENT +0x0100 SERVER_STATUS_DB_DROPPED +0x0200 SERVER_STATUS_NO_BACKSLASH_ESCAPES +0x0400 SERVER_STATUS_METADATA_CHANGED +0x0800 SERVER_QUERY_WAS_SLOW +0x1000 SERVER_PS_OUT_PARAMS +====== ============= + +ERR packet +---------- + +:: + + ERR + + direction: server -> client + + payload: + 1 [ff] the ERR header + 2 error code + if capabilities & PROTOCOL_41: + 1 '#' the sql-state marker + string[5] sql-state + all protocols: + string[p] error-message + + example: + 17 00 00 01 ff 48 04 23 48 59 30 30 30 4e 6f 20 .....H.#HY000No + 74 61 62 6c 65 73 20 75 73 65 64 tables used + + +The Auth Phase +============== + +A simple MySQL 4.1+ auth starts with: + +1. the client connecting to the server +2. the server responds with the `Auth Challenge Packet`_ +3. the client sends the `Auth Response Packet`_ +4. the server responds with `OK Packet`_ + +If the auth fails, it sends a `ERR Packet`_ instead of a `OK Packet`_ and closes the connection: + +1. the client connecting to the server +2. the server responds with the `Auth Challenge Packet`_ +3. the client sends the `Auth Response Packet`_ +4. the server responds with `ERR Packet`_ and closes connection + +or the server denies the client right away if for example its IP is deny: + +1. the client connecting to the server +2. the server responds with the `ERR Packet`_ and closes connection + +MySQL 4.1+ server also may respond at step 4 with a `Old Password Auth Challenge Packet`_: + +1. the client connecting to the server +2. the server responds with the `Auth Challenge Packet`_ +3. the client sends the `Auth Response Packet`_ +4. the server responds with the `Old Password Auth Challenge Packet`_ +5. the client sends the `Old Password Auth Response Packet`_ +6. the server responds with `OK Packet`_ or `ERR Packet`_ and closes the connection + +Auth Challenge Packet +--------------------- + +As first packet the server sends a Auth Challenge to the client. It contains several other fields: + +* the protocol version +* the mysql-server version string +* the server capabilities +* the auth challenge + +The client answers with a `Auth Response Packet`_. + +:: + + Auth Challenge Packet + response: Auth Response Packet + + payload: + 1 [0a] protocol version + string server version + 4 connection id + string[8] challenge-part-1 + 1 [00] filler + 2 capability flags + 1 character set + 2 status flags + string[13] reserved + if capabilities & SECURE_CONNECTION: + string[12] challenge-part-2 + 1 [00] filler + + example: + 36 00 00 00 0a 35 2e 35 2e 32 2d 6d 32 00 0b 00 6....5.5.2-m2... + 00 00 64 76 48 40 49 2d 43 4a 00 ff f7 08 02 00 ..dvH@I-CJ...... + 00 00 00 00 00 00 00 00 00 00 00 00 00 2a 34 64 .............*4d + 7c 63 5a 77 6b 34 5e 5d 3a 00 |cZwk4^]:. + +`status flags` is defined as the `Status Flags`_ of the `OK packet`_. + +Capability flags +................ + +The capability flags are used by the client and server to indicate which features +they support and want to use. + +====== ============================== ================================== +flags constant name description +====== ============================== ================================== +0x0001 CLIENT_LONG_PASSWORD new more secure passwords +0x0002 CLIENT_FOUND_ROWS Found instead of affected rows +0x0004 CLIENT_LONG_FLAG Get all column flags +0x0008 CLIENT_CONNECT_WITH_DB One can specify db on connect +0x0010 CLIENT_NO_SCHEMA Don't allow database.table.column +0x0020 CLIENT_COMPRESS Can use compression protocol +0x0040 CLIENT_ODBC Odbc client +0x0080 _`CLIENT_LOCAL_FILES` Can use LOAD DATA LOCAL +0x0100 CLIENT_IGNORE_SPACE Ignore spaces before '(' +0x0200 _`CLIENT_PROTOCOL_41` New 4.1 protocol +0x0400 CLIENT_INTERACTIVE This is an interactive client +0x0800 CLIENT_SSL Switch to SSL after handshake +0x1000 CLIENT_IGNORE_SIGPIPE IGNORE sigpipes +0x2000 CLIENT_TRANSACTIONS Client knows about transactions +0x4000 CLIENT_RESERVED Old flag for 4.1 protocol +0x8000 CLIENT_SECURE_CONNECTION New 4.1 authentication +====== ============================== ================================== + + + +Auth Response Packet +-------------------- + +The client answers the `Auth Challenge Packet`_ with: + +* its capability flags +* its password hashed with challenge + +If the capabilities have a `CLIENT_PROTOCOL_41`_ flag set the response packet is:: + + Auth Response Packet 4.1+ + payload: + 4 capability flags + 4 max-packet size + 1 character set + string[23] reserved + string username + if capabilities & SECURE_CONNECTION: + lenenc-str auth-response + else: + string auth-response + all: + string[p] database + +If not, it is:: + + Auth Response Packet pre-4.1 + payload: + 2 capability flags + 3 max-packet size + string username + string auth-response + +`capability flags` are the same as defined in the `Capability flags`_ of the `Auth Challenge Packet`_ plus: + +========== ============================== ================================== +flags constant name description +========== ============================== ================================== +0x00010000 _`CLIENT_MULTI_STATEMENTS` Enable/disable multi-stmt support +0x00020000 _`CLIENT_MULTI_RESULTS` Enable/disable multi-results +0x00040000 _`CLIENT_PS_MULTI_RESULTS` Multi-results in PS-protocol +0x40000000 CLIENT_SSL_VERIFY_SERVER_CERT +0x80000000 CLIENT_REMEMBER_OPTIONS +========== ============================== ================================== + + + +Old Password Auth Challenge Packet +---------------------------------- + +In case the server stored a password in the OLD_PASSWORD() fashion for this +user the client has to use another hash for the password. + +:: + + Old Password Auth Challenge Packet + ask the client to send the password hashed with insecure hash-function + + payload: + 1 [fe] + + example: + 01 00 00 02 fe + +Old Password Auth Response Packet +--------------------------------- + +:: + + Old Password Auth Response Packet + the password hashed with old, insecure hash-function + + payload: + string auth-response + + example: + 09 00 00 03 5c 49 4d 5e 4e 58 4f 47 00 ....\IM^NXOG. + + + +The Command Phase +================= + +In the command phase the client sends a command packet with the sequence-id [00]:: + + 13 00 00 00 03 53 ... + 01 00 00 00 01 + ^^- command-byte + ^^---- sequence-id == 0 + +The first byte of the payload describes the command-type like: + +=== ====================== +hex constant name +=== ====================== +00 `COM_SLEEP`_ +01 `COM_QUIT`_ +02 `COM_INIT_DB`_ +03 `COM_QUERY`_ +04 `COM_FIELD_LIST`_ +05 `COM_CREATE_DB`_ +06 `COM_DROP_DB`_ +07 `COM_REFRESH`_ +08 `COM_SHUTDOWN`_ +09 `COM_STATISTICS`_ +0a `COM_PROCESS_INFO`_ +0b `COM_CONNECT`_ +0c `COM_PROCESS_KILL`_ +0d `COM_DEBUG`_ +0e `COM_PING`_ +0f `COM_TIME`_ +10 `COM_DELAYED_INSERT`_ +11 `COM_CHANGE_USER`_ +12 COM_BINLOG_DUMP +13 `COM_TABLE_DUMP`_ +14 `COM_CONNECT_OUT`_ +15 COM_REGISTER_SLAVE +16 `COM_STMT_PREPARE`_ +17 `COM_STMT_EXECUTE`_ +18 `COM_STMT_SEND_LONG_DATA`_ +19 `COM_STMT_CLOSE`_ +1a `COM_STMT_RESET`_ +1b `COM_SET_OPTION`_ +1c `COM_STMT_FETCH`_ +1d `COM_DAEMON`_ +=== ====================== + +.. _COM_SLEEP: `unhandled commands`_ +.. _COM_CONNECT: `unhandled commands`_ +.. _COM_TIME: `unhandled commands`_ +.. _COM_DELAYED_INSERT: `unhandled commands`_ +.. _COM_CONNECT_OUT: `unhandled commands`_ +.. _COM_TABLE_DUMP: `unhandled commands`_ +.. _COM_DAEMON: `unhandled commands`_ + +The commands belong to + +* the `Old Commands`_ +* the `Prepared Statements`_ Commands +* the `Stored Procedures`_ Commands +* or the Replication Commands + +Old Commands +============ + +The old commands are supported for all MySQL Server versions from 3.23 upwards (and perhaps older). + +unhandled commands +------------------ + +* COM_SLEEP +* COM_CONNECT +* COM_TIME +* COM_DELAYED_INSERT +* COM_DAEMON + +These commands are only used internally by the server or are deprecated. Sending the to the server always results in a +`ERR packet`_. + +COM_QUIT +-------- + +:: + + COM_QUIT + tells the server that the client wants to close the connection + + direction: client -> server + response: either a connection close or a OK packet + + payload: + 1 [01] COM_QUIT + + Example: + 01 00 00 00 01 + +COM_INIT_DB +----------- + +:: + + COM_INIT_DB + change the default schema of the connection + + direction: client -> server + response: OK or ERR + + payload: + 1 [02] COM_INIT_DB + string[p] schema name + + example: + 05 00 00 00 02 74 65 73 74 .....test + +COM_QUERY +--------- + +A COM_QUERY is used to send the server a text-based query that is executed immediately. + +The server replies to a COM_QUERY packet with a `COM_QUERY Response`_. + +:: + + COM_QUERY + tells the server to execute a text-based query + + direction: client -> server + + payload: + 1 [03] COM_QUERY + string[p] the query the server shall execute + + Example: + 21 00 00 00 03 73 65 6c 65 63 74 20 40 40 76 65 !....select @@ve + 72 73 69 6f 6e 5f 63 6f 6d 6d 65 6e 74 20 6c 69 rsion_comment li + 6d 69 74 20 31 mit 1 + +The length of the query-string is a taken from the packet length - 1. + +API call: `mysql_query() `_ + + +COM_QUERY Response +.................. + +The query-response packet is a meta packet which can be one of + +* a `ERR packet`_ +* a `OK packet`_ +* a `LOCAL INFILE request`_ +* a `Text Resultset`_ + +The type of the packet is defined by the type-identifier:: + + COM_QUERY response + response to a COM_QUERY packet + + payload + lenenc-int number of columns in the resultset + +If the number of columns in the resultset is 0, this is a `OK packet`_. + +If it is not a valid `length encoded integer`_ it is a either a `ERR packet`_ or a `LOCAL INFILE request`_. + +Text Resultset +************** + +A Text Resultset is a possible `COM_QUERY Response`_. + +It is made up of a two parts: + +* the column definition +* the rows + +which consists of a sequence of packets. + +The column defintion is starts with a packet containing the column-count and is +followed by as many `Column Definition`_ packets as we have columns and is terminated +by a `EOF packet`. + +Each row is a packet too. The rows are terminated by another `EOF packet`_. In case +the query could generate the column-definition, but generating the rows afterwards +failed a `ERR packet`_ may be sent instead of the last `EOF packet`_. + +* a packet containing a `length encoded integer`_ column-count +* column-count * `Column Definition`_ packets +* `EOF packet`_ +* row-count * packets as in `Text Resultset Row`_ format +* `EOF packet`_ + +In the example we use `|` to show the packet borders:: + + 01 00 00 01 01|27 00 00 02 03 64 65 66 00 00 00 .....'....def... + 11 40 40 76 65 72 73 69 6f 6e 5f 63 6f 6d 6d 65 .@@version_comme + 6e 74 00 0c 08 00 1c 00 00 00 fd 00 00 1f 00 00| nt.............. + 05 00 00 03 fe 00 00 02 00|1d 00 00 04 1c 4d 79 ..............My + 53 51 4c 20 43 6f 6d 6d 75 6e 69 74 79 20 53 65 SQL Community Se + 72 76 65 72 20 28 47 50 4c 29|05 00 00 05 fe 00 rver (GPL)...... + 00 02 00 ... + +It has one column (`01 00 00 01 01`) and a field named `@@version_comment` whichs is a `MYSQL_TYPE_VAR_STRING`_ [fd]. +It has one row and its one value is `MySQL Community Server (GPL)`. + +If the `SERVER_MORE_RESULTS_EXISTS`_ flag is set in the last `EOF packet`_ a `multi-resultset`_ is sent. + + +It may also be resultset with an closing `ERR packet`_: + +* a packet containing a `length encoded integer`_ column-count +* column-count * `Column Definition`_ packets +* `EOF packet`_ +* `ERR packet`_ + +which is generated for queries like `EXPLAIN SELECT * FROM dual`. + +Column Types +,,,,,,,,,,,, + +=== ====================== +hex constant name +=== ====================== +00 _`MYSQL_TYPE_DECIMAL` +01 _`MYSQL_TYPE_TINY` +02 _`MYSQL_TYPE_SHORT` +03 _`MYSQL_TYPE_LONG` +04 _`MYSQL_TYPE_FLOAT` +05 _`MYSQL_TYPE_DOUBLE` +06 _`MYSQL_TYPE_NULL` +07 _`MYSQL_TYPE_TIMESTAMP` +08 _`MYSQL_TYPE_LONGLONG` +09 _`MYSQL_TYPE_INT24` +0a _`MYSQL_TYPE_DATE` +0b _`MYSQL_TYPE_TIME` +0c _`MYSQL_TYPE_DATETIME` +0d _`MYSQL_TYPE_YEAR` +0e _`MYSQL_TYPE_NEWDATE` +0f _`MYSQL_TYPE_VARCHAR` +10 _`MYSQL_TYPE_BIT` +f6 _`MYSQL_TYPE_NEWDECIMAL` +f7 _`MYSQL_TYPE_ENUM` +f8 _`MYSQL_TYPE_SET` +f9 _`MYSQL_TYPE_TINY_BLOB` +fa _`MYSQL_TYPE_MEDIUM_BLOB` +fb _`MYSQL_TYPE_LONG_BLOB` +fc _`MYSQL_TYPE_BLOB` +fd _`MYSQL_TYPE_VAR_STRING` +fe _`MYSQL_TYPE_STRING` +ff _`MYSQL_TYPE_GEOMETRY` +=== ====================== + +Column Definition +,,,,,,,,,,,,,,,,, + +If the PROTOCOL_41 capability is set:: + + Column Definition - 4.1+ + + payload: + lenenc-str catalog + lenenc-str schema + lenenc-str table + lenenc-str org_table + lenenc-str name + lenenc-str org_name + 1 filler [00] + 2 character set + 4 column length + 1 type + 2 flags + 1 decimals + 2 filler [00] [00] + +If not :: + + Column Definition - pre-4.1 + + payload: + lenenc-str table + lenenc-str name + 1 [03] + 3 column length + 1 [01] + 1 type + 1 [02] or [03] + if above field == 02: + 1 flags + if ... == 03: + 2 flags + all: + 1 decimals + +Text Resultset Row +,,,,,,,,,,,,,,,,,, + +A row with the data for each column. + +* Integers are sent as `length encoded integer`_. +* everything else sent as `length encoded string`_. + +If a field is NULL `0xfb` is sent as described in `length encoded integer`_. + +EOF packet +,,,,,,,,,, + +:: + + EOF + + direction: server -> client + + payload: + 1 [fe] the EOF header + if capabilities & PROTOCOL_41: + 2 warning count + 2 status flags + + example: + 05 00 00 05 fe 00 00 02 00 + +The status flags are a bit-field as defined in the `Status Flags`_ of the `OK packet`_. + +LOCAL INFILE request +******************** + +If the client wants to LOAD DATA from a LOCAL file into the server it sends:: + + LOAD DATA LOCAL INFILE '' INTO TABLE ; + +The LOCAL keyword triggers the server to send a LOAD INFILE packet asks the client +to send the file via a `LOCAL INFILE data`_ response. + +The client has to set the `CLIENT_LOCAL_FILES`_ capability. + +:: + + LOCAL INFILE packet + + direction: server -> client + response: LOCAL INFILE data + + payload: + 1 [fb] LOCAL INFILE + string[p] filename the client shall send + + example: + 0c 00 00 01 fb 2f 65 74 63 2f 70 61 73 73 77 64 ...../etc/passwd + +LOCAL INFILE data +,,,,,,,,,,,,,,,,, + +The client sends its file data AS IS to the server in response to a `LOCAL INFILE request`_. + +:: + + LOAD INFILE data + + direction: client data + + payload: + n the filedata + +COM_FIELD_LIST +-------------- + +:: + + COM_FIELD_LIST + get the column definition of a tables + + direction: client -> server + response: + + payload: + 1 [04] COM_FIELD_LIST + string table + string[p] field wildcard + +API call: `mysql_list_fields() `_ + +COM_FIELD_LIST response +....................... + +The response to a `COM_FIELD_LIST`_ can either be a + +* a `ERR packet`_ or the +* first half of a `Text Resultset`_ + + * a packet containing a `length encoded integer`_ column-count + * column-count * `Column Definition`_ packets + * `EOF packet`_ + +COM_CREATE_DB +------------- + +:: + + COM_CREATE_DB + create a schema + + direction: client -> server + response: OK or ERR + + payload: + 1 [05] COM_CREATE_DB + string[p] schema name + + example: + 05 00 00 00 05 74 65 73 74 .....test + +COM_DROP_DB +----------- + +:: + + COM_DROP_DB + drop a schema + + direction: client -> server + response: OK or ERR + + payload: + 1 [06] COM_DROP_DB + string[p] schema name + + example: + 05 00 00 00 06 74 65 73 74 .....test + +COM_REFRESH +----------- + +a low-level version of several `FLUSH ...` and `RESET ...` commands. + +==== =============== =========== +flag constant name description +==== =============== =========== +0x01 REFRESH_GRANT Refresh grant tables `FLUSH PRIVILEGES` +0x02 REFRESH_LOG Start on new log file `FLUSH LOGS` +0x04 REFRESH_TABLES close all tables `FLUSH TABLES` +0x08 REFRESH_HOSTS Flush host cache `FLUSH HOSTS` +0x10 REFRESH_STATUS Flush status variables `FLUSH STATUS` +0x20 REFRESH_THREADS Flush thread cache +0x40 REFRESH_SLAVE Reset master info and restart slave thread `RESET SLAVE` +0x80 REFRESH_MASTER Remove all bin logs in the index and truncate the index `RESET MASTER` +==== =============== =========== + +:: + + COM_REFRESH + get a list of active threads + + direction: client -> server + response: OK or ERR + + payload: + 1 [07] COM_REFRESH + 1 flags + +COM_SHUTDOWN +------------ + +COM_SHUTDOWN is used to shutdown the mysql-server. + +Even if several shutdown types are define, right now only one is use: SHUTDOWN_WAIT_ALL_BUFFERS + +==== ============================== =========== +type constant name description +==== ============================== =========== +0x00 SHUTDOWN_DEFAULT defaults to SHUTDOWN_WAIT_ALL_BUFFERS +0x01 SHUTDOWN_WAIT_CONNECTIONS wait for existing connections to finish +0x02 SHUTDOWN_WAIT_TRANSACTIONS wait for existing trans to finish +0x08 SHUTDOWN_WAIT_UPDATES wait for existing updates to finish (=> no partial MyISAM update) +0x10 SHUTDOWN_WAIT_ALL_BUFFERS flush InnoDB buffers and other storage engines' buffers +0x11 SHUTDOWN_WAIT_CRITICAL_BUFFERS don't flush InnoDB buffers, flush other storage engines' buffers +0xfe KILL_QUERY +0xff KILL_CONNECTION +==== ============================== =========== + +`SHUTDOWN` privilege is required. + +:: + + COM_SHUTDOWN + get a list of active threads + + direction: client -> server + response: EOF or ERR + + payload: + 1 [08] COM_SHUTDOWN + if shutdown type != 0x00: + 1 shutdown type + +Clients before 4.1.3 don't send the `shutdown type`. `0x00` is assumed in that case. + +COM_STATISTICS +-------------- + +Get a human readable string of internal statistics. + +:: + + COM_STATISTICS + get a list of active threads + + direction: client -> server + response: string[p] + + payload: + 1 [09] COM_STATISTICS + + +COM_PROCESS_INFO +---------------- + +The COM_PROCESS_INFO command is deprecated. `SHOW PROCESSLIST` should be used instead. + +It either returns a: + +* `Text Resultset`_ or +* `ERR packet`_. + +:: + + COM_PROCESS_INFO + get a list of active threads + + direction: client -> server + response: resultset or ERR + + payload: + 1 [0a] COM_PROCCESS_INFO + +COM_PROCESS_KILL +---------------- + +Same as `KILL `. + +:: + + COM_PROCESS_KILL + ask the server to terminate a connection + + direction: client -> server + response: OK or ERR + + payload: + 1 [0c] COM_PROCCESS_KILL + 4 connection id + + +COM_DEBUG +--------- + +COM_DEBUG triggers a dump on internal debug info to stdout of the mysql-server. + +The `SUPER` privilege is required for this operation. + +:: + + COM_DEBUG + dump debug info to stdout + + direction: client -> server + response: EOF or ERR + + payload: + 1 [0d] COM_DEBUG + + +COM_PING +-------- + +:: + + COM_PING + check if the server is alive + + direction: client -> server + response: OK + + payload: + 1 [0e] COM_PING + +COM_CHANGE_USER +--------------- + +COM_CHANGE_USER changes the user of the current connection and reset the connection state. + +* user variables +* temp tables +* prepared statemants +* ... and others + +:: + + COM_CHANGE_USER + change the user of the current connection + + direction: client -> server + response: EOF or ERR + + payload: + 1 [11] COM_CHANGE_USER + string user + if capabilities & SECURE_CONNECTION: + lenenc-str auth-response + else: + string auth-response + all: + string schema-name + if more bytes in packet: + 2 character-set + +Prepared Statements +=================== + +The prepared statement protocol was introduced in MySQL 4.1 and adds a few new commands: + +* `COM_STMT_PREPARE`_ +* `COM_STMT_EXECUTE`_ +* `COM_STMT_CLOSE`_ +* `COM_STMT_RESET`_ +* `COM_STMT_SEND_LONG_DATA`_ + +It also defines a more compact resultset format that is used instead of the `Text Resultset`_ to +return resultsets. + +Keep in mind that not all statements can be prepared: + + http://forge.mysql.com/worklog/task.php?id=2871 + +Binary Protocol Resultset +------------------------- + +Binary Protocol Resultset is similar the `Text Resultset`_. It just contains the rows in +`Binary Protocol Resultset Row`_ format. + +* lenenc column-count +* column-count * `Column Definition`_ +* `EOF packet`_ +* n * rows as in `Binary Protocol Resultset Row`_ +* `EOF packet`_ + +Example:: + + 01 00 00 01 01|1a 00 00 02 03 64 65 66 00 00 00 ..........def... + 04 63 6f 6c 31 00 0c 08 00 06 00 00 00 fd 00 00 .col1........... + 1f 00 00|05 00 00 03 fe 00 00 02 00|09 00 00 04 ................ + 00 00 06 66 6f 6f 62 61 72|05 00 00 05 fe 00 00 ...foobar....... + 02 00 .. + +Binary Protocol Resultset Row +----------------------------- + +A Binary Protocol Resultset Row is made up of the bit-mask containing as many bits as we have columns in the +resultset + 2 and the values for columns that are not NULL in the `Binary Protocol Value`_ format. + +:: + + Binary Protocol Resultset Row + row of a binary resultset (COM_STMT_EXECUTE) + + payload: + 1 packet header [00] + n nul-bit-mask if length (column-count + 7 + 2) / 8 + n values + + example: + 09 00 00 04 00 00 06 66 6f 6f 62 61 72 + +Binary Protocol Value +---------------------- + +* Strings like `MYSQL_TYPE_STRING`_ `MYSQL_TYPE_BLOB`_ and `MYSQL_TYPE_DECIMAL`_:: + + lenenc-str string + + example: + 03 66 6f 6f -- string = "foo" + +* `MYSQL_TYPE_LONGLONG`_:: + + 8 integer least significant byte first + + example: + 01 00 00 00 00 00 00 00 -- int64 = 1 + +* `MYSQL_TYPE_LONG`_ and `MYSQL_TYPE_INT24`_:: + + 4 integer least significant byte first + + example: + 01 00 00 00 -- int32 = 1 + +* `MYSQL_TYPE_SHORT`_:: + + 2 integer least significant byte first + + example: + 01 00 -- int16 = 1 + +* `MYSQL_TYPE_TINY`_:: + + 1 integer + + example: + 01 -- int8 = 1 + +* `MYSQL_TYPE_DOUBLE`_:: + + 8 double + + example: + 66 66 66 66 66 66 24 40 -- double = 10.2 + +* `MYSQL_TYPE_FLOAT`_:: + + 4 float + + example: + 33 33 23 41 -- float = 10.2 + +* `MYSQL_TYPE_DATE`_:: + + 1 [04] length of the encoded value + 2 year + 1 month + 1 day + + example: + 04 da 07 0a 11 -- date = 2010-10-17 + +* `MYSQL_TYPE_DATETIME`_:: + + 1 [0b] length of the encoded value + 2 year + 1 month + 1 day + 1 hour + 1 minutes + 1 seconds + 4 nseconds + + example: + 0b da 07 0a 11 13 1b 1e 01 00 00 00 -- datetime 2010-10-17 19:27:30.000 000 001 + +* `MYSQL_TYPE_TIME`_:: + + 1 [0c] length of the encoded value + 1 sign (1 if minus, 0 for plus) + 4 days + 1 hour + 1 minutes + 1 seconds + 4 nseconds + + example: + 0c 01 78 00 00 00 13 1b 1e 01 00 00 00 -- time -120d 19:27:30.000 000 001 + +* `MYSQL_TYPE_TIMESTAMP`_:: + + 1 [0b] length of the encoded value + 2 year + 1 month + 1 day + 1 hour + 1 minutes + 1 seconds + 4 nseconds + + example: + 0b da 07 0a 11 13 1b 1e 01 00 00 00 -- timestamp + + + +COM_STMT_PREPARE +---------------- + +COM_STMT_PREPARE creates a prepared statement from the passed query string. + +The server returns a `COM_STMT_PREPARE Response`_ which contains a statement-id which is +used to identify the prepared statement. + +:: + + COM_STMT_PREPARE + create a prepared statement + + direction: client -> server + response: COM_STMT_PREPARE response + + payload: + 1 [16] the COM_STMT_PREPARE command + string[p] the query to prepare + + example: + 1c 00 00 00 16 53 45 4c 45 43 54 20 43 4f 4e 43 .....SELECT CONC + 41 54 28 3f 2c 20 3f 29 20 41 53 20 63 6f 6c 31 AT(?, ?) AS col1 + + +COM_STMT_PREPARE response +......................... + +If the `COM_STMT_PREPARE`_ succeeded, it sends: + +* `COM_STMT_PREPARE OK packet`_ +* if num-params > 0 + + * num-params * `Column Definition`_ + * `EOF packet`_ + +* if num-columns > 0 + + * num-colums * `Column Definition`_ + * `EOF packet`_ + +Example:: + + 0c 00 00 01 00 01 00 00 00 01 00 02 00 00 00 00| ................ + 17 00 00 02 03 64 65 66 00 00 00 01 3f 00 0c 3f .....def....?..? + 00 00 00 00 00 fd 80 00 00 00 00|17 00 00 03 03 ................ + 64 65 66 00 00 00 01 3f 00 0c 3f 00 00 00 00 00 def....?..?..... + fd 80 00 00 00 00|05 00 00 04 fe 00 00 02 00|1a ................ + 00 00 05 03 64 65 66 00 00 00 04 63 6f 6c 31 00 ....def....col1. + 0c 3f 00 00 00 00 00 fd 80 00 1f 00 00|05 00 00 .?.............. + 06 fe 00 00 02 00 ...... + +for a query without parameters and resultset like "DO 1" it is:: + + 0c 00 00 01 00 01 00 00 00 00 00 00 00 00 00 00 + +If it failed, a `ERR packet`_ is sent. + +As LOAD DATA isn't supported by `COM_STMT_PREPARE`_ yet, no is `LOCAL INFILE request`_ expected here. +Compare this to `COM_QUERY response`_. + +COM_STMT_PREPARE OK packet +************************** + +The `COM_STMT_PREPARE response`_ starts a packet which contains the meta-information for the following packets:: + + COM_STMT_PREPARE OK + OK response to a COM_STMT_PREPARE packet + + direction: server -> client + + payload: + 1 [00] OK + 4 statement-id + 2 num-columns + 2 num-params + 1 [00] filler + 2 warning count + + +COM_STMT_EXECUTE +---------------- + +COM_STMT_EXECUTE asks the server to execute a prepared statement as identified by `stmt-id`. + +It sends the values for the placeholders of the prepared statement (if it contained any) in +`Binary Protocol Value`_ form. The type of each parameter is made up of two bytes: + +* the type as in `Column Types`_ +* a flag byte which has the highest bit set if the type is unsigned [80] + +The `num-params` used for this packet has to match the `num-params` of the `COM_STMT_PREPARE OK packet`_ +of the corresponding prepared statement. + +The server returns a `COM_STMT_EXECUTE Response`_. + +:: + + COM_STMT_EXECUTE + execute a prepared statement + + direction: client -> server + response: COM_STMT_EXECUTE Response + + payload: + 1 [17] COM_STMT_EXECUTE + 4 stmt-id + 1 flags + 4 iteration-count + if num-params > 0: + n nul-bit-map, length: (num-params+7)/8 + 1 new-params-bound-flag + if new-params-bound-flag == 1: + n type of each parameter, length: num-params * 2 + n value of each parameter + + example: + 12 00 00 00 17 01 00 00 00 00 01 00 00 00 00 01 ................ + 0f 00 03 66 6f 6f ...foo + +The `iteration-count` is always `1`. + +The `flags` are: + +===== ============= +flags constant name +===== ============= +0x00 CURSOR_TYPE_NO_CURSOR +0x01 CURSOR_TYPE_READ_ONLY +0x02 CURSOR_TYPE_FOR_UPDATE +0x04 CURSOR_TYPE_SCROLLABLE +===== ============= + + +COM_STMT_EXECUTE Response +......................... + +Similar to the `COM_QUERY Response`_ a `COM_STMT_EXECUTE`_ either returns: + +* a `OK packet`_ +* a `ERR packet`_ +* or a resultset: `Binary Protocol Resultset`_ + +COM_STMT_SEND_LONG_DATA +----------------------- + +COM_STMT_SEND_LONG_DATA sends the data for a column. Repeating to send it, appends the data to the parameter. + +No response is sent back to the client. + +:: + + COM_STMT_SEND_LONG_DATA + direction: client -> server + response: none + + payload: + 1 [18] COM_STMT_SEND_LONG_DATA + 4 statement-id + 2 param-id + n data + + +COM_STMT_CLOSE +-------------- + +a COM_STMT_CLOSE deallocates a prepared statement + +No response is sent back to the client. + +:: + + COM_STMT_CLOSE + direction: client -> server + response: none + + payload: + 1 [19] COM_STMT_CLOSE + 4 statement-id + + example: + 05 00 00 00 19 01 00 00 00 ......... + + +COM_STMT_RESET +-------------- + +a COM_STMT_RESET resets the data of a prepared statement. Useful in together with `COM_STMT_SEND_LONG_DATA`_. + +The server will send a `OK packet`_ if the statement could be reset, a `ERR packet`_ if not. + +:: + + COM_STMT_RESET + direction: client -> server + response: OK or ERR + + payload: + 1 [1a] COM_STMT_RESET + 4 statement-id + + example: + 05 00 00 00 1a 01 00 00 00 ......... + + +Stored Procedures +================= + +In MySQL 5.0 the protocol was extended to handle: + +* `multi-resultset`_ +* `multi-statement`_ + +Multi-resultset +--------------- + +Multi-resultsets are sent up stored procedures if more than one resultset was generated inside of it:: + + CREATE TEMPORARY TABLE ins ( id INT ); + DROP PROCEDURE IF EXISTS multi; + DELIMITER $$ + CREATE PROCEDURE multi() BEGIN + SELECT 1; + SELECT 1; + INSERT INTO ins VALUES (1); + INSERT INTO ins VALUES (2); + END$$ + DELIMITER ; + + CALL multi(); + DROP TABLE ins; + +results in: + +* a resultset:: + + 01 00 00 01 01 17 00 00 02 03 64 65 66 00 00 00 ..........def... + 01 31 00 0c 3f 00 01 00 00 00 08 81 00 00 00 00 .1..?........... + 05 00 00 03 fe 00 00 0a 00 02 00 00 04 01 31 05 ..............1. + 00 00 05 fe 00 00 0a 00 ........ + + * see the `EOF packet`_: `05 00 00 03 fe 00 00 0a 00` with its status-flag being `0a` + +* the 2nd resultset:: + + 01 00 00 06 01 17 00 00 07 03 64 65 66 00 00 00 ..........def... + 01 31 00 0c 3f 00 01 00 00 00 08 81 00 00 00 00 .1..?........... + 05 00 00 08 fe 00 00 0a 00 02 00 00 09 01 31 05 ..............1. + 00 00 0a fe 00 00 0a 00 ........ + + * see the `EOF packet`_: `05 00 00 0a fe 00 00 0a 00` with its status-flag being `0a` + +* ... and a closing empty resultset, a `OK packet`_:: + + 07 00 00 0b 00 01 00 02 00 00 00 ........... + +`SERVER_MORE_RESULTS_EXISTS`_ is set to indicate that more resultsets will follow. + +The trailing `OK packet`_ is the response to the CALL statement and contains the affected rows of +the last statement. In our case we INSERTed 2 rows, but only the `affected_rows` of the +last INSERT statement is returned as part of the `OK packet`_. If the last statement is a SELECT +the affected rows is 0. + +The client has to announce that it wants multi-resultsets by either setting the `CLIENT_MULTI_RESULTS`_ or +`CLIENT_PS_MULTI_RESULTS`_ capability. + +Multi-statement +--------------- + +A multi-statement is allowing COM_QUERY to send more than one query to the server, separated by a ';'. + +The client has to announce that it wants multi-statements by either setting the `CLIENT_MULTI_STATEMENTS`_ capability +or by using `COM_SET_OPTION`_. + +COM_SET_OPTION +-------------- + +Allows to enable and disable: + +* `CLIENT_MULTI_STATEMENTS`_ + +for the current connection. The option operation is one of: + +=== ============= +op constant name +=== ============= +0 MYSQL_OPTION_MULTI_STATEMENTS_ON +1 MYSQL_OPTION_MULTI_STATEMENTS_OFF +=== ============= + +On success it returns a `EOF packet`_ otherwise a `ERR packet`_. + +:: + + COM_SET_OPTION + set options for the current connection + + response: EOF or ERR + + payload: + 1 [1b] COM_SET_OPTION + 2 option operation + +COM_STMT_FETCH +-------------- + +:: + + COM_STMT_FETCH + + response: binary rows or ERR + + payload: + 1 [1c] COM_STMT_FETCH + 4 stmt-id + 4 num rows + +COM_STMT_FETCH response +....................... + +A fetch may result: + +* a `multi-resultset`_ +* a `ERR packet`_ + diff --git a/doc/mysql-proxy/scripting.txt b/doc/mysql-proxy/scripting.txt new file mode 100644 index 0000000..ee696f7 --- /dev/null +++ b/doc/mysql-proxy/scripting.txt @@ -0,0 +1,326 @@ +Hooks +===== + +connect_server +-------------- + +read_auth +--------- + +read_auth_result +---------------- + +read_query +---------- + +read_query_result +----------------- + +disconnect_client +----------------- + +Modules +======= + +mysql.proto +----------- + +The ``mysql.proto`` module provides encoders and decoders for the packets exchanged between client and server + + +from_err_packet +............... + +Decodes a ERR-packet into a table. + +Parameters: + +``packet`` + (string) mysql packet + + +On success it returns a table containing: + +``errmsg`` + (string) + +``sqlstate`` + (string) + +``errcode`` + (int) + +Otherwise it raises an error. + +to_err_packet +............. + +Encode a table containing a ERR packet into a MySQL packet. + +Parameters: + +``err`` + (table) + + ``errmsg`` + (string) + + ``sqlstate`` + (string) + + ``errcode`` + (int) + +into a MySQL packet. + +Returns a string. + +from_ok_packet +.............. + +Decodes a OK-packet + +``packet`` + (string) mysql packet + + +On success it returns a table containing: + +``server_status`` + (int) bit-mask of the connection status + +``insert_id`` + (int) last used insert id + +``warnings`` + (int) number of warnings for the last executed statement + +``affected_rows`` + (int) rows affected by the last statement + +Otherwise it raises an error. + + +to_ok_packet +............ + +Encode a OK packet + +from_eof_packet +............... + +Decodes a EOF-packet + +Parameters: + +``packet`` + (string) mysql packet + + +On success it returns a table containing: + +``server_status`` + (int) bit-mask of the connection status + +``warnings`` + (int) + +Otherwise it raises an error. + + +to_eof_packet +............. + +from_challenge_packet +..................... + +Decodes a auth-challenge-packet + +Parameters: + +``packet`` + (string) mysql packet + +On success it returns a table containing: + +``protocol_version`` + (int) version of the mysql protocol, usually 10 + +``server_version`` + (int) version of the server as integer: 50506 is MySQL 5.5.6 + +``thread_id`` + (int) connection id + +``capabilities`` + (int) bit-mask of the server capabilities + +``charset`` + (int) server default character-set + +``server_status`` + (int) bit-mask of the connection-status + +``challenge`` + (string) password challenge + + +to_challenge_packet +................... + +Encode a auth-response-packet + +from_response_packet +.................... + +Decodes a auth-response-packet + +Parameters: + +``packet`` + (string) mysql packet + + +to_response_packet +.................. + +from_masterinfo_string +...................... + +Decodes the content of the ``master.info`` file. + + +to_masterinfo_string +.................... + +from_stmt_prepare_packet +........................ + +Decodes a COM_STMT_PREPARE-packet + +Parameters: + +``packet`` + (string) mysql packet + + +On success it returns a table containing: + +``stmt_text`` + (string) + text of the prepared statement + +Otherwise it raises an error. + +from_stmt_prepare_ok_packet +........................... + +Decodes a COM_STMT_PACKET OK-packet + +Parameters: + +``packet`` + (string) mysql packet + + +On success it returns a table containing: + +``stmt_id`` + (int) statement-id + +``num_columns`` + (int) number of columns in the resultset + +``num_params`` + (int) number of parameters + +``warnings`` + (int) warnings generated by the prepare statement + +Otherwise it raises an error. + + +from_stmt_execute_packet +........................ + +Decodes a COM_STMT_EXECUTE-packet + +Parameters: + +``packet`` + (string) mysql packet + +``num_params`` + (int) number of parameters of the corresponding prepared statement + +On success it returns a table containing: + +``stmt_id`` + (int) statemend-id + +``flags`` + (int) flags describing the kind of cursor used + +``iteration_count`` + (int) iteration count: always 1 + +``new_params_bound`` + (bool) + +``params`` + (nil, table) + number-index array of parameters if ``new_params_bound`` is ``true`` + +Each param is a table of: + +``type`` + (int) + MYSQL_TYPE_INT, MYSQL_TYPE_STRING ... and so on + +``value`` + (nil, number, string) + if the value is a NULL, it ``nil`` + if it is a number (_INT, _DOUBLE, ...) it is a ``number`` + otherwise it is a ``string`` + +If decoding fails it raises an error. + +To get the ``num_params`` for this function, you have to track the track the number of parameters as returned +by the `from_stmt_prepare_ok_packet`_. Use `stmt_id_from_stmt_execute_packet`_ to get the ``statement-id`` from +the COM_STMT_EXECUTE packet and lookup your tracked information. + +stmt_id_from_stmt_execute_packet +................................ + +Decodes statement-id from a COM_STMT_EXECUTE-packet + +Parameters: + +``packet`` + (string) mysql packet + + +On success it returns the ``statement-id`` as ``int``. + +Otherwise it raises an error. + +from_stmt_close_packet +...................... + +Decodes a COM_STMT_CLOSE-packet + +Parameters: + +``packet`` + (string) mysql packet + + +On success it returns a table containing: + +``stmt_id`` + (int) + statement-id that shall be closed + +Otherwise it raises an error. + + diff --git a/doc/protocol.txt b/doc/protocol.txt new file mode 100644 index 0000000..aec4376 --- /dev/null +++ b/doc/protocol.txt @@ -0,0 +1,927 @@ +No. Time Source Destination Protocol Length Info + 1985 53.174445000 10.20.135.213 10.20.151.142 MySQL 136 Server Greeting proto=10 version=5.5.31-log + +MySQL Protocol + Packet Length: 78 + Packet Number: 0 + Server Greeting + Protocol: 10 + Version: 5.5.31-log + Thread ID: 49194 + Salt: *X]I6oNy + Server Capabilities: 0xf7ff + .... .... .... ...1 = Long Password: Set + .... .... .... ..1. = Found Rows: Set + .... .... .... .1.. = Long Column Flags: Set + .... .... .... 1... = Connect With Database: Set + .... .... ...1 .... = Don't Allow database.table.column: Set + .... .... ..1. .... = Can use compression protocol: Set + .... .... .1.. .... = ODBC Client: Set + .... .... 1... .... = Can Use LOAD DATA LOCAL: Set + .... ...1 .... .... = Ignore Spaces before '(': Set + .... ..1. .... .... = Speaks 4.1 protocol (new flag): Set + .... .1.. .... .... = Interactive Client: Set + .... 0... .... .... = Switch to SSL after handshake: Not set + ...1 .... .... .... = Ignore sigpipes: Set + ..1. .... .... .... = Knows about transactions: Set + .1.. .... .... .... = Speaks 4.1 protocol (old flag): Set + 1... .... .... .... = Can do 4.1 authentication: Set + Server Language: latin1 COLLATE latin1_swedish_ci (8) + Server Status: 0x0002 + .... .... .... ...0 = In transaction: Not set + .... .... .... ..1. = AUTO_COMMIT: Set + .... .... .... .0.. = More results: Not set + .... .... .... 0... = Multi query - more resultsets: Not set + .... .... ...0 .... = Bad index used: Not set + .... .... ..0. .... = No index used: Not set + .... .... .0.. .... = Cursor exists: Not set + .... .... 0... .... = Last row sebd: Not set + .... ...0 .... .... = database dropped: Not set + .... ..0. .... .... = No backslash escapes: Not set + Unused: \017\200\025 + Salt: 7E5vwpMqoXN[ + Payload: 6d7973716c5f6e61746976655f70617373776f726400 + [Expert Info (Warn/Undecoded): FIXME - dissector is incomplete] + [Message: FIXME - dissector is incomplete] + [Severity level: Warn] + [Group: Undecoded] + +0000 90 b1 1c 95 0e a1 00 0f e2 e9 63 82 08 00 45 08 ..........c...E. +0010 00 7a 85 be 40 00 3d 06 84 2c 0a 14 87 d5 0a 14 .z..@.=..,...... +0020 97 8e 0c ea 47 4b a4 97 09 27 50 31 65 01 50 18 ....GK...'P1e.P. +0030 00 1d b6 66 00 00 4e 00 00 00 0a 35 2e 35 2e 33 ...f..N....5.5.3 +0040 31 2d 6c 6f 67 00 2a c0 00 00 2a 58 5d 49 36 6f 1-log.*...*X]I6o +0050 4e 79 00 ff f7 08 02 00 0f 80 15 00 00 00 00 00 Ny.............. +0060 00 00 00 00 00 37 45 35 76 77 70 4d 71 6f 58 4e .....7E5vwpMqoXN +0070 5b 00 6d 79 73 71 6c 5f 6e 61 74 69 76 65 5f 70 [.mysql_native_p +0080 61 73 73 77 6f 72 64 00 assword. + +No. Time Source Destination Protocol Length Info + 1986 53.178242000 10.20.151.142 10.20.135.213 MySQL 144 Login Request user=qing db=qpush + +MySQL Protocol + Packet Length: 86 + Packet Number: 1 + Login Request + Client Capabilities: 0xa68d + .... .... .... ...1 = Long Password: Set + .... .... .... ..0. = Found Rows: Not set + .... .... .... .1.. = Long Column Flags: Set + .... .... .... 1... = Connect With Database: Set + .... .... ...0 .... = Don't Allow database.table.column: Not set + .... .... ..0. .... = Can use compression protocol: Not set + .... .... .0.. .... = ODBC Client: Not set + .... .... 1... .... = Can Use LOAD DATA LOCAL: Set + .... ...0 .... .... = Ignore Spaces before '(': Not set + .... ..1. .... .... = Speaks 4.1 protocol (new flag): Set + .... .1.. .... .... = Interactive Client: Set + .... 0... .... .... = Switch to SSL after handshake: Not set + ...0 .... .... .... = Ignore sigpipes: Not set + ..1. .... .... .... = Knows about transactions: Set + .0.. .... .... .... = Speaks 4.1 protocol (old flag): Not set + 1... .... .... .... = Can do 4.1 authentication: Set + Extended Client Capabilities: 0x007f + .... .... .... ...1 = Supports multiple statements: Set + .... .... .... ..1. = Supports multiple results: Set + MAX Packet: 16777216 + Charset: Unknown (28) + Username: qing + Password: cd8665aefc86bc63472e26ac4589aee21f18e1ee + Schema: qpush + Payload: 6d7973716c5f6e61746976655f70617373776f726400 + [Expert Info (Warn/Undecoded): FIXME - dissector is incomplete] + [Message: FIXME - dissector is incomplete] + [Severity level: Warn] + [Group: Undecoded] + +0000 00 0f e2 c7 64 e4 90 b1 1c 95 0e a1 08 00 45 00 ....d.........E. +0010 00 82 44 3c 40 00 40 06 00 00 0a 14 97 8e 0a 14 ..D<@.@......... +0020 87 d5 47 4b 0c ea 50 31 65 01 a4 97 09 79 50 18 ..GK..P1e....yP. +0030 40 14 34 00 00 00 56 00 00 01 8d a6 7f 00 00 00 @.4...V......... +0040 00 01 1c 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +0050 00 00 00 00 00 00 00 00 00 00 71 69 6e 67 00 14 ..........qing.. +0060 cd 86 65 ae fc 86 bc 63 47 2e 26 ac 45 89 ae e2 ..e....cG.&.E... +0070 1f 18 e1 ee 71 70 75 73 68 00 6d 79 73 71 6c 5f ....qpush.mysql_ +0080 6e 61 74 69 76 65 5f 70 61 73 73 77 6f 72 64 00 native_password. + +No. Time Source Destination Protocol Length Info + 1988 53.179091000 10.20.135.213 10.20.151.142 MySQL 65 Response OK + +MySQL Protocol + Packet Length: 7 + Packet Number: 2 + Affected Rows: 0 + Server Status: 0x0002 + .... .... .... ...0 = In transaction: Not set + .... .... .... ..1. = AUTO_COMMIT: Set + .... .... .... .0.. = More results: Not set + .... .... .... 0... = Multi query - more resultsets: Not set + .... .... ...0 .... = Bad index used: Not set + .... .... ..0. .... = No index used: Not set + .... .... .0.. .... = Cursor exists: Not set + .... .... 0... .... = Last row sebd: Not set + .... ...0 .... .... = database dropped: Not set + .... ..0. .... .... = No backslash escapes: Not set + Warnings: 0 + +0000 90 b1 1c 95 0e a1 00 0f e2 e9 63 82 08 00 45 08 ..........c...E. +0010 00 33 85 c0 40 00 3d 06 84 71 0a 14 87 d5 0a 14 .3..@.=..q...... +0020 97 8e 0c ea 47 4b a4 97 09 79 50 31 65 5b 50 18 ....GK...yP1e[P. +0030 00 1d bd 42 00 00 07 00 00 02 00 00 00 02 00 00 ...B............ +0040 00 . + +No. Time Source Destination Protocol Length Info + 1989 53.179289000 10.20.151.142 10.20.135.213 MySQL 91 Request Query + +MySQL Protocol + Packet Length: 33 + Packet Number: 0 + Request Command Query + Command: Query (3) + Statement: select @@version_comment limit 1 + +0000 00 0f e2 c7 64 e4 90 b1 1c 95 0e a1 08 00 45 00 ....d.........E. +0010 00 4d 44 3d 40 00 40 06 00 00 0a 14 97 8e 0a 14 .MD=@.@......... +0020 87 d5 47 4b 0c ea 50 31 65 5b a4 97 09 84 50 18 ..GK..P1e[....P. +0030 40 11 33 cb 00 00 21 00 00 00 03 73 65 6c 65 63 @.3...!....selec +0040 74 20 40 40 76 65 72 73 69 6f 6e 5f 63 6f 6d 6d t @@version_comm +0050 65 6e 74 20 6c 69 6d 69 74 20 31 ent limit 1 + +No. Time Source Destination Protocol Length Info + 1990 53.180241000 10.20.135.213 10.20.151.142 MySQL 144 Response + +MySQL Protocol + Packet Length: 1 + Packet Number: 1 + Number of fields: 1 +MySQL Protocol + Packet Length: 39 + Packet Number: 2 + Catalog: def + Database: + Table: + Original table: + Name: @@version_comment + Original name: + Charset number: latin1 COLLATE latin1_swedish_ci (8) + Length: 19 + Type: FIELD_TYPE_VAR_STRING (253) + Flags: 0x0000 + Decimals: 31 +MySQL Protocol + Packet Length: 5 + Packet Number: 3 + EOF marker: 254 + Warnings: 0 + Server Status: 0x0002 + .... .... .... ...0 = In transaction: Not set + .... .... .... ..1. = AUTO_COMMIT: Set + .... .... .... .0.. = More results: Not set + .... .... .... 0... = Multi query - more resultsets: Not set + .... .... ...0 .... = Bad index used: Not set + .... .... ..0. .... = No index used: Not set + .... .... .0.. .... = Cursor exists: Not set + .... .... 0... .... = Last row sebd: Not set + .... ...0 .... .... = database dropped: Not set + .... ..0. .... .... = No backslash escapes: Not set +MySQL Protocol + Packet Length: 20 + Packet Number: 4 + text: Source distribution +MySQL Protocol + Packet Length: 5 + Packet Number: 5 + EOF marker: 254 + Warnings: 0 + Server Status: 0x0002 + .... .... .... ...0 = In transaction: Not set + .... .... .... ..1. = AUTO_COMMIT: Set + .... .... .... .0.. = More results: Not set + .... .... .... 0... = Multi query - more resultsets: Not set + .... .... ...0 .... = Bad index used: Not set + .... .... ..0. .... = No index used: Not set + .... .... .0.. .... = Cursor exists: Not set + .... .... 0... .... = Last row sebd: Not set + .... ...0 .... .... = database dropped: Not set + .... ..0. .... .... = No backslash escapes: Not set + +0000 90 b1 1c 95 0e a1 00 0f e2 e9 63 82 08 00 45 08 ..........c...E. +0010 00 82 85 c1 40 00 3d 06 84 21 0a 14 87 d5 0a 14 ....@.=..!...... +0020 97 8e 0c ea 47 4b a4 97 09 84 50 31 65 80 50 18 ....GK....P1e.P. +0030 00 1d a8 57 00 00 01 00 00 01 01 27 00 00 02 03 ...W.......'.... +0040 64 65 66 00 00 00 11 40 40 76 65 72 73 69 6f 6e def....@@version +0050 5f 63 6f 6d 6d 65 6e 74 00 0c 08 00 13 00 00 00 _comment........ +0060 fd 00 00 1f 00 00 05 00 00 03 fe 00 00 02 00 14 ................ +0070 00 00 04 13 53 6f 75 72 63 65 20 64 69 73 74 72 ....Source distr +0080 69 62 75 74 69 6f 6e 05 00 00 05 fe 00 00 02 00 ibution......... + +No. Time Source Destination Protocol Length Info + 40391 1051.126318000 10.20.151.142 10.20.135.213 MySQL 76 Request Query + +MySQL Protocol + Packet Length: 18 + Packet Number: 0 + Request Command Query + Command: Query (3) + Statement: SELECT DATABASE() + +0000 00 0f e2 c7 64 e4 90 b1 1c 95 0e a1 08 00 45 00 ....d.........E. +0010 00 3e 13 ca 40 00 40 06 00 00 0a 14 97 8e 0a 14 .>..@.@......... +0020 87 d5 47 4b 0c ea 50 31 65 80 a4 97 09 de 50 18 ..GK..P1e.....P. +0030 3f fb 33 bc 00 00 12 00 00 00 03 53 45 4c 45 43 ?.3........SELEC +0040 54 20 44 41 54 41 42 41 53 45 28 29 T DATABASE() + +No. Time Source Destination Protocol Length Info + 40392 1051.127397000 10.20.135.213 10.20.151.142 MySQL 123 Response + +MySQL Protocol + Packet Length: 1 + Packet Number: 1 + Number of fields: 1 +MySQL Protocol + Packet Length: 32 + Packet Number: 2 + Catalog: def + Database: + Table: + Original table: + Name: DATABASE() + Original name: + Charset number: latin1 COLLATE latin1_swedish_ci (8) + Length: 34 + Type: FIELD_TYPE_VAR_STRING (253) + Flags: 0x0000 + Decimals: 31 +MySQL Protocol + Packet Length: 5 + Packet Number: 3 + EOF marker: 254 + Warnings: 0 + Server Status: 0x0002 + .... .... .... ...0 = In transaction: Not set + .... .... .... ..1. = AUTO_COMMIT: Set + .... .... .... .0.. = More results: Not set + .... .... .... 0... = Multi query - more resultsets: Not set + .... .... ...0 .... = Bad index used: Not set + .... .... ..0. .... = No index used: Not set + .... .... .0.. .... = Cursor exists: Not set + .... .... 0... .... = Last row sebd: Not set + .... ...0 .... .... = database dropped: Not set + .... ..0. .... .... = No backslash escapes: Not set +MySQL Protocol + Packet Length: 6 + Packet Number: 4 + text: qpush +MySQL Protocol + Packet Length: 5 + Packet Number: 5 + EOF marker: 254 + Warnings: 0 + Server Status: 0x0002 + .... .... .... ...0 = In transaction: Not set + .... .... .... ..1. = AUTO_COMMIT: Set + .... .... .... .0.. = More results: Not set + .... .... .... 0... = Multi query - more resultsets: Not set + .... .... ...0 .... = Bad index used: Not set + .... .... ..0. .... = No index used: Not set + .... .... .0.. .... = Cursor exists: Not set + .... .... 0... .... = Last row sebd: Not set + .... ...0 .... .... = database dropped: Not set + .... ..0. .... .... = No backslash escapes: Not set + +0000 90 b1 1c 95 0e a1 00 0f e2 e9 63 82 08 00 45 08 ..........c...E. +0010 00 6d 85 d1 40 00 3d 06 84 26 0a 14 87 d5 0a 14 .m..@.=..&...... +0020 97 8e 0c ea 47 4b a4 97 09 de 50 31 65 96 50 18 ....GK....P1e.P. +0030 00 1d 94 07 00 00 01 00 00 01 01 20 00 00 02 03 ........... .... +0040 64 65 66 00 00 00 0a 44 41 54 41 42 41 53 45 28 def....DATABASE( +0050 29 00 0c 08 00 22 00 00 00 fd 00 00 1f 00 00 05 )....".......... +0060 00 00 03 fe 00 00 02 00 06 00 00 04 05 71 70 75 .............qpu +0070 73 68 05 00 00 05 fe 00 00 02 00 sh......... + +No. Time Source Destination Protocol Length Info + 40393 1051.127529000 10.20.151.142 10.20.135.213 MySQL 63 Request Use Database + +MySQL Protocol + Packet Length: 5 + Packet Number: 0 + Request Command Use Database + Command: Use Database (2) + Schema: test + +0000 00 0f e2 c7 64 e4 90 b1 1c 95 0e a1 08 00 45 00 ....d.........E. +0010 00 31 13 cb 40 00 40 06 00 00 0a 14 97 8e 0a 14 .1..@.@......... +0020 87 d5 47 4b 0c ea 50 31 65 96 a4 97 0a 23 50 18 ..GK..P1e....#P. +0030 3f ea 33 af 00 00 05 00 00 00 02 74 65 73 74 ?.3........test + +No. Time Source Destination Protocol Length Info + 40394 1051.128358000 10.20.135.213 10.20.151.142 MySQL 65 Response OK + +MySQL Protocol + Packet Length: 7 + Packet Number: 1 + Affected Rows: 0 + Server Status: 0x0002 + .... .... .... ...0 = In transaction: Not set + .... .... .... ..1. = AUTO_COMMIT: Set + .... .... .... .0.. = More results: Not set + .... .... .... 0... = Multi query - more resultsets: Not set + .... .... ...0 .... = Bad index used: Not set + .... .... ..0. .... = No index used: Not set + .... .... .0.. .... = Cursor exists: Not set + .... .... 0... .... = Last row sebd: Not set + .... ...0 .... .... = database dropped: Not set + .... ..0. .... .... = No backslash escapes: Not set + Warnings: 0 + +0000 90 b1 1c 95 0e a1 00 0f e2 e9 63 82 08 00 45 08 ..........c...E. +0010 00 33 85 d2 40 00 3d 06 84 5f 0a 14 87 d5 0a 14 .3..@.=.._...... +0020 97 8e 0c ea 47 4b a4 97 0a 23 50 31 65 9f 50 18 ....GK...#P1e.P. +0030 00 1d bc 55 00 00 07 00 00 01 00 00 00 02 00 00 ...U............ +0040 00 . + +No. Time Source Destination Protocol Length Info + 40517 1053.941926000 10.20.151.142 10.20.135.213 MySQL 70 Request Query + +MySQL Protocol + Packet Length: 12 + Packet Number: 0 + Request Command Query + Command: Query (3) + Statement: show tables + +0000 00 0f e2 c7 64 e4 90 b1 1c 95 0e a1 08 00 45 00 ....d.........E. +0010 00 38 14 05 40 00 40 06 00 00 0a 14 97 8e 0a 14 .8..@.@......... +0020 87 d5 47 4b 0c ea 50 31 65 9f a4 97 0a 2e 50 18 ..GK..P1e.....P. +0030 3f e7 33 b6 00 00 0c 00 00 00 03 73 68 6f 77 20 ?.3........show +0040 74 61 62 6c 65 73 tables + +No. Time Source Destination Protocol Length Info + 40518 1053.943776000 10.20.135.213 10.20.151.142 MySQL 167 Response + +MySQL Protocol + Packet Length: 1 + Packet Number: 1 + Number of fields: 1 +MySQL Protocol + Packet Length: 86 + Packet Number: 2 + Catalog: def + Database: information_schema + Table: TABLE_NAMES + Original table: TABLE_NAMES + Name: Tables_in_test + Original name: TABLE_NAME + Charset number: latin1 COLLATE latin1_swedish_ci (8) + Length: 64 + Type: FIELD_TYPE_VAR_STRING (253) + Flags: 0x0001 + Decimals: 0 +MySQL Protocol + Packet Length: 5 + Packet Number: 3 + EOF marker: 254 + Warnings: 0 + Server Status: 0x0022 + .... .... .... ...0 = In transaction: Not set + .... .... .... ..1. = AUTO_COMMIT: Set + .... .... .... .0.. = More results: Not set + .... .... .... 0... = Multi query - more resultsets: Not set + .... .... ...0 .... = Bad index used: Not set + .... .... ..1. .... = No index used: Set + .... .... .0.. .... = Cursor exists: Not set + .... .... 0... .... = Last row sebd: Not set + .... ...0 .... .... = database dropped: Not set + .... ..0. .... .... = No backslash escapes: Not set +MySQL Protocol + Packet Length: 5 + Packet Number: 4 + EOF marker: 254 + Warnings: 0 + Server Status: 0x0022 + .... .... .... ...0 = In transaction: Not set + .... .... .... ..1. = AUTO_COMMIT: Set + .... .... .... .0.. = More results: Not set + .... .... .... 0... = Multi query - more resultsets: Not set + .... .... ...0 .... = Bad index used: Not set + .... .... ..1. .... = No index used: Set + .... .... .0.. .... = Cursor exists: Not set + .... .... 0... .... = Last row sebd: Not set + .... ...0 .... .... = database dropped: Not set + .... ..0. .... .... = No backslash escapes: Not set + +0000 90 b1 1c 95 0e a1 00 0f e2 e9 63 82 08 00 45 08 ..........c...E. +0010 00 99 85 d3 40 00 3d 06 83 f8 0a 14 87 d5 0a 14 ....@.=......... +0020 97 8e 0c ea 47 4b a4 97 0a 2e 50 31 65 af 50 18 ....GK....P1e.P. +0030 00 1d 90 f9 00 00 01 00 00 01 01 56 00 00 02 03 ...........V.... +0040 64 65 66 12 69 6e 66 6f 72 6d 61 74 69 6f 6e 5f def.information_ +0050 73 63 68 65 6d 61 0b 54 41 42 4c 45 5f 4e 41 4d schema.TABLE_NAM +0060 45 53 0b 54 41 42 4c 45 5f 4e 41 4d 45 53 0e 54 ES.TABLE_NAMES.T +0070 61 62 6c 65 73 5f 69 6e 5f 74 65 73 74 0a 54 41 ables_in_test.TA +0080 42 4c 45 5f 4e 41 4d 45 0c 08 00 40 00 00 00 fd BLE_NAME...@.... +0090 01 00 00 00 00 05 00 00 03 fe 00 00 22 00 05 00 ............"... +00a0 00 04 fe 00 00 22 00 .....". + +No. Time Source Destination Protocol Length Info + 41762 1087.191768000 10.20.151.142 10.20.135.213 MySQL 132 Request Query + +MySQL Protocol + Packet Length: 74 + Packet Number: 0 + Request Command Query + Command: Query (3) + Statement: create table t (id int, data varchar(256), primary key(id))engine =innodb + +0000 00 0f e2 c7 64 e4 90 b1 1c 95 0e a1 08 00 45 00 ....d.........E. +0010 00 76 16 8d 40 00 40 06 00 00 0a 14 97 8e 0a 14 .v..@.@......... +0020 87 d5 47 4b 0c ea 50 31 65 af a4 97 0a 9f 50 18 ..GK..P1e.....P. +0030 3f cb 33 f4 00 00 4a 00 00 00 03 63 72 65 61 74 ?.3...J....creat +0040 65 20 74 61 62 6c 65 20 74 20 28 69 64 20 69 6e e table t (id in +0050 74 2c 20 64 61 74 61 20 76 61 72 63 68 61 72 28 t, data varchar( +0060 32 35 36 29 2c 20 70 72 69 6d 61 72 79 20 6b 65 256), primary ke +0070 79 28 69 64 29 29 65 6e 67 69 6e 65 20 3d 69 6e y(id))engine =in +0080 6e 6f 64 62 nodb + +No. Time Source Destination Protocol Length Info + 41765 1087.291638000 10.20.135.213 10.20.151.142 MySQL 65 Response OK + +MySQL Protocol + Packet Length: 7 + Packet Number: 1 + Affected Rows: 0 + Server Status: 0x0002 + .... .... .... ...0 = In transaction: Not set + .... .... .... ..1. = AUTO_COMMIT: Set + .... .... .... .0.. = More results: Not set + .... .... .... 0... = Multi query - more resultsets: Not set + .... .... ...0 .... = Bad index used: Not set + .... .... ..0. .... = No index used: Not set + .... .... .0.. .... = Cursor exists: Not set + .... .... 0... .... = Last row sebd: Not set + .... ...0 .... .... = database dropped: Not set + .... ..0. .... .... = No backslash escapes: Not set + Warnings: 0 + +0000 90 b1 1c 95 0e a1 00 0f e2 e9 63 82 08 00 45 08 ..........c...E. +0010 00 33 85 d5 40 00 3d 06 84 5c 0a 14 87 d5 0a 14 .3..@.=..\...... +0020 97 8e 0c ea 47 4b a4 97 0a 9f 50 31 65 fd 50 18 ....GK....P1e.P. +0030 00 1d bb 7b 00 00 07 00 00 01 00 00 00 02 00 00 ...{............ +0040 00 . + +No. Time Source Destination Protocol Length Info + 45859 1193.267508000 10.20.151.142 10.20.135.213 MySQL 64 Request Query + +MySQL Protocol + Packet Length: 6 + Packet Number: 0 + Request Command Query + Command: Query (3) + Statement: begin + +0000 00 0f e2 c7 64 e4 90 b1 1c 95 0e a1 08 00 45 00 ....d.........E. +0010 00 32 1f 49 40 00 40 06 00 00 0a 14 97 8e 0a 14 .2.I@.@......... +0020 87 d5 47 4b 0c ea 50 31 65 fd a4 97 0a aa 50 18 ..GK..P1e.....P. +0030 3f c8 33 b0 00 00 06 00 00 00 03 62 65 67 69 6e ?.3........begin + +No. Time Source Destination Protocol Length Info + 45861 1193.268223000 10.20.135.213 10.20.151.142 MySQL 65 Response OK + +MySQL Protocol + Packet Length: 7 + Packet Number: 1 + Affected Rows: 0 + Server Status: 0x0003 + .... .... .... ...1 = In transaction: Set + .... .... .... ..1. = AUTO_COMMIT: Set + .... .... .... .0.. = More results: Not set + .... .... .... 0... = Multi query - more resultsets: Not set + .... .... ...0 .... = Bad index used: Not set + .... .... ..0. .... = No index used: Not set + .... .... .0.. .... = Cursor exists: Not set + .... .... 0... .... = Last row sebd: Not set + .... ...0 .... .... = database dropped: Not set + .... ..0. .... .... = No backslash escapes: Not set + Warnings: 0 + +0000 90 b1 1c 95 0e a1 00 0f e2 e9 63 82 08 00 45 08 ..........c...E. +0010 00 33 85 d9 40 00 3d 06 84 58 0a 14 87 d5 0a 14 .3..@.=..X...... +0020 97 8e 0c ea 47 4b a4 97 0a aa 50 31 66 07 50 18 ....GK....P1f.P. +0030 00 1d bb 65 00 00 07 00 00 01 00 00 00 03 00 00 ...e............ +0040 00 . + +No. Time Source Destination Protocol Length Info + 46535 1211.635729000 10.20.151.142 10.20.135.213 MySQL 99 Request Query + +MySQL Protocol + Packet Length: 41 + Packet Number: 0 + Request Command Query + Command: Query (3) + Statement: insert into t(id, data) values(1, "abc") + +0000 00 0f e2 c7 64 e4 90 b1 1c 95 0e a1 08 00 45 00 ....d.........E. +0010 00 55 20 c3 40 00 40 06 00 00 0a 14 97 8e 0a 14 .U .@.@......... +0020 87 d5 47 4b 0c ea 50 31 66 07 a4 97 0a b5 50 18 ..GK..P1f.....P. +0030 3f c5 33 d3 00 00 29 00 00 00 03 69 6e 73 65 72 ?.3...)....inser +0040 74 20 69 6e 74 6f 20 74 28 69 64 2c 20 64 61 74 t into t(id, dat +0050 61 29 20 76 61 6c 75 65 73 28 31 2c 20 22 61 62 a) values(1, "ab +0060 63 22 29 c") + +No. Time Source Destination Protocol Length Info + 46536 1211.639289000 10.20.135.213 10.20.151.142 MySQL 65 Response OK + +MySQL Protocol + Packet Length: 7 + Packet Number: 1 + Affected Rows: 1 + Server Status: 0x0003 + .... .... .... ...1 = In transaction: Set + .... .... .... ..1. = AUTO_COMMIT: Set + .... .... .... .0.. = More results: Not set + .... .... .... 0... = Multi query - more resultsets: Not set + .... .... ...0 .... = Bad index used: Not set + .... .... ..0. .... = No index used: Not set + .... .... .0.. .... = Cursor exists: Not set + .... .... 0... .... = Last row sebd: Not set + .... ...0 .... .... = database dropped: Not set + .... ..0. .... .... = No backslash escapes: Not set + Warnings: 0 + +0000 90 b1 1c 95 0e a1 00 0f e2 e9 63 82 08 00 45 08 ..........c...E. +0010 00 33 85 da 40 00 3d 06 84 57 0a 14 87 d5 0a 14 .3..@.=..W...... +0020 97 8e 0c ea 47 4b a4 97 0a b5 50 31 66 34 50 18 ....GK....P1f4P. +0030 00 1d bb 2c 00 00 07 00 00 01 00 01 00 03 00 00 ...,............ +0040 00 . + +No. Time Source Destination Protocol Length Info + 47777 1245.202824000 10.20.151.142 10.20.135.213 MySQL 74 Request Query + +MySQL Protocol + Packet Length: 16 + Packet Number: 0 + Request Command Query + Command: Query (3) + Statement: select * from t + +0000 00 0f e2 c7 64 e4 90 b1 1c 95 0e a1 08 00 45 00 ....d.........E. +0010 00 3c 23 6f 40 00 40 06 00 00 0a 14 97 8e 0a 14 .<#o@.@......... +0020 87 d5 47 4b 0c ea 50 31 66 34 a4 97 0a c0 50 18 ..GK..P1f4....P. +0030 3f c2 33 ba 00 00 10 00 00 00 03 73 65 6c 65 63 ?.3........selec +0040 74 20 2a 20 66 72 6f 6d 20 74 t * from t + +No. Time Source Destination Protocol Length Info + 47778 1245.204007000 10.20.135.213 10.20.151.142 MySQL 163 Response + +MySQL Protocol + Packet Length: 1 + Packet Number: 1 + Number of fields: 2 +MySQL Protocol + Packet Length: 32 + Packet Number: 2 + Catalog: def + Database: test + Table: t + Original table: t + Name: id + Original name: id + Charset number: binary COLLATE binary (63) + Length: 11 + Type: FIELD_TYPE_LONG (3) + Flags: 0x4003 + Decimals: 0 +MySQL Protocol + Packet Length: 36 + Packet Number: 3 + Catalog: def + Database: test + Table: t + Original table: t + Name: data + Original name: data + Charset number: latin1 COLLATE latin1_swedish_ci (8) + Length: 256 + Type: FIELD_TYPE_VAR_STRING (253) + Flags: 0x0000 + Decimals: 0 +MySQL Protocol + Packet Length: 5 + Packet Number: 4 + EOF marker: 254 + Warnings: 0 + Server Status: 0x0023 + .... .... .... ...1 = In transaction: Set + .... .... .... ..1. = AUTO_COMMIT: Set + .... .... .... .0.. = More results: Not set + .... .... .... 0... = Multi query - more resultsets: Not set + .... .... ...0 .... = Bad index used: Not set + .... .... ..1. .... = No index used: Set + .... .... .0.. .... = Cursor exists: Not set + .... .... 0... .... = Last row sebd: Not set + .... ...0 .... .... = database dropped: Not set + .... ..0. .... .... = No backslash escapes: Not set +MySQL Protocol + Packet Length: 6 + Packet Number: 5 + text: 1 + text: abc +MySQL Protocol + Packet Length: 5 + Packet Number: 6 + EOF marker: 254 + Warnings: 0 + Server Status: 0x0023 + .... .... .... ...1 = In transaction: Set + .... .... .... ..1. = AUTO_COMMIT: Set + .... .... .... .0.. = More results: Not set + .... .... .... 0... = Multi query - more resultsets: Not set + .... .... ...0 .... = Bad index used: Not set + .... .... ..1. .... = No index used: Set + .... .... .0.. .... = Cursor exists: Not set + .... .... 0... .... = Last row sebd: Not set + .... ...0 .... .... = database dropped: Not set + .... ..0. .... .... = No backslash escapes: Not set + +0000 90 b1 1c 95 0e a1 00 0f e2 e9 63 82 08 00 45 08 ..........c...E. +0010 00 95 85 db 40 00 3d 06 83 f4 0a 14 87 d5 0a 14 ....@.=......... +0020 97 8e 0c ea 47 4b a4 97 0a c0 50 31 66 48 50 18 ....GK....P1fHP. +0030 00 1d 29 e5 00 00 01 00 00 01 02 20 00 00 02 03 ..)........ .... +0040 64 65 66 04 74 65 73 74 01 74 01 74 02 69 64 02 def.test.t.t.id. +0050 69 64 0c 3f 00 0b 00 00 00 03 03 40 00 00 00 24 id.?.......@...$ +0060 00 00 03 03 64 65 66 04 74 65 73 74 01 74 01 74 ....def.test.t.t +0070 04 64 61 74 61 04 64 61 74 61 0c 08 00 00 01 00 .data.data...... +0080 00 fd 00 00 00 00 00 05 00 00 04 fe 00 00 23 00 ..............#. +0090 06 00 00 05 01 31 03 61 62 63 05 00 00 06 fe 00 .....1.abc...... +00a0 00 23 00 .#. + +No. Time Source Destination Protocol Length Info + 49335 1288.065885000 10.20.151.142 10.20.135.213 MySQL 65 Request Query + +MySQL Protocol + Packet Length: 7 + Packet Number: 0 + Request Command Query + Command: Query (3) + Statement: commit + +0000 00 0f e2 c7 64 e4 90 b1 1c 95 0e a1 08 00 45 00 ....d.........E. +0010 00 33 26 c2 40 00 40 06 00 00 0a 14 97 8e 0a 14 .3&.@.@......... +0020 87 d5 47 4b 0c ea 50 31 66 48 a4 97 0b 2d 50 18 ..GK..P1fH...-P. +0030 3f a7 33 b1 00 00 07 00 00 00 03 63 6f 6d 6d 69 ?.3........commi +0040 74 t + +No. Time Source Destination Protocol Length Info + 49336 1288.068525000 10.20.135.213 10.20.151.142 MySQL 65 Response OK + +MySQL Protocol + Packet Length: 7 + Packet Number: 1 + Affected Rows: 0 + Server Status: 0x0002 + .... .... .... ...0 = In transaction: Not set + .... .... .... ..1. = AUTO_COMMIT: Set + .... .... .... .0.. = More results: Not set + .... .... .... 0... = Multi query - more resultsets: Not set + .... .... ...0 .... = Bad index used: Not set + .... .... ..0. .... = No index used: Not set + .... .... .0.. .... = Cursor exists: Not set + .... .... 0... .... = Last row sebd: Not set + .... ...0 .... .... = database dropped: Not set + .... ..0. .... .... = No backslash escapes: Not set + Warnings: 0 + +0000 90 b1 1c 95 0e a1 00 0f e2 e9 63 82 08 00 45 08 ..........c...E. +0010 00 33 85 dd 40 00 3d 06 84 54 0a 14 87 d5 0a 14 .3..@.=..T...... +0020 97 8e 0c ea 47 4b a4 97 0b 2d 50 31 66 53 50 18 ....GK...-P1fSP. +0030 00 1d ba 97 00 00 07 00 00 01 00 00 00 02 00 00 ................ +0040 00 . + +No. Time Source Destination Protocol Length Info + 96591 2483.096047000 10.20.151.142 10.20.135.213 MySQL 108 Request Query + +MySQL Protocol + Packet Length: 50 + Packet Number: 0 + Request Command Query + Command: Query (3) + Statement: PREPARE stmt1 FROM 'select * from t where id = ?' + +0000 00 0f e2 c7 64 e4 90 b1 1c 95 0e a1 08 00 45 00 ....d.........E. +0010 00 5e 09 69 40 00 40 06 00 00 0a 14 97 8e 0a 14 .^.i@.@......... +0020 87 d5 47 4b 0c ea 50 31 66 53 a4 97 0b 38 50 18 ..GK..P1fS...8P. +0030 3f a4 33 dc 00 00 32 00 00 00 03 50 52 45 50 41 ?.3...2....PREPA +0040 52 45 20 73 74 6d 74 31 20 46 52 4f 4d 20 27 73 RE stmt1 FROM 's +0050 65 6c 65 63 74 20 2a 20 66 72 6f 6d 20 74 20 77 elect * from t w +0060 68 65 72 65 20 69 64 20 3d 20 3f 27 here id = ?' + +No. Time Source Destination Protocol Length Info + 96592 2483.097110000 10.20.135.213 10.20.151.142 MySQL 84 Response OK + +MySQL Protocol + Packet Length: 26 + Packet Number: 1 + Affected Rows: 0 + Server Status: 0x0002 + .... .... .... ...0 = In transaction: Not set + .... .... .... ..1. = AUTO_COMMIT: Set + .... .... .... .0.. = More results: Not set + .... .... .... 0... = Multi query - more resultsets: Not set + .... .... ...0 .... = Bad index used: Not set + .... .... ..0. .... = No index used: Not set + .... .... .0.. .... = Cursor exists: Not set + .... .... 0... .... = Last row sebd: Not set + .... ...0 .... .... = database dropped: Not set + .... ..0. .... .... = No backslash escapes: Not set + Warnings: 0 + Message: \022Statement prepared + +0000 90 b1 1c 95 0e a1 00 0f e2 e9 63 82 08 00 45 08 ..........c...E. +0010 00 46 85 ee 40 00 3d 06 84 30 0a 14 87 d5 0a 14 .F..@.=..0...... +0020 97 8e 0c ea 47 4b a4 97 0b 38 50 31 66 89 50 18 ....GK...8P1f.P. +0030 00 1d 16 93 00 00 1a 00 00 01 00 00 00 02 00 00 ................ +0040 00 12 53 74 61 74 65 6d 65 6e 74 20 70 72 65 70 ..Statement prep +0050 61 72 65 64 ared + +No. Time Source Destination Protocol Length Info + 101131 2604.100769000 10.20.151.142 10.20.135.213 MySQL 80 Request Query + +MySQL Protocol + Packet Length: 22 + Packet Number: 0 + Request Command Query + Command: Query (3) + Statement: execute stmt1 using 1 + +0000 00 0f e2 c7 64 e4 90 b1 1c 95 0e a1 08 00 45 00 ....d.........E. +0010 00 42 12 c7 40 00 40 06 00 00 0a 14 97 8e 0a 14 .B..@.@......... +0020 87 d5 47 4b 0c ea 50 31 66 89 a4 97 0b 56 50 18 ..GK..P1f....VP. +0030 3f 9d 33 c0 00 00 16 00 00 00 03 65 78 65 63 75 ?.3........execu +0040 74 65 20 73 74 6d 74 31 20 75 73 69 6e 67 20 31 te stmt1 using 1 + +No. Time Source Destination Protocol Length Info + 101134 2604.101657000 10.20.135.213 10.20.151.142 MySQL 214 Response Error 1064 + +MySQL Protocol + Packet Length: 156 + Packet Number: 1 + Error Code: 1064 + SQL state: 42000 + Error message: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '1' at line 1 + +0000 90 b1 1c 95 0e a1 00 0f e2 e9 63 82 08 00 45 08 ..........c...E. +0010 00 c8 85 f0 40 00 3d 06 83 ac 0a 14 87 d5 0a 14 ....@.=......... +0020 97 8e 0c ea 47 4b a4 97 0b 56 50 31 66 a3 50 18 ....GK...VP1f.P. +0030 00 1d 6e 7f 00 00 9c 00 00 01 ff 28 04 23 34 32 ..n........(.#42 +0040 30 30 30 59 6f 75 20 68 61 76 65 20 61 6e 20 65 000You have an e +0050 72 72 6f 72 20 69 6e 20 79 6f 75 72 20 53 51 4c rror in your SQL +0060 20 73 79 6e 74 61 78 3b 20 63 68 65 63 6b 20 74 syntax; check t +0070 68 65 20 6d 61 6e 75 61 6c 20 74 68 61 74 20 63 he manual that c +0080 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 79 6f orresponds to yo +0090 75 72 20 4d 79 53 51 4c 20 73 65 72 76 65 72 20 ur MySQL server +00a0 76 65 72 73 69 6f 6e 20 66 6f 72 20 74 68 65 20 version for the +00b0 72 69 67 68 74 20 73 79 6e 74 61 78 20 74 6f 20 right syntax to +00c0 75 73 65 20 6e 65 61 72 20 27 31 27 20 61 74 20 use near '1' at +00d0 6c 69 6e 65 20 31 line 1 + +No. Time Source Destination Protocol Length Info + 102487 2631.764599000 10.20.151.142 10.20.135.213 MySQL 69 Request Query + +MySQL Protocol + Packet Length: 11 + Packet Number: 0 + Request Command Query + Command: Query (3) + Statement: set @a = 1 + +0000 00 0f e2 c7 64 e4 90 b1 1c 95 0e a1 08 00 45 00 ....d.........E. +0010 00 37 15 89 40 00 40 06 00 00 0a 14 97 8e 0a 14 .7..@.@......... +0020 87 d5 47 4b 0c ea 50 31 66 a3 a4 97 0b f6 50 18 ..GK..P1f.....P. +0030 3f 75 33 b5 00 00 0b 00 00 00 03 73 65 74 20 40 ?u3........set @ +0040 61 20 3d 20 31 a = 1 + +No. Time Source Destination Protocol Length Info + 102488 2631.765660000 10.20.135.213 10.20.151.142 MySQL 65 Response OK + +MySQL Protocol + Packet Length: 7 + Packet Number: 1 + Affected Rows: 0 + Server Status: 0x0002 + .... .... .... ...0 = In transaction: Not set + .... .... .... ..1. = AUTO_COMMIT: Set + .... .... .... .0.. = More results: Not set + .... .... .... 0... = Multi query - more resultsets: Not set + .... .... ...0 .... = Bad index used: Not set + .... .... ..0. .... = No index used: Not set + .... .... .0.. .... = Cursor exists: Not set + .... .... 0... .... = Last row sebd: Not set + .... ...0 .... .... = database dropped: Not set + .... ..0. .... .... = No backslash escapes: Not set + Warnings: 0 + +0000 90 b1 1c 95 0e a1 00 0f e2 e9 63 82 08 00 45 08 ..........c...E. +0010 00 33 85 f2 40 00 3d 06 84 3f 0a 14 87 d5 0a 14 .3..@.=..?...... +0020 97 8e 0c ea 47 4b a4 97 0b f6 50 31 66 b2 50 18 ....GK....P1f.P. +0030 00 1d b9 6f 00 00 07 00 00 01 00 00 00 02 00 00 ...o............ +0040 00 . + +No. Time Source Destination Protocol Length Info + 102620 2635.940846000 10.20.151.142 10.20.135.213 MySQL 81 Request Query + +MySQL Protocol + Packet Length: 23 + Packet Number: 0 + Request Command Query + Command: Query (3) + Statement: execute stmt1 using @a + +0000 00 0f e2 c7 64 e4 90 b1 1c 95 0e a1 08 00 45 00 ....d.........E. +0010 00 43 15 cf 40 00 40 06 00 00 0a 14 97 8e 0a 14 .C..@.@......... +0020 87 d5 47 4b 0c ea 50 31 66 b2 a4 97 0c 01 50 18 ..GK..P1f.....P. +0030 3f 72 33 c1 00 00 17 00 00 00 03 65 78 65 63 75 ?r3........execu +0040 74 65 20 73 74 6d 74 31 20 75 73 69 6e 67 20 40 te stmt1 using @ +0050 61 a + +No. Time Source Destination Protocol Length Info + 102621 2635.942265000 10.20.135.213 10.20.151.142 MySQL 163 Response + +MySQL Protocol + Packet Length: 1 + Packet Number: 1 + Number of fields: 2 +MySQL Protocol + Packet Length: 32 + Packet Number: 2 + Catalog: def + Database: test + Table: t + Original table: t + Name: id + Original name: id + Charset number: binary COLLATE binary (63) + Length: 11 + Type: FIELD_TYPE_LONG (3) + Flags: 0x4003 + Decimals: 0 +MySQL Protocol + Packet Length: 36 + Packet Number: 3 + Catalog: def + Database: test + Table: t + Original table: t + Name: data + Original name: data + Charset number: latin1 COLLATE latin1_swedish_ci (8) + Length: 256 + Type: FIELD_TYPE_VAR_STRING (253) + Flags: 0x0000 + Decimals: 0 +MySQL Protocol + Packet Length: 5 + Packet Number: 4 + EOF marker: 254 + Warnings: 0 + Server Status: 0x0002 + .... .... .... ...0 = In transaction: Not set + .... .... .... ..1. = AUTO_COMMIT: Set + .... .... .... .0.. = More results: Not set + .... .... .... 0... = Multi query - more resultsets: Not set + .... .... ...0 .... = Bad index used: Not set + .... .... ..0. .... = No index used: Not set + .... .... .0.. .... = Cursor exists: Not set + .... .... 0... .... = Last row sebd: Not set + .... ...0 .... .... = database dropped: Not set + .... ..0. .... .... = No backslash escapes: Not set +MySQL Protocol + Packet Length: 6 + Packet Number: 5 + text: 1 + text: abc +MySQL Protocol + Packet Length: 5 + Packet Number: 6 + EOF marker: 254 + Warnings: 0 + Server Status: 0x0002 + .... .... .... ...0 = In transaction: Not set + .... .... .... ..1. = AUTO_COMMIT: Set + .... .... .... .0.. = More results: Not set + .... .... .... 0... = Multi query - more resultsets: Not set + .... .... ...0 .... = Bad index used: Not set + .... .... ..0. .... = No index used: Not set + .... .... .0.. .... = Cursor exists: Not set + .... .... 0... .... = Last row sebd: Not set + .... ...0 .... .... = database dropped: Not set + .... ..0. .... .... = No backslash escapes: Not set + +0000 90 b1 1c 95 0e a1 00 0f e2 e9 63 82 08 00 45 08 ..........c...E. +0010 00 95 85 f3 40 00 3d 06 83 dc 0a 14 87 d5 0a 14 ....@.=......... +0020 97 8e 0c ea 47 4b a4 97 0c 01 50 31 66 cd 50 18 ....GK....P1f.P. +0030 00 1d 49 40 00 00 01 00 00 01 02 20 00 00 02 03 ..I@....... .... +0040 64 65 66 04 74 65 73 74 01 74 01 74 02 69 64 02 def.test.t.t.id. +0050 69 64 0c 3f 00 0b 00 00 00 03 03 40 00 00 00 24 id.?.......@...$ +0060 00 00 03 03 64 65 66 04 74 65 73 74 01 74 01 74 ....def.test.t.t +0070 04 64 61 74 61 04 64 61 74 61 0c 08 00 00 01 00 .data.data...... +0080 00 fd 00 00 00 00 00 05 00 00 04 fe 00 00 02 00 ................ +0090 06 00 00 05 01 31 03 61 62 63 05 00 00 06 fe 00 .....1.abc...... +00a0 00 02 00 ... diff --git a/hack/hack.go b/hack/hack.go new file mode 100644 index 0000000..ff2a926 --- /dev/null +++ b/hack/hack.go @@ -0,0 +1,27 @@ +package hack + +import ( + "reflect" + "unsafe" +) + +// String provides no copy to change slice to string +// use your own risk +func String(b []byte) (s string) { + pbytes := (*reflect.SliceHeader)(unsafe.Pointer(&b)) + pstring := (*reflect.StringHeader)(unsafe.Pointer(&s)) + pstring.Data = pbytes.Data + pstring.Len = pbytes.Len + return +} + +// Slice provides no copy to change string to slice +// use your own risk +func Slice(s string) (b []byte) { + pbytes := (*reflect.SliceHeader)(unsafe.Pointer(&b)) + pstring := (*reflect.StringHeader)(unsafe.Pointer(&s)) + pbytes.Data = pstring.Data + pbytes.Len = pstring.Len + pbytes.Cap = pstring.Len + return +} diff --git a/hack/hack_test.go b/hack/hack_test.go new file mode 100644 index 0000000..7b11b0b --- /dev/null +++ b/hack/hack_test.go @@ -0,0 +1,36 @@ +package hack + +import ( + "bytes" + "testing" +) + +func TestString(t *testing.T) { + b := []byte("hello world") + a := String(b) + + if a != "hello world" { + t.Fatal(a) + } + + b[0] = 'a' + + if a != "aello world" { + t.Fatal(a) + } + + b = append(b, "abc"...) + if a != "aello world" { + t.Fatal(a) + } +} + +func TestByte(t *testing.T) { + a := "hello world" + + b := Slice(a) + + if !bytes.Equal(b, []byte("hello world")) { + t.Fatal(string(b)) + } +} diff --git a/log/logger.go b/log/logger.go new file mode 100644 index 0000000..2940366 --- /dev/null +++ b/log/logger.go @@ -0,0 +1,123 @@ +// Copyright (c) 2014 Xiaomi.com, Inc. All Rights Reserved +// @file logger.go +// @author 王靖 (wangjing1@xiaomi.com) +// @date 14-11-25 20:02:50 +// @version $Revision: 1.0 $ +// @brief + +package log + +import ( + "crypto/rand" + "fmt" + "math/big" + "micode.be.xiaomi.com/golib/milog" + "path/filepath" + "runtime" + "strconv" + "strings" + "sync" +) + +// SysLog 系统Log +var SysLog *Logger = nil + +// AppLog 应用Log +var AppLog *Logger = nil + +// Logger the milog.Logger wrapper +type Logger struct { + l *milog.Logger +} + +func logidGenerator() string { + if i, err := rand.Int(rand.Reader, big.NewInt(1<<30-1)); err != nil { + return "0" + } else { + return i.String() + } +} + +func comMessage(strfmt string, args ...interface{}) map[string]string { + pc, file, line, ok := runtime.Caller(2) + if !ok { + file = "?" + line = 0 + } + fn := runtime.FuncForPC(pc) + var fnName string + if fn == nil { + fnName = "?()" + } else { + dotName := filepath.Ext(fn.Name()) + fnName = strings.TrimLeft(dotName, ".") + "()" + } + ret := map[string]string{ + "file": filepath.Base(file) + ":" + strconv.Itoa(line), + "func": fnName, + "msg": fmt.Sprintf(strfmt, args...), + } + + return ret +} + +// Notice print notice message to logfile +func (lg *Logger) Notice(strfmt string, args ...interface{}) { + lg.l.Notice(comMessage(strfmt, args...), logidGenerator()) +} + +// Debug print debug message to logfile +func (lg *Logger) Debug(strfmt string, args ...interface{}) { + lg.l.Debug(comMessage(strfmt, args...), logidGenerator()) +} + +// Warn print warning message to logfile +func (lg *Logger) Warn(strfmt string, args ...interface{}) { + lg.l.Warn(comMessage(strfmt, args...), logidGenerator()) +} + +// Fatal print fatal message to logfile +func (lg *Logger) Fatal(strfmt string, args ...interface{}) { + lg.l.Fatal(comMessage(strfmt, args...), logidGenerator()) +} + +// Config Config of One Log Instance +type Config struct { + FilePath string + LogLevel int + AppTag string +} + +func init() { + realInit(&Config{FilePath: "/dev/stdout", LogLevel: 0}, + &Config{FilePath: "/dev/stdout", LogLevel: 0}) +} + +var once sync.Once + +func Init(syslog, applog *Config) { + f := func() { + realInit(syslog, applog) + } + once.Do(f) +} + +func realInit(syslog, applog *Config) { + SysLog = &Logger{ + l: milog.NewLogger(syslog.FilePath), + } + SysLog.l.SetLevel(syslog.LogLevel) + SysLog.l.SetAppTag(defaultAppTag()) + + AppLog = &Logger{ + l: milog.NewLogger(applog.FilePath), + } + AppLog.l.SetLevel(applog.LogLevel) + AppLog.l.SetAppTag(defaultAppTag()) +} + +func defaultAppTag() string { + return "mysql-proxy" +} + +/* vim: set expandtab ts=4 sw=4 */ diff --git a/makefile b/makefile new file mode 100644 index 0000000..e3170f5 --- /dev/null +++ b/makefile @@ -0,0 +1,17 @@ +all: build run + +build: + go install ./... + +run: + cd cmd/proxy && go build && cd - + GOGC=1000 ./cmd/proxy/proxy --config=etc/proxy_single.yaml --logfile=log/proxy.log --loglevel=0 + +clean: + go clean -i ./... + +test: + go test ./... + +package: build + tar cvf output.tar etc/ cmd/proxy/proxy run.sh diff --git a/mysql/charset.go b/mysql/charset.go new file mode 100644 index 0000000..5cca150 --- /dev/null +++ b/mysql/charset.go @@ -0,0 +1,542 @@ +package mysql + +type CollationId uint8 + +//charset key is charset name and value is default collation id +var CharsetIds = map[string]CollationId{ + "default": DEFAULT_COLLATION_ID, + "big5": 1, + "dec8": 3, + "cp850": 4, + "hp8": 6, + "koi8r": 7, + "latin1": 8, + "latin2": 9, + "swe7": 10, + "ascii": 11, + "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": 33, + "ucs2": 35, + "cp866": 36, + "keybcs2": 37, + "macce": 38, + "macroman": 39, + "cp852": 40, + "latin7": 41, + "utf8mb4": 45, + "cp1251": 51, + "utf16": 54, + "utf16le": 56, + "cp1256": 57, + "cp1257": 59, + "utf32": 60, + "binary": 63, + "geostd8": 92, + "cp932": 95, + "eucjpms": 97, +} + +//charset key is charset name and value is 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_swedish_ci", + "latin2": "latin2_general_ci", + "swe7": "swe7_swedish_ci", + "ascii": "ascii_general_ci", + "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_general_ci", + "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_general_ci", + "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", +} + +var Collations = map[CollationId]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", +} + +var CollationNames = map[string]CollationId{ + "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, +} + +const ( + DEFAULT_CHARSET = "utf8" + DEFAULT_COLLATION_ID CollationId = 33 + DEFAULT_COLLATION_NAME string = "utf8_general_ci" +) diff --git a/mysql/const.go b/mysql/const.go new file mode 100644 index 0000000..e371bef --- /dev/null +++ b/mysql/const.go @@ -0,0 +1,152 @@ +package mysql + +const ( + MinProtocolVersion byte = 10 + MaxPayloadLen int = 1<<24 - 1 + TimeFormat string = "2006-01-02 15:04:05" + ServerVersion string = "5.5.31-go_proxy-0.1" +) + +const ( + OK_HEADER byte = 0x00 + ERR_HEADER byte = 0xff + EOF_HEADER byte = 0xfe + LocalInFile_HEADER byte = 0xfb +) + +const ( + SERVER_STATUS_IN_TRANS uint16 = 0x0001 + SERVER_STATUS_AUTOCOMMIT uint16 = 0x0002 + SERVER_MORE_RESULTS_EXISTS uint16 = 0x0008 + SERVER_STATUS_NO_GOOD_INDEX_USED uint16 = 0x0010 + SERVER_STATUS_NO_INDEX_USED uint16 = 0x0020 + SERVER_STATUS_CURSOR_EXISTS uint16 = 0x0040 + SERVER_STATUS_LAST_ROW_SEND uint16 = 0x0080 + SERVER_STATUS_DB_DROPPED uint16 = 0x0100 + SERVER_STATUS_NO_BACKSLASH_ESCAPED uint16 = 0x0200 + SERVER_STATUS_METADATA_CHANGED uint16 = 0x0400 + SERVER_QUERY_WAS_SLOW uint16 = 0x0800 + SERVER_PS_OUT_PARAMS uint16 = 0x1000 +) + +const ( + COM_SLEEP byte = iota + COM_QUIT + COM_INIT_DB + COM_QUERY + COM_FIELD_LIST + COM_CREATE_DB + COM_DROP_DB + COM_REFRESH + COM_SHUTDOWN + COM_STATISTICS + COM_PROCESS_INFO + COM_CONNECT + COM_PROCESS_KILL + COM_DEBUG + COM_PING + COM_TIME + COM_DELAYED_INSERT + COM_CHANGE_USER + COM_BINLOG_DUMP + COM_TABLE_DUMP + COM_CONNECT_OUT + COM_REGISTER_SLAVE + COM_STMT_PREPARE + COM_STMT_EXECUTE // 23 + COM_STMT_SEND_LONG_DATA // 24 + COM_STMT_CLOSE + COM_STMT_RESET + COM_SET_OPTION + COM_STMT_FETCH + COM_DAEMON + COM_BINLOG_DUMP_GTID + COM_RESET_CONNECTION +) + +const ( + CLIENT_LONG_PASSWORD uint32 = 1 << iota + CLIENT_FOUND_ROWS + CLIENT_LONG_FLAG + CLIENT_CONNECT_WITH_DB + CLIENT_NO_SCHEMA + CLIENT_COMPRESS + CLIENT_ODBC + CLIENT_LOCAL_FILES + CLIENT_IGNORE_SPACE + CLIENT_PROTOCOL_41 + CLIENT_INTERACTIVE + CLIENT_SSL + CLIENT_IGNORE_SIGPIPE + CLIENT_TRANSACTIONS + CLIENT_RESERVED + CLIENT_SECURE_CONNECTION + CLIENT_MULTI_STATEMENTS + CLIENT_MULTI_RESULTS + CLIENT_PS_MULTI_RESULTS + CLIENT_PLUGIN_AUTH + CLIENT_CONNECT_ATTRS + CLIENT_PLUGIN_AUTH_LENENC_CLIENT_DATA +) + +const ( + MYSQL_TYPE_DECIMAL byte = iota + MYSQL_TYPE_TINY + MYSQL_TYPE_SHORT + MYSQL_TYPE_LONG + MYSQL_TYPE_FLOAT + MYSQL_TYPE_DOUBLE + MYSQL_TYPE_NULL + MYSQL_TYPE_TIMESTAMP + MYSQL_TYPE_LONGLONG + MYSQL_TYPE_INT24 + MYSQL_TYPE_DATE + MYSQL_TYPE_TIME + MYSQL_TYPE_DATETIME + MYSQL_TYPE_YEAR + MYSQL_TYPE_NEWDATE + MYSQL_TYPE_VARCHAR + MYSQL_TYPE_BIT +) + +const ( + MYSQL_TYPE_NEWDECIMAL byte = iota + 0xf6 + MYSQL_TYPE_ENUM + MYSQL_TYPE_SET + MYSQL_TYPE_TINY_BLOB + MYSQL_TYPE_MEDIUM_BLOB + MYSQL_TYPE_LONG_BLOB + MYSQL_TYPE_BLOB + MYSQL_TYPE_VAR_STRING + MYSQL_TYPE_STRING + MYSQL_TYPE_GEOMETRY +) + +const ( + NOT_NULL_FLAG = 1 + PRI_KEY_FLAG = 2 + UNIQUE_KEY_FLAG = 4 + BLOB_FLAG = 16 + UNSIGNED_FLAG = 32 + ZEROFILL_FLAG = 64 + BINARY_FLAG = 128 + ENUM_FLAG = 256 + AUTO_INCREMENT_FLAG = 512 + TIMESTAMP_FLAG = 1024 + SET_FLAG = 2048 + NUM_FLAG = 32768 + PART_KEY_FLAG = 16384 + GROUP_FLAG = 32768 + UNIQUE_FLAG = 65536 +) + +const ( + AUTH_NAME = "mysql_native_password" +) + +const ( + CURSOR_TYPE_NO_CURSOR byte = iota + CURSOR_TYPE_READ_ONLY + CURSOR_TYPE_FOR_UPDATE + CURSOR_TYPE_SCROLLABLE +) diff --git a/mysql/debug.go b/mysql/debug.go new file mode 100644 index 0000000..5fdc24a --- /dev/null +++ b/mysql/debug.go @@ -0,0 +1,46 @@ +package mysql + +import ( + "bytes" + "fmt" +) + +const ( + InitialHandshake = "Initial Handshake Packet" +) + +func Dump(types string, action string, cId uint32, capability uint32, data []byte) { + fmt.Println("---------------mysql packet dump----------------") + fmt.Println("Action:", action) + fmt.Println("ConnectionId:", cId) + fmt.Println("PacketType:", types) + + switch types { + case InitialHandshake: + dumpInitialHandshake(data, capability) + default: + fmt.Println("Unsupport packet type") + } +} + +func dumpInitialHandshake(data []byte, capability uint32) { + fmt.Println("\tProtocal Version:", data[0]) + + strlen := bytes.IndexByte(data[1:], 0x00) + fmt.Println("\tServer:", string(data[1:1+strlen]), "00") + pos := 1 + strlen + 1 + + //cipher := data[pos : pos+8] + pos += 8 + + // capability lower 2 byte + // capa := binary.LittleEndian.Uint16(data[pos : pos+2]) + pos += 2 + + if len(data) > pos { + pos += 1 + 2 + 2 + 1 + 10 + // cipher = append(cipher, data[pos:pos+12]...) + } + + //fmt.Println("\tCipher:", cipher) +} diff --git a/mysql/errcode.go b/mysql/errcode.go new file mode 100644 index 0000000..8acff1a --- /dev/null +++ b/mysql/errcode.go @@ -0,0 +1,870 @@ +package mysql + +const ( + ER_ERROR_FIRST uint16 = 1000 + ER_HASHCHK = 1000 + ER_NISAMCHK = 1001 + ER_NO = 1002 + ER_YES = 1003 + ER_CANT_CREATE_FILE = 1004 + ER_CANT_CREATE_TABLE = 1005 + ER_CANT_CREATE_DB = 1006 + ER_DB_CREATE_EXISTS = 1007 + ER_DB_DROP_EXISTS = 1008 + ER_DB_DROP_DELETE = 1009 + ER_DB_DROP_RMDIR = 1010 + ER_CANT_DELETE_FILE = 1011 + ER_CANT_FIND_SYSTEM_REC = 1012 + ER_CANT_GET_STAT = 1013 + ER_CANT_GET_WD = 1014 + ER_CANT_LOCK = 1015 + ER_CANT_OPEN_FILE = 1016 + ER_FILE_NOT_FOUND = 1017 + ER_CANT_READ_DIR = 1018 + ER_CANT_SET_WD = 1019 + ER_CHECKREAD = 1020 + ER_DISK_FULL = 1021 + ER_DUP_KEY = 1022 + ER_ERROR_ON_CLOSE = 1023 + ER_ERROR_ON_READ = 1024 + ER_ERROR_ON_RENAME = 1025 + ER_ERROR_ON_WRITE = 1026 + ER_FILE_USED = 1027 + ER_FILSORT_ABORT = 1028 + ER_FORM_NOT_FOUND = 1029 + ER_GET_ERRNO = 1030 + ER_ILLEGAL_HA = 1031 + ER_KEY_NOT_FOUND = 1032 + ER_NOT_FORM_FILE = 1033 + ER_NOT_KEYFILE = 1034 + ER_OLD_KEYFILE = 1035 + ER_OPEN_AS_READONLY = 1036 + ER_OUTOFMEMORY = 1037 + ER_OUT_OF_SORTMEMORY = 1038 + ER_UNEXPECTED_EOF = 1039 + ER_CON_COUNT_ERROR = 1040 + ER_OUT_OF_RESOURCES = 1041 + ER_BAD_HOST_ERROR = 1042 + ER_HANDSHAKE_ERROR = 1043 + ER_DBACCESS_DENIED_ERROR = 1044 + ER_ACCESS_DENIED_ERROR = 1045 + ER_NO_DB_ERROR = 1046 + ER_UNKNOWN_COM_ERROR = 1047 + ER_BAD_NULL_ERROR = 1048 + ER_BAD_DB_ERROR = 1049 + ER_TABLE_EXISTS_ERROR = 1050 + ER_BAD_TABLE_ERROR = 1051 + ER_NON_UNIQ_ERROR = 1052 + ER_SERVER_SHUTDOWN = 1053 + ER_BAD_FIELD_ERROR = 1054 + ER_WRONG_FIELD_WITH_GROUP = 1055 + ER_WRONG_GROUP_FIELD = 1056 + ER_WRONG_SUM_SELECT = 1057 + ER_WRONG_VALUE_COUNT = 1058 + ER_TOO_LONG_IDENT = 1059 + ER_DUP_FIELDNAME = 1060 + ER_DUP_KEYNAME = 1061 + ER_DUP_ENTRY = 1062 + ER_WRONG_FIELD_SPEC = 1063 + ER_PARSE_ERROR = 1064 + ER_EMPTY_QUERY = 1065 + ER_NONUNIQ_TABLE = 1066 + ER_INVALID_DEFAULT = 1067 + ER_MULTIPLE_PRI_KEY = 1068 + ER_TOO_MANY_KEYS = 1069 + ER_TOO_MANY_KEY_PARTS = 1070 + ER_TOO_LONG_KEY = 1071 + ER_KEY_COLUMN_DOES_NOT_EXITS = 1072 + ER_BLOB_USED_AS_KEY = 1073 + ER_TOO_BIG_FIELDLENGTH = 1074 + ER_WRONG_AUTO_KEY = 1075 + ER_READY = 1076 + ER_NORMAL_SHUTDOWN = 1077 + ER_GOT_SIGNAL = 1078 + ER_SHUTDOWN_COMPLETE = 1079 + ER_FORCING_CLOSE = 1080 + ER_IPSOCK_ERROR = 1081 + ER_NO_SUCH_INDEX = 1082 + ER_WRONG_FIELD_TERMINATORS = 1083 + ER_BLOBS_AND_NO_TERMINATED = 1084 + ER_TEXTFILE_NOT_READABLE = 1085 + ER_FILE_EXISTS_ERROR = 1086 + ER_LOAD_INFO = 1087 + ER_ALTER_INFO = 1088 + ER_WRONG_SUB_KEY = 1089 + ER_CANT_REMOVE_ALL_FIELDS = 1090 + ER_CANT_DROP_FIELD_OR_KEY = 1091 + ER_INSERT_INFO = 1092 + ER_UPDATE_TABLE_USED = 1093 + ER_NO_SUCH_THREAD = 1094 + ER_KILL_DENIED_ERROR = 1095 + ER_NO_TABLES_USED = 1096 + ER_TOO_BIG_SET = 1097 + ER_NO_UNIQUE_LOGFILE = 1098 + ER_TABLE_NOT_LOCKED_FOR_WRITE = 1099 + ER_TABLE_NOT_LOCKED = 1100 + ER_BLOB_CANT_HAVE_DEFAULT = 1101 + ER_WRONG_DB_NAME = 1102 + ER_WRONG_TABLE_NAME = 1103 + ER_TOO_BIG_SELECT = 1104 + ER_UNKNOWN_ERROR = 1105 + ER_UNKNOWN_PROCEDURE = 1106 + ER_WRONG_PARAMCOUNT_TO_PROCEDURE = 1107 + ER_WRONG_PARAMETERS_TO_PROCEDURE = 1108 + ER_UNKNOWN_TABLE = 1109 + ER_FIELD_SPECIFIED_TWICE = 1110 + ER_INVALID_GROUP_FUNC_USE = 1111 + ER_UNSUPPORTED_EXTENSION = 1112 + ER_TABLE_MUST_HAVE_COLUMNS = 1113 + ER_RECORD_FILE_FULL = 1114 + ER_UNKNOWN_CHARACTER_SET = 1115 + ER_TOO_MANY_TABLES = 1116 + ER_TOO_MANY_FIELDS = 1117 + ER_TOO_BIG_ROWSIZE = 1118 + ER_STACK_OVERRUN = 1119 + ER_WRONG_OUTER_JOIN = 1120 + ER_NULL_COLUMN_IN_INDEX = 1121 + ER_CANT_FIND_UDF = 1122 + ER_CANT_INITIALIZE_UDF = 1123 + ER_UDF_NO_PATHS = 1124 + ER_UDF_EXISTS = 1125 + ER_CANT_OPEN_LIBRARY = 1126 + ER_CANT_FIND_DL_ENTRY = 1127 + ER_FUNCTION_NOT_DEFINED = 1128 + ER_HOST_IS_BLOCKED = 1129 + ER_HOST_NOT_PRIVILEGED = 1130 + ER_PASSWORD_ANONYMOUS_USER = 1131 + ER_PASSWORD_NOT_ALLOWED = 1132 + ER_PASSWORD_NO_MATCH = 1133 + ER_UPDATE_INFO = 1134 + ER_CANT_CREATE_THREAD = 1135 + ER_WRONG_VALUE_COUNT_ON_ROW = 1136 + ER_CANT_REOPEN_TABLE = 1137 + ER_INVALID_USE_OF_NULL = 1138 + ER_REGEXP_ERROR = 1139 + ER_MIX_OF_GROUP_FUNC_AND_FIELDS = 1140 + ER_NONEXISTING_GRANT = 1141 + ER_TABLEACCESS_DENIED_ERROR = 1142 + ER_COLUMNACCESS_DENIED_ERROR = 1143 + ER_ILLEGAL_GRANT_FOR_TABLE = 1144 + ER_GRANT_WRONG_HOST_OR_USER = 1145 + ER_NO_SUCH_TABLE = 1146 + ER_NONEXISTING_TABLE_GRANT = 1147 + ER_NOT_ALLOWED_COMMAND = 1148 + ER_SYNTAX_ERROR = 1149 + ER_DELAYED_CANT_CHANGE_LOCK = 1150 + ER_TOO_MANY_DELAYED_THREADS = 1151 + ER_ABORTING_CONNECTION = 1152 + ER_NET_PACKET_TOO_LARGE = 1153 + ER_NET_READ_ERROR_FROM_PIPE = 1154 + ER_NET_FCNTL_ERROR = 1155 + ER_NET_PACKETS_OUT_OF_ORDER = 1156 + ER_NET_UNCOMPRESS_ERROR = 1157 + ER_NET_READ_ERROR = 1158 + ER_NET_READ_INTERRUPTED = 1159 + ER_NET_ERROR_ON_WRITE = 1160 + ER_NET_WRITE_INTERRUPTED = 1161 + ER_TOO_LONG_STRING = 1162 + ER_TABLE_CANT_HANDLE_BLOB = 1163 + ER_TABLE_CANT_HANDLE_AUTO_INCREMENT = 1164 + ER_DELAYED_INSERT_TABLE_LOCKED = 1165 + ER_WRONG_COLUMN_NAME = 1166 + ER_WRONG_KEY_COLUMN = 1167 + ER_WRONG_MRG_TABLE = 1168 + ER_DUP_UNIQUE = 1169 + ER_BLOB_KEY_WITHOUT_LENGTH = 1170 + ER_PRIMARY_CANT_HAVE_NULL = 1171 + ER_TOO_MANY_ROWS = 1172 + ER_REQUIRES_PRIMARY_KEY = 1173 + ER_NO_RAID_COMPILED = 1174 + ER_UPDATE_WITHOUT_KEY_IN_SAFE_MODE = 1175 + ER_KEY_DOES_NOT_EXITS = 1176 + ER_CHECK_NO_SUCH_TABLE = 1177 + ER_CHECK_NOT_IMPLEMENTED = 1178 + ER_CANT_DO_THIS_DURING_AN_TRANSACTION = 1179 + ER_ERROR_DURING_COMMIT = 1180 + ER_ERROR_DURING_ROLLBACK = 1181 + ER_ERROR_DURING_FLUSH_LOGS = 1182 + ER_ERROR_DURING_CHECKPOINT = 1183 + ER_NEW_ABORTING_CONNECTION = 1184 + ER_DUMP_NOT_IMPLEMENTED = 1185 + ER_FLUSH_MASTER_BINLOG_CLOSED = 1186 + ER_INDEX_REBUILD = 1187 + ER_MASTER = 1188 + ER_MASTER_NET_READ = 1189 + ER_MASTER_NET_WRITE = 1190 + ER_FT_MATCHING_KEY_NOT_FOUND = 1191 + ER_LOCK_OR_ACTIVE_TRANSACTION = 1192 + ER_UNKNOWN_SYSTEM_VARIABLE = 1193 + ER_CRASHED_ON_USAGE = 1194 + ER_CRASHED_ON_REPAIR = 1195 + ER_WARNING_NOT_COMPLETE_ROLLBACK = 1196 + ER_TRANS_CACHE_FULL = 1197 + ER_SLAVE_MUST_STOP = 1198 + ER_SLAVE_NOT_RUNNING = 1199 + ER_BAD_SLAVE = 1200 + ER_MASTER_INFO = 1201 + ER_SLAVE_THREAD = 1202 + ER_TOO_MANY_USER_CONNECTIONS = 1203 + ER_SET_CONSTANTS_ONLY = 1204 + ER_LOCK_WAIT_TIMEOUT = 1205 + ER_LOCK_TABLE_FULL = 1206 + ER_READ_ONLY_TRANSACTION = 1207 + ER_DROP_DB_WITH_READ_LOCK = 1208 + ER_CREATE_DB_WITH_READ_LOCK = 1209 + ER_WRONG_ARGUMENTS = 1210 + ER_NO_PERMISSION_TO_CREATE_USER = 1211 + ER_UNION_TABLES_IN_DIFFERENT_DIR = 1212 + ER_LOCK_DEADLOCK = 1213 + ER_TABLE_CANT_HANDLE_FT = 1214 + ER_CANNOT_ADD_FOREIGN = 1215 + ER_NO_REFERENCED_ROW = 1216 + ER_ROW_IS_REFERENCED = 1217 + ER_CONNECT_TO_MASTER = 1218 + ER_QUERY_ON_MASTER = 1219 + ER_ERROR_WHEN_EXECUTING_COMMAND = 1220 + ER_WRONG_USAGE = 1221 + ER_WRONG_NUMBER_OF_COLUMNS_IN_SELECT = 1222 + ER_CANT_UPDATE_WITH_READLOCK = 1223 + ER_MIXING_NOT_ALLOWED = 1224 + ER_DUP_ARGUMENT = 1225 + ER_USER_LIMIT_REACHED = 1226 + ER_SPECIFIC_ACCESS_DENIED_ERROR = 1227 + ER_LOCAL_VARIABLE = 1228 + ER_GLOBAL_VARIABLE = 1229 + ER_NO_DEFAULT = 1230 + ER_WRONG_VALUE_FOR_VAR = 1231 + ER_WRONG_TYPE_FOR_VAR = 1232 + ER_VAR_CANT_BE_READ = 1233 + ER_CANT_USE_OPTION_HERE = 1234 + ER_NOT_SUPPORTED_YET = 1235 + ER_MASTER_FATAL_ERROR_READING_BINLOG = 1236 + ER_SLAVE_IGNORED_TABLE = 1237 + ER_INCORRECT_GLOBAL_LOCAL_VAR = 1238 + ER_WRONG_FK_DEF = 1239 + ER_KEY_REF_DO_NOT_MATCH_TABLE_REF = 1240 + ER_OPERAND_COLUMNS = 1241 + ER_SUBQUERY_NO_1_ROW = 1242 + ER_UNKNOWN_STMT_HANDLER = 1243 + ER_CORRUPT_HELP_DB = 1244 + ER_CYCLIC_REFERENCE = 1245 + ER_AUTO_CONVERT = 1246 + ER_ILLEGAL_REFERENCE = 1247 + ER_DERIVED_MUST_HAVE_ALIAS = 1248 + ER_SELECT_REDUCED = 1249 + ER_TABLENAME_NOT_ALLOWED_HERE = 1250 + ER_NOT_SUPPORTED_AUTH_MODE = 1251 + ER_SPATIAL_CANT_HAVE_NULL = 1252 + ER_COLLATION_CHARSET_MISMATCH = 1253 + ER_SLAVE_WAS_RUNNING = 1254 + ER_SLAVE_WAS_NOT_RUNNING = 1255 + ER_TOO_BIG_FOR_UNCOMPRESS = 1256 + ER_ZLIB_Z_MEM_ERROR = 1257 + ER_ZLIB_Z_BUF_ERROR = 1258 + ER_ZLIB_Z_DATA_ERROR = 1259 + ER_CUT_VALUE_GROUP_CONCAT = 1260 + ER_WARN_TOO_FEW_RECORDS = 1261 + ER_WARN_TOO_MANY_RECORDS = 1262 + ER_WARN_NULL_TO_NOTNULL = 1263 + ER_WARN_DATA_OUT_OF_RANGE = 1264 + WARN_DATA_TRUNCATED = 1265 + ER_WARN_USING_OTHER_HANDLER = 1266 + ER_CANT_AGGREGATE_2COLLATIONS = 1267 + ER_DROP_USER = 1268 + ER_REVOKE_GRANTS = 1269 + ER_CANT_AGGREGATE_3COLLATIONS = 1270 + ER_CANT_AGGREGATE_NCOLLATIONS = 1271 + ER_VARIABLE_IS_NOT_STRUCT = 1272 + ER_UNKNOWN_COLLATION = 1273 + ER_SLAVE_IGNORED_SSL_PARAMS = 1274 + ER_SERVER_IS_IN_SECURE_AUTH_MODE = 1275 + ER_WARN_FIELD_RESOLVED = 1276 + ER_BAD_SLAVE_UNTIL_COND = 1277 + ER_MISSING_SKIP_SLAVE = 1278 + ER_UNTIL_COND_IGNORED = 1279 + ER_WRONG_NAME_FOR_INDEX = 1280 + ER_WRONG_NAME_FOR_CATALOG = 1281 + ER_WARN_QC_RESIZE = 1282 + ER_BAD_FT_COLUMN = 1283 + ER_UNKNOWN_KEY_CACHE = 1284 + ER_WARN_HOSTNAME_WONT_WORK = 1285 + ER_UNKNOWN_STORAGE_ENGINE = 1286 + ER_WARN_DEPRECATED_SYNTAX = 1287 + ER_NON_UPDATABLE_TABLE = 1288 + ER_FEATURE_DISABLED = 1289 + ER_OPTION_PREVENTS_STATEMENT = 1290 + ER_DUPLICATED_VALUE_IN_TYPE = 1291 + ER_TRUNCATED_WRONG_VALUE = 1292 + ER_TOO_MUCH_AUTO_TIMESTAMP_COLS = 1293 + ER_INVALID_ON_UPDATE = 1294 + ER_UNSUPPORTED_PS = 1295 + ER_GET_ERRMSG = 1296 + ER_GET_TEMPORARY_ERRMSG = 1297 + ER_UNKNOWN_TIME_ZONE = 1298 + ER_WARN_INVALID_TIMESTAMP = 1299 + ER_INVALID_CHARACTER_STRING = 1300 + ER_WARN_ALLOWED_PACKET_OVERFLOWED = 1301 + ER_CONFLICTING_DECLARATIONS = 1302 + ER_SP_NO_RECURSIVE_CREATE = 1303 + ER_SP_ALREADY_EXISTS = 1304 + ER_SP_DOES_NOT_EXIST = 1305 + ER_SP_DROP_FAILED = 1306 + ER_SP_STORE_FAILED = 1307 + ER_SP_LILABEL_MISMATCH = 1308 + ER_SP_LABEL_REDEFINE = 1309 + ER_SP_LABEL_MISMATCH = 1310 + ER_SP_UNINIT_VAR = 1311 + ER_SP_BADSELECT = 1312 + ER_SP_BADRETURN = 1313 + ER_SP_BADSTATEMENT = 1314 + ER_UPDATE_LOG_DEPRECATED_IGNORED = 1315 + ER_UPDATE_LOG_DEPRECATED_TRANSLATED = 1316 + ER_QUERY_INTERRUPTED = 1317 + ER_SP_WRONG_NO_OF_ARGS = 1318 + ER_SP_COND_MISMATCH = 1319 + ER_SP_NORETURN = 1320 + ER_SP_NORETURNEND = 1321 + ER_SP_BAD_CURSOR_QUERY = 1322 + ER_SP_BAD_CURSOR_SELECT = 1323 + ER_SP_CURSOR_MISMATCH = 1324 + ER_SP_CURSOR_ALREADY_OPEN = 1325 + ER_SP_CURSOR_NOT_OPEN = 1326 + ER_SP_UNDECLARED_VAR = 1327 + ER_SP_WRONG_NO_OF_FETCH_ARGS = 1328 + ER_SP_FETCH_NO_DATA = 1329 + ER_SP_DUP_PARAM = 1330 + ER_SP_DUP_VAR = 1331 + ER_SP_DUP_COND = 1332 + ER_SP_DUP_CURS = 1333 + ER_SP_CANT_ALTER = 1334 + ER_SP_SUBSELECT_NYI = 1335 + ER_STMT_NOT_ALLOWED_IN_SF_OR_TRG = 1336 + ER_SP_VARCOND_AFTER_CURSHNDLR = 1337 + ER_SP_CURSOR_AFTER_HANDLER = 1338 + ER_SP_CASE_NOT_FOUND = 1339 + ER_FPARSER_TOO_BIG_FILE = 1340 + ER_FPARSER_BAD_HEADER = 1341 + ER_FPARSER_EOF_IN_COMMENT = 1342 + ER_FPARSER_ERROR_IN_PARAMETER = 1343 + ER_FPARSER_EOF_IN_UNKNOWN_PARAMETER = 1344 + ER_VIEW_NO_EXPLAIN = 1345 + ER_FRM_UNKNOWN_TYPE = 1346 + ER_WRONG_OBJECT = 1347 + ER_NONUPDATEABLE_COLUMN = 1348 + ER_VIEW_SELECT_DERIVED = 1349 + ER_VIEW_SELECT_CLAUSE = 1350 + ER_VIEW_SELECT_VARIABLE = 1351 + ER_VIEW_SELECT_TMPTABLE = 1352 + ER_VIEW_WRONG_LIST = 1353 + ER_WARN_VIEW_MERGE = 1354 + ER_WARN_VIEW_WITHOUT_KEY = 1355 + ER_VIEW_INVALID = 1356 + ER_SP_NO_DROP_SP = 1357 + ER_SP_GOTO_IN_HNDLR = 1358 + ER_TRG_ALREADY_EXISTS = 1359 + ER_TRG_DOES_NOT_EXIST = 1360 + ER_TRG_ON_VIEW_OR_TEMP_TABLE = 1361 + ER_TRG_CANT_CHANGE_ROW = 1362 + ER_TRG_NO_SUCH_ROW_IN_TRG = 1363 + ER_NO_DEFAULT_FOR_FIELD = 1364 + ER_DIVISION_BY_ZERO = 1365 + ER_TRUNCATED_WRONG_VALUE_FOR_FIELD = 1366 + ER_ILLEGAL_VALUE_FOR_TYPE = 1367 + ER_VIEW_NONUPD_CHECK = 1368 + ER_VIEW_CHECK_FAILED = 1369 + ER_PROCACCESS_DENIED_ERROR = 1370 + ER_RELAY_LOG_FAIL = 1371 + ER_PASSWD_LENGTH = 1372 + ER_UNKNOWN_TARGET_BINLOG = 1373 + ER_IO_ERR_LOG_INDEX_READ = 1374 + ER_BINLOG_PURGE_PROHIBITED = 1375 + ER_FSEEK_FAIL = 1376 + ER_BINLOG_PURGE_FATAL_ERR = 1377 + ER_LOG_IN_USE = 1378 + ER_LOG_PURGE_UNKNOWN_ERR = 1379 + ER_RELAY_LOG_INIT = 1380 + ER_NO_BINARY_LOGGING = 1381 + ER_RESERVED_SYNTAX = 1382 + ER_WSAS_FAILED = 1383 + ER_DIFF_GROUPS_PROC = 1384 + ER_NO_GROUP_FOR_PROC = 1385 + ER_ORDER_WITH_PROC = 1386 + ER_LOGGING_PROHIBIT_CHANGING_OF = 1387 + ER_NO_FILE_MAPPING = 1388 + ER_WRONG_MAGIC = 1389 + ER_PS_MANY_PARAM = 1390 + ER_KEY_PART_0 = 1391 + ER_VIEW_CHECKSUM = 1392 + ER_VIEW_MULTIUPDATE = 1393 + ER_VIEW_NO_INSERT_FIELD_LIST = 1394 + ER_VIEW_DELETE_MERGE_VIEW = 1395 + ER_CANNOT_USER = 1396 + ER_XAER_NOTA = 1397 + ER_XAER_INVAL = 1398 + ER_XAER_RMFAIL = 1399 + ER_XAER_OUTSIDE = 1400 + ER_XAER_RMERR = 1401 + ER_XA_RBROLLBACK = 1402 + ER_NONEXISTING_PROC_GRANT = 1403 + ER_PROC_AUTO_GRANT_FAIL = 1404 + ER_PROC_AUTO_REVOKE_FAIL = 1405 + ER_DATA_TOO_LONG = 1406 + ER_SP_BAD_SQLSTATE = 1407 + ER_STARTUP = 1408 + ER_LOAD_FROM_FIXED_SIZE_ROWS_TO_VAR = 1409 + ER_CANT_CREATE_USER_WITH_GRANT = 1410 + ER_WRONG_VALUE_FOR_TYPE = 1411 + ER_TABLE_DEF_CHANGED = 1412 + ER_SP_DUP_HANDLER = 1413 + ER_SP_NOT_VAR_ARG = 1414 + ER_SP_NO_RETSET = 1415 + ER_CANT_CREATE_GEOMETRY_OBJECT = 1416 + ER_FAILED_ROUTINE_BREAK_BINLOG = 1417 + ER_BINLOG_UNSAFE_ROUTINE = 1418 + ER_BINLOG_CREATE_ROUTINE_NEED_SUPER = 1419 + ER_EXEC_STMT_WITH_OPEN_CURSOR = 1420 + ER_STMT_HAS_NO_OPEN_CURSOR = 1421 + ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG = 1422 + ER_NO_DEFAULT_FOR_VIEW_FIELD = 1423 + ER_SP_NO_RECURSION = 1424 + ER_TOO_BIG_SCALE = 1425 + ER_TOO_BIG_PRECISION = 1426 + ER_M_BIGGER_THAN_D = 1427 + ER_WRONG_LOCK_OF_SYSTEM_TABLE = 1428 + ER_CONNECT_TO_FOREIGN_DATA_SOURCE = 1429 + ER_QUERY_ON_FOREIGN_DATA_SOURCE = 1430 + ER_FOREIGN_DATA_SOURCE_DOESNT_EXIST = 1431 + ER_FOREIGN_DATA_STRING_INVALID_CANT_CREATE = 1432 + ER_FOREIGN_DATA_STRING_INVALID = 1433 + ER_CANT_CREATE_FEDERATED_TABLE = 1434 + ER_TRG_IN_WRONG_SCHEMA = 1435 + ER_STACK_OVERRUN_NEED_MORE = 1436 + ER_TOO_LONG_BODY = 1437 + ER_WARN_CANT_DROP_DEFAULT_KEYCACHE = 1438 + ER_TOO_BIG_DISPLAYWIDTH = 1439 + ER_XAER_DUPID = 1440 + ER_DATETIME_FUNCTION_OVERFLOW = 1441 + ER_CANT_UPDATE_USED_TABLE_IN_SF_OR_TRG = 1442 + ER_VIEW_PREVENT_UPDATE = 1443 + ER_PS_NO_RECURSION = 1444 + ER_SP_CANT_SET_AUTOCOMMIT = 1445 + ER_MALFORMED_DEFINER = 1446 + ER_VIEW_FRM_NO_USER = 1447 + ER_VIEW_OTHER_USER = 1448 + ER_NO_SUCH_USER = 1449 + ER_FORBID_SCHEMA_CHANGE = 1450 + ER_ROW_IS_REFERENCED_2 = 1451 + ER_NO_REFERENCED_ROW_2 = 1452 + ER_SP_BAD_VAR_SHADOW = 1453 + ER_TRG_NO_DEFINER = 1454 + ER_OLD_FILE_FORMAT = 1455 + ER_SP_RECURSION_LIMIT = 1456 + ER_SP_PROC_TABLE_CORRUPT = 1457 + ER_SP_WRONG_NAME = 1458 + ER_TABLE_NEEDS_UPGRADE = 1459 + ER_SP_NO_AGGREGATE = 1460 + ER_MAX_PREPARED_STMT_COUNT_REACHED = 1461 + ER_VIEW_RECURSIVE = 1462 + ER_NON_GROUPING_FIELD_USED = 1463 + ER_TABLE_CANT_HANDLE_SPKEYS = 1464 + ER_NO_TRIGGERS_ON_SYSTEM_SCHEMA = 1465 + ER_REMOVED_SPACES = 1466 + ER_AUTOINC_READ_FAILED = 1467 + ER_USERNAME = 1468 + ER_HOSTNAME = 1469 + ER_WRONG_STRING_LENGTH = 1470 + ER_NON_INSERTABLE_TABLE = 1471 + ER_ADMIN_WRONG_MRG_TABLE = 1472 + ER_TOO_HIGH_LEVEL_OF_NESTING_FOR_SELECT = 1473 + ER_NAME_BECOMES_EMPTY = 1474 + ER_AMBIGUOUS_FIELD_TERM = 1475 + ER_FOREIGN_SERVER_EXISTS = 1476 + ER_FOREIGN_SERVER_DOESNT_EXIST = 1477 + ER_ILLEGAL_HA_CREATE_OPTION = 1478 + ER_PARTITION_REQUIRES_VALUES_ERROR = 1479 + ER_PARTITION_WRONG_VALUES_ERROR = 1480 + ER_PARTITION_MAXVALUE_ERROR = 1481 + ER_PARTITION_SUBPARTITION_ERROR = 1482 + ER_PARTITION_SUBPART_MIX_ERROR = 1483 + ER_PARTITION_WRONG_NO_PART_ERROR = 1484 + ER_PARTITION_WRONG_NO_SUBPART_ERROR = 1485 + ER_WRONG_EXPR_IN_PARTITION_FUNC_ERROR = 1486 + ER_NO_CONST_EXPR_IN_RANGE_OR_LIST_ERROR = 1487 + ER_FIELD_NOT_FOUND_PART_ERROR = 1488 + ER_LIST_OF_FIELDS_ONLY_IN_HASH_ERROR = 1489 + ER_INCONSISTENT_PARTITION_INFO_ERROR = 1490 + ER_PARTITION_FUNC_NOT_ALLOWED_ERROR = 1491 + ER_PARTITIONS_MUST_BE_DEFINED_ERROR = 1492 + ER_RANGE_NOT_INCREASING_ERROR = 1493 + ER_INCONSISTENT_TYPE_OF_FUNCTIONS_ERROR = 1494 + ER_MULTIPLE_DEF_CONST_IN_LIST_PART_ERROR = 1495 + ER_PARTITION_ENTRY_ERROR = 1496 + ER_MIX_HANDLER_ERROR = 1497 + ER_PARTITION_NOT_DEFINED_ERROR = 1498 + ER_TOO_MANY_PARTITIONS_ERROR = 1499 + ER_SUBPARTITION_ERROR = 1500 + ER_CANT_CREATE_HANDLER_FILE = 1501 + ER_BLOB_FIELD_IN_PART_FUNC_ERROR = 1502 + ER_UNIQUE_KEY_NEED_ALL_FIELDS_IN_PF = 1503 + ER_NO_PARTS_ERROR = 1504 + ER_PARTITION_MGMT_ON_NONPARTITIONED = 1505 + ER_FOREIGN_KEY_ON_PARTITIONED = 1506 + ER_DROP_PARTITION_NON_EXISTENT = 1507 + ER_DROP_LAST_PARTITION = 1508 + ER_COALESCE_ONLY_ON_HASH_PARTITION = 1509 + ER_REORG_HASH_ONLY_ON_SAME_NO = 1510 + ER_REORG_NO_PARAM_ERROR = 1511 + ER_ONLY_ON_RANGE_LIST_PARTITION = 1512 + ER_ADD_PARTITION_SUBPART_ERROR = 1513 + ER_ADD_PARTITION_NO_NEW_PARTITION = 1514 + ER_COALESCE_PARTITION_NO_PARTITION = 1515 + ER_REORG_PARTITION_NOT_EXIST = 1516 + ER_SAME_NAME_PARTITION = 1517 + ER_NO_BINLOG_ERROR = 1518 + ER_CONSECUTIVE_REORG_PARTITIONS = 1519 + ER_REORG_OUTSIDE_RANGE = 1520 + ER_PARTITION_FUNCTION_FAILURE = 1521 + ER_PART_STATE_ERROR = 1522 + ER_LIMITED_PART_RANGE = 1523 + ER_PLUGIN_IS_NOT_LOADED = 1524 + ER_WRONG_VALUE = 1525 + ER_NO_PARTITION_FOR_GIVEN_VALUE = 1526 + ER_FILEGROUP_OPTION_ONLY_ONCE = 1527 + ER_CREATE_FILEGROUP_FAILED = 1528 + ER_DROP_FILEGROUP_FAILED = 1529 + ER_TABLESPACE_AUTO_EXTEND_ERROR = 1530 + ER_WRONG_SIZE_NUMBER = 1531 + ER_SIZE_OVERFLOW_ERROR = 1532 + ER_ALTER_FILEGROUP_FAILED = 1533 + ER_BINLOG_ROW_LOGGING_FAILED = 1534 + ER_BINLOG_ROW_WRONG_TABLE_DEF = 1535 + ER_BINLOG_ROW_RBR_TO_SBR = 1536 + ER_EVENT_ALREADY_EXISTS = 1537 + ER_EVENT_STORE_FAILED = 1538 + ER_EVENT_DOES_NOT_EXIST = 1539 + ER_EVENT_CANT_ALTER = 1540 + ER_EVENT_DROP_FAILED = 1541 + ER_EVENT_INTERVAL_NOT_POSITIVE_OR_TOO_BIG = 1542 + ER_EVENT_ENDS_BEFORE_STARTS = 1543 + ER_EVENT_EXEC_TIME_IN_THE_PAST = 1544 + ER_EVENT_OPEN_TABLE_FAILED = 1545 + ER_EVENT_NEITHER_M_EXPR_NOR_M_AT = 1546 + ER_OBSOLETE_COL_COUNT_DOESNT_MATCH_CORRUPTED = 1547 + ER_OBSOLETE_CANNOT_LOAD_FROM_TABLE = 1548 + ER_EVENT_CANNOT_DELETE = 1549 + ER_EVENT_COMPILE_ERROR = 1550 + ER_EVENT_SAME_NAME = 1551 + ER_EVENT_DATA_TOO_LONG = 1552 + ER_DROP_INDEX_FK = 1553 + ER_WARN_DEPRECATED_SYNTAX_WITH_VER = 1554 + ER_CANT_WRITE_LOCK_LOG_TABLE = 1555 + ER_CANT_LOCK_LOG_TABLE = 1556 + ER_FOREIGN_DUPLICATE_KEY_OLD_UNUSED = 1557 + ER_COL_COUNT_DOESNT_MATCH_PLEASE_UPDATE = 1558 + ER_TEMP_TABLE_PREVENTS_SWITCH_OUT_OF_RBR = 1559 + ER_STORED_FUNCTION_PREVENTS_SWITCH_BINLOG_FORMAT = 1560 + ER_NDB_CANT_SWITCH_BINLOG_FORMAT = 1561 + ER_PARTITION_NO_TEMPORARY = 1562 + ER_PARTITION_CONST_DOMAIN_ERROR = 1563 + ER_PARTITION_FUNCTION_IS_NOT_ALLOWED = 1564 + ER_DDL_LOG_ERROR = 1565 + ER_NULL_IN_VALUES_LESS_THAN = 1566 + ER_WRONG_PARTITION_NAME = 1567 + ER_CANT_CHANGE_TX_CHARACTERISTICS = 1568 + ER_DUP_ENTRY_AUTOINCREMENT_CASE = 1569 + ER_EVENT_MODIFY_QUEUE_ERROR = 1570 + ER_EVENT_SET_VAR_ERROR = 1571 + ER_PARTITION_MERGE_ERROR = 1572 + ER_CANT_ACTIVATE_LOG = 1573 + ER_RBR_NOT_AVAILABLE = 1574 + ER_BASE64_DECODE_ERROR = 1575 + ER_EVENT_RECURSION_FORBIDDEN = 1576 + ER_EVENTS_DB_ERROR = 1577 + ER_ONLY_INTEGERS_ALLOWED = 1578 + ER_UNSUPORTED_LOG_ENGINE = 1579 + ER_BAD_LOG_STATEMENT = 1580 + ER_CANT_RENAME_LOG_TABLE = 1581 + ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT = 1582 + ER_WRONG_PARAMETERS_TO_NATIVE_FCT = 1583 + ER_WRONG_PARAMETERS_TO_STORED_FCT = 1584 + ER_NATIVE_FCT_NAME_COLLISION = 1585 + ER_DUP_ENTRY_WITH_KEY_NAME = 1586 + ER_BINLOG_PURGE_EMFILE = 1587 + ER_EVENT_CANNOT_CREATE_IN_THE_PAST = 1588 + ER_EVENT_CANNOT_ALTER_IN_THE_PAST = 1589 + ER_SLAVE_INCIDENT = 1590 + ER_NO_PARTITION_FOR_GIVEN_VALUE_SILENT = 1591 + ER_BINLOG_UNSAFE_STATEMENT = 1592 + ER_SLAVE_FATAL_ERROR = 1593 + ER_SLAVE_RELAY_LOG_READ_FAILURE = 1594 + ER_SLAVE_RELAY_LOG_WRITE_FAILURE = 1595 + ER_SLAVE_CREATE_EVENT_FAILURE = 1596 + ER_SLAVE_MASTER_COM_FAILURE = 1597 + ER_BINLOG_LOGGING_IMPOSSIBLE = 1598 + ER_VIEW_NO_CREATION_CTX = 1599 + ER_VIEW_INVALID_CREATION_CTX = 1600 + ER_SR_INVALID_CREATION_CTX = 1601 + ER_TRG_CORRUPTED_FILE = 1602 + ER_TRG_NO_CREATION_CTX = 1603 + ER_TRG_INVALID_CREATION_CTX = 1604 + ER_EVENT_INVALID_CREATION_CTX = 1605 + ER_TRG_CANT_OPEN_TABLE = 1606 + ER_CANT_CREATE_SROUTINE = 1607 + ER_NEVER_USED = 1608 + ER_NO_FORMAT_DESCRIPTION_EVENT_BEFORE_BINLOG_STATEMENT = 1609 + ER_SLAVE_CORRUPT_EVENT = 1610 + ER_LOAD_DATA_INVALID_COLUMN = 1611 + ER_LOG_PURGE_NO_FILE = 1612 + ER_XA_RBTIMEOUT = 1613 + ER_XA_RBDEADLOCK = 1614 + ER_NEED_REPREPARE = 1615 + ER_DELAYED_NOT_SUPPORTED = 1616 + WARN_NO_MASTER_INFO = 1617 + WARN_OPTION_IGNORED = 1618 + WARN_PLUGIN_DELETE_BUILTIN = 1619 + WARN_PLUGIN_BUSY = 1620 + ER_VARIABLE_IS_READONLY = 1621 + ER_WARN_ENGINE_TRANSACTION_ROLLBACK = 1622 + ER_SLAVE_HEARTBEAT_FAILURE = 1623 + ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE = 1624 + ER_NDB_REPLICATION_SCHEMA_ERROR = 1625 + ER_CONFLICT_FN_PARSE_ERROR = 1626 + ER_EXCEPTIONS_WRITE_ERROR = 1627 + ER_TOO_LONG_TABLE_COMMENT = 1628 + ER_TOO_LONG_FIELD_COMMENT = 1629 + ER_FUNC_INEXISTENT_NAME_COLLISION = 1630 + ER_DATABASE_NAME = 1631 + ER_TABLE_NAME = 1632 + ER_PARTITION_NAME = 1633 + ER_SUBPARTITION_NAME = 1634 + ER_TEMPORARY_NAME = 1635 + ER_RENAMED_NAME = 1636 + ER_TOO_MANY_CONCURRENT_TRXS = 1637 + WARN_NON_ASCII_SEPARATOR_NOT_IMPLEMENTED = 1638 + ER_DEBUG_SYNC_TIMEOUT = 1639 + ER_DEBUG_SYNC_HIT_LIMIT = 1640 + ER_DUP_SIGNAL_SET = 1641 + ER_SIGNAL_WARN = 1642 + ER_SIGNAL_NOT_FOUND = 1643 + ER_SIGNAL_EXCEPTION = 1644 + ER_RESIGNAL_WITHOUT_ACTIVE_HANDLER = 1645 + ER_SIGNAL_BAD_CONDITION_TYPE = 1646 + WARN_COND_ITEM_TRUNCATED = 1647 + ER_COND_ITEM_TOO_LONG = 1648 + ER_UNKNOWN_LOCALE = 1649 + ER_SLAVE_IGNORE_SERVER_IDS = 1650 + ER_QUERY_CACHE_DISABLED = 1651 + ER_SAME_NAME_PARTITION_FIELD = 1652 + ER_PARTITION_COLUMN_LIST_ERROR = 1653 + ER_WRONG_TYPE_COLUMN_VALUE_ERROR = 1654 + ER_TOO_MANY_PARTITION_FUNC_FIELDS_ERROR = 1655 + ER_MAXVALUE_IN_VALUES_IN = 1656 + ER_TOO_MANY_VALUES_ERROR = 1657 + ER_ROW_SINGLE_PARTITION_FIELD_ERROR = 1658 + ER_FIELD_TYPE_NOT_ALLOWED_AS_PARTITION_FIELD = 1659 + ER_PARTITION_FIELDS_TOO_LONG = 1660 + ER_BINLOG_ROW_ENGINE_AND_STMT_ENGINE = 1661 + ER_BINLOG_ROW_MODE_AND_STMT_ENGINE = 1662 + ER_BINLOG_UNSAFE_AND_STMT_ENGINE = 1663 + ER_BINLOG_ROW_INJECTION_AND_STMT_ENGINE = 1664 + ER_BINLOG_STMT_MODE_AND_ROW_ENGINE = 1665 + ER_BINLOG_ROW_INJECTION_AND_STMT_MODE = 1666 + ER_BINLOG_MULTIPLE_ENGINES_AND_SELF_LOGGING_ENGINE = 1667 + ER_BINLOG_UNSAFE_LIMIT = 1668 + ER_BINLOG_UNSAFE_INSERT_DELAYED = 1669 + ER_BINLOG_UNSAFE_SYSTEM_TABLE = 1670 + ER_BINLOG_UNSAFE_AUTOINC_COLUMNS = 1671 + ER_BINLOG_UNSAFE_UDF = 1672 + ER_BINLOG_UNSAFE_SYSTEM_VARIABLE = 1673 + ER_BINLOG_UNSAFE_SYSTEM_FUNCTION = 1674 + ER_BINLOG_UNSAFE_NONTRANS_AFTER_TRANS = 1675 + ER_MESSAGE_AND_STATEMENT = 1676 + ER_SLAVE_CONVERSION_FAILED = 1677 + ER_SLAVE_CANT_CREATE_CONVERSION = 1678 + ER_INSIDE_TRANSACTION_PREVENTS_SWITCH_BINLOG_FORMAT = 1679 + ER_PATH_LENGTH = 1680 + ER_WARN_DEPRECATED_SYNTAX_NO_REPLACEMENT = 1681 + ER_WRONG_NATIVE_TABLE_STRUCTURE = 1682 + ER_WRONG_PERFSCHEMA_USAGE = 1683 + ER_WARN_I_S_SKIPPED_TABLE = 1684 + ER_INSIDE_TRANSACTION_PREVENTS_SWITCH_BINLOG_DIRECT = 1685 + ER_STORED_FUNCTION_PREVENTS_SWITCH_BINLOG_DIRECT = 1686 + ER_SPATIAL_MUST_HAVE_GEOM_COL = 1687 + ER_TOO_LONG_INDEX_COMMENT = 1688 + ER_LOCK_ABORTED = 1689 + ER_DATA_OUT_OF_RANGE = 1690 + ER_WRONG_SPVAR_TYPE_IN_LIMIT = 1691 + ER_BINLOG_UNSAFE_MULTIPLE_ENGINES_AND_SELF_LOGGING_ENGINE = 1692 + ER_BINLOG_UNSAFE_MIXED_STATEMENT = 1693 + ER_INSIDE_TRANSACTION_PREVENTS_SWITCH_SQL_LOG_BIN = 1694 + ER_STORED_FUNCTION_PREVENTS_SWITCH_SQL_LOG_BIN = 1695 + ER_FAILED_READ_FROM_PAR_FILE = 1696 + ER_VALUES_IS_NOT_INT_TYPE_ERROR = 1697 + ER_ACCESS_DENIED_NO_PASSWORD_ERROR = 1698 + ER_SET_PASSWORD_AUTH_PLUGIN = 1699 + ER_GRANT_PLUGIN_USER_EXISTS = 1700 + ER_TRUNCATE_ILLEGAL_FK = 1701 + ER_PLUGIN_IS_PERMANENT = 1702 + ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE_MIN = 1703 + ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE_MAX = 1704 + ER_STMT_CACHE_FULL = 1705 + ER_MULTI_UPDATE_KEY_CONFLICT = 1706 + ER_TABLE_NEEDS_REBUILD = 1707 + WARN_OPTION_BELOW_LIMIT = 1708 + ER_INDEX_COLUMN_TOO_LONG = 1709 + ER_ERROR_IN_TRIGGER_BODY = 1710 + ER_ERROR_IN_UNKNOWN_TRIGGER_BODY = 1711 + ER_INDEX_CORRUPT = 1712 + ER_UNDO_RECORD_TOO_BIG = 1713 + ER_BINLOG_UNSAFE_INSERT_IGNORE_SELECT = 1714 + ER_BINLOG_UNSAFE_INSERT_SELECT_UPDATE = 1715 + ER_BINLOG_UNSAFE_REPLACE_SELECT = 1716 + ER_BINLOG_UNSAFE_CREATE_IGNORE_SELECT = 1717 + ER_BINLOG_UNSAFE_CREATE_REPLACE_SELECT = 1718 + ER_BINLOG_UNSAFE_UPDATE_IGNORE = 1719 + ER_PLUGIN_NO_UNINSTALL = 1720 + ER_PLUGIN_NO_INSTALL = 1721 + ER_BINLOG_UNSAFE_WRITE_AUTOINC_SELECT = 1722 + ER_BINLOG_UNSAFE_CREATE_SELECT_AUTOINC = 1723 + ER_BINLOG_UNSAFE_INSERT_TWO_KEYS = 1724 + ER_TABLE_IN_FK_CHECK = 1725 + ER_UNSUPPORTED_ENGINE = 1726 + ER_BINLOG_UNSAFE_AUTOINC_NOT_FIRST = 1727 + ER_CANNOT_LOAD_FROM_TABLE_V2 = 1728 + ER_MASTER_DELAY_VALUE_OUT_OF_RANGE = 1729 + ER_ONLY_FD_AND_RBR_EVENTS_ALLOWED_IN_BINLOG_STATEMENT = 1730 + ER_PARTITION_EXCHANGE_DIFFERENT_OPTION = 1731 + ER_PARTITION_EXCHANGE_PART_TABLE = 1732 + ER_PARTITION_EXCHANGE_TEMP_TABLE = 1733 + ER_PARTITION_INSTEAD_OF_SUBPARTITION = 1734 + ER_UNKNOWN_PARTITION = 1735 + ER_TABLES_DIFFERENT_METADATA = 1736 + ER_ROW_DOES_NOT_MATCH_PARTITION = 1737 + ER_BINLOG_CACHE_SIZE_GREATER_THAN_MAX = 1738 + ER_WARN_INDEX_NOT_APPLICABLE = 1739 + ER_PARTITION_EXCHANGE_FOREIGN_KEY = 1740 + ER_NO_SUCH_KEY_VALUE = 1741 + ER_RPL_INFO_DATA_TOO_LONG = 1742 + ER_NETWORK_READ_EVENT_CHECKSUM_FAILURE = 1743 + ER_BINLOG_READ_EVENT_CHECKSUM_FAILURE = 1744 + ER_BINLOG_STMT_CACHE_SIZE_GREATER_THAN_MAX = 1745 + ER_CANT_UPDATE_TABLE_IN_CREATE_TABLE_SELECT = 1746 + ER_PARTITION_CLAUSE_ON_NONPARTITIONED = 1747 + ER_ROW_DOES_NOT_MATCH_GIVEN_PARTITION_SET = 1748 + ER_NO_SUCH_PARTITION__UNUSED = 1749 + ER_CHANGE_RPL_INFO_REPOSITORY_FAILURE = 1750 + ER_WARNING_NOT_COMPLETE_ROLLBACK_WITH_CREATED_TEMP_TABLE = 1751 + ER_WARNING_NOT_COMPLETE_ROLLBACK_WITH_DROPPED_TEMP_TABLE = 1752 + ER_MTS_FEATURE_IS_NOT_SUPPORTED = 1753 + ER_MTS_UPDATED_DBS_GREATER_MAX = 1754 + ER_MTS_CANT_PARALLEL = 1755 + ER_MTS_INCONSISTENT_DATA = 1756 + ER_FULLTEXT_NOT_SUPPORTED_WITH_PARTITIONING = 1757 + ER_DA_INVALID_CONDITION_NUMBER = 1758 + ER_INSECURE_PLAIN_TEXT = 1759 + ER_INSECURE_CHANGE_MASTER = 1760 + ER_FOREIGN_DUPLICATE_KEY_WITH_CHILD_INFO = 1761 + ER_FOREIGN_DUPLICATE_KEY_WITHOUT_CHILD_INFO = 1762 + ER_SQLTHREAD_WITH_SECURE_SLAVE = 1763 + ER_TABLE_HAS_NO_FT = 1764 + ER_VARIABLE_NOT_SETTABLE_IN_SF_OR_TRIGGER = 1765 + ER_VARIABLE_NOT_SETTABLE_IN_TRANSACTION = 1766 + ER_GTID_NEXT_IS_NOT_IN_GTID_NEXT_LIST = 1767 + ER_CANT_CHANGE_GTID_NEXT_IN_TRANSACTION_WHEN_GTID_NEXT_LIST_IS_NULL = 1768 + ER_SET_STATEMENT_CANNOT_INVOKE_FUNCTION = 1769 + ER_GTID_NEXT_CANT_BE_AUTOMATIC_IF_GTID_NEXT_LIST_IS_NON_NULL = 1770 + ER_SKIPPING_LOGGED_TRANSACTION = 1771 + ER_MALFORMED_GTID_SET_SPECIFICATION = 1772 + ER_MALFORMED_GTID_SET_ENCODING = 1773 + ER_MALFORMED_GTID_SPECIFICATION = 1774 + ER_GNO_EXHAUSTED = 1775 + ER_BAD_SLAVE_AUTO_POSITION = 1776 + ER_AUTO_POSITION_REQUIRES_GTID_MODE_ON = 1777 + ER_CANT_DO_IMPLICIT_COMMIT_IN_TRX_WHEN_GTID_NEXT_IS_SET = 1778 + ER_GTID_MODE_2_OR_3_REQUIRES_ENFORCE_GTID_CONSISTENCY_ON = 1779 + ER_GTID_MODE_REQUIRES_BINLOG = 1780 + ER_CANT_SET_GTID_NEXT_TO_GTID_WHEN_GTID_MODE_IS_OFF = 1781 + ER_CANT_SET_GTID_NEXT_TO_ANONYMOUS_WHEN_GTID_MODE_IS_ON = 1782 + ER_CANT_SET_GTID_NEXT_LIST_TO_NON_NULL_WHEN_GTID_MODE_IS_OFF = 1783 + ER_FOUND_GTID_EVENT_WHEN_GTID_MODE_IS_OFF = 1784 + ER_GTID_UNSAFE_NON_TRANSACTIONAL_TABLE = 1785 + ER_GTID_UNSAFE_CREATE_SELECT = 1786 + ER_GTID_UNSAFE_CREATE_DROP_TEMPORARY_TABLE_IN_TRANSACTION = 1787 + ER_GTID_MODE_CAN_ONLY_CHANGE_ONE_STEP_AT_A_TIME = 1788 + ER_MASTER_HAS_PURGED_REQUIRED_GTIDS = 1789 + ER_CANT_SET_GTID_NEXT_WHEN_OWNING_GTID = 1790 + ER_UNKNOWN_EXPLAIN_FORMAT = 1791 + ER_CANT_EXECUTE_IN_READ_ONLY_TRANSACTION = 1792 + ER_TOO_LONG_TABLE_PARTITION_COMMENT = 1793 + ER_SLAVE_CONFIGURATION = 1794 + ER_INNODB_FT_LIMIT = 1795 + ER_INNODB_NO_FT_TEMP_TABLE = 1796 + ER_INNODB_FT_WRONG_DOCID_COLUMN = 1797 + ER_INNODB_FT_WRONG_DOCID_INDEX = 1798 + ER_INNODB_ONLINE_LOG_TOO_BIG = 1799 + ER_UNKNOWN_ALTER_ALGORITHM = 1800 + ER_UNKNOWN_ALTER_LOCK = 1801 + ER_MTS_CHANGE_MASTER_CANT_RUN_WITH_GAPS = 1802 + ER_MTS_RECOVERY_FAILURE = 1803 + ER_MTS_RESET_WORKERS = 1804 + ER_COL_COUNT_DOESNT_MATCH_CORRUPTED_V2 = 1805 + ER_SLAVE_SILENT_RETRY_TRANSACTION = 1806 + ER_DISCARD_FK_CHECKS_RUNNING = 1807 + ER_TABLE_SCHEMA_MISMATCH = 1808 + ER_TABLE_IN_SYSTEM_TABLESPACE = 1809 + ER_IO_READ_ERROR = 1810 + ER_IO_WRITE_ERROR = 1811 + ER_TABLESPACE_MISSING = 1812 + ER_TABLESPACE_EXISTS = 1813 + ER_TABLESPACE_DISCARDED = 1814 + ER_INTERNAL_ERROR = 1815 + ER_INNODB_IMPORT_ERROR = 1816 + ER_INNODB_INDEX_CORRUPT = 1817 + ER_INVALID_YEAR_COLUMN_LENGTH = 1818 + ER_NOT_VALID_PASSWORD = 1819 + ER_MUST_CHANGE_PASSWORD = 1820 + ER_FK_NO_INDEX_CHILD = 1821 + ER_FK_NO_INDEX_PARENT = 1822 + ER_FK_FAIL_ADD_SYSTEM = 1823 + ER_FK_CANNOT_OPEN_PARENT = 1824 + ER_FK_INCORRECT_OPTION = 1825 + ER_FK_DUP_NAME = 1826 + ER_PASSWORD_FORMAT = 1827 + ER_FK_COLUMN_CANNOT_DROP = 1828 + ER_FK_COLUMN_CANNOT_DROP_CHILD = 1829 + ER_FK_COLUMN_NOT_NULL = 1830 + ER_DUP_INDEX = 1831 + ER_FK_COLUMN_CANNOT_CHANGE = 1832 + ER_FK_COLUMN_CANNOT_CHANGE_CHILD = 1833 + ER_FK_CANNOT_DELETE_PARENT = 1834 + ER_MALFORMED_PACKET = 1835 + ER_READ_ONLY_MODE = 1836 + ER_GTID_NEXT_TYPE_UNDEFINED_GROUP = 1837 + ER_VARIABLE_NOT_SETTABLE_IN_SP = 1838 + ER_CANT_SET_GTID_PURGED_WHEN_GTID_MODE_IS_OFF = 1839 + ER_CANT_SET_GTID_PURGED_WHEN_GTID_EXECUTED_IS_NOT_EMPTY = 1840 + ER_CANT_SET_GTID_PURGED_WHEN_OWNED_GTIDS_IS_NOT_EMPTY = 1841 + ER_GTID_PURGED_WAS_CHANGED = 1842 + ER_GTID_EXECUTED_WAS_CHANGED = 1843 + ER_BINLOG_STMT_MODE_AND_NO_REPL_TABLES = 1844 + ER_ALTER_OPERATION_NOT_SUPPORTED = 1845 + ER_ALTER_OPERATION_NOT_SUPPORTED_REASON = 1846 + ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_COPY = 1847 + ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_PARTITION = 1848 + ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_FK_RENAME = 1849 + ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_COLUMN_TYPE = 1850 + ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_FK_CHECK = 1851 + ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_IGNORE = 1852 + ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_NOPK = 1853 + ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_AUTOINC = 1854 + ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_HIDDEN_FTS = 1855 + ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_CHANGE_FTS = 1856 + ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_FTS = 1857 + ER_SQL_SLAVE_SKIP_COUNTER_NOT_SETTABLE_IN_GTID_MODE = 1858 + ER_DUP_UNKNOWN_IN_INDEX = 1859 + ER_IDENT_CAUSES_TOO_LONG_PATH = 1860 + ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_NOT_NULL = 1861 + ER_MUST_CHANGE_PASSWORD_LOGIN = 1862 + ER_ROW_IN_WRONG_PARTITION = 1863 + ER_ERROR_LAST = 1863 +) diff --git a/mysql/errname.go b/mysql/errname.go new file mode 100644 index 0000000..7f8575a --- /dev/null +++ b/mysql/errname.go @@ -0,0 +1,868 @@ +package mysql + +var MySQLErrName = map[uint16]string{ + ER_HASHCHK: "hashchk", + ER_NISAMCHK: "isamchk", + ER_NO: "NO", + ER_YES: "YES", + ER_CANT_CREATE_FILE: "Can't create file '%-.200s' (errno: %d - %s)", + ER_CANT_CREATE_TABLE: "Can't create table '%-.200s' (errno: %d)", + ER_CANT_CREATE_DB: "Can't create database '%-.192s' (errno: %d)", + ER_DB_CREATE_EXISTS: "Can't create database '%-.192s'; database exists", + ER_DB_DROP_EXISTS: "Can't drop database '%-.192s'; database doesn't exist", + ER_DB_DROP_DELETE: "Error dropping database (can't delete '%-.192s', errno: %d)", + ER_DB_DROP_RMDIR: "Error dropping database (can't rmdir '%-.192s', errno: %d)", + ER_CANT_DELETE_FILE: "Error on delete of '%-.192s' (errno: %d - %s)", + ER_CANT_FIND_SYSTEM_REC: "Can't read record in system table", + ER_CANT_GET_STAT: "Can't get status of '%-.200s' (errno: %d - %s)", + ER_CANT_GET_WD: "Can't get working directory (errno: %d - %s)", + ER_CANT_LOCK: "Can't lock file (errno: %d - %s)", + ER_CANT_OPEN_FILE: "Can't open file: '%-.200s' (errno: %d - %s)", + ER_FILE_NOT_FOUND: "Can't find file: '%-.200s' (errno: %d - %s)", + ER_CANT_READ_DIR: "Can't read dir of '%-.192s' (errno: %d - %s)", + ER_CANT_SET_WD: "Can't change dir to '%-.192s' (errno: %d - %s)", + ER_CHECKREAD: "Record has changed since last read in table '%-.192s'", + ER_DISK_FULL: "Disk full (%s); waiting for someone to free some space... (errno: %d - %s)", + ER_DUP_KEY: "Can't write; duplicate key in table '%-.192s'", + ER_ERROR_ON_CLOSE: "Error on close of '%-.192s' (errno: %d - %s)", + ER_ERROR_ON_READ: "Error reading file '%-.200s' (errno: %d - %s)", + ER_ERROR_ON_RENAME: "Error on rename of '%-.210s' to '%-.210s' (errno: %d - %s)", + ER_ERROR_ON_WRITE: "Error writing file '%-.200s' (errno: %d - %s)", + ER_FILE_USED: "'%-.192s' is locked against change", + ER_FILSORT_ABORT: "Sort aborted", + ER_FORM_NOT_FOUND: "View '%-.192s' doesn't exist for '%-.192s'", + ER_GET_ERRNO: "Got error %d from storage engine", + ER_ILLEGAL_HA: "Table storage engine for '%-.192s' doesn't have this option", + ER_KEY_NOT_FOUND: "Can't find record in '%-.192s'", + ER_NOT_FORM_FILE: "Incorrect information in file: '%-.200s'", + ER_NOT_KEYFILE: "Incorrect key file for table '%-.200s'; try to repair it", + ER_OLD_KEYFILE: "Old key file for table '%-.192s'; repair it!", + ER_OPEN_AS_READONLY: "Table '%-.192s' is read only", + ER_OUTOFMEMORY: "Out of memory; restart server and try again (needed %d bytes)", + ER_OUT_OF_SORTMEMORY: "Out of sort memory, consider increasing server sort buffer size", + ER_UNEXPECTED_EOF: "Unexpected EOF found when reading file '%-.192s' (errno: %d - %s)", + ER_CON_COUNT_ERROR: "Too many connections", + ER_OUT_OF_RESOURCES: "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", + ER_BAD_HOST_ERROR: "Can't get hostname for your address", + ER_HANDSHAKE_ERROR: "Bad handshake", + ER_DBACCESS_DENIED_ERROR: "Access denied for user '%-.48s'@'%-.64s' to database '%-.192s'", + ER_ACCESS_DENIED_ERROR: "Access denied for user '%-.48s'@'%-.64s' (using password: %s)", + ER_NO_DB_ERROR: "No database selected", + ER_UNKNOWN_COM_ERROR: "Unknown command", + ER_BAD_NULL_ERROR: "Column '%-.192s' cannot be null", + ER_BAD_DB_ERROR: "Unknown database '%-.192s'", + ER_TABLE_EXISTS_ERROR: "Table '%-.192s' already exists", + ER_BAD_TABLE_ERROR: "Unknown table '%-.100s'", + ER_NON_UNIQ_ERROR: "Column '%-.192s' in %-.192s is ambiguous", + ER_SERVER_SHUTDOWN: "Server shutdown in progress", + ER_BAD_FIELD_ERROR: "Unknown column '%-.192s' in '%-.192s'", + ER_WRONG_FIELD_WITH_GROUP: "'%-.192s' isn't in GROUP BY", + ER_WRONG_GROUP_FIELD: "Can't group on '%-.192s'", + ER_WRONG_SUM_SELECT: "Statement has sum functions and columns in same statement", + ER_WRONG_VALUE_COUNT: "Column count doesn't match value count", + ER_TOO_LONG_IDENT: "Identifier name '%-.100s' is too long", + ER_DUP_FIELDNAME: "Duplicate column name '%-.192s'", + ER_DUP_KEYNAME: "Duplicate key name '%-.192s'", + ER_DUP_ENTRY: "Duplicate entry '%-.192s' for key %d", + ER_WRONG_FIELD_SPEC: "Incorrect column specifier for column '%-.192s'", + ER_PARSE_ERROR: "%s near '%-.80s' at line %d", + ER_EMPTY_QUERY: "Query was empty", + ER_NONUNIQ_TABLE: "Not unique table/alias: '%-.192s'", + ER_INVALID_DEFAULT: "Invalid default value for '%-.192s'", + ER_MULTIPLE_PRI_KEY: "Multiple primary key defined", + ER_TOO_MANY_KEYS: "Too many keys specified; max %d keys allowed", + ER_TOO_MANY_KEY_PARTS: "Too many key parts specified; max %d parts allowed", + ER_TOO_LONG_KEY: "Specified key was too long; max key length is %d bytes", + ER_KEY_COLUMN_DOES_NOT_EXITS: "Key column '%-.192s' doesn't exist in table", + ER_BLOB_USED_AS_KEY: "BLOB column '%-.192s' can't be used in key specification with the used table type", + ER_TOO_BIG_FIELDLENGTH: "Column length too big for column '%-.192s' (max = %lu); use BLOB or TEXT instead", + ER_WRONG_AUTO_KEY: "Incorrect table definition; there can be only one auto column and it must be defined as a key", + ER_READY: "%s: ready for connections.\nVersion: '%s' socket: '%s' port: %d", + ER_NORMAL_SHUTDOWN: "%s: Normal shutdown\n", + ER_GOT_SIGNAL: "%s: Got signal %d. Aborting!\n", + ER_SHUTDOWN_COMPLETE: "%s: Shutdown complete\n", + ER_FORCING_CLOSE: "%s: Forcing close of thread %ld user: '%-.48s'\n", + ER_IPSOCK_ERROR: "Can't create IP socket", + ER_NO_SUCH_INDEX: "Table '%-.192s' has no index like the one used in CREATE INDEX; recreate the table", + ER_WRONG_FIELD_TERMINATORS: "Field separator argument is not what is expected; check the manual", + ER_BLOBS_AND_NO_TERMINATED: "You can't use fixed rowlength with BLOBs; please use 'fields terminated by'", + ER_TEXTFILE_NOT_READABLE: "The file '%-.128s' must be in the database directory or be readable by all", + ER_FILE_EXISTS_ERROR: "File '%-.200s' already exists", + ER_LOAD_INFO: "Records: %ld Deleted: %ld Skipped: %ld Warnings: %ld", + ER_ALTER_INFO: "Records: %ld Duplicates: %ld", + ER_WRONG_SUB_KEY: "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", + ER_CANT_REMOVE_ALL_FIELDS: "You can't delete all columns with ALTER TABLE; use DROP TABLE instead", + ER_CANT_DROP_FIELD_OR_KEY: "Can't DROP '%-.192s'; check that column/key exists", + ER_INSERT_INFO: "Records: %ld Duplicates: %ld Warnings: %ld", + ER_UPDATE_TABLE_USED: "You can't specify target table '%-.192s' for update in FROM clause", + ER_NO_SUCH_THREAD: "Unknown thread id: %lu", + ER_KILL_DENIED_ERROR: "You are not owner of thread %lu", + ER_NO_TABLES_USED: "No tables used", + ER_TOO_BIG_SET: "Too many strings for column %-.192s and SET", + ER_NO_UNIQUE_LOGFILE: "Can't generate a unique log-filename %-.200s.(1-999)\n", + ER_TABLE_NOT_LOCKED_FOR_WRITE: "Table '%-.192s' was locked with a READ lock and can't be updated", + ER_TABLE_NOT_LOCKED: "Table '%-.192s' was not locked with LOCK TABLES", + ER_BLOB_CANT_HAVE_DEFAULT: "BLOB/TEXT column '%-.192s' can't have a default value", + ER_WRONG_DB_NAME: "Incorrect database name '%-.100s'", + ER_WRONG_TABLE_NAME: "Incorrect table name '%-.100s'", + ER_TOO_BIG_SELECT: "The SELECT would examine more than MAX_JOIN_SIZE rows; check your WHERE and use SET SQL_BIG_SELECTS=1 or SET MAX_JOIN_SIZE=# if the SELECT is okay", + ER_UNKNOWN_ERROR: "Unknown error", + ER_UNKNOWN_PROCEDURE: "Unknown procedure '%-.192s'", + ER_WRONG_PARAMCOUNT_TO_PROCEDURE: "Incorrect parameter count to procedure '%-.192s'", + ER_WRONG_PARAMETERS_TO_PROCEDURE: "Incorrect parameters to procedure '%-.192s'", + ER_UNKNOWN_TABLE: "Unknown table '%-.192s' in %-.32s", + ER_FIELD_SPECIFIED_TWICE: "Column '%-.192s' specified twice", + ER_INVALID_GROUP_FUNC_USE: "Invalid use of group function", + ER_UNSUPPORTED_EXTENSION: "Table '%-.192s' uses an extension that doesn't exist in this MySQL version", + ER_TABLE_MUST_HAVE_COLUMNS: "A table must have at least 1 column", + ER_RECORD_FILE_FULL: "The table '%-.192s' is full", + ER_UNKNOWN_CHARACTER_SET: "Unknown character set: '%-.64s'", + ER_TOO_MANY_TABLES: "Too many tables; MySQL can only use %d tables in a join", + ER_TOO_MANY_FIELDS: "Too many columns", + ER_TOO_BIG_ROWSIZE: "Row size too large. The maximum row size for the used table type, not counting BLOBs, is %ld. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs", + ER_STACK_OVERRUN: "Thread stack overrun: Used: %ld of a %ld stack. Use 'mysqld --thread_stack=#' to specify a bigger stack if needed", + ER_WRONG_OUTER_JOIN: "Cross dependency found in OUTER JOIN; examine your ON conditions", + ER_NULL_COLUMN_IN_INDEX: "Table handler doesn't support NULL in given index. Please change column '%-.192s' to be NOT NULL or use another handler", + ER_CANT_FIND_UDF: "Can't load function '%-.192s'", + ER_CANT_INITIALIZE_UDF: "Can't initialize function '%-.192s'; %-.80s", + ER_UDF_NO_PATHS: "No paths allowed for shared library", + ER_UDF_EXISTS: "Function '%-.192s' already exists", + ER_CANT_OPEN_LIBRARY: "Can't open shared library '%-.192s' (errno: %d %-.128s)", + ER_CANT_FIND_DL_ENTRY: "Can't find symbol '%-.128s' in library", + ER_FUNCTION_NOT_DEFINED: "Function '%-.192s' is not defined", + ER_HOST_IS_BLOCKED: "Host '%-.64s' is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts'", + ER_HOST_NOT_PRIVILEGED: "Host '%-.64s' is not allowed to connect to this MySQL server", + ER_PASSWORD_ANONYMOUS_USER: "You are using MySQL as an anonymous user and anonymous users are not allowed to change passwords", + ER_PASSWORD_NOT_ALLOWED: "You must have privileges to update tables in the mysql database to be able to change passwords for others", + ER_PASSWORD_NO_MATCH: "Can't find any matching row in the user table", + ER_UPDATE_INFO: "Rows matched: %ld Changed: %ld Warnings: %ld", + ER_CANT_CREATE_THREAD: "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", + ER_WRONG_VALUE_COUNT_ON_ROW: "Column count doesn't match value count at row %ld", + ER_CANT_REOPEN_TABLE: "Can't reopen table: '%-.192s'", + ER_INVALID_USE_OF_NULL: "Invalid use of NULL value", + ER_REGEXP_ERROR: "Got error '%-.64s' from regexp", + ER_MIX_OF_GROUP_FUNC_AND_FIELDS: "Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause", + ER_NONEXISTING_GRANT: "There is no such grant defined for user '%-.48s' on host '%-.64s'", + ER_TABLEACCESS_DENIED_ERROR: "%-.128s command denied to user '%-.48s'@'%-.64s' for table '%-.64s'", + ER_COLUMNACCESS_DENIED_ERROR: "%-.16s command denied to user '%-.48s'@'%-.64s' for column '%-.192s' in table '%-.192s'", + ER_ILLEGAL_GRANT_FOR_TABLE: "Illegal GRANT/REVOKE command; please consult the manual to see which privileges can be used", + ER_GRANT_WRONG_HOST_OR_USER: "The host or user argument to GRANT is too long", + ER_NO_SUCH_TABLE: "Table '%-.192s.%-.192s' doesn't exist", + ER_NONEXISTING_TABLE_GRANT: "There is no such grant defined for user '%-.48s' on host '%-.64s' on table '%-.192s'", + ER_NOT_ALLOWED_COMMAND: "The used command is not allowed with this MySQL version", + ER_SYNTAX_ERROR: "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use", + ER_DELAYED_CANT_CHANGE_LOCK: "Delayed insert thread couldn't get requested lock for table %-.192s", + ER_TOO_MANY_DELAYED_THREADS: "Too many delayed threads in use", + ER_ABORTING_CONNECTION: "Aborted connection %ld to db: '%-.192s' user: '%-.48s' (%-.64s)", + ER_NET_PACKET_TOO_LARGE: "Got a packet bigger than 'max_allowed_packet' bytes", + ER_NET_READ_ERROR_FROM_PIPE: "Got a read error from the connection pipe", + ER_NET_FCNTL_ERROR: "Got an error from fcntl()", + ER_NET_PACKETS_OUT_OF_ORDER: "Got packets out of order", + ER_NET_UNCOMPRESS_ERROR: "Couldn't uncompress communication packet", + ER_NET_READ_ERROR: "Got an error reading communication packets", + ER_NET_READ_INTERRUPTED: "Got timeout reading communication packets", + ER_NET_ERROR_ON_WRITE: "Got an error writing communication packets", + ER_NET_WRITE_INTERRUPTED: "Got timeout writing communication packets", + ER_TOO_LONG_STRING: "Result string is longer than 'max_allowed_packet' bytes", + ER_TABLE_CANT_HANDLE_BLOB: "The used table type doesn't support BLOB/TEXT columns", + ER_TABLE_CANT_HANDLE_AUTO_INCREMENT: "The used table type doesn't support AUTO_INCREMENT columns", + ER_DELAYED_INSERT_TABLE_LOCKED: "INSERT DELAYED can't be used with table '%-.192s' because it is locked with LOCK TABLES", + ER_WRONG_COLUMN_NAME: "Incorrect column name '%-.100s'", + ER_WRONG_KEY_COLUMN: "The used storage engine can't index column '%-.192s'", + ER_WRONG_MRG_TABLE: "Unable to open underlying table which is differently defined or of non-MyISAM type or doesn't exist", + ER_DUP_UNIQUE: "Can't write, because of unique constraint, to table '%-.192s'", + ER_BLOB_KEY_WITHOUT_LENGTH: "BLOB/TEXT column '%-.192s' used in key specification without a key length", + ER_PRIMARY_CANT_HAVE_NULL: "All parts of a PRIMARY KEY must be NOT NULL; if you need NULL in a key, use UNIQUE instead", + ER_TOO_MANY_ROWS: "Result consisted of more than one row", + ER_REQUIRES_PRIMARY_KEY: "This table type requires a primary key", + ER_NO_RAID_COMPILED: "This version of MySQL is not compiled with RAID support", + ER_UPDATE_WITHOUT_KEY_IN_SAFE_MODE: "You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column", + ER_KEY_DOES_NOT_EXITS: "Key '%-.192s' doesn't exist in table '%-.192s'", + ER_CHECK_NO_SUCH_TABLE: "Can't open table", + ER_CHECK_NOT_IMPLEMENTED: "The storage engine for the table doesn't support %s", + ER_CANT_DO_THIS_DURING_AN_TRANSACTION: "You are not allowed to execute this command in a transaction", + ER_ERROR_DURING_COMMIT: "Got error %d during COMMIT", + ER_ERROR_DURING_ROLLBACK: "Got error %d during ROLLBACK", + ER_ERROR_DURING_FLUSH_LOGS: "Got error %d during FLUSH_LOGS", + ER_ERROR_DURING_CHECKPOINT: "Got error %d during CHECKPOINT", + ER_NEW_ABORTING_CONNECTION: "Aborted connection %ld to db: '%-.192s' user: '%-.48s' host: '%-.64s' (%-.64s)", + ER_DUMP_NOT_IMPLEMENTED: "The storage engine for the table does not support binary table dump", + ER_FLUSH_MASTER_BINLOG_CLOSED: "Binlog closed, cannot RESET MASTER", + ER_INDEX_REBUILD: "Failed rebuilding the index of dumped table '%-.192s'", + ER_MASTER: "Error from master: '%-.64s'", + ER_MASTER_NET_READ: "Net error reading from master", + ER_MASTER_NET_WRITE: "Net error writing to master", + ER_FT_MATCHING_KEY_NOT_FOUND: "Can't find FULLTEXT index matching the column list", + ER_LOCK_OR_ACTIVE_TRANSACTION: "Can't execute the given command because you have active locked tables or an active transaction", + ER_UNKNOWN_SYSTEM_VARIABLE: "Unknown system variable '%-.64s'", + ER_CRASHED_ON_USAGE: "Table '%-.192s' is marked as crashed and should be repaired", + ER_CRASHED_ON_REPAIR: "Table '%-.192s' is marked as crashed and last (automatic?) repair failed", + ER_WARNING_NOT_COMPLETE_ROLLBACK: "Some non-transactional changed tables couldn't be rolled back", + ER_TRANS_CACHE_FULL: "Multi-statement transaction required more than 'max_binlog_cache_size' bytes of storage; increase this mysqld variable and try again", + ER_SLAVE_MUST_STOP: "This operation cannot be performed with a running slave; run STOP SLAVE first", + ER_SLAVE_NOT_RUNNING: "This operation requires a running slave; configure slave and do START SLAVE", + ER_BAD_SLAVE: "The server is not configured as slave; fix in config file or with CHANGE MASTER TO", + ER_MASTER_INFO: "Could not initialize master info structure; more error messages can be found in the MySQL error log", + ER_SLAVE_THREAD: "Could not create slave thread; check system resources", + ER_TOO_MANY_USER_CONNECTIONS: "User %-.64s already has more than 'max_user_connections' active connections", + ER_SET_CONSTANTS_ONLY: "You may only use constant expressions with SET", + ER_LOCK_WAIT_TIMEOUT: "Lock wait timeout exceeded; try restarting transaction", + ER_LOCK_TABLE_FULL: "The total number of locks exceeds the lock table size", + ER_READ_ONLY_TRANSACTION: "Update locks cannot be acquired during a READ UNCOMMITTED transaction", + ER_DROP_DB_WITH_READ_LOCK: "DROP DATABASE not allowed while thread is holding global read lock", + ER_CREATE_DB_WITH_READ_LOCK: "CREATE DATABASE not allowed while thread is holding global read lock", + ER_WRONG_ARGUMENTS: "Incorrect arguments to %s", + ER_NO_PERMISSION_TO_CREATE_USER: "'%-.48s'@'%-.64s' is not allowed to create new users", + ER_UNION_TABLES_IN_DIFFERENT_DIR: "Incorrect table definition; all MERGE tables must be in the same database", + ER_LOCK_DEADLOCK: "Deadlock found when trying to get lock; try restarting transaction", + ER_TABLE_CANT_HANDLE_FT: "The used table type doesn't support FULLTEXT indexes", + ER_CANNOT_ADD_FOREIGN: "Cannot add foreign key constraint", + ER_NO_REFERENCED_ROW: "Cannot add or update a child row: a foreign key constraint fails", + ER_ROW_IS_REFERENCED: "Cannot delete or update a parent row: a foreign key constraint fails", + ER_CONNECT_TO_MASTER: "Error connecting to master: %-.128s", + ER_QUERY_ON_MASTER: "Error running query on master: %-.128s", + ER_ERROR_WHEN_EXECUTING_COMMAND: "Error when executing command %s: %-.128s", + ER_WRONG_USAGE: "Incorrect usage of %s and %s", + ER_WRONG_NUMBER_OF_COLUMNS_IN_SELECT: "The used SELECT statements have a different number of columns", + ER_CANT_UPDATE_WITH_READLOCK: "Can't execute the query because you have a conflicting read lock", + ER_MIXING_NOT_ALLOWED: "Mixing of transactional and non-transactional tables is disabled", + ER_DUP_ARGUMENT: "Option '%s' used twice in statement", + ER_USER_LIMIT_REACHED: "User '%-.64s' has exceeded the '%s' resource (current value: %ld)", + ER_SPECIFIC_ACCESS_DENIED_ERROR: "Access denied; you need (at least one of) the %-.128s privilege(s) for this operation", + ER_LOCAL_VARIABLE: "Variable '%-.64s' is a SESSION variable and can't be used with SET GLOBAL", + ER_GLOBAL_VARIABLE: "Variable '%-.64s' is a GLOBAL variable and should be set with SET GLOBAL", + ER_NO_DEFAULT: "Variable '%-.64s' doesn't have a default value", + ER_WRONG_VALUE_FOR_VAR: "Variable '%-.64s' can't be set to the value of '%-.200s'", + ER_WRONG_TYPE_FOR_VAR: "Incorrect argument type to variable '%-.64s'", + ER_VAR_CANT_BE_READ: "Variable '%-.64s' can only be set, not read", + ER_CANT_USE_OPTION_HERE: "Incorrect usage/placement of '%s'", + ER_NOT_SUPPORTED_YET: "This version of MySQL doesn't yet support '%s'", + ER_MASTER_FATAL_ERROR_READING_BINLOG: "Got fatal error %d from master when reading data from binary log: '%-.320s'", + ER_SLAVE_IGNORED_TABLE: "Slave SQL thread ignored the query because of replicate-*-table rules", + ER_INCORRECT_GLOBAL_LOCAL_VAR: "Variable '%-.192s' is a %s variable", + ER_WRONG_FK_DEF: "Incorrect foreign key definition for '%-.192s': %s", + ER_KEY_REF_DO_NOT_MATCH_TABLE_REF: "Key reference and table reference don't match", + ER_OPERAND_COLUMNS: "Operand should contain %d column(s)", + ER_SUBQUERY_NO_1_ROW: "Subquery returns more than 1 row", + ER_UNKNOWN_STMT_HANDLER: "Unknown prepared statement handler (%.*s) given to %s", + ER_CORRUPT_HELP_DB: "Help database is corrupt or does not exist", + ER_CYCLIC_REFERENCE: "Cyclic reference on subqueries", + ER_AUTO_CONVERT: "Converting column '%s' from %s to %s", + ER_ILLEGAL_REFERENCE: "Reference '%-.64s' not supported (%s)", + ER_DERIVED_MUST_HAVE_ALIAS: "Every derived table must have its own alias", + ER_SELECT_REDUCED: "Select %u was reduced during optimization", + ER_TABLENAME_NOT_ALLOWED_HERE: "Table '%-.192s' from one of the SELECTs cannot be used in %-.32s", + ER_NOT_SUPPORTED_AUTH_MODE: "Client does not support authentication protocol requested by server; consider upgrading MySQL client", + ER_SPATIAL_CANT_HAVE_NULL: "All parts of a SPATIAL index must be NOT NULL", + ER_COLLATION_CHARSET_MISMATCH: "COLLATION '%s' is not valid for CHARACTER SET '%s'", + ER_SLAVE_WAS_RUNNING: "Slave is already running", + ER_SLAVE_WAS_NOT_RUNNING: "Slave already has been stopped", + ER_TOO_BIG_FOR_UNCOMPRESS: "Uncompressed data size too large; the maximum size is %d (probably, length of uncompressed data was corrupted)", + ER_ZLIB_Z_MEM_ERROR: "ZLIB: Not enough memory", + ER_ZLIB_Z_BUF_ERROR: "ZLIB: Not enough room in the output buffer (probably, length of uncompressed data was corrupted)", + ER_ZLIB_Z_DATA_ERROR: "ZLIB: Input data corrupted", + ER_CUT_VALUE_GROUP_CONCAT: "Row %u was cut by GROUP_CONCAT()", + ER_WARN_TOO_FEW_RECORDS: "Row %ld doesn't contain data for all columns", + ER_WARN_TOO_MANY_RECORDS: "Row %ld was truncated; it contained more data than there were input columns", + ER_WARN_NULL_TO_NOTNULL: "Column set to default value; NULL supplied to NOT NULL column '%s' at row %ld", + ER_WARN_DATA_OUT_OF_RANGE: "Out of range value for column '%s' at row %ld", + WARN_DATA_TRUNCATED: "Data truncated for column '%s' at row %ld", + ER_WARN_USING_OTHER_HANDLER: "Using storage engine %s for table '%s'", + ER_CANT_AGGREGATE_2COLLATIONS: "Illegal mix of collations (%s,%s) and (%s,%s) for operation '%s'", + ER_DROP_USER: "Cannot drop one or more of the requested users", + ER_REVOKE_GRANTS: "Can't revoke all privileges for one or more of the requested users", + ER_CANT_AGGREGATE_3COLLATIONS: "Illegal mix of collations (%s,%s), (%s,%s), (%s,%s) for operation '%s'", + ER_CANT_AGGREGATE_NCOLLATIONS: "Illegal mix of collations for operation '%s'", + ER_VARIABLE_IS_NOT_STRUCT: "Variable '%-.64s' is not a variable component (can't be used as XXXX.variable_name)", + ER_UNKNOWN_COLLATION: "Unknown collation: '%-.64s'", + ER_SLAVE_IGNORED_SSL_PARAMS: "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", + ER_SERVER_IS_IN_SECURE_AUTH_MODE: "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", + ER_WARN_FIELD_RESOLVED: "Field or reference '%-.192s%s%-.192s%s%-.192s' of SELECT #%d was resolved in SELECT #%d", + ER_BAD_SLAVE_UNTIL_COND: "Incorrect parameter or combination of parameters for START SLAVE UNTIL", + ER_MISSING_SKIP_SLAVE: "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", + ER_UNTIL_COND_IGNORED: "SQL thread is not to be started so UNTIL options are ignored", + ER_WRONG_NAME_FOR_INDEX: "Incorrect index name '%-.100s'", + ER_WRONG_NAME_FOR_CATALOG: "Incorrect catalog name '%-.100s'", + ER_WARN_QC_RESIZE: "Query cache failed to set size %lu; new query cache size is %lu", + ER_BAD_FT_COLUMN: "Column '%-.192s' cannot be part of FULLTEXT index", + ER_UNKNOWN_KEY_CACHE: "Unknown key cache '%-.100s'", + ER_WARN_HOSTNAME_WONT_WORK: "MySQL is started in --skip-name-resolve mode; you must restart it without this switch for this grant to work", + ER_UNKNOWN_STORAGE_ENGINE: "Unknown storage engine '%s'", + ER_WARN_DEPRECATED_SYNTAX: "'%s' is deprecated and will be removed in a future release. Please use %s instead", + ER_NON_UPDATABLE_TABLE: "The target table %-.100s of the %s is not updatable", + ER_FEATURE_DISABLED: "The '%s' feature is disabled; you need MySQL built with '%s' to have it working", + ER_OPTION_PREVENTS_STATEMENT: "The MySQL server is running with the %s option so it cannot execute this statement", + ER_DUPLICATED_VALUE_IN_TYPE: "Column '%-.100s' has duplicated value '%-.64s' in %s", + ER_TRUNCATED_WRONG_VALUE: "Truncated incorrect %-.32s value: '%-.128s'", + ER_TOO_MUCH_AUTO_TIMESTAMP_COLS: "Incorrect table definition; there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause", + ER_INVALID_ON_UPDATE: "Invalid ON UPDATE clause for '%-.192s' column", + ER_UNSUPPORTED_PS: "This command is not supported in the prepared statement protocol yet", + ER_GET_ERRMSG: "Got error %d '%-.100s' from %s", + ER_GET_TEMPORARY_ERRMSG: "Got temporary error %d '%-.100s' from %s", + ER_UNKNOWN_TIME_ZONE: "Unknown or incorrect time zone: '%-.64s'", + ER_WARN_INVALID_TIMESTAMP: "Invalid TIMESTAMP value in column '%s' at row %ld", + ER_INVALID_CHARACTER_STRING: "Invalid %s character string: '%.64s'", + ER_WARN_ALLOWED_PACKET_OVERFLOWED: "Result of %s() was larger than max_allowed_packet (%ld) - truncated", + ER_CONFLICTING_DECLARATIONS: "Conflicting declarations: '%s%s' and '%s%s'", + ER_SP_NO_RECURSIVE_CREATE: "Can't create a %s from within another stored routine", + ER_SP_ALREADY_EXISTS: "%s %s already exists", + ER_SP_DOES_NOT_EXIST: "%s %s does not exist", + ER_SP_DROP_FAILED: "Failed to DROP %s %s", + ER_SP_STORE_FAILED: "Failed to CREATE %s %s", + ER_SP_LILABEL_MISMATCH: "%s with no matching label: %s", + ER_SP_LABEL_REDEFINE: "Redefining label %s", + ER_SP_LABEL_MISMATCH: "End-label %s without match", + ER_SP_UNINIT_VAR: "Referring to uninitialized variable %s", + ER_SP_BADSELECT: "PROCEDURE %s can't return a result set in the given context", + ER_SP_BADRETURN: "RETURN is only allowed in a FUNCTION", + ER_SP_BADSTATEMENT: "%s is not allowed in stored procedures", + ER_UPDATE_LOG_DEPRECATED_IGNORED: "The update log is deprecated and replaced by the binary log; SET SQL_LOG_UPDATE has been ignored.", + ER_UPDATE_LOG_DEPRECATED_TRANSLATED: "The update log is deprecated and replaced by the binary log; SET SQL_LOG_UPDATE has been translated to SET SQL_LOG_BIN.", + ER_QUERY_INTERRUPTED: "Query execution was interrupted", + ER_SP_WRONG_NO_OF_ARGS: "Incorrect number of arguments for %s %s; expected %u, got %u", + ER_SP_COND_MISMATCH: "Undefined CONDITION: %s", + ER_SP_NORETURN: "No RETURN found in FUNCTION %s", + ER_SP_NORETURNEND: "FUNCTION %s ended without RETURN", + ER_SP_BAD_CURSOR_QUERY: "Cursor statement must be a SELECT", + ER_SP_BAD_CURSOR_SELECT: "Cursor SELECT must not have INTO", + ER_SP_CURSOR_MISMATCH: "Undefined CURSOR: %s", + ER_SP_CURSOR_ALREADY_OPEN: "Cursor is already open", + ER_SP_CURSOR_NOT_OPEN: "Cursor is not open", + ER_SP_UNDECLARED_VAR: "Undeclared variable: %s", + ER_SP_WRONG_NO_OF_FETCH_ARGS: "Incorrect number of FETCH variables", + ER_SP_FETCH_NO_DATA: "No data - zero rows fetched, selected, or processed", + ER_SP_DUP_PARAM: "Duplicate parameter: %s", + ER_SP_DUP_VAR: "Duplicate variable: %s", + ER_SP_DUP_COND: "Duplicate condition: %s", + ER_SP_DUP_CURS: "Duplicate cursor: %s", + ER_SP_CANT_ALTER: "Failed to ALTER %s %s", + ER_SP_SUBSELECT_NYI: "Subquery value not supported", + ER_STMT_NOT_ALLOWED_IN_SF_OR_TRG: "%s is not allowed in stored function or trigger", + ER_SP_VARCOND_AFTER_CURSHNDLR: "Variable or condition declaration after cursor or handler declaration", + ER_SP_CURSOR_AFTER_HANDLER: "Cursor declaration after handler declaration", + ER_SP_CASE_NOT_FOUND: "Case not found for CASE statement", + ER_FPARSER_TOO_BIG_FILE: "Configuration file '%-.192s' is too big", + ER_FPARSER_BAD_HEADER: "Malformed file type header in file '%-.192s'", + ER_FPARSER_EOF_IN_COMMENT: "Unexpected end of file while parsing comment '%-.200s'", + ER_FPARSER_ERROR_IN_PARAMETER: "Error while parsing parameter '%-.192s' (line: '%-.192s')", + ER_FPARSER_EOF_IN_UNKNOWN_PARAMETER: "Unexpected end of file while skipping unknown parameter '%-.192s'", + ER_VIEW_NO_EXPLAIN: "EXPLAIN/SHOW can not be issued; lacking privileges for underlying table", + ER_FRM_UNKNOWN_TYPE: "File '%-.192s' has unknown type '%-.64s' in its header", + ER_WRONG_OBJECT: "'%-.192s.%-.192s' is not %s", + ER_NONUPDATEABLE_COLUMN: "Column '%-.192s' is not updatable", + ER_VIEW_SELECT_DERIVED: "View's SELECT contains a subquery in the FROM clause", + ER_VIEW_SELECT_CLAUSE: "View's SELECT contains a '%s' clause", + ER_VIEW_SELECT_VARIABLE: "View's SELECT contains a variable or parameter", + ER_VIEW_SELECT_TMPTABLE: "View's SELECT refers to a temporary table '%-.192s'", + ER_VIEW_WRONG_LIST: "View's SELECT and view's field list have different column counts", + ER_WARN_VIEW_MERGE: "View merge algorithm can't be used here for now (assumed undefined algorithm)", + ER_WARN_VIEW_WITHOUT_KEY: "View being updated does not have complete key of underlying table in it", + ER_VIEW_INVALID: "View '%-.192s.%-.192s' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them", + ER_SP_NO_DROP_SP: "Can't drop or alter a %s from within another stored routine", + ER_SP_GOTO_IN_HNDLR: "GOTO is not allowed in a stored procedure handler", + ER_TRG_ALREADY_EXISTS: "Trigger already exists", + ER_TRG_DOES_NOT_EXIST: "Trigger does not exist", + ER_TRG_ON_VIEW_OR_TEMP_TABLE: "Trigger's '%-.192s' is view or temporary table", + ER_TRG_CANT_CHANGE_ROW: "Updating of %s row is not allowed in %strigger", + ER_TRG_NO_SUCH_ROW_IN_TRG: "There is no %s row in %s trigger", + ER_NO_DEFAULT_FOR_FIELD: "Field '%-.192s' doesn't have a default value", + ER_DIVISION_BY_ZERO: "Division by 0", + ER_TRUNCATED_WRONG_VALUE_FOR_FIELD: "Incorrect %-.32s value: '%-.128s' for column '%.192s' at row %ld", + ER_ILLEGAL_VALUE_FOR_TYPE: "Illegal %s '%-.192s' value found during parsing", + ER_VIEW_NONUPD_CHECK: "CHECK OPTION on non-updatable view '%-.192s.%-.192s'", + ER_VIEW_CHECK_FAILED: "CHECK OPTION failed '%-.192s.%-.192s'", + ER_PROCACCESS_DENIED_ERROR: "%-.16s command denied to user '%-.48s'@'%-.64s' for routine '%-.192s'", + ER_RELAY_LOG_FAIL: "Failed purging old relay logs: %s", + ER_PASSWD_LENGTH: "Password hash should be a %d-digit hexadecimal number", + ER_UNKNOWN_TARGET_BINLOG: "Target log not found in binlog index", + ER_IO_ERR_LOG_INDEX_READ: "I/O error reading log index file", + ER_BINLOG_PURGE_PROHIBITED: "Server configuration does not permit binlog purge", + ER_FSEEK_FAIL: "Failed on fseek()", + ER_BINLOG_PURGE_FATAL_ERR: "Fatal error during log purge", + ER_LOG_IN_USE: "A purgeable log is in use, will not purge", + ER_LOG_PURGE_UNKNOWN_ERR: "Unknown error during log purge", + ER_RELAY_LOG_INIT: "Failed initializing relay log position: %s", + ER_NO_BINARY_LOGGING: "You are not using binary logging", + ER_RESERVED_SYNTAX: "The '%-.64s' syntax is reserved for purposes internal to the MySQL server", + ER_WSAS_FAILED: "WSAStartup Failed", + ER_DIFF_GROUPS_PROC: "Can't handle procedures with different groups yet", + ER_NO_GROUP_FOR_PROC: "Select must have a group with this procedure", + ER_ORDER_WITH_PROC: "Can't use ORDER clause with this procedure", + ER_LOGGING_PROHIBIT_CHANGING_OF: "Binary logging and replication forbid changing the global server %s", + ER_NO_FILE_MAPPING: "Can't map file: %-.200s, errno: %d", + ER_WRONG_MAGIC: "Wrong magic in %-.64s", + ER_PS_MANY_PARAM: "Prepared statement contains too many placeholders", + ER_KEY_PART_0: "Key part '%-.192s' length cannot be 0", + ER_VIEW_CHECKSUM: "View text checksum failed", + ER_VIEW_MULTIUPDATE: "Can not modify more than one base table through a join view '%-.192s.%-.192s'", + ER_VIEW_NO_INSERT_FIELD_LIST: "Can not insert into join view '%-.192s.%-.192s' without fields list", + ER_VIEW_DELETE_MERGE_VIEW: "Can not delete from join view '%-.192s.%-.192s'", + ER_CANNOT_USER: "Operation %s failed for %.256s", + ER_XAER_NOTA: "XAER_NOTA: Unknown XID", + ER_XAER_INVAL: "XAER_INVAL: Invalid arguments (or unsupported command)", + ER_XAER_RMFAIL: "XAER_RMFAIL: The command cannot be executed when global transaction is in the %.64s state", + ER_XAER_OUTSIDE: "XAER_OUTSIDE: Some work is done outside global transaction", + ER_XAER_RMERR: "XAER_RMERR: Fatal error occurred in the transaction branch - check your data for consistency", + ER_XA_RBROLLBACK: "XA_RBROLLBACK: Transaction branch was rolled back", + ER_NONEXISTING_PROC_GRANT: "There is no such grant defined for user '%-.48s' on host '%-.64s' on routine '%-.192s'", + ER_PROC_AUTO_GRANT_FAIL: "Failed to grant EXECUTE and ALTER ROUTINE privileges", + ER_PROC_AUTO_REVOKE_FAIL: "Failed to revoke all privileges to dropped routine", + ER_DATA_TOO_LONG: "Data too long for column '%s' at row %ld", + ER_SP_BAD_SQLSTATE: "Bad SQLSTATE: '%s'", + ER_STARTUP: "%s: ready for connections.\nVersion: '%s' socket: '%s' port: %d %s", + ER_LOAD_FROM_FIXED_SIZE_ROWS_TO_VAR: "Can't load value from file with fixed size rows to variable", + ER_CANT_CREATE_USER_WITH_GRANT: "You are not allowed to create a user with GRANT", + ER_WRONG_VALUE_FOR_TYPE: "Incorrect %-.32s value: '%-.128s' for function %-.32s", + ER_TABLE_DEF_CHANGED: "Table definition has changed, please retry transaction", + ER_SP_DUP_HANDLER: "Duplicate handler declared in the same block", + ER_SP_NOT_VAR_ARG: "OUT or INOUT argument %d for routine %s is not a variable or NEW pseudo-variable in BEFORE trigger", + ER_SP_NO_RETSET: "Not allowed to return a result set from a %s", + ER_CANT_CREATE_GEOMETRY_OBJECT: "Cannot get geometry object from data you send to the GEOMETRY field", + ER_FAILED_ROUTINE_BREAK_BINLOG: "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", + ER_BINLOG_UNSAFE_ROUTINE: "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 log_bin_trust_function_creators variable)", + ER_BINLOG_CREATE_ROUTINE_NEED_SUPER: "You do not have the SUPER privilege and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable)", + ER_EXEC_STMT_WITH_OPEN_CURSOR: "You can't execute a prepared statement which has an open cursor associated with it. Reset the statement to re-execute it.", + ER_STMT_HAS_NO_OPEN_CURSOR: "The statement (%lu) has no open cursor.", + ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG: "Explicit or implicit commit is not allowed in stored function or trigger.", + ER_NO_DEFAULT_FOR_VIEW_FIELD: "Field of view '%-.192s.%-.192s' underlying table doesn't have a default value", + ER_SP_NO_RECURSION: "Recursive stored functions and triggers are not allowed.", + ER_TOO_BIG_SCALE: "Too big scale %d specified for column '%-.192s'. Maximum is %lu.", + ER_TOO_BIG_PRECISION: "Too big precision %d specified for column '%-.192s'. Maximum is %lu.", + ER_M_BIGGER_THAN_D: "For float(M,D), double(M,D) or decimal(M,D), M must be >= D (column '%-.192s').", + ER_WRONG_LOCK_OF_SYSTEM_TABLE: "You can't combine write-locking of system tables with other tables or lock types", + ER_CONNECT_TO_FOREIGN_DATA_SOURCE: "Unable to connect to foreign data source: %.64s", + ER_QUERY_ON_FOREIGN_DATA_SOURCE: "There was a problem processing the query on the foreign data source. Data source error: %-.64s", + ER_FOREIGN_DATA_SOURCE_DOESNT_EXIST: "The foreign data source you are trying to reference does not exist. Data source error: %-.64s", + ER_FOREIGN_DATA_STRING_INVALID_CANT_CREATE: "Can't create federated table. The data source connection string '%-.64s' is not in the correct format", + ER_FOREIGN_DATA_STRING_INVALID: "The data source connection string '%-.64s' is not in the correct format", + ER_CANT_CREATE_FEDERATED_TABLE: "Can't create federated table. Foreign data src error: %-.64s", + ER_TRG_IN_WRONG_SCHEMA: "Trigger in wrong schema", + ER_STACK_OVERRUN_NEED_MORE: "Thread stack overrun: %ld bytes used of a %ld byte stack, and %ld bytes needed. Use 'mysqld --thread_stack=#' to specify a bigger stack.", + ER_TOO_LONG_BODY: "Routine body for '%-.100s' is too long", + ER_WARN_CANT_DROP_DEFAULT_KEYCACHE: "Cannot drop default keycache", + ER_TOO_BIG_DISPLAYWIDTH: "Display width out of range for column '%-.192s' (max = %lu)", + ER_XAER_DUPID: "XAER_DUPID: The XID already exists", + ER_DATETIME_FUNCTION_OVERFLOW: "Datetime function: %-.32s field overflow", + ER_CANT_UPDATE_USED_TABLE_IN_SF_OR_TRG: "Can't update table '%-.192s' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.", + ER_VIEW_PREVENT_UPDATE: "The definition of table '%-.192s' prevents operation %.192s on table '%-.192s'.", + ER_PS_NO_RECURSION: "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", + ER_SP_CANT_SET_AUTOCOMMIT: "Not allowed to set autocommit from a stored function or trigger", + ER_MALFORMED_DEFINER: "Definer is not fully qualified", + ER_VIEW_FRM_NO_USER: "View '%-.192s'.'%-.192s' has no definer information (old table format). Current user is used as definer. Please recreate the view!", + ER_VIEW_OTHER_USER: "You need the SUPER privilege for creation view with '%-.192s'@'%-.192s' definer", + ER_NO_SUCH_USER: "The user specified as a definer ('%-.64s'@'%-.64s') does not exist", + ER_FORBID_SCHEMA_CHANGE: "Changing schema from '%-.192s' to '%-.192s' is not allowed.", + ER_ROW_IS_REFERENCED_2: "Cannot delete or update a parent row: a foreign key constraint fails (%.192s)", + ER_NO_REFERENCED_ROW_2: "Cannot add or update a child row: a foreign key constraint fails (%.192s)", + ER_SP_BAD_VAR_SHADOW: "Variable '%-.64s' must be quoted with `...`, or renamed", + ER_TRG_NO_DEFINER: "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.", + ER_OLD_FILE_FORMAT: "'%-.192s' has an old format, you should re-create the '%s' object(s)", + ER_SP_RECURSION_LIMIT: "Recursive limit %d (as set by the max_sp_recursion_depth variable) was exceeded for routine %.192s", + ER_SP_PROC_TABLE_CORRUPT: "Failed to load routine %-.192s. The table mysql.proc is missing, corrupt, or contains bad data (internal code %d)", + ER_SP_WRONG_NAME: "Incorrect routine name '%-.192s'", + ER_TABLE_NEEDS_UPGRADE: "Table upgrade required. Please do \"REPAIR TABLE `%-.32s`\" or dump/reload to fix it!", + ER_SP_NO_AGGREGATE: "AGGREGATE is not supported for stored functions", + ER_MAX_PREPARED_STMT_COUNT_REACHED: "Can't create more than max_prepared_stmt_count statements (current value: %lu)", + ER_VIEW_RECURSIVE: "`%-.192s`.`%-.192s` contains view recursion", + ER_NON_GROUPING_FIELD_USED: "Non-grouping field '%-.192s' is used in %-.64s clause", + ER_TABLE_CANT_HANDLE_SPKEYS: "The used table type doesn't support SPATIAL indexes", + ER_NO_TRIGGERS_ON_SYSTEM_SCHEMA: "Triggers can not be created on system tables", + ER_REMOVED_SPACES: "Leading spaces are removed from name '%s'", + ER_AUTOINC_READ_FAILED: "Failed to read auto-increment value from storage engine", + ER_USERNAME: "user name", + ER_HOSTNAME: "host name", + ER_WRONG_STRING_LENGTH: "String '%-.70s' is too long for %s (should be no longer than %d)", + ER_NON_INSERTABLE_TABLE: "The target table %-.100s of the %s is not insertable-into", + ER_ADMIN_WRONG_MRG_TABLE: "Table '%-.64s' is differently defined or of non-MyISAM type or doesn't exist", + ER_TOO_HIGH_LEVEL_OF_NESTING_FOR_SELECT: "Too high level of nesting for select", + ER_NAME_BECOMES_EMPTY: "Name '%-.64s' has become ''", + ER_AMBIGUOUS_FIELD_TERM: "First character of the FIELDS TERMINATED string is ambiguous; please use non-optional and non-empty FIELDS ENCLOSED BY", + ER_FOREIGN_SERVER_EXISTS: "The foreign server, %s, you are trying to create already exists.", + ER_FOREIGN_SERVER_DOESNT_EXIST: "The foreign server name you are trying to reference does not exist. Data source error: %-.64s", + ER_ILLEGAL_HA_CREATE_OPTION: "Table storage engine '%-.64s' does not support the create option '%.64s'", + ER_PARTITION_REQUIRES_VALUES_ERROR: "Syntax error: %-.64s PARTITIONING requires definition of VALUES %-.64s for each partition", + ER_PARTITION_WRONG_VALUES_ERROR: "Only %-.64s PARTITIONING can use VALUES %-.64s in partition definition", + ER_PARTITION_MAXVALUE_ERROR: "MAXVALUE can only be used in last partition definition", + ER_PARTITION_SUBPARTITION_ERROR: "Subpartitions can only be hash partitions and by key", + ER_PARTITION_SUBPART_MIX_ERROR: "Must define subpartitions on all partitions if on one partition", + ER_PARTITION_WRONG_NO_PART_ERROR: "Wrong number of partitions defined, mismatch with previous setting", + ER_PARTITION_WRONG_NO_SUBPART_ERROR: "Wrong number of subpartitions defined, mismatch with previous setting", + ER_WRONG_EXPR_IN_PARTITION_FUNC_ERROR: "Constant, random or timezone-dependent expressions in (sub)partitioning function are not allowed", + ER_NO_CONST_EXPR_IN_RANGE_OR_LIST_ERROR: "Expression in RANGE/LIST VALUES must be constant", + ER_FIELD_NOT_FOUND_PART_ERROR: "Field in list of fields for partition function not found in table", + ER_LIST_OF_FIELDS_ONLY_IN_HASH_ERROR: "List of fields is only allowed in KEY partitions", + ER_INCONSISTENT_PARTITION_INFO_ERROR: "The partition info in the frm file is not consistent with what can be written into the frm file", + ER_PARTITION_FUNC_NOT_ALLOWED_ERROR: "The %-.192s function returns the wrong type", + ER_PARTITIONS_MUST_BE_DEFINED_ERROR: "For %-.64s partitions each partition must be defined", + ER_RANGE_NOT_INCREASING_ERROR: "VALUES LESS THAN value must be strictly increasing for each partition", + ER_INCONSISTENT_TYPE_OF_FUNCTIONS_ERROR: "VALUES value must be of same type as partition function", + ER_MULTIPLE_DEF_CONST_IN_LIST_PART_ERROR: "Multiple definition of same constant in list partitioning", + ER_PARTITION_ENTRY_ERROR: "Partitioning can not be used stand-alone in query", + ER_MIX_HANDLER_ERROR: "The mix of handlers in the partitions is not allowed in this version of MySQL", + ER_PARTITION_NOT_DEFINED_ERROR: "For the partitioned engine it is necessary to define all %-.64s", + ER_TOO_MANY_PARTITIONS_ERROR: "Too many partitions (including subpartitions) were defined", + ER_SUBPARTITION_ERROR: "It is only possible to mix RANGE/LIST partitioning with HASH/KEY partitioning for subpartitioning", + ER_CANT_CREATE_HANDLER_FILE: "Failed to create specific handler file", + ER_BLOB_FIELD_IN_PART_FUNC_ERROR: "A BLOB field is not allowed in partition function", + ER_UNIQUE_KEY_NEED_ALL_FIELDS_IN_PF: "A %-.192s must include all columns in the table's partitioning function", + ER_NO_PARTS_ERROR: "Number of %-.64s = 0 is not an allowed value", + ER_PARTITION_MGMT_ON_NONPARTITIONED: "Partition management on a not partitioned table is not possible", + ER_FOREIGN_KEY_ON_PARTITIONED: "Foreign key clause is not yet supported in conjunction with partitioning", + ER_DROP_PARTITION_NON_EXISTENT: "Error in list of partitions to %-.64s", + ER_DROP_LAST_PARTITION: "Cannot remove all partitions, use DROP TABLE instead", + ER_COALESCE_ONLY_ON_HASH_PARTITION: "COALESCE PARTITION can only be used on HASH/KEY partitions", + ER_REORG_HASH_ONLY_ON_SAME_NO: "REORGANIZE PARTITION can only be used to reorganize partitions not to change their numbers", + ER_REORG_NO_PARAM_ERROR: "REORGANIZE PARTITION without parameters can only be used on auto-partitioned tables using HASH PARTITIONs", + ER_ONLY_ON_RANGE_LIST_PARTITION: "%-.64s PARTITION can only be used on RANGE/LIST partitions", + ER_ADD_PARTITION_SUBPART_ERROR: "Trying to Add partition(s) with wrong number of subpartitions", + ER_ADD_PARTITION_NO_NEW_PARTITION: "At least one partition must be added", + ER_COALESCE_PARTITION_NO_PARTITION: "At least one partition must be coalesced", + ER_REORG_PARTITION_NOT_EXIST: "More partitions to reorganize than there are partitions", + ER_SAME_NAME_PARTITION: "Duplicate partition name %-.192s", + ER_NO_BINLOG_ERROR: "It is not allowed to shut off binlog on this command", + ER_CONSECUTIVE_REORG_PARTITIONS: "When reorganizing a set of partitions they must be in consecutive order", + ER_REORG_OUTSIDE_RANGE: "Reorganize of range partitions cannot change total ranges except for last partition where it can extend the range", + ER_PARTITION_FUNCTION_FAILURE: "Partition function not supported in this version for this handler", + ER_PART_STATE_ERROR: "Partition state cannot be defined from CREATE/ALTER TABLE", + ER_LIMITED_PART_RANGE: "The %-.64s handler only supports 32 bit integers in VALUES", + ER_PLUGIN_IS_NOT_LOADED: "Plugin '%-.192s' is not loaded", + ER_WRONG_VALUE: "Incorrect %-.32s value: '%-.128s'", + ER_NO_PARTITION_FOR_GIVEN_VALUE: "Table has no partition for value %-.64s", + ER_FILEGROUP_OPTION_ONLY_ONCE: "It is not allowed to specify %s more than once", + ER_CREATE_FILEGROUP_FAILED: "Failed to create %s", + ER_DROP_FILEGROUP_FAILED: "Failed to drop %s", + ER_TABLESPACE_AUTO_EXTEND_ERROR: "The handler doesn't support autoextend of tablespaces", + ER_WRONG_SIZE_NUMBER: "A size parameter was incorrectly specified, either number or on the form 10M", + ER_SIZE_OVERFLOW_ERROR: "The size number was correct but we don't allow the digit part to be more than 2 billion", + ER_ALTER_FILEGROUP_FAILED: "Failed to alter: %s", + ER_BINLOG_ROW_LOGGING_FAILED: "Writing one row to the row-based binary log failed", + ER_BINLOG_ROW_WRONG_TABLE_DEF: "Table definition on master and slave does not match: %s", + ER_BINLOG_ROW_RBR_TO_SBR: "Slave running with --log-slave-updates must use row-based binary logging to be able to replicate row-based binary log events", + ER_EVENT_ALREADY_EXISTS: "Event '%-.192s' already exists", + ER_EVENT_STORE_FAILED: "Failed to store event %s. Error code %d from storage engine.", + ER_EVENT_DOES_NOT_EXIST: "Unknown event '%-.192s'", + ER_EVENT_CANT_ALTER: "Failed to alter event '%-.192s'", + ER_EVENT_DROP_FAILED: "Failed to drop %s", + ER_EVENT_INTERVAL_NOT_POSITIVE_OR_TOO_BIG: "INTERVAL is either not positive or too big", + ER_EVENT_ENDS_BEFORE_STARTS: "ENDS is either invalid or before STARTS", + ER_EVENT_EXEC_TIME_IN_THE_PAST: "Event execution time is in the past. Event has been disabled", + ER_EVENT_OPEN_TABLE_FAILED: "Failed to open mysql.event", + ER_EVENT_NEITHER_M_EXPR_NOR_M_AT: "No datetime expression provided", + ER_OBSOLETE_COL_COUNT_DOESNT_MATCH_CORRUPTED: "Column count of mysql.%s is wrong. Expected %d, found %d. The table is probably corrupted", + ER_OBSOLETE_CANNOT_LOAD_FROM_TABLE: "Cannot load from mysql.%s. The table is probably corrupted", + ER_EVENT_CANNOT_DELETE: "Failed to delete the event from mysql.event", + ER_EVENT_COMPILE_ERROR: "Error during compilation of event's body", + ER_EVENT_SAME_NAME: "Same old and new event name", + ER_EVENT_DATA_TOO_LONG: "Data for column '%s' too long", + ER_DROP_INDEX_FK: "Cannot drop index '%-.192s': needed in a foreign key constraint", + ER_WARN_DEPRECATED_SYNTAX_WITH_VER: "The syntax '%s' is deprecated and will be removed in MySQL %s. Please use %s instead", + ER_CANT_WRITE_LOCK_LOG_TABLE: "You can't write-lock a log table. Only read access is possible", + ER_CANT_LOCK_LOG_TABLE: "You can't use locks with log tables.", + ER_FOREIGN_DUPLICATE_KEY_OLD_UNUSED: "Upholding foreign key constraints for table '%.192s', entry '%-.192s', key %d would lead to a duplicate entry", + ER_COL_COUNT_DOESNT_MATCH_PLEASE_UPDATE: "Column count of mysql.%s is wrong. Expected %d, found %d. Created with MySQL %d, now running %d. Please use mysql_upgrade to fix this error.", + ER_TEMP_TABLE_PREVENTS_SWITCH_OUT_OF_RBR: "Cannot switch out of the row-based binary log format when the session has open temporary tables", + ER_STORED_FUNCTION_PREVENTS_SWITCH_BINLOG_FORMAT: "Cannot change the binary logging format inside a stored function or trigger", + ER_NDB_CANT_SWITCH_BINLOG_FORMAT: "The NDB cluster engine does not support changing the binlog format on the fly yet", + ER_PARTITION_NO_TEMPORARY: "Cannot create temporary table with partitions", + ER_PARTITION_CONST_DOMAIN_ERROR: "Partition constant is out of partition function domain", + ER_PARTITION_FUNCTION_IS_NOT_ALLOWED: "This partition function is not allowed", + ER_DDL_LOG_ERROR: "Error in DDL log", + ER_NULL_IN_VALUES_LESS_THAN: "Not allowed to use NULL value in VALUES LESS THAN", + ER_WRONG_PARTITION_NAME: "Incorrect partition name", + ER_CANT_CHANGE_TX_CHARACTERISTICS: "Transaction characteristics can't be changed while a transaction is in progress", + ER_DUP_ENTRY_AUTOINCREMENT_CASE: "ALTER TABLE causes auto_increment resequencing, resulting in duplicate entry '%-.192s' for key '%-.192s'", + ER_EVENT_MODIFY_QUEUE_ERROR: "Internal scheduler error %d", + ER_EVENT_SET_VAR_ERROR: "Error during starting/stopping of the scheduler. Error code %u", + ER_PARTITION_MERGE_ERROR: "Engine cannot be used in partitioned tables", + ER_CANT_ACTIVATE_LOG: "Cannot activate '%-.64s' log", + ER_RBR_NOT_AVAILABLE: "The server was not built with row-based replication", + ER_BASE64_DECODE_ERROR: "Decoding of base64 string failed", + ER_EVENT_RECURSION_FORBIDDEN: "Recursion of EVENT DDL statements is forbidden when body is present", + ER_EVENTS_DB_ERROR: "Cannot proceed because system tables used by Event Scheduler were found damaged at server start", + ER_ONLY_INTEGERS_ALLOWED: "Only integers allowed as number here", + ER_UNSUPORTED_LOG_ENGINE: "This storage engine cannot be used for log tables\"", + ER_BAD_LOG_STATEMENT: "You cannot '%s' a log table if logging is enabled", + ER_CANT_RENAME_LOG_TABLE: "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'", + ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT: "Incorrect parameter count in the call to native function '%-.192s'", + ER_WRONG_PARAMETERS_TO_NATIVE_FCT: "Incorrect parameters in the call to native function '%-.192s'", + ER_WRONG_PARAMETERS_TO_STORED_FCT: "Incorrect parameters in the call to stored function '%-.192s'", + ER_NATIVE_FCT_NAME_COLLISION: "This function '%-.192s' has the same name as a native function", + ER_DUP_ENTRY_WITH_KEY_NAME: "Duplicate entry '%-.64s' for key '%-.192s'", + ER_BINLOG_PURGE_EMFILE: "Too many files opened, please execute the command again", + ER_EVENT_CANNOT_CREATE_IN_THE_PAST: "Event execution time is in the past and ON COMPLETION NOT PRESERVE is set. The event was dropped immediately after creation.", + ER_EVENT_CANNOT_ALTER_IN_THE_PAST: "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.", + ER_SLAVE_INCIDENT: "The incident %s occured on the master. Message: %-.64s", + ER_NO_PARTITION_FOR_GIVEN_VALUE_SILENT: "Table has no partition for some existing values", + ER_BINLOG_UNSAFE_STATEMENT: "Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. %s", + ER_SLAVE_FATAL_ERROR: "Fatal error: %s", + ER_SLAVE_RELAY_LOG_READ_FAILURE: "Relay log read failure: %s", + ER_SLAVE_RELAY_LOG_WRITE_FAILURE: "Relay log write failure: %s", + ER_SLAVE_CREATE_EVENT_FAILURE: "Failed to create %s", + ER_SLAVE_MASTER_COM_FAILURE: "Master command %s failed: %s", + ER_BINLOG_LOGGING_IMPOSSIBLE: "Binary logging not possible. Message: %s", + ER_VIEW_NO_CREATION_CTX: "View `%-.64s`.`%-.64s` has no creation context", + ER_VIEW_INVALID_CREATION_CTX: "Creation context of view `%-.64s`.`%-.64s' is invalid", + ER_SR_INVALID_CREATION_CTX: "Creation context of stored routine `%-.64s`.`%-.64s` is invalid", + ER_TRG_CORRUPTED_FILE: "Corrupted TRG file for table `%-.64s`.`%-.64s`", + ER_TRG_NO_CREATION_CTX: "Triggers for table `%-.64s`.`%-.64s` have no creation context", + ER_TRG_INVALID_CREATION_CTX: "Trigger creation context of table `%-.64s`.`%-.64s` is invalid", + ER_EVENT_INVALID_CREATION_CTX: "Creation context of event `%-.64s`.`%-.64s` is invalid", + ER_TRG_CANT_OPEN_TABLE: "Cannot open table for trigger `%-.64s`.`%-.64s`", + ER_CANT_CREATE_SROUTINE: "Cannot create stored routine `%-.64s`. Check warnings", + ER_NEVER_USED: "Ambiguous slave modes combination. %s", + ER_NO_FORMAT_DESCRIPTION_EVENT_BEFORE_BINLOG_STATEMENT: "The BINLOG statement of type `%s` was not preceded by a format description BINLOG statement.", + ER_SLAVE_CORRUPT_EVENT: "Corrupted replication event was detected", + ER_LOAD_DATA_INVALID_COLUMN: "Invalid column reference (%-.64s) in LOAD DATA", + ER_LOG_PURGE_NO_FILE: "Being purged log %s was not found", + ER_XA_RBTIMEOUT: "XA_RBTIMEOUT: Transaction branch was rolled back: took too long", + ER_XA_RBDEADLOCK: "XA_RBDEADLOCK: Transaction branch was rolled back: deadlock was detected", + ER_NEED_REPREPARE: "Prepared statement needs to be re-prepared", + ER_DELAYED_NOT_SUPPORTED: "DELAYED option not supported for table '%-.192s'", + WARN_NO_MASTER_INFO: "The master info structure does not exist", + WARN_OPTION_IGNORED: "<%-.64s> option ignored", + WARN_PLUGIN_DELETE_BUILTIN: "Built-in plugins cannot be deleted", + WARN_PLUGIN_BUSY: "Plugin is busy and will be uninstalled on shutdown", + ER_VARIABLE_IS_READONLY: "%s variable '%s' is read-only. Use SET %s to assign the value", + ER_WARN_ENGINE_TRANSACTION_ROLLBACK: "Storage engine %s does not support rollback for this statement. Transaction rolled back and must be restarted", + ER_SLAVE_HEARTBEAT_FAILURE: "Unexpected master's heartbeat data: %s", + ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE: "The requested value for the heartbeat period is either negative or exceeds the maximum allowed (%s seconds).", + ER_NDB_REPLICATION_SCHEMA_ERROR: "Bad schema for mysql.ndb_replication table. Message: %-.64s", + ER_CONFLICT_FN_PARSE_ERROR: "Error in parsing conflict function. Message: %-.64s", + ER_EXCEPTIONS_WRITE_ERROR: "Write to exceptions table failed. Message: %-.128s\"", + ER_TOO_LONG_TABLE_COMMENT: "Comment for table '%-.64s' is too long (max = %lu)", + ER_TOO_LONG_FIELD_COMMENT: "Comment for field '%-.64s' is too long (max = %lu)", + ER_FUNC_INEXISTENT_NAME_COLLISION: "FUNCTION %s does not exist. Check the 'Function Name Parsing and Resolution' section in the Reference Manual", + ER_DATABASE_NAME: "Database", + ER_TABLE_NAME: "Table", + ER_PARTITION_NAME: "Partition", + ER_SUBPARTITION_NAME: "Subpartition", + ER_TEMPORARY_NAME: "Temporary", + ER_RENAMED_NAME: "Renamed", + ER_TOO_MANY_CONCURRENT_TRXS: "Too many active concurrent transactions", + WARN_NON_ASCII_SEPARATOR_NOT_IMPLEMENTED: "Non-ASCII separator arguments are not fully supported", + ER_DEBUG_SYNC_TIMEOUT: "debug sync point wait timed out", + ER_DEBUG_SYNC_HIT_LIMIT: "debug sync point hit limit reached", + ER_DUP_SIGNAL_SET: "Duplicate condition information item '%s'", + ER_SIGNAL_WARN: "Unhandled user-defined warning condition", + ER_SIGNAL_NOT_FOUND: "Unhandled user-defined not found condition", + ER_SIGNAL_EXCEPTION: "Unhandled user-defined exception condition", + ER_RESIGNAL_WITHOUT_ACTIVE_HANDLER: "RESIGNAL when handler not active", + ER_SIGNAL_BAD_CONDITION_TYPE: "SIGNAL/RESIGNAL can only use a CONDITION defined with SQLSTATE", + WARN_COND_ITEM_TRUNCATED: "Data truncated for condition item '%s'", + ER_COND_ITEM_TOO_LONG: "Data too long for condition item '%s'", + ER_UNKNOWN_LOCALE: "Unknown locale: '%-.64s'", + ER_SLAVE_IGNORE_SERVER_IDS: "The requested server id %d clashes with the slave startup option --replicate-same-server-id", + ER_QUERY_CACHE_DISABLED: "Query cache is disabled; restart the server with query_cache_type=1 to enable it", + ER_SAME_NAME_PARTITION_FIELD: "Duplicate partition field name '%-.192s'", + ER_PARTITION_COLUMN_LIST_ERROR: "Inconsistency in usage of column lists for partitioning", + ER_WRONG_TYPE_COLUMN_VALUE_ERROR: "Partition column values of incorrect type", + ER_TOO_MANY_PARTITION_FUNC_FIELDS_ERROR: "Too many fields in '%-.192s'", + ER_MAXVALUE_IN_VALUES_IN: "Cannot use MAXVALUE as value in VALUES IN", + ER_TOO_MANY_VALUES_ERROR: "Cannot have more than one value for this type of %-.64s partitioning", + ER_ROW_SINGLE_PARTITION_FIELD_ERROR: "Row expressions in VALUES IN only allowed for multi-field column partitioning", + ER_FIELD_TYPE_NOT_ALLOWED_AS_PARTITION_FIELD: "Field '%-.192s' is of a not allowed type for this type of partitioning", + ER_PARTITION_FIELDS_TOO_LONG: "The total length of the partitioning fields is too large", + ER_BINLOG_ROW_ENGINE_AND_STMT_ENGINE: "Cannot execute statement: impossible to write to binary log since both row-incapable engines and statement-incapable engines are involved.", + ER_BINLOG_ROW_MODE_AND_STMT_ENGINE: "Cannot execute statement: impossible to write to binary log since BINLOG_FORMAT = ROW and at least one table uses a storage engine limited to statement-based logging.", + ER_BINLOG_UNSAFE_AND_STMT_ENGINE: "Cannot execute statement: impossible to write to binary log since statement is unsafe, storage engine is limited to statement-based logging, and BINLOG_FORMAT = MIXED. %s", + ER_BINLOG_ROW_INJECTION_AND_STMT_ENGINE: "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.", + ER_BINLOG_STMT_MODE_AND_ROW_ENGINE: "Cannot execute statement: impossible to write to binary log since BINLOG_FORMAT = STATEMENT and at least one table uses a storage engine limited to row-based logging.%s", + ER_BINLOG_ROW_INJECTION_AND_STMT_MODE: "Cannot execute statement: impossible to write to binary log since statement is in row format and BINLOG_FORMAT = STATEMENT.", + ER_BINLOG_MULTIPLE_ENGINES_AND_SELF_LOGGING_ENGINE: "Cannot execute statement: impossible to write to binary log since more than one engine is involved and at least one engine is self-logging.", + ER_BINLOG_UNSAFE_LIMIT: "The statement is unsafe because it uses a LIMIT clause. This is unsafe because the set of rows included cannot be predicted.", + ER_BINLOG_UNSAFE_INSERT_DELAYED: "The statement is unsafe because it uses INSERT DELAYED. This is unsafe because the times when rows are inserted cannot be predicted.", + ER_BINLOG_UNSAFE_SYSTEM_TABLE: "The statement is unsafe because it uses the general log, slow query log, or performance_schema table(s). This is unsafe because system tables may differ on slaves.", + ER_BINLOG_UNSAFE_AUTOINC_COLUMNS: "Statement is unsafe because it invokes a trigger or a stored function that inserts into an AUTO_INCREMENT column. Inserted values cannot be logged correctly.", + ER_BINLOG_UNSAFE_UDF: "Statement is unsafe because it uses a UDF which may not return the same value on the slave.", + ER_BINLOG_UNSAFE_SYSTEM_VARIABLE: "Statement is unsafe because it uses a system variable that may have a different value on the slave.", + ER_BINLOG_UNSAFE_SYSTEM_FUNCTION: "Statement is unsafe because it uses a system function that may return a different value on the slave.", + ER_BINLOG_UNSAFE_NONTRANS_AFTER_TRANS: "Statement is unsafe because it accesses a non-transactional table after accessing a transactional table within the same transaction.", + ER_MESSAGE_AND_STATEMENT: "%s Statement: %s", + ER_SLAVE_CONVERSION_FAILED: "Column %d of table '%-.192s.%-.192s' cannot be converted from type '%-.32s' to type '%-.32s'", + ER_SLAVE_CANT_CREATE_CONVERSION: "Can't create conversion table for table '%-.192s.%-.192s'", + ER_INSIDE_TRANSACTION_PREVENTS_SWITCH_BINLOG_FORMAT: "Cannot modify @@session.binlog_format inside a transaction", + ER_PATH_LENGTH: "The path specified for %.64s is too long.", + ER_WARN_DEPRECATED_SYNTAX_NO_REPLACEMENT: "'%s' is deprecated and will be removed in a future release.", + ER_WRONG_NATIVE_TABLE_STRUCTURE: "Native table '%-.64s'.'%-.64s' has the wrong structure", + ER_WRONG_PERFSCHEMA_USAGE: "Invalid performance_schema usage.", + ER_WARN_I_S_SKIPPED_TABLE: "Table '%s'.'%s' was skipped since its definition is being modified by concurrent DDL statement", + ER_INSIDE_TRANSACTION_PREVENTS_SWITCH_BINLOG_DIRECT: "Cannot modify @@session.binlog_direct_non_transactional_updates inside a transaction", + ER_STORED_FUNCTION_PREVENTS_SWITCH_BINLOG_DIRECT: "Cannot change the binlog direct flag inside a stored function or trigger", + ER_SPATIAL_MUST_HAVE_GEOM_COL: "A SPATIAL index may only contain a geometrical type column", + ER_TOO_LONG_INDEX_COMMENT: "Comment for index '%-.64s' is too long (max = %lu)", + ER_LOCK_ABORTED: "Wait on a lock was aborted due to a pending exclusive lock", + ER_DATA_OUT_OF_RANGE: "%s value is out of range in '%s'", + ER_WRONG_SPVAR_TYPE_IN_LIMIT: "A variable of a non-integer based type in LIMIT clause", + ER_BINLOG_UNSAFE_MULTIPLE_ENGINES_AND_SELF_LOGGING_ENGINE: "Mixing self-logging and non-self-logging engines in a statement is unsafe.", + ER_BINLOG_UNSAFE_MIXED_STATEMENT: "Statement accesses nontransactional table as well as transactional or temporary table, and writes to any of them.", + ER_INSIDE_TRANSACTION_PREVENTS_SWITCH_SQL_LOG_BIN: "Cannot modify @@session.sql_log_bin inside a transaction", + ER_STORED_FUNCTION_PREVENTS_SWITCH_SQL_LOG_BIN: "Cannot change the sql_log_bin inside a stored function or trigger", + ER_FAILED_READ_FROM_PAR_FILE: "Failed to read from the .par file", + ER_VALUES_IS_NOT_INT_TYPE_ERROR: "VALUES value for partition '%-.64s' must have type INT", + ER_ACCESS_DENIED_NO_PASSWORD_ERROR: "Access denied for user '%-.48s'@'%-.64s'", + ER_SET_PASSWORD_AUTH_PLUGIN: "SET PASSWORD has no significance for users authenticating via plugins", + ER_GRANT_PLUGIN_USER_EXISTS: "GRANT with IDENTIFIED WITH is illegal because the user %-.*s already exists", + ER_TRUNCATE_ILLEGAL_FK: "Cannot truncate a table referenced in a foreign key constraint (%.192s)", + ER_PLUGIN_IS_PERMANENT: "Plugin '%s' is force_plus_permanent and can not be unloaded", + ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE_MIN: "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.", + ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE_MAX: "The requested value for the heartbeat period exceeds the value of `slave_net_timeout' seconds. A sensible value for the period should be less than the timeout.", + ER_STMT_CACHE_FULL: "Multi-row statements required more than 'max_binlog_stmt_cache_size' bytes of storage; increase this mysqld variable and try again", + ER_MULTI_UPDATE_KEY_CONFLICT: "Primary key/partition key update is not allowed since the table is updated both as '%-.192s' and '%-.192s'.", + ER_TABLE_NEEDS_REBUILD: "Table rebuild required. Please do \"ALTER TABLE `%-.32s` FORCE\" or dump/reload to fix it!", + WARN_OPTION_BELOW_LIMIT: "The value of '%s' should be no less than the value of '%s'", + ER_INDEX_COLUMN_TOO_LONG: "Index column size too large. The maximum column size is %lu bytes.", + ER_ERROR_IN_TRIGGER_BODY: "Trigger '%-.64s' has an error in its body: '%-.256s'", + ER_ERROR_IN_UNKNOWN_TRIGGER_BODY: "Unknown trigger has an error in its body: '%-.256s'", + ER_INDEX_CORRUPT: "Index %s is corrupted", + ER_UNDO_RECORD_TOO_BIG: "Undo log record is too big.", + ER_BINLOG_UNSAFE_INSERT_IGNORE_SELECT: "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.", + ER_BINLOG_UNSAFE_INSERT_SELECT_UPDATE: "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.", + ER_BINLOG_UNSAFE_REPLACE_SELECT: "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.", + ER_BINLOG_UNSAFE_CREATE_IGNORE_SELECT: "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.", + ER_BINLOG_UNSAFE_CREATE_REPLACE_SELECT: "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.", + ER_BINLOG_UNSAFE_UPDATE_IGNORE: "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.", + ER_PLUGIN_NO_UNINSTALL: "Plugin '%s' is marked as not dynamically uninstallable. You have to stop the server to uninstall it.", + ER_PLUGIN_NO_INSTALL: "Plugin '%s' is marked as not dynamically installable. You have to stop the server to install it.", + ER_BINLOG_UNSAFE_WRITE_AUTOINC_SELECT: "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.", + ER_BINLOG_UNSAFE_CREATE_SELECT_AUTOINC: "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.", + ER_BINLOG_UNSAFE_INSERT_TWO_KEYS: "INSERT... ON DUPLICATE KEY UPDATE on a table with more than one UNIQUE KEY is unsafe", + ER_TABLE_IN_FK_CHECK: "Table is being used in foreign key check.", + ER_UNSUPPORTED_ENGINE: "Storage engine '%s' does not support system tables. [%s.%s]", + ER_BINLOG_UNSAFE_AUTOINC_NOT_FIRST: "INSERT into autoincrement field which is not the first part in the composed primary key is unsafe.", + ER_CANNOT_LOAD_FROM_TABLE_V2: "Cannot load from %s.%s. The table is probably corrupted", + ER_MASTER_DELAY_VALUE_OUT_OF_RANGE: "The requested value %u for the master delay exceeds the maximum %u", + ER_ONLY_FD_AND_RBR_EVENTS_ALLOWED_IN_BINLOG_STATEMENT: "Only Format_description_log_event and row events are allowed in BINLOG statements (but %s was provided)", + ER_PARTITION_EXCHANGE_DIFFERENT_OPTION: "Non matching attribute '%-.64s' between partition and table", + ER_PARTITION_EXCHANGE_PART_TABLE: "Table to exchange with partition is partitioned: '%-.64s'", + ER_PARTITION_EXCHANGE_TEMP_TABLE: "Table to exchange with partition is temporary: '%-.64s'", + ER_PARTITION_INSTEAD_OF_SUBPARTITION: "Subpartitioned table, use subpartition instead of partition", + ER_UNKNOWN_PARTITION: "Unknown partition '%-.64s' in table '%-.64s'", + ER_TABLES_DIFFERENT_METADATA: "Tables have different definitions", + ER_ROW_DOES_NOT_MATCH_PARTITION: "Found a row that does not match the partition", + ER_BINLOG_CACHE_SIZE_GREATER_THAN_MAX: "Option binlog_cache_size (%lu) is greater than max_binlog_cache_size (%lu); setting binlog_cache_size equal to max_binlog_cache_size.", + ER_WARN_INDEX_NOT_APPLICABLE: "Cannot use %-.64s access on index '%-.64s' due to type or collation conversion on field '%-.64s'", + ER_PARTITION_EXCHANGE_FOREIGN_KEY: "Table to exchange with partition has foreign key references: '%-.64s'", + ER_NO_SUCH_KEY_VALUE: "Key value '%-.192s' was not found in table '%-.192s.%-.192s'", + ER_RPL_INFO_DATA_TOO_LONG: "Data for column '%s' too long", + ER_NETWORK_READ_EVENT_CHECKSUM_FAILURE: "Replication event checksum verification failed while reading from network.", + ER_BINLOG_READ_EVENT_CHECKSUM_FAILURE: "Replication event checksum verification failed while reading from a log file.", + ER_BINLOG_STMT_CACHE_SIZE_GREATER_THAN_MAX: "Option binlog_stmt_cache_size (%lu) is greater than max_binlog_stmt_cache_size (%lu); setting binlog_stmt_cache_size equal to max_binlog_stmt_cache_size.", + ER_CANT_UPDATE_TABLE_IN_CREATE_TABLE_SELECT: "Can't update table '%-.192s' while '%-.192s' is being created.", + ER_PARTITION_CLAUSE_ON_NONPARTITIONED: "PARTITION () clause on non partitioned table", + ER_ROW_DOES_NOT_MATCH_GIVEN_PARTITION_SET: "Found a row not matching the given partition set", + ER_NO_SUCH_PARTITION__UNUSED: "partition '%-.64s' doesn't exist", + ER_CHANGE_RPL_INFO_REPOSITORY_FAILURE: "Failure while changing the type of replication repository: %s.", + ER_WARNING_NOT_COMPLETE_ROLLBACK_WITH_CREATED_TEMP_TABLE: "The creation of some temporary tables could not be rolled back.", + ER_WARNING_NOT_COMPLETE_ROLLBACK_WITH_DROPPED_TEMP_TABLE: "Some temporary tables were dropped, but these operations could not be rolled back.", + ER_MTS_FEATURE_IS_NOT_SUPPORTED: "%s is not supported in multi-threaded slave mode. %s", + ER_MTS_UPDATED_DBS_GREATER_MAX: "The number of modified databases exceeds the maximum %d; the database names will not be included in the replication event metadata.", + ER_MTS_CANT_PARALLEL: "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.", + ER_MTS_INCONSISTENT_DATA: "%s", + ER_FULLTEXT_NOT_SUPPORTED_WITH_PARTITIONING: "FULLTEXT index is not supported for partitioned tables.", + ER_DA_INVALID_CONDITION_NUMBER: "Invalid condition number", + ER_INSECURE_PLAIN_TEXT: "Sending passwords in plain text without SSL/TLS is extremely insecure.", + ER_INSECURE_CHANGE_MASTER: "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.", + ER_FOREIGN_DUPLICATE_KEY_WITH_CHILD_INFO: "Foreign key constraint for table '%.192s', record '%-.192s' would lead to a duplicate entry in table '%.192s', key '%.192s'", + ER_FOREIGN_DUPLICATE_KEY_WITHOUT_CHILD_INFO: "Foreign key constraint for table '%.192s', record '%-.192s' would lead to a duplicate entry in a child table", + ER_SQLTHREAD_WITH_SECURE_SLAVE: "Setting authentication options is not possible when only the Slave SQL Thread is being started.", + ER_TABLE_HAS_NO_FT: "The table does not have FULLTEXT index to support this query", + ER_VARIABLE_NOT_SETTABLE_IN_SF_OR_TRIGGER: "The system variable %.200s cannot be set in stored functions or triggers.", + ER_VARIABLE_NOT_SETTABLE_IN_TRANSACTION: "The system variable %.200s cannot be set when there is an ongoing transaction.", + ER_GTID_NEXT_IS_NOT_IN_GTID_NEXT_LIST: "The system variable @@SESSION.GTID_NEXT has the value %.200s, which is not listed in @@SESSION.GTID_NEXT_LIST.", + ER_CANT_CHANGE_GTID_NEXT_IN_TRANSACTION_WHEN_GTID_NEXT_LIST_IS_NULL: "When @@SESSION.GTID_NEXT_LIST == NULL, the system variable @@SESSION.GTID_NEXT cannot change inside a transaction.", + ER_SET_STATEMENT_CANNOT_INVOKE_FUNCTION: "The statement 'SET %.200s' cannot invoke a stored function.", + ER_GTID_NEXT_CANT_BE_AUTOMATIC_IF_GTID_NEXT_LIST_IS_NON_NULL: "The system variable @@SESSION.GTID_NEXT cannot be 'AUTOMATIC' when @@SESSION.GTID_NEXT_LIST is non-NULL.", + ER_SKIPPING_LOGGED_TRANSACTION: "Skipping transaction %.200s because it has already been executed and logged.", + ER_MALFORMED_GTID_SET_SPECIFICATION: "Malformed GTID set specification '%.200s'.", + ER_MALFORMED_GTID_SET_ENCODING: "Malformed GTID set encoding.", + ER_MALFORMED_GTID_SPECIFICATION: "Malformed GTID specification '%.200s'.", + ER_GNO_EXHAUSTED: "Impossible to generate Global Transaction Identifier: the integer component reached the maximal value. Restart the server with a new server_uuid.", + ER_BAD_SLAVE_AUTO_POSITION: "Parameters MASTER_LOG_FILE, MASTER_LOG_POS, RELAY_LOG_FILE and RELAY_LOG_POS cannot be set when MASTER_AUTO_POSITION is active.", + ER_AUTO_POSITION_REQUIRES_GTID_MODE_ON: "CHANGE MASTER TO MASTER_AUTO_POSITION = 1 can only be executed when @@GLOBAL.GTID_MODE = ON.", + ER_CANT_DO_IMPLICIT_COMMIT_IN_TRX_WHEN_GTID_NEXT_IS_SET: "Cannot execute statements with implicit commit inside a transaction when @@SESSION.GTID_NEXT != AUTOMATIC or @@SESSION.GTID_NEXT_LIST != NULL.", + ER_GTID_MODE_2_OR_3_REQUIRES_ENFORCE_GTID_CONSISTENCY_ON: "@@GLOBAL.GTID_MODE = ON or UPGRADE_STEP_2 requires @@GLOBAL.ENFORCE_GTID_CONSISTENCY = 1.", + ER_GTID_MODE_REQUIRES_BINLOG: "@@GLOBAL.GTID_MODE = ON or UPGRADE_STEP_1 or UPGRADE_STEP_2 requires --log-bin and --log-slave-updates.", + ER_CANT_SET_GTID_NEXT_TO_GTID_WHEN_GTID_MODE_IS_OFF: "@@SESSION.GTID_NEXT cannot be set to UUID:NUMBER when @@GLOBAL.GTID_MODE = OFF.", + ER_CANT_SET_GTID_NEXT_TO_ANONYMOUS_WHEN_GTID_MODE_IS_ON: "@@SESSION.GTID_NEXT cannot be set to ANONYMOUS when @@GLOBAL.GTID_MODE = ON.", + ER_CANT_SET_GTID_NEXT_LIST_TO_NON_NULL_WHEN_GTID_MODE_IS_OFF: "@@SESSION.GTID_NEXT_LIST cannot be set to a non-NULL value when @@GLOBAL.GTID_MODE = OFF.", + ER_FOUND_GTID_EVENT_WHEN_GTID_MODE_IS_OFF: "Found a Gtid_log_event or Previous_gtids_log_event when @@GLOBAL.GTID_MODE = OFF.", + ER_GTID_UNSAFE_NON_TRANSACTIONAL_TABLE: "When @@GLOBAL.ENFORCE_GTID_CONSISTENCY = 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.", + ER_GTID_UNSAFE_CREATE_SELECT: "CREATE TABLE ... SELECT is forbidden when @@GLOBAL.ENFORCE_GTID_CONSISTENCY = 1.", + ER_GTID_UNSAFE_CREATE_DROP_TEMPORARY_TABLE_IN_TRANSACTION: "When @@GLOBAL.ENFORCE_GTID_CONSISTENCY = 1, the statements CREATE TEMPORARY TABLE and DROP TEMPORARY TABLE can be executed in a non-transactional context only, and require that AUTOCOMMIT = 1.", + ER_GTID_MODE_CAN_ONLY_CHANGE_ONE_STEP_AT_A_TIME: "The value of @@GLOBAL.GTID_MODE can only change one step at a time: OFF <-> UPGRADE_STEP_1 <-> UPGRADE_STEP_2 <-> ON. Also note that this value must be stepped up or down simultaneously on all servers; see the Manual for instructions.", + ER_MASTER_HAS_PURGED_REQUIRED_GTIDS: "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.", + ER_CANT_SET_GTID_NEXT_WHEN_OWNING_GTID: "@@SESSION.GTID_NEXT cannot be changed by a client that owns a GTID. The client owns %s. Ownership is released on COMMIT or ROLLBACK.", + ER_UNKNOWN_EXPLAIN_FORMAT: "Unknown EXPLAIN format name: '%s'", + ER_CANT_EXECUTE_IN_READ_ONLY_TRANSACTION: "Cannot execute statement in a READ ONLY transaction.", + ER_TOO_LONG_TABLE_PARTITION_COMMENT: "Comment for table partition '%-.64s' is too long (max = %lu)", + ER_SLAVE_CONFIGURATION: "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.", + ER_INNODB_FT_LIMIT: "InnoDB presently supports one FULLTEXT index creation at a time", + ER_INNODB_NO_FT_TEMP_TABLE: "Cannot create FULLTEXT index on temporary InnoDB table", + ER_INNODB_FT_WRONG_DOCID_COLUMN: "Column '%-.192s' is of wrong type for an InnoDB FULLTEXT index", + ER_INNODB_FT_WRONG_DOCID_INDEX: "Index '%-.192s' is of wrong type for an InnoDB FULLTEXT index", + ER_INNODB_ONLINE_LOG_TOO_BIG: "Creating index '%-.192s' required more than 'innodb_online_alter_log_max_size' bytes of modification log. Please try again.", + ER_UNKNOWN_ALTER_ALGORITHM: "Unknown ALGORITHM '%s'", + ER_UNKNOWN_ALTER_LOCK: "Unknown LOCK type '%s'", + ER_MTS_CHANGE_MASTER_CANT_RUN_WITH_GAPS: "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.", + ER_MTS_RECOVERY_FAILURE: "Cannot recover after SLAVE errored out in parallel execution mode. Additional error messages can be found in the MySQL error log.", + ER_MTS_RESET_WORKERS: "Cannot clean up worker info tables. Additional error messages can be found in the MySQL error log.", + ER_COL_COUNT_DOESNT_MATCH_CORRUPTED_V2: "Column count of %s.%s is wrong. Expected %d, found %d. The table is probably corrupted", + ER_SLAVE_SILENT_RETRY_TRANSACTION: "Slave must silently retry current transaction", + ER_DISCARD_FK_CHECKS_RUNNING: "There is a foreign key check running on table '%-.192s'. Cannot discard the table.", + ER_TABLE_SCHEMA_MISMATCH: "Schema mismatch (%s)", + ER_TABLE_IN_SYSTEM_TABLESPACE: "Table '%-.192s' in system tablespace", + ER_IO_READ_ERROR: "IO Read error: (%lu, %s) %s", + ER_IO_WRITE_ERROR: "IO Write error: (%lu, %s) %s", + ER_TABLESPACE_MISSING: "Tablespace is missing for table '%-.192s'", + ER_TABLESPACE_EXISTS: "Tablespace for table '%-.192s' exists. Please DISCARD the tablespace before IMPORT.", + ER_TABLESPACE_DISCARDED: "Tablespace has been discarded for table '%-.192s'", + ER_INTERNAL_ERROR: "Internal error: %s", + ER_INNODB_IMPORT_ERROR: "ALTER TABLE '%-.192s' IMPORT TABLESPACE failed with error %lu : '%s'", + ER_INNODB_INDEX_CORRUPT: "Index corrupt: %s", + ER_INVALID_YEAR_COLUMN_LENGTH: "YEAR(%lu) column type is deprecated. Creating YEAR(4) column instead.", + ER_NOT_VALID_PASSWORD: "Your password does not satisfy the current policy requirements", + ER_MUST_CHANGE_PASSWORD: "You must SET PASSWORD before executing this statement", + ER_FK_NO_INDEX_CHILD: "Failed to add the foreign key constaint. Missing index for constraint '%s' in the foreign table '%s'", + ER_FK_NO_INDEX_PARENT: "Failed to add the foreign key constaint. Missing index for constraint '%s' in the referenced table '%s'", + ER_FK_FAIL_ADD_SYSTEM: "Failed to add the foreign key constraint '%s' to system tables", + ER_FK_CANNOT_OPEN_PARENT: "Failed to open the referenced table '%s'", + ER_FK_INCORRECT_OPTION: "Failed to add the foreign key constraint on table '%s'. Incorrect options in FOREIGN KEY constraint '%s'", + ER_FK_DUP_NAME: "Duplicate foreign key constraint name '%s'", + ER_PASSWORD_FORMAT: "The password hash doesn't have the expected format. Check if the correct password algorithm is being used with the PASSWORD() function.", + ER_FK_COLUMN_CANNOT_DROP: "Cannot drop column '%-.192s': needed in a foreign key constraint '%-.192s'", + ER_FK_COLUMN_CANNOT_DROP_CHILD: "Cannot drop column '%-.192s': needed in a foreign key constraint '%-.192s' of table '%-.192s'", + ER_FK_COLUMN_NOT_NULL: "Column '%-.192s' cannot be NOT NULL: needed in a foreign key constraint '%-.192s' SET NULL", + ER_DUP_INDEX: "Duplicate index '%-.64s' defined on the table '%-.64s.%-.64s'. This is deprecated and will be disallowed in a future release.", + ER_FK_COLUMN_CANNOT_CHANGE: "Cannot change column '%-.192s': used in a foreign key constraint '%-.192s'", + ER_FK_COLUMN_CANNOT_CHANGE_CHILD: "Cannot change column '%-.192s': used in a foreign key constraint '%-.192s' of table '%-.192s'", + ER_FK_CANNOT_DELETE_PARENT: "Cannot delete rows from table which is parent in a foreign key constraint '%-.192s' of table '%-.192s'", + ER_MALFORMED_PACKET: "Malformed communication packet.", + ER_READ_ONLY_MODE: "Running in read-only mode", + ER_GTID_NEXT_TYPE_UNDEFINED_GROUP: "When @@SESSION.GTID_NEXT 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.GTID_NEXT before a transaction and forgot to set @@SESSION.GTID_NEXT to a different identifier or to 'AUTOMATIC' after COMMIT or ROLLBACK. Current @@SESSION.GTID_NEXT is '%s'.", + ER_VARIABLE_NOT_SETTABLE_IN_SP: "The system variable %.200s cannot be set in stored procedures.", + ER_CANT_SET_GTID_PURGED_WHEN_GTID_MODE_IS_OFF: "@@GLOBAL.GTID_PURGED can only be set when @@GLOBAL.GTID_MODE = ON.", + ER_CANT_SET_GTID_PURGED_WHEN_GTID_EXECUTED_IS_NOT_EMPTY: "@@GLOBAL.GTID_PURGED can only be set when @@GLOBAL.GTID_EXECUTED is empty.", + ER_CANT_SET_GTID_PURGED_WHEN_OWNED_GTIDS_IS_NOT_EMPTY: "@@GLOBAL.GTID_PURGED can only be set when there are no ongoing transactions (not even in other clients).", + ER_GTID_PURGED_WAS_CHANGED: "@@GLOBAL.GTID_PURGED was changed from '%s' to '%s'.", + ER_GTID_EXECUTED_WAS_CHANGED: "@@GLOBAL.GTID_EXECUTED was changed from '%s' to '%s'.", + ER_BINLOG_STMT_MODE_AND_NO_REPL_TABLES: "Cannot execute statement: impossible to write to binary log since BINLOG_FORMAT = STATEMENT, and both replicated and non replicated tables are written to.", + ER_ALTER_OPERATION_NOT_SUPPORTED: "%s is not supported for this operation. Try %s.", + ER_ALTER_OPERATION_NOT_SUPPORTED_REASON: "%s is not supported. Reason: %s. Try %s.", + ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_COPY: "COPY algorithm requires a lock", + ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_PARTITION: "Partition specific operations do not yet support LOCK/ALGORITHM", + ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_FK_RENAME: "Columns participating in a foreign key are renamed", + ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_COLUMN_TYPE: "Cannot change column type INPLACE", + ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_FK_CHECK: "Adding foreign keys needs foreign_key_checks=OFF", + ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_IGNORE: "Creating unique indexes with IGNORE requires COPY algorithm to remove duplicate rows", + ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_NOPK: "Dropping a primary key is not allowed without also adding a new primary key", + ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_AUTOINC: "Adding an auto-increment column requires a lock", + ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_HIDDEN_FTS: "Cannot replace hidden FTS_DOC_ID with a user-visible one", + ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_CHANGE_FTS: "Cannot drop or rename FTS_DOC_ID", + ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_FTS: "Fulltext index creation requires a lock", + ER_SQL_SLAVE_SKIP_COUNTER_NOT_SETTABLE_IN_GTID_MODE: "sql_slave_skip_counter can not be set when the server is running with @@GLOBAL.GTID_MODE = ON. Instead, for each transaction that you want to skip, generate an empty transaction with the same GTID as the transaction", + ER_DUP_UNKNOWN_IN_INDEX: "Duplicate entry for key '%-.192s'", + ER_IDENT_CAUSES_TOO_LONG_PATH: "Long database name and identifier for object resulted in path length exceeding %d characters. Path: '%s'.", + ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_NOT_NULL: "cannot silently convert NULL values, as required in this SQL_MODE", + ER_MUST_CHANGE_PASSWORD_LOGIN: "Your password has expired. To log in you must change it using a client that supports expired passwords.", + ER_ROW_IN_WRONG_PARTITION: "Found a row in wrong partition %s", +} diff --git a/mysql/error.go b/mysql/error.go new file mode 100644 index 0000000..d24b58c --- /dev/null +++ b/mysql/error.go @@ -0,0 +1,62 @@ +package mysql + +import ( + "errors" + "fmt" +) + +var ( + ErrBadConn = errors.New("connection was bad") + ErrMalformPacket = errors.New("Malform packet error") + + ErrTxDone = errors.New("sql: Transaction has already been committed or rolled back") + ErrBadPkgLen = errors.New("bad packet length") + ErrPktSync = errors.New("packet sync error") + ErrPktSyncMul = errors.New("packet sync mul error") + ErrPktTooLarge = errors.New("packet to large") +) + +type SqlError struct { + Code uint16 + Message string + State string +} + +func (e *SqlError) Error() string { + return fmt.Sprintf("ERROR %d (%s): %s", e.Code, e.State, e.Message) +} + +//default mysql error, must adapt errname message format +func NewDefaultError(errCode uint16, args ...interface{}) *SqlError { + e := new(SqlError) + e.Code = errCode + + if s, ok := MySQLState[errCode]; ok { + e.State = s + } else { + e.State = DEFAULT_MYSQL_STATE + } + + if format, ok := MySQLErrName[errCode]; ok { + e.Message = fmt.Sprintf(format, args...) + } else { + e.Message = fmt.Sprint(args...) + } + + return e +} + +func NewError(errCode uint16, message string) *SqlError { + e := new(SqlError) + e.Code = errCode + + if s, ok := MySQLState[errCode]; ok { + e.State = s + } else { + e.State = DEFAULT_MYSQL_STATE + } + + e.Message = message + + return e +} diff --git a/mysql/field.go b/mysql/field.go new file mode 100644 index 0000000..b8a50eb --- /dev/null +++ b/mysql/field.go @@ -0,0 +1,154 @@ +package mysql + +import ( + "encoding/binary" +) + +type FieldData []byte + +type Field struct { + Data FieldData + Schema []byte + Table []byte + OrgTable []byte + Name []byte + OrgName []byte + Charset uint16 + ColumnLength uint32 + Type uint8 + Flag uint16 + Decimal uint8 + + DefaultValueLength uint64 + DefaultValue []byte +} + +func (p FieldData) Parse() (f *Field, err error) { + f = new(Field) + + f.Data = p + + var n int + pos := 0 + //skip catelog, always def + n, err = SkipLengthEnodedString(p) + if err != nil { + return + } + pos += n + + //schema + f.Schema, _, n, err = LengthEnodedString(p[pos:]) + if err != nil { + return + } + pos += n + + //table + f.Table, _, n, err = LengthEnodedString(p[pos:]) + if err != nil { + return + } + pos += n + + //org_table + f.OrgTable, _, n, err = LengthEnodedString(p[pos:]) + if err != nil { + return + } + pos += n + + //name + f.Name, _, n, err = LengthEnodedString(p[pos:]) + if err != nil { + return + } + pos += n + + //org_name + f.OrgName, _, n, err = LengthEnodedString(p[pos:]) + if err != nil { + return + } + pos += n + + //skip oc + pos += 1 + + //charset + f.Charset = binary.LittleEndian.Uint16(p[pos:]) + pos += 2 + + //column length + f.ColumnLength = binary.LittleEndian.Uint32(p[pos:]) + pos += 4 + + //type + f.Type = p[pos] + pos++ + + //flag + f.Flag = binary.LittleEndian.Uint16(p[pos:]) + pos += 2 + + //decimals 1 + f.Decimal = p[pos] + pos++ + + //filter [0x00][0x00] + pos += 2 + + f.DefaultValue = nil + //if more data, command was field list + if len(p) > pos { + //length of default value lenenc-int + f.DefaultValueLength, _, n = LengthEncodedInt(p[pos:]) + pos += n + + if pos+int(f.DefaultValueLength) > len(p) { + err = ErrMalformPacket + return + } + + //default value string[$len] + f.DefaultValue = p[pos:(pos + int(f.DefaultValueLength))] + } + + return +} + +func (f *Field) Dump() []byte { + if f.Data != nil { + return []byte(f.Data) + } + + l := len(f.Schema) + len(f.Table) + len(f.OrgTable) + len(f.Name) + len(f.OrgName) + len(f.DefaultValue) + 48 + + data := make([]byte, 0, l) + + data = append(data, PutLengthEncodedString([]byte("def"))...) + + data = append(data, PutLengthEncodedString(f.Schema)...) + + data = append(data, PutLengthEncodedString(f.Table)...) + data = append(data, PutLengthEncodedString(f.OrgTable)...) + + data = append(data, PutLengthEncodedString(f.Name)...) + data = append(data, PutLengthEncodedString(f.OrgName)...) + + data = append(data, 0x0c) + + data = append(data, Uint16ToBytes(f.Charset)...) + data = append(data, Uint32ToBytes(f.ColumnLength)...) + data = append(data, f.Type) + data = append(data, Uint16ToBytes(f.Flag)...) + data = append(data, f.Decimal) + data = append(data, 0, 0) + + if f.DefaultValue != nil { + data = append(data, Uint64ToBytes(f.DefaultValueLength)...) + data = append(data, f.DefaultValue...) + } + + return data +} diff --git a/mysql/packet.go b/mysql/packet.go new file mode 100644 index 0000000..4fc58f1 --- /dev/null +++ b/mysql/packet.go @@ -0,0 +1,17 @@ +// Copyright (c) 2014 Xiaomi.com, Inc. All Rights Reserved +// @file package.go +// @author 王靖 (wangjing1@xiaomi.com) +// @date 14-11-27 14:40:10 +// @version $Revision: 1.0 $ +// @brief + +package mysql + +import () + +// Packets documentation: +// http://dev.mysql.com/doc/internals/en/mysql-packet.html +const MaxPacketSize = 1<<24 - 1 +const PacketHeadSize = 4 + +/* vim: set expandtab ts=4 sw=4 */ diff --git a/mysql/packetio.go b/mysql/packetio.go new file mode 100644 index 0000000..6180bc3 --- /dev/null +++ b/mysql/packetio.go @@ -0,0 +1,113 @@ +package mysql + +import ( + "bufio" + "io" + . "github.com/wangjild/go-mysql-proxy/log" + "net" +) + +type PacketIO struct { + reader io.Reader + writer io.Writer + + Sequence uint8 +} + +func NewPacketIO(conn net.Conn) *PacketIO { + p := new(PacketIO) + + p.reader = bufio.NewReader(conn) + p.writer = conn + + p.Sequence = 0 + + return p +} + +func (p *PacketIO) ReadPacket() ([]byte, error) { + + var payload []byte + for { + + var header [PacketHeadSize]byte + if n, err := io.ReadFull(p.reader, header[:]); err != nil { + AppLog.Warn("wrong packet format, head size is %d", n) + return nil, ErrBadConn + } + + length := int(uint32(header[0]) | uint32(header[1])<<8 | uint32(header[2])<<16) + if length < 1 { + AppLog.Warn("wrong packet length, size is %d", length) + return nil, ErrBadPkgLen + } + + if uint8(header[3]) != p.Sequence { + if uint8(header[3]) > p.Sequence { + return nil, ErrPktSyncMul + } else { + return nil, ErrPktSync + } + } + + p.Sequence++ + + data := make([]byte, length, length) + var err error + if _, err = io.ReadFull(p.reader, data); err != nil { + AppLog.Warn("read packet from conn error: %s", err.Error()) + return nil, ErrBadConn + } + + lastPacket := (length < MaxPacketSize) + + if lastPacket && payload == nil { + return data, nil + } + + payload = append(payload, data...) + + if lastPacket { + return payload, nil + } + + } +} + +//data already have header +func (p *PacketIO) WritePacket(data []byte) error { + length := len(data) - 4 + + for length >= MaxPayloadLen { + + data[0] = 0xff + data[1] = 0xff + data[2] = 0xff + + data[3] = p.Sequence + + if n, err := p.writer.Write(data[:4+MaxPayloadLen]); err != nil { + return ErrBadConn + } else if n != (4 + MaxPayloadLen) { + return ErrBadConn + } else { + p.Sequence++ + length -= MaxPayloadLen + data = data[MaxPayloadLen:] + } + } + + data[0] = byte(length) + data[1] = byte(length >> 8) + data[2] = byte(length >> 16) + data[3] = p.Sequence + + if n, err := p.writer.Write(data); err != nil { + return ErrBadConn + } else if n != len(data) { + return ErrBadConn + } else { + p.Sequence++ + return nil + } +} diff --git a/mysql/result.go b/mysql/result.go new file mode 100644 index 0000000..652dfb7 --- /dev/null +++ b/mysql/result.go @@ -0,0 +1,11 @@ +package mysql + +type Result struct { + AffectedRows uint64 + InsertId uint64 + + Status uint16 + Warnings uint16 + + *Resultset +} diff --git a/mysql/resultset.go b/mysql/resultset.go new file mode 100644 index 0000000..ae227b1 --- /dev/null +++ b/mysql/resultset.go @@ -0,0 +1,393 @@ +package mysql + +import ( + "encoding/binary" + "fmt" + "math" + "github.com/wangjild/go-mysql-proxy/hack" + "strconv" +) + +type RowData []byte + +func (p RowData) Parse(f []*Field, binary bool) ([]interface{}, error) { + if binary { + return p.ParseBinary(f) + } else { + return p.ParseText(f) + } +} + +func (p RowData) ParseText(f []*Field) ([]interface{}, error) { + data := make([]interface{}, len(f)) + + var err error + var v []byte + var isNull, isUnsigned bool + var pos int = 0 + var n int = 0 + + for i := range f { + v, isNull, n, err = LengthEnodedString(p[pos:]) + if err != nil { + return nil, err + } + + pos += n + + if isNull { + data[i] = nil + } else { + isUnsigned = (f[i].Flag&UNSIGNED_FLAG > 0) + + switch f[i].Type { + case MYSQL_TYPE_TINY, MYSQL_TYPE_SHORT, MYSQL_TYPE_INT24, + MYSQL_TYPE_LONGLONG, MYSQL_TYPE_YEAR: + if isUnsigned { + data[i], err = strconv.ParseUint(string(v), 10, 64) + } else { + data[i], err = strconv.ParseInt(string(v), 10, 64) + } + case MYSQL_TYPE_FLOAT, MYSQL_TYPE_DOUBLE: + data[i], err = strconv.ParseFloat(string(v), 64) + default: + data[i] = v + } + + if err != nil { + return nil, err + } + } + } + + return data, nil +} + +func (p RowData) ParseBinary(f []*Field) ([]interface{}, error) { + data := make([]interface{}, len(f)) + + if p[0] != OK_HEADER { + return nil, ErrMalformPacket + } + + pos := 1 + ((len(f) + 7 + 2) >> 3) + + nullBitmap := p[1:pos] + + var isUnsigned bool + var isNull bool + var n int + var err error + var v []byte + for i := range data { + if nullBitmap[(i+2)/8]&(1<<(uint(i+2)%8)) > 0 { + data[i] = nil + continue + } + + isUnsigned = f[i].Flag&UNSIGNED_FLAG > 0 + + switch f[i].Type { + case MYSQL_TYPE_NULL: + data[i] = nil + continue + + case MYSQL_TYPE_TINY: + if isUnsigned { + data[i] = uint64(p[pos]) + } else { + data[i] = int64(p[pos]) + } + pos++ + continue + + case MYSQL_TYPE_SHORT, MYSQL_TYPE_YEAR: + if isUnsigned { + data[i] = uint64(binary.LittleEndian.Uint16(p[pos : pos+2])) + } else { + data[i] = int64((binary.LittleEndian.Uint16(p[pos : pos+2]))) + } + pos += 2 + continue + + case MYSQL_TYPE_INT24, MYSQL_TYPE_LONG: + if isUnsigned { + data[i] = uint64(binary.LittleEndian.Uint32(p[pos : pos+4])) + } else { + data[i] = int64(binary.LittleEndian.Uint32(p[pos : pos+4])) + } + pos += 4 + continue + + case MYSQL_TYPE_LONGLONG: + if isUnsigned { + data[i] = binary.LittleEndian.Uint64(p[pos : pos+8]) + } else { + data[i] = int64(binary.LittleEndian.Uint64(p[pos : pos+8])) + } + pos += 8 + continue + + case MYSQL_TYPE_FLOAT: + data[i] = float64(math.Float32frombits(binary.LittleEndian.Uint32(p[pos : pos+4]))) + pos += 4 + continue + + case MYSQL_TYPE_DOUBLE: + data[i] = math.Float64frombits(binary.LittleEndian.Uint64(p[pos : pos+8])) + pos += 8 + continue + + case MYSQL_TYPE_DECIMAL, MYSQL_TYPE_NEWDECIMAL, MYSQL_TYPE_VARCHAR, + MYSQL_TYPE_BIT, MYSQL_TYPE_ENUM, MYSQL_TYPE_SET, MYSQL_TYPE_TINY_BLOB, + MYSQL_TYPE_MEDIUM_BLOB, MYSQL_TYPE_LONG_BLOB, MYSQL_TYPE_BLOB, + MYSQL_TYPE_VAR_STRING, MYSQL_TYPE_STRING, MYSQL_TYPE_GEOMETRY: + v, isNull, n, err = LengthEnodedString(p[pos:]) + pos += n + if err != nil { + return nil, err + } + + if !isNull { + data[i] = v + continue + } else { + data[i] = nil + continue + } + case MYSQL_TYPE_DATE, MYSQL_TYPE_NEWDATE: + var num uint64 + num, isNull, n = LengthEncodedInt(p[pos:]) + + pos += n + + if isNull { + data[i] = nil + continue + } + + data[i], err = FormatBinaryDate(int(num), p[pos:]) + pos += int(num) + + if err != nil { + return nil, err + } + + case MYSQL_TYPE_TIMESTAMP, MYSQL_TYPE_DATETIME: + var num uint64 + num, isNull, n = LengthEncodedInt(p[pos:]) + + pos += n + + if isNull { + data[i] = nil + continue + } + + data[i], err = FormatBinaryDateTime(int(num), p[pos:]) + pos += int(num) + + if err != nil { + return nil, err + } + + case MYSQL_TYPE_TIME: + var num uint64 + num, isNull, n = LengthEncodedInt(p[pos:]) + + pos += n + + if isNull { + data[i] = nil + continue + } + + data[i], err = FormatBinaryTime(int(num), p[pos:]) + pos += int(num) + + if err != nil { + return nil, err + } + + default: + return nil, fmt.Errorf("Stmt Unknown FieldType %d %s", f[i].Type, f[i].Name) + } + } + + return data, nil +} + +type Resultset struct { + Fields []*Field + FieldNames map[string]int + Values [][]interface{} + + RowDatas []RowData +} + +func (r *Resultset) RowNumber() int { + return len(r.Values) +} + +func (r *Resultset) ColumnNumber() int { + return len(r.Fields) +} + +func (r *Resultset) GetValue(row, column int) (interface{}, error) { + if row >= len(r.Values) || row < 0 { + return nil, fmt.Errorf("invalid row index %d", row) + } + + if column >= len(r.Fields) || column < 0 { + return nil, fmt.Errorf("invalid column index %d", column) + } + + return r.Values[row][column], nil +} + +func (r *Resultset) NameIndex(name string) (int, error) { + if column, ok := r.FieldNames[name]; ok { + return column, nil + } else { + return 0, fmt.Errorf("invalid field name %s", name) + } +} + +func (r *Resultset) GetValueByName(row int, name string) (interface{}, error) { + if column, err := r.NameIndex(name); err != nil { + return nil, err + } else { + return r.GetValue(row, column) + } +} + +func (r *Resultset) IsNull(row, column int) (bool, error) { + d, err := r.GetValue(row, column) + if err != nil { + return false, err + } + + return d == nil, nil +} + +func (r *Resultset) IsNullByName(row int, name string) (bool, error) { + if column, err := r.NameIndex(name); err != nil { + return false, err + } else { + return r.IsNull(row, column) + } +} + +func (r *Resultset) GetUint(row, column int) (uint64, error) { + d, err := r.GetValue(row, column) + if err != nil { + return 0, err + } + + switch v := d.(type) { + case uint64: + return v, nil + case int64: + return uint64(v), nil + case float64: + return uint64(v), nil + case string: + return strconv.ParseUint(v, 10, 64) + case []byte: + return strconv.ParseUint(string(v), 10, 64) + case nil: + return 0, nil + default: + return 0, fmt.Errorf("data type is %T", v) + } +} + +func (r *Resultset) GetUintByName(row int, name string) (uint64, error) { + if column, err := r.NameIndex(name); err != nil { + return 0, err + } else { + return r.GetUint(row, column) + } +} + +func (r *Resultset) GetInt(row, column int) (int64, error) { + v, err := r.GetUint(row, column) + if err != nil { + return 0, err + } + + return int64(v), nil +} + +func (r *Resultset) GetIntByName(row int, name string) (int64, error) { + v, err := r.GetUintByName(row, name) + if err != nil { + return 0, err + } + + return int64(v), nil +} + +func (r *Resultset) GetFloat(row, column int) (float64, error) { + d, err := r.GetValue(row, column) + if err != nil { + return 0, err + } + + switch v := d.(type) { + case float64: + return v, nil + case uint64: + return float64(v), nil + case int64: + return float64(v), nil + case string: + return strconv.ParseFloat(v, 64) + case []byte: + return strconv.ParseFloat(string(v), 64) + case nil: + return 0, nil + default: + return 0, fmt.Errorf("data type is %T", v) + } +} + +func (r *Resultset) GetFloatByName(row int, name string) (float64, error) { + if column, err := r.NameIndex(name); err != nil { + return 0, err + } else { + return r.GetFloat(row, column) + } +} + +func (r *Resultset) GetString(row, column int) (string, error) { + d, err := r.GetValue(row, column) + if err != nil { + return "", err + } + + switch v := d.(type) { + case string: + return v, nil + case []byte: + return hack.String(v), nil + case int64: + return strconv.FormatInt(v, 10), nil + case uint64: + return strconv.FormatUint(v, 10), nil + case float64: + return strconv.FormatFloat(v, 'f', -1, 64), nil + case nil: + return "", nil + default: + return "", fmt.Errorf("data type is %T", v) + } +} + +func (r *Resultset) GetStringByName(row int, name string) (string, error) { + if column, err := r.NameIndex(name); err != nil { + return "", err + } else { + return r.GetString(row, column) + } +} diff --git a/mysql/resultset_sort.go b/mysql/resultset_sort.go new file mode 100644 index 0000000..2edfc00 --- /dev/null +++ b/mysql/resultset_sort.go @@ -0,0 +1,142 @@ +package mysql + +import ( + "bytes" + "fmt" + "github.com/wangjild/go-mysql-proxy/hack" + "sort" +) + +const ( + SortAsc = "asc" + SortDesc = "desc" +) + +type SortKey struct { + //name of the field + Name string + + Direction string + + //column index of the field + column int +} + +type resultsetSorter struct { + *Resultset + + sk []SortKey +} + +func newResultsetSorter(r *Resultset, sk []SortKey) (*resultsetSorter, error) { + s := new(resultsetSorter) + + s.Resultset = r + + for i, k := range sk { + if column, ok := r.FieldNames[k.Name]; ok { + sk[i].column = column + } else { + return nil, fmt.Errorf("key %s not in resultset fields, can not sort", k.Name) + } + } + + s.sk = sk + + return s, nil +} + +func (r *resultsetSorter) Len() int { + return r.RowNumber() +} + +func (r *resultsetSorter) Less(i, j int) bool { + v1 := r.Values[i] + v2 := r.Values[j] + + for _, k := range r.sk { + v := cmpValue(v1[k.column], v2[k.column]) + + if k.Direction == SortDesc { + v = -v + } + + if v < 0 { + return true + } else if v > 0 { + return false + } + + //equal, cmp next key + } + + return false +} + +//compare value using asc +func cmpValue(v1 interface{}, v2 interface{}) int { + if v1 == nil && v2 == nil { + return 0 + } else if v1 == nil { + return -1 + } else if v2 == nil { + return 1 + } + + switch v := v1.(type) { + case string: + s := v2.(string) + return bytes.Compare(hack.Slice(v), hack.Slice(s)) + case []byte: + s := v2.([]byte) + return bytes.Compare(v, s) + case int64: + s := v2.(int64) + if v < s { + return -1 + } else if v > s { + return 1 + } else { + return 0 + } + case uint64: + s := v2.(uint64) + if v < s { + return -1 + } else if v > s { + return 1 + } else { + return 0 + } + case float64: + s := v2.(float64) + if v < s { + return -1 + } else if v > s { + return 1 + } else { + return 0 + } + default: + //can not go here + panic(fmt.Sprintf("invalid type %T", v)) + } +} + +func (r *resultsetSorter) Swap(i, j int) { + r.Values[i], r.Values[j] = r.Values[j], r.Values[i] + + r.RowDatas[i], r.RowDatas[j] = r.RowDatas[j], r.RowDatas[i] +} + +func (r *Resultset) Sort(sk []SortKey) error { + s, err := newResultsetSorter(r, sk) + + if err != nil { + return err + } + + sort.Sort(s) + + return nil +} diff --git a/mysql/resultset_sort_test.go b/mysql/resultset_sort_test.go new file mode 100644 index 0000000..9fe4453 --- /dev/null +++ b/mysql/resultset_sort_test.go @@ -0,0 +1,98 @@ +package mysql + +import ( + "fmt" + "reflect" + "sort" + "testing" +) + +func TestResultsetSort(t *testing.T) { + r1 := new(Resultset) + r2 := new(Resultset) + + r1.Values = [][]interface{}{ + []interface{}{int64(1), "a", []byte("aa")}, + []interface{}{int64(2), "a", []byte("bb")}, + []interface{}{int64(3), "c", []byte("bb")}, + } + + r1.RowDatas = []RowData{ + RowData([]byte("1")), + RowData([]byte("2")), + RowData([]byte("3")), + } + + s := new(resultsetSorter) + + s.Resultset = r1 + + s.sk = []SortKey{ + SortKey{column: 0, Direction: SortDesc}, + } + + sort.Sort(s) + + r2.Values = [][]interface{}{ + []interface{}{int64(3), "c", []byte("bb")}, + []interface{}{int64(2), "a", []byte("bb")}, + []interface{}{int64(1), "a", []byte("aa")}, + } + + r2.RowDatas = []RowData{ + RowData([]byte("3")), + RowData([]byte("2")), + RowData([]byte("1")), + } + + if !reflect.DeepEqual(r1, r2) { + t.Fatal(fmt.Sprintf("%v %v", r1, r2)) + } + + s.sk = []SortKey{ + SortKey{column: 1, Direction: SortAsc}, + SortKey{column: 2, Direction: SortDesc}, + } + + sort.Sort(s) + + r2.Values = [][]interface{}{ + []interface{}{int64(2), "a", []byte("bb")}, + []interface{}{int64(1), "a", []byte("aa")}, + []interface{}{int64(3), "c", []byte("bb")}, + } + + r2.RowDatas = []RowData{ + RowData([]byte("2")), + RowData([]byte("1")), + RowData([]byte("3")), + } + + if !reflect.DeepEqual(r1, r2) { + t.Fatal(fmt.Sprintf("%v %v", r1, r2)) + } + + s.sk = []SortKey{ + SortKey{column: 1, Direction: SortAsc}, + SortKey{column: 2, Direction: SortAsc}, + } + + sort.Sort(s) + + r2.Values = [][]interface{}{ + []interface{}{int64(1), "a", []byte("aa")}, + []interface{}{int64(2), "a", []byte("bb")}, + []interface{}{int64(3), "c", []byte("bb")}, + } + + r2.RowDatas = []RowData{ + RowData([]byte("1")), + RowData([]byte("2")), + RowData([]byte("3")), + } + + if !reflect.DeepEqual(r1, r2) { + t.Fatal(fmt.Sprintf("%v %v", r1, r2)) + } + +} diff --git a/mysql/state.go b/mysql/state.go new file mode 100644 index 0000000..568d84b --- /dev/null +++ b/mysql/state.go @@ -0,0 +1,233 @@ +package mysql + +const ( + DEFAULT_MYSQL_STATE = "HY000" +) + +var MySQLState = map[uint16]string{ + ER_DUP_KEY: "23000", + ER_OUTOFMEMORY: "HY001", + ER_OUT_OF_SORTMEMORY: "HY001", + ER_CON_COUNT_ERROR: "08004", + ER_BAD_HOST_ERROR: "08S01", + ER_HANDSHAKE_ERROR: "08S01", + ER_DBACCESS_DENIED_ERROR: "42000", + ER_ACCESS_DENIED_ERROR: "28000", + ER_NO_DB_ERROR: "3D000", + ER_UNKNOWN_COM_ERROR: "08S01", + ER_BAD_NULL_ERROR: "23000", + ER_BAD_DB_ERROR: "42000", + ER_TABLE_EXISTS_ERROR: "42S01", + ER_BAD_TABLE_ERROR: "42S02", + ER_NON_UNIQ_ERROR: "23000", + ER_SERVER_SHUTDOWN: "08S01", + ER_BAD_FIELD_ERROR: "42S22", + ER_WRONG_FIELD_WITH_GROUP: "42000", + ER_WRONG_SUM_SELECT: "42000", + ER_WRONG_GROUP_FIELD: "42000", + ER_WRONG_VALUE_COUNT: "21S01", + ER_TOO_LONG_IDENT: "42000", + ER_DUP_FIELDNAME: "42S21", + ER_DUP_KEYNAME: "42000", + ER_DUP_ENTRY: "23000", + ER_WRONG_FIELD_SPEC: "42000", + ER_PARSE_ERROR: "42000", + ER_EMPTY_QUERY: "42000", + ER_NONUNIQ_TABLE: "42000", + ER_INVALID_DEFAULT: "42000", + ER_MULTIPLE_PRI_KEY: "42000", + ER_TOO_MANY_KEYS: "42000", + ER_TOO_MANY_KEY_PARTS: "42000", + ER_TOO_LONG_KEY: "42000", + ER_KEY_COLUMN_DOES_NOT_EXITS: "42000", + ER_BLOB_USED_AS_KEY: "42000", + ER_TOO_BIG_FIELDLENGTH: "42000", + ER_WRONG_AUTO_KEY: "42000", + ER_FORCING_CLOSE: "08S01", + ER_IPSOCK_ERROR: "08S01", + ER_NO_SUCH_INDEX: "42S12", + ER_WRONG_FIELD_TERMINATORS: "42000", + ER_BLOBS_AND_NO_TERMINATED: "42000", + ER_CANT_REMOVE_ALL_FIELDS: "42000", + ER_CANT_DROP_FIELD_OR_KEY: "42000", + ER_BLOB_CANT_HAVE_DEFAULT: "42000", + ER_WRONG_DB_NAME: "42000", + ER_WRONG_TABLE_NAME: "42000", + ER_TOO_BIG_SELECT: "42000", + ER_UNKNOWN_PROCEDURE: "42000", + ER_WRONG_PARAMCOUNT_TO_PROCEDURE: "42000", + ER_UNKNOWN_TABLE: "42S02", + ER_FIELD_SPECIFIED_TWICE: "42000", + ER_UNSUPPORTED_EXTENSION: "42000", + ER_TABLE_MUST_HAVE_COLUMNS: "42000", + ER_UNKNOWN_CHARACTER_SET: "42000", + ER_TOO_BIG_ROWSIZE: "42000", + ER_WRONG_OUTER_JOIN: "42000", + ER_NULL_COLUMN_IN_INDEX: "42000", + ER_PASSWORD_ANONYMOUS_USER: "42000", + ER_PASSWORD_NOT_ALLOWED: "42000", + ER_PASSWORD_NO_MATCH: "42000", + ER_WRONG_VALUE_COUNT_ON_ROW: "21S01", + ER_INVALID_USE_OF_NULL: "22004", + ER_REGEXP_ERROR: "42000", + ER_MIX_OF_GROUP_FUNC_AND_FIELDS: "42000", + ER_NONEXISTING_GRANT: "42000", + ER_TABLEACCESS_DENIED_ERROR: "42000", + ER_COLUMNACCESS_DENIED_ERROR: "42000", + ER_ILLEGAL_GRANT_FOR_TABLE: "42000", + ER_GRANT_WRONG_HOST_OR_USER: "42000", + ER_NO_SUCH_TABLE: "42S02", + ER_NONEXISTING_TABLE_GRANT: "42000", + ER_NOT_ALLOWED_COMMAND: "42000", + ER_SYNTAX_ERROR: "42000", + ER_ABORTING_CONNECTION: "08S01", + ER_NET_PACKET_TOO_LARGE: "08S01", + ER_NET_READ_ERROR_FROM_PIPE: "08S01", + ER_NET_FCNTL_ERROR: "08S01", + ER_NET_PACKETS_OUT_OF_ORDER: "08S01", + ER_NET_UNCOMPRESS_ERROR: "08S01", + ER_NET_READ_ERROR: "08S01", + ER_NET_READ_INTERRUPTED: "08S01", + ER_NET_ERROR_ON_WRITE: "08S01", + ER_NET_WRITE_INTERRUPTED: "08S01", + ER_TOO_LONG_STRING: "42000", + ER_TABLE_CANT_HANDLE_BLOB: "42000", + ER_TABLE_CANT_HANDLE_AUTO_INCREMENT: "42000", + ER_WRONG_COLUMN_NAME: "42000", + ER_WRONG_KEY_COLUMN: "42000", + ER_DUP_UNIQUE: "23000", + ER_BLOB_KEY_WITHOUT_LENGTH: "42000", + ER_PRIMARY_CANT_HAVE_NULL: "42000", + ER_TOO_MANY_ROWS: "42000", + ER_REQUIRES_PRIMARY_KEY: "42000", + ER_KEY_DOES_NOT_EXITS: "42000", + ER_CHECK_NO_SUCH_TABLE: "42000", + ER_CHECK_NOT_IMPLEMENTED: "42000", + ER_CANT_DO_THIS_DURING_AN_TRANSACTION: "25000", + ER_NEW_ABORTING_CONNECTION: "08S01", + ER_MASTER_NET_READ: "08S01", + ER_MASTER_NET_WRITE: "08S01", + ER_TOO_MANY_USER_CONNECTIONS: "42000", + ER_READ_ONLY_TRANSACTION: "25000", + ER_NO_PERMISSION_TO_CREATE_USER: "42000", + ER_LOCK_DEADLOCK: "40001", + ER_NO_REFERENCED_ROW: "23000", + ER_ROW_IS_REFERENCED: "23000", + ER_CONNECT_TO_MASTER: "08S01", + ER_WRONG_NUMBER_OF_COLUMNS_IN_SELECT: "21000", + ER_USER_LIMIT_REACHED: "42000", + ER_SPECIFIC_ACCESS_DENIED_ERROR: "42000", + ER_NO_DEFAULT: "42000", + ER_WRONG_VALUE_FOR_VAR: "42000", + ER_WRONG_TYPE_FOR_VAR: "42000", + ER_CANT_USE_OPTION_HERE: "42000", + ER_NOT_SUPPORTED_YET: "42000", + ER_WRONG_FK_DEF: "42000", + ER_OPERAND_COLUMNS: "21000", + ER_SUBQUERY_NO_1_ROW: "21000", + ER_ILLEGAL_REFERENCE: "42S22", + ER_DERIVED_MUST_HAVE_ALIAS: "42000", + ER_SELECT_REDUCED: "01000", + ER_TABLENAME_NOT_ALLOWED_HERE: "42000", + ER_NOT_SUPPORTED_AUTH_MODE: "08004", + ER_SPATIAL_CANT_HAVE_NULL: "42000", + ER_COLLATION_CHARSET_MISMATCH: "42000", + ER_WARN_TOO_FEW_RECORDS: "01000", + ER_WARN_TOO_MANY_RECORDS: "01000", + ER_WARN_NULL_TO_NOTNULL: "22004", + ER_WARN_DATA_OUT_OF_RANGE: "22003", + WARN_DATA_TRUNCATED: "01000", + ER_WRONG_NAME_FOR_INDEX: "42000", + ER_WRONG_NAME_FOR_CATALOG: "42000", + ER_UNKNOWN_STORAGE_ENGINE: "42000", + ER_TRUNCATED_WRONG_VALUE: "22007", + ER_SP_NO_RECURSIVE_CREATE: "2F003", + ER_SP_ALREADY_EXISTS: "42000", + ER_SP_DOES_NOT_EXIST: "42000", + ER_SP_LILABEL_MISMATCH: "42000", + ER_SP_LABEL_REDEFINE: "42000", + ER_SP_LABEL_MISMATCH: "42000", + ER_SP_UNINIT_VAR: "01000", + ER_SP_BADSELECT: "0A000", + ER_SP_BADRETURN: "42000", + ER_SP_BADSTATEMENT: "0A000", + ER_UPDATE_LOG_DEPRECATED_IGNORED: "42000", + ER_UPDATE_LOG_DEPRECATED_TRANSLATED: "42000", + ER_QUERY_INTERRUPTED: "70100", + ER_SP_WRONG_NO_OF_ARGS: "42000", + ER_SP_COND_MISMATCH: "42000", + ER_SP_NORETURN: "42000", + ER_SP_NORETURNEND: "2F005", + ER_SP_BAD_CURSOR_QUERY: "42000", + ER_SP_BAD_CURSOR_SELECT: "42000", + ER_SP_CURSOR_MISMATCH: "42000", + ER_SP_CURSOR_ALREADY_OPEN: "24000", + ER_SP_CURSOR_NOT_OPEN: "24000", + ER_SP_UNDECLARED_VAR: "42000", + ER_SP_FETCH_NO_DATA: "02000", + ER_SP_DUP_PARAM: "42000", + ER_SP_DUP_VAR: "42000", + ER_SP_DUP_COND: "42000", + ER_SP_DUP_CURS: "42000", + ER_SP_SUBSELECT_NYI: "0A000", + ER_STMT_NOT_ALLOWED_IN_SF_OR_TRG: "0A000", + ER_SP_VARCOND_AFTER_CURSHNDLR: "42000", + ER_SP_CURSOR_AFTER_HANDLER: "42000", + ER_SP_CASE_NOT_FOUND: "20000", + ER_DIVISION_BY_ZERO: "22012", + ER_ILLEGAL_VALUE_FOR_TYPE: "22007", + ER_PROCACCESS_DENIED_ERROR: "42000", + ER_XAER_NOTA: "XAE04", + ER_XAER_INVAL: "XAE05", + ER_XAER_RMFAIL: "XAE07", + ER_XAER_OUTSIDE: "XAE09", + ER_XAER_RMERR: "XAE03", + ER_XA_RBROLLBACK: "XA100", + ER_NONEXISTING_PROC_GRANT: "42000", + ER_DATA_TOO_LONG: "22001", + ER_SP_BAD_SQLSTATE: "42000", + ER_CANT_CREATE_USER_WITH_GRANT: "42000", + ER_SP_DUP_HANDLER: "42000", + ER_SP_NOT_VAR_ARG: "42000", + ER_SP_NO_RETSET: "0A000", + ER_CANT_CREATE_GEOMETRY_OBJECT: "22003", + ER_TOO_BIG_SCALE: "42000", + ER_TOO_BIG_PRECISION: "42000", + ER_M_BIGGER_THAN_D: "42000", + ER_TOO_LONG_BODY: "42000", + ER_TOO_BIG_DISPLAYWIDTH: "42000", + ER_XAER_DUPID: "XAE08", + ER_DATETIME_FUNCTION_OVERFLOW: "22008", + ER_ROW_IS_REFERENCED_2: "23000", + ER_NO_REFERENCED_ROW_2: "23000", + ER_SP_BAD_VAR_SHADOW: "42000", + ER_SP_WRONG_NAME: "42000", + ER_SP_NO_AGGREGATE: "42000", + ER_MAX_PREPARED_STMT_COUNT_REACHED: "42000", + ER_NON_GROUPING_FIELD_USED: "42000", + ER_FOREIGN_DUPLICATE_KEY_OLD_UNUSED: "23000", + ER_CANT_CHANGE_TX_CHARACTERISTICS: "25001", + ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT: "42000", + ER_WRONG_PARAMETERS_TO_NATIVE_FCT: "42000", + ER_WRONG_PARAMETERS_TO_STORED_FCT: "42000", + ER_DUP_ENTRY_WITH_KEY_NAME: "23000", + ER_XA_RBTIMEOUT: "XA106", + ER_XA_RBDEADLOCK: "XA102", + ER_FUNC_INEXISTENT_NAME_COLLISION: "42000", + ER_DUP_SIGNAL_SET: "42000", + ER_SIGNAL_WARN: "01000", + ER_SIGNAL_NOT_FOUND: "02000", + ER_SIGNAL_EXCEPTION: "HY000", + ER_RESIGNAL_WITHOUT_ACTIVE_HANDLER: "0K000", + ER_SPATIAL_MUST_HAVE_GEOM_COL: "42000", + ER_DATA_OUT_OF_RANGE: "22003", + ER_ACCESS_DENIED_NO_PASSWORD_ERROR: "28000", + ER_TRUNCATE_ILLEGAL_FK: "42000", + ER_DA_INVALID_CONDITION_NUMBER: "35000", + ER_FOREIGN_DUPLICATE_KEY_WITH_CHILD_INFO: "23000", + ER_FOREIGN_DUPLICATE_KEY_WITHOUT_CHILD_INFO: "23000", + ER_CANT_EXECUTE_IN_READ_ONLY_TRANSACTION: "25006", + ER_ALTER_OPERATION_NOT_SUPPORTED: "0A000", + ER_ALTER_OPERATION_NOT_SUPPORTED_REASON: "0A000", + ER_DUP_UNKNOWN_IN_INDEX: "23000", +} diff --git a/mysql/util.go b/mysql/util.go new file mode 100644 index 0000000..19455d9 --- /dev/null +++ b/mysql/util.go @@ -0,0 +1,308 @@ +package mysql + +import ( + "crypto/rand" + "crypto/sha1" + "encoding/binary" + "fmt" + "io" + "runtime" + "unicode/utf8" +) + +func Pstack() string { + buf := make([]byte, 1024) + n := runtime.Stack(buf, false) + return string(buf[0:n]) +} + +func CalcPassword(scramble, password []byte) []byte { + if len(password) == 0 { + return nil + } + + // stage1Hash = SHA1(password) + crypt := sha1.New() + crypt.Write(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 +} + +func RandomBuf(size int) ([]byte, error) { + buf := make([]byte, size) + + if _, err := io.ReadFull(rand.Reader, buf); err != nil { + return nil, err + } + + for i, b := range buf { + if uint8(b) == 0 { + buf[i] = '0' + } + } + return buf, nil +} + +func LengthEncodedInt(b []byte) (num uint64, isNull bool, n int) { + switch b[0] { + + // 251: NULL + case 0xfb: + n = 1 + isNull = true + return + + // 252: value of following 2 + case 0xfc: + num = uint64(b[1]) | uint64(b[2])<<8 + n = 3 + return + + // 253: value of following 3 + case 0xfd: + num = uint64(b[1]) | uint64(b[2])<<8 | uint64(b[3])<<16 + n = 4 + return + + // 254: value of following 8 + case 0xfe: + num = 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 + n = 9 + return + } + + // 0-250: value of first byte + num = uint64(b[0]) + n = 1 + return +} + +func PutLengthEncodedInt(n uint64) []byte { + switch { + case n <= 250: + return []byte{byte(n)} + + case n <= 0xffff: + return []byte{0xfc, byte(n), byte(n >> 8)} + + case n <= 0xffffff: + return []byte{0xfd, byte(n), byte(n >> 8), byte(n >> 16)} + + case n <= 0xffffffffffffffff: + return []byte{0xfe, byte(n), byte(n >> 8), byte(n >> 16), byte(n >> 24), + byte(n >> 32), byte(n >> 40), byte(n >> 48), byte(n >> 56)} + } + return nil +} + +func LengthEnodedString(b []byte) ([]byte, bool, int, error) { + // Get length + num, isNull, n := LengthEncodedInt(b) + if num < 1 { + return nil, isNull, n, nil + } + + n += int(num) + + // Check data length + if len(b) >= n { + return b[n-int(num) : n], false, n, nil + } + return nil, false, n, io.EOF +} + +func SkipLengthEnodedString(b []byte) (int, error) { + // Get length + num, _, n := LengthEncodedInt(b) + if num < 1 { + return n, nil + } + + n += int(num) + + // Check data length + if len(b) >= n { + return n, nil + } + return n, io.EOF +} + +func PutLengthEncodedString(b []byte) []byte { + data := make([]byte, 0, len(b)+9) + data = append(data, PutLengthEncodedInt(uint64(len(b)))...) + data = append(data, b...) + return data +} + +func Uint16ToBytes(n uint16) []byte { + return []byte{ + byte(n), + byte(n >> 8), + } +} + +func Uint32ToBytes(n uint32) []byte { + return []byte{ + byte(n), + byte(n >> 8), + byte(n >> 16), + byte(n >> 24), + } +} + +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 FormatBinaryDate(n int, data []byte) ([]byte, error) { + switch n { + case 0: + return []byte("0000-00-00"), nil + case 4: + return []byte(fmt.Sprintf("%04d-%02d-%02d", + binary.LittleEndian.Uint16(data[:2]), + data[2], + data[3])), nil + default: + return nil, fmt.Errorf("invalid date packet length %d", n) + } +} + +func FormatBinaryDateTime(n int, data []byte) ([]byte, error) { + switch n { + case 0: + return []byte("0000-00-00 00:00:00"), nil + case 4: + return []byte(fmt.Sprintf("%04d-%02d-%02d 00:00:00", + binary.LittleEndian.Uint16(data[:2]), + data[2], + data[3])), nil + case 7: + return []byte(fmt.Sprintf( + "%04d-%02d-%02d %02d:%02d:%02d", + binary.LittleEndian.Uint16(data[:2]), + data[2], + data[3], + data[4], + data[5], + data[6])), nil + case 11: + return []byte(fmt.Sprintf( + "%04d-%02d-%02d %02d:%02d:%02d.%06d", + binary.LittleEndian.Uint16(data[:2]), + data[2], + data[3], + data[4], + data[5], + data[6], + binary.LittleEndian.Uint32(data[7:11]))), nil + default: + return nil, fmt.Errorf("invalid datetime packet length %d", n) + } +} + +func FormatBinaryTime(n int, data []byte) ([]byte, error) { + if n == 0 { + return []byte("0000-00-00"), nil + } + + var sign byte + if data[0] == 1 { + sign = byte('-') + } + + switch n { + case 8: + return []byte(fmt.Sprintf( + "%c%02d:%02d:%02d", + sign, + uint16(data[1])*24+uint16(data[5]), + data[6], + data[7], + )), nil + case 12: + return []byte(fmt.Sprintf( + "%c%02d:%02d:%02d.%06d", + sign, + uint16(data[1])*24+uint16(data[5]), + data[6], + data[7], + binary.LittleEndian.Uint32(data[8:12]), + )), nil + default: + return nil, fmt.Errorf("invalid time packet length %d", n) + } +} + +var ( + DONTESCAPE = byte(255) + + EncodeMap [256]byte +) + +func Escape(sql string) string { + dest := make([]byte, 0, 2*len(sql)) + + for i, w := 0, 0; i < len(sql); i += w { + runeValue, width := utf8.DecodeRuneInString(sql[i:]) + if c := EncodeMap[byte(runeValue)]; c == DONTESCAPE { + dest = append(dest, sql[i:i+width]...) + } else { + dest = append(dest, '\\', c) + } + w = width + } + + return string(dest) +} + +var encodeRef = map[byte]byte{ + '\x00': '0', + '\'': '\'', + '"': '"', + '\b': 'b', + '\n': 'n', + '\r': 'r', + '\t': 't', + 26: 'Z', // ctl-Z + '\\': '\\', +} + +func init() { + for i := range EncodeMap { + EncodeMap[i] = DONTESCAPE + } + for i := range EncodeMap { + if to, ok := encodeRef[byte(i)]; ok { + EncodeMap[byte(i)] = to + } + } +} diff --git a/pool/.gitignore b/pool/.gitignore new file mode 100644 index 0000000..f47cb20 --- /dev/null +++ b/pool/.gitignore @@ -0,0 +1 @@ +*.out diff --git a/pool/slice.go b/pool/slice.go new file mode 100644 index 0000000..a5d9623 --- /dev/null +++ b/pool/slice.go @@ -0,0 +1,101 @@ +package pool + +import ( + "reflect" + "sync" +) + +const maxSliceType = 16 +const minSliceSize = 1 << 3 // 8 len slice +const maxSliceSize = 1 << maxSliceType // 64k len slice + +type ( + PoolI interface { + Borrow(size int) interface{} + Return(b interface{}) + } + + // SliceSyncPool holds bufs. + syncPool struct { + capV int + lenV int + *sync.Pool + } + + SliceSyncPool struct { + pools []*syncPool + + New func(l int, c int) interface{} + checkType func(interface{}) bool + } +) + +func newSyncPool(NewFunc func(l int, c int) interface{}, lv int, cv int) *syncPool { + p := new(syncPool) + p.capV = cv + p.lenV = lv + p.Pool = &sync.Pool{New: func() interface{} { return NewFunc(p.lenV, p.capV) }} + return p +} + +func NewSliceSyncPool(NewFunc func(l int, c int) interface{}, check func(interface{}) bool) *SliceSyncPool { + p := new(SliceSyncPool) + + p.New = NewFunc + p.checkType = check + + p.pools = make([]*syncPool, maxSliceType+1) + min := floorlog2(minSliceSize) + max := floorlog2(maxSliceSize) + for i := min; i <= max; i++ { + // return 2^i size slice + p.pools[i] = newSyncPool(NewFunc, 0, 1< maxSliceSize { + return p.New(size, 2*size) + } else if size < minSliceSize { + // small than 8 len's slice all return 8 cap interface{} + ret = p.borrow(floorlog2(minSliceSize)) + } else { + idx := floorlog2(uint(size)) + if 1< maxSliceSize || v.Cap() < minSliceSize { + return // too big or too small, let it go + } + + idx := floorlog2(uint(v.Cap())) + rs := 1 << uint(idx) + p.pools[idx].Put(v.Slice3(0, rs, rs).Interface()) +} diff --git a/pool/slice1.go b/pool/slice1.go new file mode 100644 index 0000000..c014661 --- /dev/null +++ b/pool/slice1.go @@ -0,0 +1,88 @@ +package pool + +import ( + "reflect" +) + +const cacheSliceCap = 10240 + +type ( + // SlicePool holds bufs. + SlicePool struct { + pools []chan interface{} + + New func(l int, c int) interface{} + checkType func(interface{}) bool + } +) + +func NewSlicePool(NewFunc func(l int, c int) interface{}, check func(i interface{}) bool) *SlicePool { + p := new(SlicePool) + + p.New = NewFunc + p.checkType = check + + p.pools = make([]chan interface{}, maxSliceType+1) + min := floorlog2(minSliceSize) + max := floorlog2(maxSliceSize) + for i := min; i <= max; i++ { + // return 2^i size slice + p.pools[i] = make(chan interface{}, cacheSliceCap) + } + + return p +} + +// borrow a buf from the pool. +func (p *SlicePool) Borrow(size int) interface{} { + + var ret interface{} + + if size > maxSliceSize { + return p.New(size, 2*size) + } else if size < minSliceSize { + // small than 8 len's slice all return 8 cap interface{} + ret = p.borrow(floorlog2(minSliceSize)) + } else { + idx := floorlog2(uint(size)) + if 1< maxSliceSize || v.Cap() < minSliceSize { + return // too big or too small, let it go + } + + idx := floorlog2(uint(v.Cap())) + rs := 1 << uint(idx) + select { + case p.pools[idx] <- v.Slice3(0, rs, rs).Interface(): + default: + // let it go, let it go + } +} diff --git a/pool/slice1_test.go b/pool/slice1_test.go new file mode 100644 index 0000000..d330da4 --- /dev/null +++ b/pool/slice1_test.go @@ -0,0 +1,82 @@ +package pool + +import ( + "math/rand" + "testing" +) + +func TestChanPoolConsist(t *testing.T) { + + isPool := NewSlicePool( + func(l int, c int) interface{} { return make([]int, l, c) }, + checkInts, + ) + + testPoolConsist(isPool, t) +} + +func TestHugePool(t *testing.T) { + isPool := NewSlicePool( + func(l int, c int) interface{} { return make([]int, l, c) }, + checkInts, + ) + + testHugePool(isPool, t) +} + +func TestPoolEdgeCondition(t *testing.T) { + bsPool := NewSlicePool( + func(l int, c int) interface{} { return make([]byte, l, c) }, + checkBytes, + ) + + testPoolEdgeCondition(bsPool, t) +} + +func TestDifferentTypePanic(t *testing.T) { + + bsPool := NewSlicePool( + func(l int, c int) interface{} { return make([]byte, l, c) }, + checkBytes, + ) + + testDifferentTypePanic(bsPool, t) +} +func TestPoolFull(t *testing.T) { + + bsPool := NewSlicePool( + func(l int, c int) interface{} { return make([]byte, l, c) }, + checkBytes, + ) + + for i := 0; i <= cacheSliceCap+1; i++ { + bsPool.Return(make([]byte, 0, 8)) + } +} + +func BenchmarkSliceBorrowReturn(t *testing.B) { + + bytesPool := NewSlicePool( + func(l int, c int) interface{} { return make([]byte, l, c) }, + checkBytes, + ) + + for i := 0; i < t.N; i++ { + size := rand.Intn(maxSliceSize) + if size == 0 { + continue + } + + v := bytesPool.Borrow(size) + b, ok := v.([]byte) + if !ok { + t.Fatal(v, "is not slice type!") + } + + if len(b) != size || cap(b) < len(b) { + t.Fatal("length:", len(b), "is less than cap:", cap(b)) + } else { + bytesPool.Return(b) + } + } +} diff --git a/pool/slice_test.go b/pool/slice_test.go new file mode 100644 index 0000000..543d479 --- /dev/null +++ b/pool/slice_test.go @@ -0,0 +1,168 @@ +package pool + +import ( + "math/rand" + "reflect" + "testing" + "unsafe" +) + +func getBytes(i interface{}, tb testing.TB) []byte { + var b []byte + var ok bool + if b, ok = i.([]byte); !ok { + tb.Fatal(i, "is not bytes slice type!") + } + return b +} + +func getInts(i interface{}, tb testing.TB) []int { + var b []int + var ok bool + if b, ok = i.([]int); !ok { + tb.Fatal(i, "is not int slice type!") + } + return b +} + +func checkBytes(i interface{}) bool { + _, ok := i.([]byte) + return ok +} + +func checkInts(i interface{}) bool { + _, ok := i.([]int) + return ok +} + +func TestSyncPoolConsist(t *testing.T) { + + isSyncPool := NewSliceSyncPool( + func(l int, c int) interface{} { return make([]int, l, c) }, + checkInts, + ) + + testPoolConsist(isSyncPool, t) +} + +func testPoolConsist(isPool PoolI, t testing.TB) { + + contents := [8]int{1, 2, 3, 4, 5, 6, 7, 8} + b := getInts(isPool.Borrow(0), t) + b = append(b, contents[:]...) + isPool.Return(b) + + nb := getInts(isPool.Borrow(8), t) + + if (*reflect.SliceHeader)(unsafe.Pointer(&nb)).Data != (*reflect.SliceHeader)(unsafe.Pointer(&b)).Data { + t.Fatal("not the same underly buffer!") + } +} + +func TestSyncHugePool(t *testing.T) { + isSyncPool := NewSliceSyncPool( + func(l int, c int) interface{} { return make([]int, l, c) }, + checkInts, + ) + + testHugePool(isSyncPool, t) +} + +func testHugePool(isPool PoolI, tb testing.TB) { + b := getInts(isPool.Borrow(maxSliceSize+1), tb) + isPool.Return(b) // should not pool this really big buffer + + nb := getInts(isPool.Borrow(maxSliceSize), tb) + if (*reflect.SliceHeader)(unsafe.Pointer(&nb)).Data == (*reflect.SliceHeader)(unsafe.Pointer(&b)).Data { + tb.Fatal("these two buffer should be different underly array!") + } +} + +func TestSyncPoolEdgeCondition(t *testing.T) { + bsSyncPool := NewSliceSyncPool( + func(l int, c int) interface{} { return make([]byte, l, c) }, + checkBytes, + ) + + testPoolEdgeCondition(bsSyncPool, t) +} + +func testPoolEdgeCondition(bsSyncPool PoolI, t testing.TB) { + + for i := 1; i <= minSliceSize; i++ { + s := bsSyncPool.Borrow(i) + b := getBytes(s, t) + + if len(b) != i { + t.Fatal("len:", len(b), "not match required size:", i) + } + + if cap(b) != minSliceSize { + t.Fatal("cap:", cap(b), "not match minSliceSize:", minSliceSize) + } + + bsSyncPool.Return(b) + } + + for i := minSliceSize + 1; i <= maxSliceSize; i++ { + s := bsSyncPool.Borrow(i) + b := getBytes(s, t) + + if len(b) != i { + t.Fatal("len:", len(b), "not match required size:", i) + } + + fl := floorlog2(uint(i)) + if 1< 1 { + size >>= 1 + idx++ + } + return idx +} diff --git a/proxy/auth.go b/proxy/auth.go new file mode 100644 index 0000000..7fe3a45 --- /dev/null +++ b/proxy/auth.go @@ -0,0 +1,57 @@ +package proxy + +import ( + "fmt" +) + +type userAuth struct { + Map map[string]*passDB +} + +func newUserAuth() *userAuth { + s := new(userAuth) + s.Map = make(map[string]*passDB) + return s +} + +type passDB struct { + DB map[string]string +} + +func newPassDB() *passDB { + pass := new(passDB) + pass.DB = make(map[string]string) + return pass +} + +func (s *passDB) add(user string, passwd string, db string) error { + if _, ok := s.DB[passwd]; ok { + return fmt.Errorf("user[%s] with same passwd has multi db, this is forbidden!") + } + + s.DB[passwd] = db + return nil +} + +func (s *Server) getUserAuth(user string) *passDB { + return s.users.Map[user] +} + +func (s *Server) parseUserAuths() error { + uas := newUserAuth() + for _, schemaCfg := range s.cfg.Schemas { + for _, auth := range schemaCfg.Auths { + if _, ok := uas.Map[auth.User]; !ok { + uas.Map[auth.User] = newPassDB() + } + + if err := uas.Map[auth.User].add(auth.User, auth.Passwd, schemaCfg.DB); err != nil { + return err + } + } + } + + s.users = uas + + return nil +} diff --git a/proxy/conn.go b/proxy/conn.go new file mode 100644 index 0000000..ef9c191 --- /dev/null +++ b/proxy/conn.go @@ -0,0 +1,398 @@ +package proxy + +import ( + "bytes" + "encoding/binary" + "fmt" + "github.com/wangjild/go-mysql-proxy/client" + "github.com/wangjild/go-mysql-proxy/hack" + . "github.com/wangjild/go-mysql-proxy/log" + . "github.com/wangjild/go-mysql-proxy/mysql" + "net" + // "runtime" + "sync" + "sync/atomic" +) + +var DEFAULT_CAPABILITY uint32 = CLIENT_LONG_PASSWORD | CLIENT_LONG_FLAG | + CLIENT_CONNECT_WITH_DB | CLIENT_PROTOCOL_41 | + CLIENT_TRANSACTIONS | CLIENT_SECURE_CONNECTION + +//client <-> proxy +type Conn struct { + sync.Mutex + + pkg *PacketIO + + c net.Conn + + server *Server + + capability uint32 + + connectionId uint32 + + status uint16 + collation CollationId + charset string + + user string + possdbs []string + + salt []byte + + db string + schema *Schema + + txConns map[*Node]*client.SqlConn + + closed bool + + lastInsertId int64 + affectedRows int64 + + stmtId uint32 + + stmts map[uint32]*Stmt +} + +var baseConnId uint32 = 10000 + +func (s *Server) newConn(co net.Conn) *Conn { + c := new(Conn) + + c.c = co + + c.pkg = NewPacketIO(co) + + c.server = s + + c.c = co + c.pkg.Sequence = 0 + + c.connectionId = atomic.AddUint32(&baseConnId, 1) + + c.status = SERVER_STATUS_AUTOCOMMIT + + c.salt, _ = RandomBuf(20) + + c.txConns = make(map[*Node]*client.SqlConn) + + c.closed = false + + c.collation = DEFAULT_COLLATION_ID + c.charset = DEFAULT_CHARSET + + c.stmtId = 0 + c.stmts = make(map[uint32]*Stmt) + + return c +} + +func (c *Conn) Handshake() error { + if err := c.writeInitialHandshake(); err != nil { + AppLog.Warn("send initial handshake error %s", err.Error()) + return err + } + + if err := c.readHandshakeResponse(); err != nil { + AppLog.Warn("recv handshake response error %s", err.Error()) + + c.writeError(err) + + return err + } + + if err := c.writeOK(nil); err != nil { + AppLog.Warn("write ok fail %s", err.Error()) + return err + } + + c.pkg.Sequence = 0 + + return nil +} + +func (c *Conn) Close() error { + if c.closed { + return nil + } + + c.c.Close() + + c.rollback() + for _, s := range c.stmts { + s.Close() + } + + c.stmts = nil + + c.closed = true + + return nil +} + +func (c *Conn) writeInitialHandshake() error { + + // preserved for write head + data := make([]byte, 4, 128) + + //min version 10 + data = append(data, 10) + + //server version[00] + data = append(data, ServerVersion...) + data = append(data, 0) + + //connection id + data = append(data, byte(c.connectionId), byte(c.connectionId>>8), byte(c.connectionId>>16), byte(c.connectionId>>24)) + + //auth-plugin-data-part-1 + data = append(data, c.salt[0:8]...) + + //filter [00] + data = append(data, 0) + + //capability flag lower 2 bytes, using default capability here + data = append(data, byte(DEFAULT_CAPABILITY), byte(DEFAULT_CAPABILITY>>8)) + + //charset, utf-8 default + data = append(data, uint8(DEFAULT_COLLATION_ID)) + + //status + data = append(data, byte(c.status), byte(c.status>>8)) + + //below 13 byte may not be used + //capability flag upper 2 bytes, using default capability here + data = append(data, byte(DEFAULT_CAPABILITY>>16), byte(DEFAULT_CAPABILITY>>24)) + + //filter [0x15], for wireshark dump, value is 0x15 + data = append(data, 0x00) + + //reserved 10 [00] + data = append(data, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) + + //auth-plugin-data-part-2 + data = append(data, c.salt[8:]...) + + //filter [00] + data = append(data, 0) + + return c.writePacket(data) +} + +func (c *Conn) readPacket() ([]byte, error) { + return c.pkg.ReadPacket() +} + +func (c *Conn) writePacket(data []byte) error { + return c.pkg.WritePacket(data) +} + +func (c *Conn) readHandshakeResponse() error { + data, err := c.readPacket() + if err != nil { + return err + } + + pos := 0 + + //capability + c.capability = binary.LittleEndian.Uint32(data[:4]) + pos += 4 + + //skip max packet size + pos += 4 + + //charset, skip, if you want to use another charset, use set names + //c.collation = CollationId(data[pos]) + pos++ + + //skip reserved 23[00] + pos += 23 + + //user name + c.user = string(data[pos : pos+bytes.IndexByte(data[pos:], 0)]) + pos += len(c.user) + 1 + + //auth length and auth + authLen := int(data[pos]) + pos++ + auth := data[pos : pos+authLen] + pos += authLen + + if c.capability&CLIENT_CONNECT_WITH_DB == 0 { + AppLog.Debug("connect without db") + if err := c.checkAuth(auth); err != nil { + return err + } + } else { // connect with db + AppLog.Debug("connect with db") + if len(data[pos:]) == 0 { + return NewDefaultError(ER_ACCESS_DENIED_ERROR, c.c.RemoteAddr().String(), c.user, "Yes") + } + + db := string(data[pos : pos+bytes.IndexByte(data[pos:], 0)]) + pos += len(c.db) + 1 + + // check with db multi-user + if err := c.checkAuthWithDB(auth, db); err != nil { + return err + } + } + + return nil +} + +func (c *Conn) Run() { + defer func() { + /*r := recover() + if err, ok := r.(error); ok { + const size = 4096 + buf := make([]byte, size) + buf = buf[:runtime.Stack(buf, false)] + + AppLog.Warn("%v", err) + }*/ + + c.Close() + }() + + for { + data, err := c.readPacket() + if err != nil { + return + } + + if err := c.dispatch(data); err != nil { + AppLog.Warn("con[%d], dispatch error %s", c.connectionId, err.Error()) + if err != ErrBadConn { + c.writeError(err) + } + } + + if c.closed { + return + } + + c.pkg.Sequence = 0 + } +} + +func (c *Conn) dispatch(data []byte) error { + cmd := data[0] + data = data[1:] + + switch cmd { + case COM_QUIT: + c.Close() + return nil + case COM_QUERY: + return c.handleQuery(hack.String(data)) + case COM_PING: + return c.writeOK(nil) + case COM_INIT_DB: + if err := c.useDB(hack.String(data)); err != nil { + return err + } else { + return c.writeOK(nil) + } + case COM_FIELD_LIST: + return c.handleFieldList(data) + case COM_STMT_PREPARE: + return c.handleComStmtPrepare(hack.String(data)) + case COM_STMT_EXECUTE: + return c.handleComStmtExecute(data) + case COM_STMT_CLOSE: + return c.handleComStmtClose(data) + case COM_STMT_SEND_LONG_DATA: + return c.handleComStmtSendLongData(data) + case COM_STMT_RESET: + return c.handleComStmtReset(data) + default: + msg := fmt.Sprintf("command %d not supported now", cmd) + AppLog.Warn(msg) + return NewError(ER_UNKNOWN_ERROR, msg) + } + + return nil +} + +func (c *Conn) useDB(db string) error { + if s := c.server.getSchema(db); s == nil { + return NewDefaultError(ER_BAD_DB_ERROR, db) + } else { + c.schema = s + c.db = db + } + return nil +} + +func (c *Conn) writeOK(r *Result) error { + if r == nil { + r = &Result{Status: c.status} + } + data := make([]byte, 4, 32) + + data = append(data, OK_HEADER) + + data = append(data, PutLengthEncodedInt(r.AffectedRows)...) + data = append(data, PutLengthEncodedInt(r.InsertId)...) + + if c.capability&CLIENT_PROTOCOL_41 > 0 { + data = append(data, byte(r.Status), byte(r.Status>>8)) + data = append(data, byte(r.Warnings), byte(r.Warnings>>8)) + } + + return c.writePacket(data) +} + +func (c *Conn) writeError(e error) error { + var m *SqlError + var ok bool + if m, ok = e.(*SqlError); !ok { + m = NewError(ER_UNKNOWN_ERROR, e.Error()) + } + + data := make([]byte, 4, 16+len(m.Message)) + + data = append(data, ERR_HEADER) + data = append(data, byte(m.Code), byte(m.Code>>8)) + + if c.capability&CLIENT_PROTOCOL_41 > 0 { + data = append(data, '#') + data = append(data, m.State...) + } + + data = append(data, m.Message...) + + return c.writePacket(data) +} + +func (c *Conn) writeEOF(status uint16) error { + data := make([]byte, 4, 9) + + data = append(data, EOF_HEADER) + if c.capability&CLIENT_PROTOCOL_41 > 0 { + data = append(data, 0, 0) + data = append(data, byte(status), byte(status>>8)) + } + + return c.writePacket(data) +} + +func (c *Conn) IsAutoCommit() bool { + return c.status&SERVER_STATUS_AUTOCOMMIT > 0 +} + +func (c *Conn) checkDB() error { + if c.schema != nil { + return nil + } + + if c.db != "" { + return c.useDB(c.db) + } + + return NewDefaultError(ER_NO_DB_ERROR) +} diff --git a/proxy/conn_auth.go b/proxy/conn_auth.go new file mode 100644 index 0000000..661f76f --- /dev/null +++ b/proxy/conn_auth.go @@ -0,0 +1,44 @@ +package proxy + +import ( + "bytes" + . "github.com/wangjild/go-mysql-proxy/log" + . "github.com/wangjild/go-mysql-proxy/mysql" +) + +func (c *Conn) checkAuth(auth []byte) error { + AppLog.Debug("checkAuth") + auths := c.server.getUserAuth(c.user) + if auths == nil { + AppLog.Warn("connect without db, auths is nil") + return NewDefaultError(ER_ACCESS_DENIED_ERROR, c.c.RemoteAddr().String(), c.user, "Yes") + } + + for passwd, db := range auths.DB { + if bytes.Equal(auth, CalcPassword(c.salt, []byte(passwd))) { + // gotcha!!! + c.db = db + return nil + } + } + return NewDefaultError(ER_ACCESS_DENIED_ERROR, c.c.RemoteAddr().String(), c.user, "Yes") +} + +func (c *Conn) checkAuthWithDB(auth []byte, db string) error { + var s *Schema + if s = c.server.getSchema(db); s == nil { + return NewDefaultError(ER_BAD_DB_ERROR, db) + } + + if passwd, ok := s.auths[c.user]; !ok { + return NewDefaultError(ER_ACCESS_DENIED_ERROR, c.c.RemoteAddr().String(), c.user, "Yes") + } else if !bytes.Equal(auth, CalcPassword(c.salt, []byte(passwd))) { + return NewDefaultError(ER_ACCESS_DENIED_ERROR, c.c.RemoteAddr().String(), c.user, "Yes") + } + + if err := c.useDB(db); err != nil { + return err + } + + return nil +} diff --git a/proxy/conn_query.go b/proxy/conn_query.go new file mode 100644 index 0000000..9efa28b --- /dev/null +++ b/proxy/conn_query.go @@ -0,0 +1,166 @@ +package proxy + +import ( + "fmt" + "github.com/wangjild/go-mysql-proxy/client" + "github.com/wangjild/go-mysql-proxy/hack" + . "github.com/wangjild/go-mysql-proxy/mysql" + "github.com/wangjild/go-mysql-proxy/sql" +) + +func (c *Conn) handleQuery(sqlstmt string) (err error) { + /*defer func() { + if e := recover(); e != nil { + err = fmt.Errorf("execute %s error %v", sql, e) + return + } + }()*/ + + var stmt sql.IStatement + stmt, err = sql.Parse(sqlstmt) + if err != nil { + return fmt.Errorf(`parse sql "%s" error "%s"`, sqlstmt, err.Error()) + } + + switch v := stmt.(type) { + case sql.ISelect: + return c.handleSelect(v, sqlstmt) + case *sql.Insert: + return c.handleExec(stmt, sqlstmt, false) + case *sql.Update: + return c.handleExec(stmt, sqlstmt, false) + case *sql.Delete: + return c.handleExec(stmt, sqlstmt, false) + case *sql.Replace: + return c.handleExec(stmt, sqlstmt, false) + case *sql.Set: + return c.handleSet(v, sqlstmt) + case *sql.Begin: + return c.handleBegin() + case *sql.Commit: + return c.handleCommit() + case *sql.Rollback: + return c.handleRollback() + case sql.IShow: + return c.handleShow(sqlstmt, v) + case sql.IDDLStatement: + return c.handleExec(stmt, sqlstmt, false) + case *sql.Do: + return c.handleExec(stmt, sqlstmt, false) + case *sql.Call: + return c.handleExec(stmt, sqlstmt, false) + case *sql.Use: + if err := c.useDB(hack.String(stmt.(*sql.Use).DB)); err != nil { + return err + } else { + return c.writeOK(nil) + } + + default: + return fmt.Errorf("statement %T[%s] not support now", stmt, sqlstmt) + } + + return nil +} + +func (c *Conn) getConn(n *Node, isSelect bool) (co *client.SqlConn, err error) { + if !c.needBeginTx() { + if isSelect { + co, err = n.getSelectConn() + } else { + co, err = n.getMasterConn() + } + if err != nil { + return + } + } else { + var ok bool + c.Lock() + co, ok = c.txConns[n] + c.Unlock() + + if !ok { + if co, err = n.getMasterConn(); err != nil { + return + } + + if err = co.SetAutocommit(c.IsAutoCommit()); err != nil { + return + } + + if err = co.Begin(); err != nil { + return + } + + c.Lock() + c.txConns[n] = co + c.Unlock() + } + } + + //todo, set conn charset, etc... + if err = co.UseDB(c.schema.db); err != nil { + return + } + + if err = co.SetCharset(c.charset); err != nil { + return + } + + return +} + +func (c *Conn) closeDBConn(co *client.SqlConn, rollback bool) { + // since we have DDL, and when server is not in autoCommit, + // we do not release the connection and will reuse it later + if c.isInTransaction() || !c.isAutoCommit() { + return + } + + if rollback { + co.Rollback() + } + + co.Close() +} + +func makeBindVars(args []interface{}) map[string]interface{} { + bindVars := make(map[string]interface{}, len(args)) + + for i, v := range args { + bindVars[fmt.Sprintf("v%d", i+1)] = v + } + + return bindVars +} + +func (c *Conn) handleExec(stmt sql.IStatement, sqlstmt string, isread bool) error { + + if err := c.checkDB(); err != nil { + return err + } + + conn, err := c.getConn(c.schema.node, isread) + if err != nil { + return err + } else if conn == nil { + return fmt.Errorf("no available connection") + } + + var rs *Result + rs, err = conn.Execute(sqlstmt) + + c.closeDBConn(conn, err != nil) + + if err == nil { + err = c.writeOK(rs) + } + + return err +} + +func (c *Conn) mergeSelectResult(rs *Result) error { + r := rs.Resultset + status := c.status | rs.Status + return c.writeResultset(status, r) +} diff --git a/proxy/conn_resultset.go b/proxy/conn_resultset.go new file mode 100644 index 0000000..227052c --- /dev/null +++ b/proxy/conn_resultset.go @@ -0,0 +1,140 @@ +package proxy + +import ( + "fmt" + "github.com/wangjild/go-mysql-proxy/hack" + . "github.com/wangjild/go-mysql-proxy/mysql" + "strconv" +) + +func formatValue(value interface{}) ([]byte, error) { + switch v := value.(type) { + case int8: + return strconv.AppendInt(nil, int64(v), 10), nil + case int16: + return strconv.AppendInt(nil, int64(v), 10), nil + case int32: + return strconv.AppendInt(nil, int64(v), 10), nil + case int64: + return strconv.AppendInt(nil, int64(v), 10), nil + case int: + return strconv.AppendInt(nil, int64(v), 10), nil + case uint8: + return strconv.AppendUint(nil, uint64(v), 10), nil + case uint16: + return strconv.AppendUint(nil, uint64(v), 10), nil + case uint32: + return strconv.AppendUint(nil, uint64(v), 10), nil + case uint64: + return strconv.AppendUint(nil, uint64(v), 10), nil + case uint: + return strconv.AppendUint(nil, uint64(v), 10), nil + case float32: + return strconv.AppendFloat(nil, float64(v), 'f', -1, 64), nil + case float64: + return strconv.AppendFloat(nil, float64(v), 'f', -1, 64), nil + case []byte: + return v, nil + case string: + return hack.Slice(v), nil + default: + return nil, fmt.Errorf("invalid type %T", value) + } +} + +func formatField(field *Field, value interface{}) error { + switch value.(type) { + case int8, int16, int32, int64, int: + field.Charset = 63 + field.Type = MYSQL_TYPE_LONGLONG + field.Flag = BINARY_FLAG | NOT_NULL_FLAG + case uint8, uint16, uint32, uint64, uint: + field.Charset = 63 + field.Type = MYSQL_TYPE_LONGLONG + field.Flag = BINARY_FLAG | NOT_NULL_FLAG | UNSIGNED_FLAG + case string, []byte: + field.Charset = 33 + field.Type = MYSQL_TYPE_VAR_STRING + default: + return fmt.Errorf("unsupport type %T for resultset", value) + } + return nil +} + +func (c *Conn) buildResultset(names []string, values [][]interface{}) (*Resultset, error) { + r := new(Resultset) + + r.Fields = make([]*Field, len(names)) + + var b []byte + var err error + + for i, vs := range values { + if len(vs) != len(r.Fields) { + return nil, fmt.Errorf("row %d has %d column not equal %d", i, len(vs), len(r.Fields)) + } + + var row []byte + for j, value := range vs { + if i == 0 { + field := &Field{} + r.Fields[j] = field + field.Name = hack.Slice(names[j]) + + if err = formatField(field, value); err != nil { + return nil, err + } + } + b, err = formatValue(value) + + if err != nil { + return nil, err + } + + row = append(row, PutLengthEncodedString(b)...) + } + + r.RowDatas = append(r.RowDatas, row) + } + + return r, nil +} + +func (c *Conn) writeResultset(status uint16, r *Resultset) error { + c.affectedRows = int64(-1) + + columnLen := PutLengthEncodedInt(uint64(len(r.Fields))) + + data := make([]byte, 4, 1024) + + data = append(data, columnLen...) + if err := c.writePacket(data); err != nil { + return err + } + + for _, v := range r.Fields { + data = data[0:4] + data = append(data, v.Dump()...) + if err := c.writePacket(data); err != nil { + return err + } + } + + if err := c.writeEOF(status); err != nil { + return err + } + + for _, v := range r.RowDatas { + data = data[0:4] + data = append(data, v...) + if err := c.writePacket(data); err != nil { + return err + } + } + + if err := c.writeEOF(status); err != nil { + return err + } + + return nil +} diff --git a/proxy/conn_select.go b/proxy/conn_select.go new file mode 100644 index 0000000..f97f40b --- /dev/null +++ b/proxy/conn_select.go @@ -0,0 +1,111 @@ +package proxy + +import ( + "bytes" + "fmt" + . "github.com/wangjild/go-mysql-proxy/mysql" + "github.com/wangjild/go-mysql-proxy/sql" +) + +func (c *Conn) buildSimpleSelectResult(value interface{}, name []byte, asName []byte) (*Resultset, error) { + field := &Field{} + + field.Name = name + + if asName != nil { + field.Name = asName + } + + field.OrgName = name + + formatField(field, value) + + r := &Resultset{Fields: []*Field{field}} + row, err := formatValue(value) + if err != nil { + return nil, err + } + r.RowDatas = append(r.RowDatas, PutLengthEncodedString(row)) + + return r, nil +} + +func (c *Conn) handleFieldList(data []byte) error { + index := bytes.IndexByte(data, 0x00) + table := string(data[0:index]) + wildcard := string(data[index+1:]) + + if c.schema == nil { + return NewDefaultError(ER_NO_DB_ERROR) + } + + co, err := c.schema.node.getMasterConn() + if err != nil { + return err + } + defer co.Close() + + if err = co.UseDB(c.schema.db); err != nil { + return err + } + + if fs, err := co.FieldList(table, wildcard); err != nil { + return err + } else { + return c.writeFieldList(c.status, fs) + } +} + +func (c *Conn) writeFieldList(status uint16, fs []*Field) error { + c.affectedRows = int64(-1) + + data := make([]byte, 4, 1024) + + for _, v := range fs { + data = data[0:4] + data = append(data, v.Dump()...) + if err := c.writePacket(data); err != nil { + return err + } + } + + if err := c.writeEOF(status); err != nil { + return err + } + return nil +} + +func (c *Conn) handleSelect(stmt sql.IStatement, sqlstmt string) error { + + if err := c.checkDB(); err != nil { + return err + } + + isread := false + if s, ok := stmt.(sql.ISelect); ok { + isread = !s.IsLocked() + } else if _, sok := stmt.(sql.IShow); sok { + isread = true + } + + conn, err := c.getConn(c.schema.node, isread) + + if err != nil { + return err + } else if conn == nil { + // r := c.newEmptyResultset(stmt) + // return c.writeResultset(c.status, r) + return fmt.Errorf("no available connection") + } + + var res *Result + res, err = conn.Execute(sqlstmt) + + c.closeDBConn(conn, false) + + if err == nil { + err = c.mergeSelectResult(res) + } + + return err +} diff --git a/proxy/conn_set.go b/proxy/conn_set.go new file mode 100644 index 0000000..65eb45e --- /dev/null +++ b/proxy/conn_set.go @@ -0,0 +1,90 @@ +package proxy + +import ( + "fmt" + . "github.com/wangjild/go-mysql-proxy/log" + . "github.com/wangjild/go-mysql-proxy/mysql" + "github.com/wangjild/go-mysql-proxy/sql" + "strings" +) + +func (c *Conn) handleSet(stmt *sql.Set, sql string) error { + if len(stmt.VarList) < 1 { + return fmt.Errorf("must set one item at least") + } + + var err error + for _, v := range stmt.VarList { + if strings.ToUpper(v.Name) == "AUTOCOMMIT" { + AppLog.Debug("handle autocommit") + err = c.handleSetAutoCommit(v.Value) + } + } + + if err != nil { + return err + } + return c.handleOtherSet(stmt, sql) +} + +func (c *Conn) handleSetAutoCommit(val sql.IExpr) error { + + var stmt *sql.Predicate + var ok bool + if stmt, ok = val.(*sql.Predicate); !ok { + return fmt.Errorf("set autocommit is not support for complicate expressions") + } + + switch value := stmt.Expr.(type) { + case sql.NumVal: + if i, err := value.ParseInt(); err != nil { + return err + } else if i == 1 { + c.status |= SERVER_STATUS_AUTOCOMMIT + AppLog.Debug("autocommit is set") + } else if i == 0 { + c.status &= ^SERVER_STATUS_AUTOCOMMIT + AppLog.Debug("auto commit is unset") + } else { + return fmt.Errorf("Variable 'autocommit' can't be set to the value of '%s'", i) + } + case sql.StrVal: + if s := value.Trim(); s == "" { + return fmt.Errorf("Variable 'autocommit' can't be set to the value of ''") + } else if us := strings.ToUpper(s); us == `ON` { + c.status |= SERVER_STATUS_AUTOCOMMIT + AppLog.Debug("auto commit is set") + } else if us == `OFF` { + c.status &= ^SERVER_STATUS_AUTOCOMMIT + AppLog.Debug("auto commit is unset") + } else { + return fmt.Errorf("Variable 'autocommit' can't be set to the value of '%s'", us) + } + default: + return fmt.Errorf("set autocommit error, value type is %T", val) + } + + return nil +} + +func (c *Conn) handleSetNames(val sql.IValExpr) error { + value, ok := val.(sql.StrVal) + if !ok { + return fmt.Errorf("set names charset error") + } + + charset := strings.ToLower(string(value)) + cid, ok := CharsetIds[charset] + if !ok { + return fmt.Errorf("invalid charset %s", charset) + } + + c.charset = charset + c.collation = cid + + return c.writeOK(nil) +} + +func (c *Conn) handleOtherSet(stmt sql.IStatement, sql string) error { + return c.handleExec(stmt, sql, false) +} diff --git a/proxy/conn_shard_test.go b/proxy/conn_shard_test.go new file mode 100644 index 0000000..b749535 --- /dev/null +++ b/proxy/conn_shard_test.go @@ -0,0 +1,339 @@ +package proxy + +import ( + "fmt" + "github.com/wangjild/go-mysql-proxy/mysql" + "reflect" + "testing" +) + +func testShard_Insert(t *testing.T, table string, node string, id int, str string) { + conn := newTestDBConn(t) + + s := fmt.Sprintf(`insert into %s (id, str) values (%d, "%s")`, table, id, str) + if r, err := conn.Execute(s); err != nil { + t.Fatal(s, err) + } else if r.AffectedRows != 1 { + t.Fatal(r.AffectedRows) + } + s = fmt.Sprintf(`select str from %s where id = %d`, table, id) + + n := newTestServer(t).nodes[node] + c, err := n.getMasterConn() + if err != nil { + t.Fatal(s, err) + } else { + if r, err := c.Execute(s); err != nil { + t.Fatal(s, err) + } else if v, _ := r.GetString(0, 0); v != str { + t.Fatal(s, v) + } + } + + if r, err := conn.Execute(s); err != nil { + t.Fatal(s, err) + } else if v, _ := r.GetString(0, 0); v != str { + t.Fatal(s, v) + } +} + +func testShard_Select(t *testing.T, table string, where string, strs ...string) { + sql := fmt.Sprintf("select str from %s where %s", table, where) + conn := newTestDBConn(t) + + r, err := conn.Execute(sql) + if err != nil { + t.Fatal(sql, err) + } else if r.RowNumber() != len(strs) { + t.Fatal(sql, r.RowNumber(), len(strs)) + } + + m := map[string]struct{}{} + for _, s := range strs { + m[s] = struct{}{} + } + + for i := 0; i < r.RowNumber(); i++ { + if v, err := r.GetString(i, 0); err != nil { + t.Fatal(sql, err) + } else if _, ok := m[v]; !ok { + t.Fatal(sql, v, "no in check strs") + } else { + delete(m, v) + } + } + + if len(m) != 0 { + t.Fatal(sql, "invalid select") + } +} + +func testShard_StmtInsert(t *testing.T, table string, node string, id int, str string) { + conn := newTestDBConn(t) + + s := fmt.Sprintf(`insert into %s (id, str) values (?, ?)`, table) + if r, err := conn.Execute(s, id, str); err != nil { + t.Fatal(s, err) + } else if r.AffectedRows != 1 { + t.Fatal(r.AffectedRows) + } + s = fmt.Sprintf(`select str from %s where id = ?`, table) + + n := newTestServer(t).nodes[node] + c, err := n.getMasterConn() + if err != nil { + t.Fatal(s, err) + } else { + if r, err := c.Execute(s, id); err != nil { + t.Fatal(s, err) + } else if v, _ := r.GetString(0, 0); v != str { + t.Fatal(s, v) + } + } + + if r, err := conn.Execute(s, id); err != nil { + t.Fatal(s, err) + } else if v, _ := r.GetString(0, 0); v != str { + t.Fatal(s, v) + } +} + +func testShard_StmtSelect(t *testing.T, table string, where string, args []interface{}, strs ...string) { + sql := fmt.Sprintf("select str from %s where %s", table, where) + conn := newTestDBConn(t) + + r, err := conn.Execute(sql, args...) + if err != nil { + t.Fatal(sql, err) + } else if r.RowNumber() != len(strs) { + t.Fatal(sql, r.RowNumber(), len(strs)) + } + + m := map[string]struct{}{} + for _, s := range strs { + m[s] = struct{}{} + } + + for i := 0; i < r.RowNumber(); i++ { + if v, err := r.GetString(i, 0); err != nil { + t.Fatal(sql, err) + } else if _, ok := m[v]; !ok { + t.Fatal(sql, v, "no in check strs") + } else { + delete(m, v) + } + } + + if len(m) != 0 { + t.Fatal(sql, "invalid select") + } +} + +func TestShard_DeleteHashTable(t *testing.T) { + s := `drop table if exists go_proxy_test_shard_hash` + + server := newTestServer(t) + + for _, n := range server.nodes { + if n.String() != "node2" && n.String() != "node3" { + continue + } + c, err := n.getMasterConn() + if err != nil { + t.Fatal(err) + } + + c.UseDB("go_proxy") + defer c.Close() + if _, err := c.Execute(s); err != nil { + t.Fatal(err) + } + + } +} + +func TestShard_CreateHashTable(t *testing.T) { + s := `CREATE TABLE IF NOT EXISTS go_proxy_test_shard_hash ( + id BIGINT(64) UNSIGNED NOT NULL, + str VARCHAR(256), + PRIMARY KEY (id) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8` + + server := newTestServer(t) + + for _, n := range server.nodes { + if n.String() != "node2" && n.String() != "node3" { + continue + } + c, err := n.getMasterConn() + if err != nil { + t.Fatal(err) + } + + c.UseDB("go_proxy") + defer c.Close() + if _, err := c.Execute(s); err != nil { + t.Fatal(err) + } + } +} + +func TestShard_Hash(t *testing.T) { + table := "go_proxy_test_shard_hash" + testShard_Insert(t, table, "node2", 0, "a") + testShard_Insert(t, table, "node3", 1, "b") + testShard_Insert(t, table, "node2", 2, "c") + testShard_Insert(t, table, "node3", 3, "d") + + testShard_Select(t, table, "id = 2", "c") + testShard_Select(t, table, "id = 2 or id = 3", "c", "d") + testShard_Select(t, table, "id = 2 and id = 3") + testShard_Select(t, table, "id in (0, 1, 3)", "a", "b", "d") + + testShard_StmtInsert(t, table, "node2", 10, "a") + testShard_StmtInsert(t, table, "node3", 11, "b") + testShard_StmtInsert(t, table, "node2", 12, "c") + testShard_StmtInsert(t, table, "node3", 13, "d") + + testShard_StmtSelect(t, table, "id = ?", []interface{}{12}, "c") + testShard_StmtSelect(t, table, "id = ? or id = ?", []interface{}{12, 13}, "c", "d") + testShard_StmtSelect(t, table, "id = ? and id = ?", []interface{}{12, 13}) + testShard_StmtSelect(t, table, "id in (?, ?, ?)", []interface{}{10, 11, 13}, "a", "b", "d") +} + +func testExecute(t *testing.T, sql string) *mysql.Result { + conn := newTestDBConn(t) + + r, err := conn.Execute(sql) + if err != nil { + t.Fatal(err) + } + + return r +} + +func testShared_SelectOrderBy(t *testing.T, table string, where string, v [][]interface{}) { + sql := fmt.Sprintf("select id, str from %s where %s", table, where) + + r := testExecute(t, sql) + + if !reflect.DeepEqual(r.Values, v) { + t.Fatal(fmt.Sprintf("%v != %v", r.Values, v)) + } +} + +func TestShard_HashOrderByLimit(t *testing.T) { + table := "go_proxy_test_shard_hash" + + testShard_Insert(t, table, "node2", 4, "a") + testShard_Insert(t, table, "node3", 5, "a") + testShard_Insert(t, table, "node2", 6, "b") + testShard_Insert(t, table, "node3", 7, "b") + + var v [][]interface{} + v = [][]interface{}{ + []interface{}{uint64(7), []byte("b")}, + []interface{}{uint64(6), []byte("b")}, + []interface{}{uint64(5), []byte("a")}, + []interface{}{uint64(4), []byte("a")}, + } + + testShared_SelectOrderBy(t, table, "id in (4,5,6,7) order by id desc", v) + + v = [][]interface{}{ + []interface{}{uint64(6), []byte("b")}, + []interface{}{uint64(7), []byte("b")}, + []interface{}{uint64(4), []byte("a")}, + []interface{}{uint64(5), []byte("a")}, + } + + testShared_SelectOrderBy(t, table, "id in (4,5,6,7) order by str desc, id asc", v) + + v = [][]interface{}{ + []interface{}{uint64(6), []byte("b")}, + []interface{}{uint64(7), []byte("b")}, + } + + testShared_SelectOrderBy(t, table, "id in (4,5,6,7) order by str desc, id asc limit 0, 2", v) + + v = [][]interface{}{ + []interface{}{uint64(5), []byte("a")}, + } + + testShared_SelectOrderBy(t, table, "id in (4,5,6,7) order by str desc, id asc limit 1, 2", v) + +} + +func TestShard_DeleteRangeTable(t *testing.T) { + s := `drop table if exists go_proxy_test_shard_range` + + server := newTestServer(t) + + for _, n := range server.nodes { + if n.String() != "node2" && n.String() != "node3" { + continue + } + c, err := n.getMasterConn() + if err != nil { + t.Fatal(err) + } + + c.UseDB("go_proxy") + defer c.Close() + if _, err := c.Execute(s); err != nil { + t.Fatal(err) + } + + } +} + +func TestShard_CreateRangeTable(t *testing.T) { + s := `CREATE TABLE IF NOT EXISTS go_proxy_test_shard_range ( + id BIGINT(64) UNSIGNED NOT NULL, + str VARCHAR(256), + PRIMARY KEY (id) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8` + + server := newTestServer(t) + + for _, n := range server.nodes { + if n.String() != "node2" && n.String() != "node3" { + continue + } + c, err := n.getMasterConn() + if err != nil { + t.Fatal(err) + } + + c.UseDB("go_proxy") + defer c.Close() + if _, err := c.Execute(s); err != nil { + t.Fatal(err) + } + + } +} + +func TestShard_Range(t *testing.T) { + table := "go_proxy_test_shard_range" + testShard_Insert(t, table, "node2", 0, "a") + testShard_Insert(t, table, "node3", 10000, "b") + testShard_StmtInsert(t, table, "node2", 2, "c") + testShard_StmtInsert(t, table, "node3", 10001, "d") + + testShard_Select(t, table, "id = 2", "c") + testShard_Select(t, table, "id = 2 or id = 10001", "c", "d") + testShard_Select(t, table, "id = 2 and id = 10001") + testShard_Select(t, table, "id in (0, 10000, 10001)", "a", "b", "d") + testShard_Select(t, table, "id < 1 or id >= 10000", "a", "b", "d") + testShard_Select(t, table, "id > 1 and id <= 10000", "b", "c") + testShard_Select(t, table, "id < 1 and id >= 10000") + + testShard_StmtSelect(t, table, "id = ?", []interface{}{2}, "c") + testShard_StmtSelect(t, table, "id = ? or id = ?", []interface{}{2, 10001}, "c", "d") + testShard_StmtSelect(t, table, "id = ? and id = ?", []interface{}{2, 10001}) + testShard_StmtSelect(t, table, "id in (?, ?, ?)", []interface{}{0, 10000, 10001}, "a", "b", "d") + testShard_StmtSelect(t, table, "id < ? or id >= ?", []interface{}{1, 10000}, "a", "b", "d") + testShard_StmtSelect(t, table, "id > ? and id <= ?", []interface{}{1, 10000}, "b", "c") + testShard_StmtSelect(t, table, "id < ? and id >= ?", []interface{}{1, 10000}) +} diff --git a/proxy/conn_show.go b/proxy/conn_show.go new file mode 100644 index 0000000..09fe5df --- /dev/null +++ b/proxy/conn_show.go @@ -0,0 +1,61 @@ +package proxy + +import ( + "github.com/wangjild/go-mysql-proxy/hack" + . "github.com/wangjild/go-mysql-proxy/mysql" + "github.com/wangjild/go-mysql-proxy/sql" +) + +func (c *Conn) handleShow(strsql string, stmt sql.IShow) error { + var err error + + switch stmt.(type) { + case *sql.ShowDatabases: + err = c.handleShowDatabases() + default: + err = c.handleSelect(stmt, strsql) + } + + return err + +} + +func (c *Conn) handleShowDatabases() error { + dbs := make([]interface{}, 0, len(c.server.schemas)) + for key := range c.server.schemas { + dbs = append(dbs, key) + } + + if r, err := c.buildSimpleShowResultset(dbs, "Database"); err != nil { + return err + } else { + return c.writeResultset(c.status, r) + } +} + +func (c *Conn) buildSimpleShowResultset(values []interface{}, name string) (*Resultset, error) { + + r := new(Resultset) + + field := &Field{} + + field.Name = hack.Slice(name) + field.Charset = 33 + field.Type = MYSQL_TYPE_VAR_STRING + + r.Fields = []*Field{field} + + var row []byte + var err error + + for _, value := range values { + row, err = formatValue(value) + if err != nil { + return nil, err + } + r.RowDatas = append(r.RowDatas, + PutLengthEncodedString(row)) + } + + return r, nil +} diff --git a/proxy/conn_stmt.go b/proxy/conn_stmt.go new file mode 100644 index 0000000..5b5f2c5 --- /dev/null +++ b/proxy/conn_stmt.go @@ -0,0 +1,269 @@ +package proxy + +import ( + "encoding/binary" + "fmt" + "github.com/wangjild/go-mysql-proxy/client" + . "github.com/wangjild/go-mysql-proxy/log" + . "github.com/wangjild/go-mysql-proxy/mysql" + "github.com/wangjild/go-mysql-proxy/sql" + "strconv" +) + +var paramFieldData []byte +var columnFieldData []byte + +func init() { + var p = &Field{Name: []byte("?")} + var c = &Field{} + + paramFieldData = p.Dump() + columnFieldData = c.Dump() +} + +type Stmt struct { + id uint32 + bid uint32 + + params int + types []byte + columns int + + args []interface{} + + s sql.IStatement + + sqlstmt string + + cstmt *client.Stmt +} + +func (s *Stmt) ClearParams() { + s.args = make([]interface{}, s.params) +} + +func (s *Stmt) Close() { + s.cstmt.Close(true) +} + +func (c *Conn) handleComStmtPrepare(sqlstmt string) error { + if c.schema == nil { + return NewDefaultError(ER_NO_DB_ERROR) + } + + s := new(Stmt) + + var err error + s.s, err = sql.Parse(sqlstmt) + if err != nil { + return fmt.Errorf(`prepare parse sql "%s" error`, sqlstmt) + } + + s.sqlstmt = sqlstmt + + var co *client.SqlConn + co, err = c.schema.node.getMasterConn() + // TODO tablename for select + if err != nil { + return fmt.Errorf("prepare error %s", err) + } + + if err = co.UseDB(c.schema.db); err != nil { + co.Close() + return fmt.Errorf("parepre error %s", err) + } + + if t, err := co.Prepare(sqlstmt); err != nil { + co.Close() + return fmt.Errorf("parepre error %s", err) + } else { + s.params = t.ParamNum() + s.types = make([]byte, 0, s.params*2) + s.columns = t.ColumnNum() + s.bid = t.ID() + s.cstmt = t + } + + s.id = c.stmtId + c.stmtId++ + + if err = c.writePrepare(s); err != nil { + return err + } + + s.ClearParams() + + c.stmts[s.id] = s + + return nil +} + +func (c *Conn) writePrepare(s *Stmt) error { + data := make([]byte, 4, 128) + + //status ok + data = append(data, 0) + //stmt id + data = append(data, Uint32ToBytes(s.id)...) + //number columns + data = append(data, Uint16ToBytes(uint16(s.columns))...) + //number params + data = append(data, Uint16ToBytes(uint16(s.params))...) + //filter [00] + data = append(data, 0) + //warning count + data = append(data, 0, 0) + + if err := c.writePacket(data); err != nil { + return err + } + + if s.params > 0 { + for i := 0; i < s.params; i++ { + data = data[0:4] + data = append(data, []byte(s.cstmt.ParamDefs[i])...) + + if err := c.writePacket(data); err != nil { + return err + } + } + + if err := c.writeEOF(c.status); err != nil { + return err + } + } + + if s.columns > 0 { + for i := 0; i < s.columns; i++ { + data = data[0:4] + data = append(data, []byte(s.cstmt.ColDefs[i])...) + + if err := c.writePacket(data); err != nil { + return err + } + } + + if err := c.writeEOF(c.status); err != nil { + return err + } + + } + return nil +} + +func (c *Conn) handleComStmtExecute(data []byte) error { + if len(data) < 9 { + AppLog.Warn("ErrMalFormPacket: length %d", len(data)) + return ErrMalformPacket + } + + pos := 0 + id := binary.LittleEndian.Uint32(data[0:4]) + pos += 4 + + s, ok := c.stmts[id] + if !ok { + return NewDefaultError(ER_UNKNOWN_STMT_HANDLER, + strconv.FormatUint(uint64(id), 10), "stmt_execute") + } + + flag := data[pos] + pos++ + + //now we only support CURSOR_TYPE_NO_CURSOR flag + if flag != 0 { + return NewError(ER_UNKNOWN_ERROR, fmt.Sprintf("unsupported flag %d", flag)) + } + + s.cstmt.SetAttr(flag) + + //skip iteration-count, always 1 + pos += 4 + + st, isread := s.s.(sql.ISelect) + if isread { + isread = (!st.IsLocked()) + } + err := c.handleStmtExec(s, data[pos:], isread) + + s.ClearParams() + + return err +} + +func (c *Conn) handleComStmtSendLongData(data []byte) error { + if len(data) < 6 { + AppLog.Warn("ErrMalFormPacket") + return ErrMalformPacket + } + + id := binary.LittleEndian.Uint32(data[0:4]) + + s, ok := c.stmts[id] + if !ok { + return NewDefaultError(ER_UNKNOWN_STMT_HANDLER, + strconv.FormatUint(uint64(id), 10), "stmt_send_longdata") + } + + paramId := binary.LittleEndian.Uint16(data[4:6]) + if paramId >= uint16(s.params) { + return NewDefaultError(ER_WRONG_ARGUMENTS, "stmt_send_longdata") + } + + s.cstmt.SendLongData(paramId, data[6:]) + return nil +} + +func (c *Conn) handleComStmtReset(data []byte) error { + if len(data) < 4 { + AppLog.Warn("ErrMalFormPacket") + return ErrMalformPacket + } + + id := binary.LittleEndian.Uint32(data[0:4]) + + s, ok := c.stmts[id] + if !ok { + return NewDefaultError(ER_UNKNOWN_STMT_HANDLER, + strconv.FormatUint(uint64(id), 10), "stmt_reset") + } + + if r, err := s.cstmt.Reset(); err != nil { + return err + } else { + s.ClearParams() + return c.writeOK(r) + } +} + +func (c *Conn) handleComStmtClose(data []byte) error { + if len(data) < 4 { + return nil + } + + id := binary.LittleEndian.Uint32(data[0:4]) + + if cstmt, ok := c.stmts[id]; ok { + cstmt.Close() + } + + delete(c.stmts, id) + + return nil +} + +// +func (c *Conn) handleStmtExec(prepared *Stmt, data []byte, resultSet bool) error { + + res, err := prepared.cstmt.Execute(data) + if err != nil { + return err + } + + if resultSet { + err = c.mergeSelectResult(res) + } else { + err = c.writeOK(res) + } + return err +} diff --git a/proxy/conn_stmt_test.go b/proxy/conn_stmt_test.go new file mode 100644 index 0000000..cb37a7f --- /dev/null +++ b/proxy/conn_stmt_test.go @@ -0,0 +1,286 @@ +package proxy + +import ( + "testing" +) + +func TestStmt_DropTable(t *testing.T) { + server := newTestServer(t) + n := server.nodes["node1"] + c, err := n.getMasterConn() + if err != nil { + t.Fatal(err) + } + c.UseDB("go_proxy") + if _, err := c.Execute(`drop table if exists go_proxy_test_proxy_stmt`); err != nil { + t.Fatal(err) + } + c.Close() +} + +func TestStmt_CreateTable(t *testing.T) { + str := `CREATE TABLE IF NOT EXISTS go_proxy_test_proxy_stmt ( + id BIGINT(64) UNSIGNED NOT NULL, + str VARCHAR(256), + f DOUBLE, + e enum("test1", "test2"), + u tinyint unsigned, + i tinyint, + PRIMARY KEY (id) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8` + + server := newTestServer(t) + n := server.nodes["node1"] + c, err := n.getMasterConn() + if err != nil { + t.Fatal(err) + } + + c.UseDB("go_proxy") + defer c.Close() + if _, err := c.Execute(str); err != nil { + t.Fatal(err) + } +} + +func TestStmt_Insert(t *testing.T) { + str := `insert into go_proxy_test_proxy_stmt (id, str, f, e, u, i) values (?, ?, ?, ?, ?, ?)` + + c := newTestDBConn(t) + defer c.Close() + + s, err := c.Prepare(str) + + if err != nil { + t.Fatal(err) + } + + if pkg, err := s.Execute(1, "a", 3.14, "test1", 255, -127); err != nil { + t.Fatal(err) + } else { + if pkg.AffectedRows != 1 { + t.Fatal(pkg.AffectedRows) + } + } + + s.Close() +} + +func TestStmt_Select(t *testing.T) { + str := `select str, f, e from go_proxy_test_proxy_stmt where id = ?` + + c := newTestDBConn(t) + defer c.Close() + + s, err := c.Prepare(str) + + if err != nil { + t.Fatal(err) + } + + if result, err := s.Execute(1); err != nil { + t.Fatal(err) + } else { + if len(result.Values) != 1 { + t.Fatal(len(result.Values)) + } + + if len(result.Fields) != 3 { + t.Fatal(len(result.Fields)) + } + + if str, _ := result.GetString(0, 0); str != "a" { + t.Fatal("invalid str", str) + } + + if f, _ := result.GetFloat(0, 1); f != float64(3.14) { + t.Fatal("invalid f", f) + } + + if e, _ := result.GetString(0, 2); e != "test1" { + t.Fatal("invalid e", e) + } + + if str, _ := result.GetStringByName(0, "str"); str != "a" { + t.Fatal("invalid str", str) + } + + if f, _ := result.GetFloatByName(0, "f"); f != float64(3.14) { + t.Fatal("invalid f", f) + } + + if e, _ := result.GetStringByName(0, "e"); e != "test1" { + t.Fatal("invalid e", e) + } + + } + + s.Close() +} + +func TestStmt_NULL(t *testing.T) { + str := `insert into go_proxy_test_proxy_stmt (id, str, f, e) values (?, ?, ?, ?)` + + c := newTestDBConn(t) + defer c.Close() + + s, err := c.Prepare(str) + + if err != nil { + t.Fatal(err) + } + + if pkg, err := s.Execute(2, nil, 3.14, nil); err != nil { + t.Fatal(err) + } else { + if pkg.AffectedRows != 1 { + t.Fatal(pkg.AffectedRows) + } + } + + s.Close() + + str = `select * from go_proxy_test_proxy_stmt where id = ?` + s, err = c.Prepare(str) + + if err != nil { + t.Fatal(err) + } + + if r, err := s.Execute(2); err != nil { + t.Fatal(err) + } else { + if b, err := r.IsNullByName(0, "id"); err != nil { + t.Fatal(err) + } else if b == true { + t.Fatal(b) + } + + if b, err := r.IsNullByName(0, "str"); err != nil { + t.Fatal(err) + } else if b == false { + t.Fatal(b) + } + + if b, err := r.IsNullByName(0, "f"); err != nil { + t.Fatal(err) + } else if b == true { + t.Fatal(b) + } + + if b, err := r.IsNullByName(0, "e"); err != nil { + t.Fatal(err) + } else if b == false { + t.Fatal(b) + } + } + + s.Close() +} + +func TestStmt_Unsigned(t *testing.T) { + str := `insert into go_proxy_test_proxy_stmt (id, u) values (?, ?)` + + c := newTestDBConn(t) + defer c.Close() + + s, err := c.Prepare(str) + + if err != nil { + t.Fatal(err) + } + + if pkg, err := s.Execute(3, uint8(255)); err != nil { + t.Fatal(err) + } else { + if pkg.AffectedRows != 1 { + t.Fatal(pkg.AffectedRows) + } + } + + s.Close() + + str = `select u from go_proxy_test_proxy_stmt where id = ?` + + s, err = c.Prepare(str) + if err != nil { + t.Fatal(err) + } + + if r, err := s.Execute(3); err != nil { + t.Fatal(err) + } else { + if u, err := r.GetUint(0, 0); err != nil { + t.Fatal(err) + } else if u != uint64(255) { + t.Fatal(u) + } + } + + s.Close() +} + +func TestStmt_Signed(t *testing.T) { + str := `insert into go_proxy_test_proxy_stmt (id, i) values (?, ?)` + + c := newTestDBConn(t) + defer c.Close() + + s, err := c.Prepare(str) + + if err != nil { + t.Fatal(err) + } + + if _, err := s.Execute(4, 127); err != nil { + t.Fatal(err) + } + + if _, err := s.Execute(uint64(18446744073709551516), int8(-128)); err != nil { + t.Fatal(err) + } + + s.Close() + +} + +func TestStmt_Trans(t *testing.T) { + c1 := newTestDBConn(t) + defer c1.Close() + + if _, err := c1.Execute(`insert into go_proxy_test_proxy_stmt (id, str) values (1002, "abc")`); err != nil { + t.Fatal(err) + } + + var err error + if err = c1.Begin(); err != nil { + t.Fatal(err) + } + + str := `select str from go_proxy_test_proxy_stmt where id = ?` + + s, err := c1.Prepare(str) + if err != nil { + t.Fatal(err) + } + + if _, err := s.Execute(1002); err != nil { + t.Fatal(err) + } + + if err := c1.Commit(); err != nil { + t.Fatal(err) + } + + if r, err := s.Execute(1002); err != nil { + t.Fatal(err) + } else { + if str, _ := r.GetString(0, 0); str != `abc` { + t.Fatal(str) + } + } + + if err := s.Close(); err != nil { + t.Fatal(err) + } +} diff --git a/proxy/conn_test.go b/proxy/conn_test.go new file mode 100644 index 0000000..9485cb4 --- /dev/null +++ b/proxy/conn_test.go @@ -0,0 +1,379 @@ +package proxy + +import ( + . "github.com/wangjild/go-mysql-proxy/mysql" + "testing" +) + +func TestConn_Handshake(t *testing.T) { + c := newTestDBConn(t) + + if err := c.Ping(); err != nil { + t.Fatal(err) + } + + c.Close() +} + +func TestConn_DeleteTable(t *testing.T) { + server := newTestServer(t) + n := server.nodes["node1"] + c, err := n.getMasterConn() + if err != nil { + t.Fatal(err) + } + c.UseDB("go_proxy") + if _, err := c.Execute(`drop table if exists go_proxy_test_proxy_conn`); err != nil { + t.Fatal(err) + } + c.Close() +} + +func TestConn_CreateTable(t *testing.T) { + s := `CREATE TABLE IF NOT EXISTS go_proxy_test_proxy_conn ( + id BIGINT(64) UNSIGNED NOT NULL, + str VARCHAR(256), + f DOUBLE, + e enum("test1", "test2"), + u tinyint unsigned, + i tinyint, + ni tinyint, + PRIMARY KEY (id) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8` + + server := newTestServer(t) + n := server.nodes["node1"] + c, err := n.getMasterConn() + if err != nil { + t.Fatal(err) + } + + c.UseDB("go_proxy") + defer c.Close() + if _, err := c.Execute(s); err != nil { + t.Fatal(err) + } +} + +func TestConn_Insert(t *testing.T) { + s := `insert into go_proxy_test_proxy_conn (id, str, f, e, u, i) values(1, "abc", 3.14, "test1", 255, -127)` + + c := newTestDBConn(t) + defer c.Close() + + if r, err := c.Execute(s); err != nil { + t.Fatal(err) + } else { + if r.AffectedRows != 1 { + t.Fatal(r.AffectedRows) + } + } +} + +func TestConn_Select(t *testing.T) { + s := `select str, f, e, u, i, ni from go_proxy_test_proxy_conn where id = 1` + + c := newTestDBConn(t) + defer c.Close() + + if r, err := c.Execute(s); err != nil { + t.Fatal(err) + } else { + if r.RowNumber() != 1 { + t.Fatal(r.RowNumber()) + } + + if r.ColumnNumber() != 6 { + t.Fatal(r.ColumnNumber()) + } + + if v, _ := r.GetString(0, 0); v != `abc` { + t.Fatal(v) + } + + if v, _ := r.GetFloat(0, 1); v != 3.14 { + t.Fatal(v) + } + + if v, _ := r.GetString(0, 2); v != `test1` { + t.Fatal(v) + } + + if v, _ := r.GetUint(0, 3); v != 255 { + t.Fatal(v) + } + + if v, _ := r.GetInt(0, 4); v != -127 { + t.Fatal(v) + } + + if v, _ := r.IsNull(0, 5); !v { + t.Fatal("ni not null") + } + } +} + +func TestConn_Update(t *testing.T) { + s := `update go_proxy_test_proxy_conn set str = "123" where id = 1` + + c := newTestDBConn(t) + defer c.Close() + + if _, err := c.Execute(s); err != nil { + t.Fatal(err) + } + + if r, err := c.Execute(`select str from go_proxy_test_proxy_conn where id = 1`); err != nil { + t.Fatal(err) + } else { + if v, _ := r.GetString(0, 0); v != `123` { + t.Fatal(v) + } + } +} + +func TestConn_Replace(t *testing.T) { + s := `replace into go_proxy_test_proxy_conn (id, str, f) values(1, "abc", 3.14159)` + + c := newTestDBConn(t) + defer c.Close() + + if r, err := c.Execute(s); err != nil { + t.Fatal(err) + } else { + if r.AffectedRows != 2 { + t.Fatal(r.AffectedRows) + } + } + + s = `replace into go_proxy_test_proxy_conn (id, str) values(2, "abcb")` + + if r, err := c.Execute(s); err != nil { + t.Fatal(err) + } else { + if r.AffectedRows != 1 { + t.Fatal(r.AffectedRows) + } + } + + s = `select str, f from go_proxy_test_proxy_conn` + + if r, err := c.Execute(s); err != nil { + t.Fatal(err) + } else { + if v, _ := r.GetString(0, 0); v != `abc` { + t.Fatal(v) + } + + if v, _ := r.GetString(1, 0); v != `abcb` { + t.Fatal(v) + } + + if v, _ := r.GetFloat(0, 1); v != 3.14159 { + t.Fatal(v) + } + + if v, _ := r.IsNull(1, 1); !v { + t.Fatal(v) + } + } +} + +func TestConn_Delete(t *testing.T) { + s := `delete from go_proxy_test_proxy_conn where id = 100000` + + c := newTestDBConn(t) + defer c.Close() + + if r, err := c.Execute(s); err != nil { + t.Fatal(err) + } else { + if r.AffectedRows != 0 { + t.Fatal(r.AffectedRows) + } + } +} + +func TestConn_SetAutoCommit(t *testing.T) { + c := newTestDBConn(t) + defer c.Close() + + if r, err := c.Execute("set autocommit = 1"); err != nil { + t.Fatal(err) + } else { + if !(r.Status&SERVER_STATUS_AUTOCOMMIT > 0) { + t.Fatal(r.Status) + } + } + + if r, err := c.Execute("set autocommit = 0"); err != nil { + t.Fatal(err) + } else { + if !(r.Status&SERVER_STATUS_AUTOCOMMIT == 0) { + t.Fatal(r.Status) + } + } +} + +func TestConn_Trans(t *testing.T) { + c1 := newTestDBConn(t) + defer c1.Close() + + c2 := newTestDBConn(t) + defer c2.Close() + + var err error + + if err = c1.Begin(); err != nil { + t.Fatal(err) + } + + if err = c2.Begin(); err != nil { + t.Fatal(err) + } + + if _, err := c1.Execute(`insert into go_proxy_test_proxy_conn (id, str) values (111, "abc")`); err != nil { + t.Fatal(err) + } + + if r, err := c2.Execute(`select str from go_proxy_test_proxy_conn where id = 111`); err != nil { + t.Fatal(err) + } else { + if r.RowNumber() != 0 { + t.Fatal(r.RowNumber()) + } + } + + if err := c1.Commit(); err != nil { + t.Fatal(err) + } + + if err := c2.Commit(); err != nil { + t.Fatal(err) + } + + if r, err := c1.Execute(`select str from go_proxy_test_proxy_conn where id = 111`); err != nil { + t.Fatal(err) + } else { + if r.RowNumber() != 1 { + t.Fatal(r.RowNumber()) + } + + if v, _ := r.GetString(0, 0); v != `abc` { + t.Fatal(v) + } + } +} + +func TestConn_SetNames(t *testing.T) { + c := newTestDBConn(t) + defer c.Close() + + if err := c.SetCharset("gb2312"); err != nil { + t.Fatal(err) + } +} + +func TestConn_LastInsertId(t *testing.T) { + s := `CREATE TABLE IF NOT EXISTS go_proxy_test_conn_id ( + id BIGINT(64) UNSIGNED AUTO_INCREMENT NOT NULL, + str VARCHAR(256), + PRIMARY KEY (id) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8` + + server := newTestServer(t) + n := server.nodes["node1"] + + c1, err := n.getMasterConn() + if err != nil { + t.Fatal(err) + } + + if _, err := c1.Execute(s); err != nil { + t.Fatal(err) + } + + c1.Close() + + c := newTestDBConn(t) + defer c.Close() + + r, err := c.Execute(`insert into go_proxy_test_conn_id (str) values ("abc")`) + if err != nil { + t.Fatal(err) + } + + lastId := r.InsertId + if r, err := c.Execute(`select last_insert_id()`); err != nil { + t.Fatal(err) + } else { + if r.ColumnNumber() != 1 { + t.Fatal(r.ColumnNumber()) + } + + if v, _ := r.GetUint(0, 0); v != lastId { + t.Fatal(v) + } + } + + if r, err := c.Execute(`select last_insert_id() as a`); err != nil { + t.Fatal(err) + } else { + if string(r.Fields[0].Name) != "a" { + t.Fatal(string(r.Fields[0].Name)) + } + + if v, _ := r.GetUint(0, 0); v != lastId { + t.Fatal(v) + } + } + + c1, _ = n.getMasterConn() + + if _, err := c1.Execute(`drop table if exists go_proxy_test_conn_id`); err != nil { + t.Fatal(err) + } + + c1.Close() +} + +func TestConn_RowCount(t *testing.T) { + c := newTestDBConn(t) + defer c.Close() + + r, err := c.Execute(`insert into go_proxy_test_proxy_conn (id, str) values (1002, "abc")`) + if err != nil { + t.Fatal(err) + } + + row := r.AffectedRows + + if r, err := c.Execute("select row_count()"); err != nil { + t.Fatal(err) + } else { + if v, _ := r.GetUint(0, 0); v != row { + t.Fatal(v) + } + } + + if r, err := c.Execute("select row_count() as b"); err != nil { + t.Fatal(err) + } else { + if v, _ := r.GetInt(0, 0); v != -1 { + t.Fatal(v) + } + } +} + +func TestConn_SelectVersion(t *testing.T) { + c := newTestDBConn(t) + defer c.Close() + + if r, err := c.Execute("select version()"); err != nil { + t.Fatal(err) + } else { + if v, _ := r.GetString(0, 0); v != ServerVersion { + t.Fatal(v) + } + } +} diff --git a/proxy/conn_tx.go b/proxy/conn_tx.go new file mode 100644 index 0000000..5c58a02 --- /dev/null +++ b/proxy/conn_tx.go @@ -0,0 +1,72 @@ +package proxy + +import ( + "github.com/wangjild/go-mysql-proxy/client" + . "github.com/wangjild/go-mysql-proxy/mysql" +) + +func (c *Conn) isInTransaction() bool { + return c.status&SERVER_STATUS_IN_TRANS > 0 +} + +func (c *Conn) isAutoCommit() bool { + return c.status&SERVER_STATUS_AUTOCOMMIT > 0 +} + +func (c *Conn) handleBegin() error { + c.status |= SERVER_STATUS_IN_TRANS + return c.writeOK(nil) +} + +func (c *Conn) handleCommit() (err error) { + if err := c.commit(); err != nil { + return err + } else { + return c.writeOK(nil) + } +} + +func (c *Conn) handleRollback() (err error) { + if err := c.rollback(); err != nil { + return err + } + + return c.writeOK(nil) +} + +func (c *Conn) commit() (err error) { + c.status &= ^SERVER_STATUS_IN_TRANS + + for _, co := range c.txConns { + if e := co.Commit(); e != nil { + err = e + } + co.Close() + } + + c.txConns = map[*Node]*client.SqlConn{} + + return +} + +func (c *Conn) rollback() (err error) { + c.status &= ^SERVER_STATUS_IN_TRANS + + for _, co := range c.txConns { + if e := co.Rollback(); e != nil { + err = e + } + co.Close() + } + + c.txConns = map[*Node]*client.SqlConn{} + + return +} + +//if status is in_trans, need +//else if status is not autocommit, need +//else no need +func (c *Conn) needBeginTx() bool { + return c.isInTransaction() || !c.isAutoCommit() +} diff --git a/proxy/node.go b/proxy/node.go new file mode 100644 index 0000000..e0de1a8 --- /dev/null +++ b/proxy/node.go @@ -0,0 +1,305 @@ +package proxy + +import ( + "fmt" + "github.com/wangjild/go-mysql-proxy/client" + "github.com/wangjild/go-mysql-proxy/config" + . "github.com/wangjild/go-mysql-proxy/log" + "sync" + "time" +) + +const ( + Master = "master" + Slave = "slave" +) + +type Node struct { + sync.Mutex + + server *Server + + cfg config.NodeConfig + + //running master db + db *client.DB + + master *client.DB + slave *client.DB + + downAfterNoAlive time.Duration + + lastMasterPing int64 + lastSlavePing int64 +} + +func (n *Node) run() { + //to do + //1 check connection alive + //2 check remove mysql server alive + + t := time.NewTicker(3000 * time.Second) + defer t.Stop() + + n.lastMasterPing = time.Now().Unix() + n.lastSlavePing = n.lastMasterPing + for { + select { + case <-t.C: + n.checkMaster() + n.checkSlave() + } + } +} + +func (n *Node) String() string { + return n.cfg.Name +} + +func (n *Node) getMasterConn() (*client.SqlConn, error) { + n.Lock() + db := n.db + n.Unlock() + + if db == nil { + return nil, fmt.Errorf("master is down") + } + + return db.GetConn() +} + +func (n *Node) getSelectConn() (*client.SqlConn, error) { + var db *client.DB + + n.Lock() + if n.cfg.RWSplit && n.slave != nil { + db = n.slave + } else { + db = n.db + } + n.Unlock() + + if db == nil { + return nil, fmt.Errorf("no alive mysql server") + } + + return db.GetConn() +} + +func (n *Node) checkMaster() { + n.Lock() + db := n.db + n.Unlock() + + if db == nil { + AppLog.Notice("no master avaliable") + return + } + + if err := db.Ping(); err != nil { + AppLog.Warn("%s ping master %s error %s", n, db.Addr(), err.Error()) + } else { + n.lastMasterPing = time.Now().Unix() + return + } + + if int64(n.downAfterNoAlive) > 0 && time.Now().Unix()-n.lastMasterPing > int64(n.downAfterNoAlive) { + AppLog.Warn("%s down master db %s", n, n.master.Addr()) + + n.downMaster() + } +} + +func (n *Node) checkSlave() { + if n.slave == nil { + return + } + + db := n.slave + if err := db.Ping(); err != nil { + AppLog.Warn("%s ping slave %s error %s", n, db.Addr(), err.Error()) + } else { + n.lastSlavePing = time.Now().Unix() + } + + if int64(n.downAfterNoAlive) > 0 && time.Now().Unix()-n.lastSlavePing > int64(n.downAfterNoAlive) { + AppLog.Warn("%s slave db %s not alive over %ds, down it", + n, db.Addr(), int64(n.downAfterNoAlive/time.Second)) + + n.downSlave() + } +} + +func (n *Node) openDB(addr string) (*client.DB, error) { + db, err := client.Open(addr, n.cfg.User, n.cfg.Password, "") + if err != nil { + return nil, err + } + + db.SetMaxIdleConnNum(n.cfg.IdleConns) + return db, nil +} + +func (n *Node) checkUpDB(addr string) (*client.DB, error) { + db, err := n.openDB(addr) + if err != nil { + return nil, err + } + + if err := db.Ping(); err != nil { + db.Close() + return nil, err + } + + return db, nil +} + +func (n *Node) upMaster(addr string) error { + n.Lock() + if n.master != nil { + n.Unlock() + return fmt.Errorf("%s master must be down first", n) + } + n.Unlock() + + db, err := n.checkUpDB(addr) + if err != nil { + return err + } + + n.Lock() + n.master = db + n.db = db + n.Unlock() + + return nil +} + +func (n *Node) upSlave(addr string) error { + n.Lock() + if n.slave != nil { + n.Unlock() + return fmt.Errorf("%s, slave must be down first", n) + } + n.Unlock() + + db, err := n.checkUpDB(addr) + if err != nil { + return err + } + + n.Lock() + n.slave = db + n.Unlock() + + return nil +} + +func (n *Node) downMaster() error { + n.Lock() + if n.master != nil { + n.master = nil + } + return nil +} + +func (n *Node) downSlave() error { + n.Lock() + db := n.slave + n.slave = nil + n.Unlock() + + if db != nil { + db.Close() + } + + return nil +} + +func (s *Server) UpMaster(node string, addr string) error { + n := s.getNode(node) + if n == nil { + return fmt.Errorf("invalid node %s", node) + } + + return n.upMaster(addr) +} + +func (s *Server) UpSlave(node string, addr string) error { + n := s.getNode(node) + if n == nil { + return fmt.Errorf("invalid node %s", node) + } + + return n.upSlave(addr) +} +func (s *Server) DownMaster(node string) error { + n := s.getNode(node) + if n == nil { + return fmt.Errorf("invalid node %s", node) + } + n.db = nil + return n.downMaster() +} + +func (s *Server) DownSlave(node string) error { + n := s.getNode(node) + if n == nil { + return fmt.Errorf("invalid node [%s].", node) + } + return n.downSlave() +} + +func (s *Server) getNode(name string) *Node { + return s.nodes[name] +} + +func (s *Server) parseNodes() error { + cfg := s.cfg + s.nodes = make(map[string]*Node, len(cfg.Nodes)) + + for _, v := range cfg.Nodes { + if _, ok := s.nodes[v.Name]; ok { + return fmt.Errorf("duplicate node [%s].", v.Name) + } + + n, err := s.parseNode(v) + if err != nil { + return err + } + + s.nodes[v.Name] = n + } + + return nil +} + +func (s *Server) parseNode(cfg config.NodeConfig) (*Node, error) { + n := new(Node) + n.server = s + n.cfg = cfg + + n.downAfterNoAlive = time.Duration(cfg.DownAfterNoAlive) * time.Second + + if len(cfg.Master) == 0 { + return nil, fmt.Errorf("must setting master MySQL node.") + } + + var err error + if n.master, err = n.openDB(cfg.Master); err != nil { + return nil, err + } + + n.db = n.master + + if len(cfg.Slave) > 0 { + if n.slave, err = n.openDB(cfg.Slave); err != nil { + AppLog.Warn(err.Error()) + n.slave = nil + } + } + + go n.run() + + return n, nil +} diff --git a/proxy/schema.go b/proxy/schema.go new file mode 100644 index 0000000..8e76528 --- /dev/null +++ b/proxy/schema.go @@ -0,0 +1,62 @@ +package proxy + +import ( + "fmt" + "github.com/wangjild/go-mysql-proxy/config" +) + +type Schema struct { + db string + node *Node + auths map[string]string +} + +func (s *Server) parseSchemas() error { + s.schemas = make(map[string]*Schema) + + for _, schemaCfg := range s.cfg.Schemas { + if _, ok := s.schemas[schemaCfg.DB]; ok { + return fmt.Errorf("duplicate schema [%s].", schemaCfg.DB) + } + + n := s.getNode(schemaCfg.Node) + if n == nil { + return fmt.Errorf("schema [%s] node [%s] config is not exists.", schemaCfg.DB, schemaCfg.Node) + } + + auths, err := s.getAuths(schemaCfg) + if err != nil { + return err + } + + s.schemas[schemaCfg.DB] = &Schema{ + db: schemaCfg.DB, + node: n, + auths: auths, + } + } + + return nil +} + +func (s *Server) getAuths(schema config.SchemaConfig) (map[string]string, error) { + if len(schema.Auths) == 0 { + return nil, fmt.Errorf("schema [%s]'s auth is empty.", schema.DB) + } + + auth := make(map[string]string) + + for _, v := range schema.Auths { + if _, ok := auth[v.User]; ok { + return nil, fmt.Errorf("schema [%s] has duplicate user[%s]", schema.DB, v.User) + } + + auth[v.User] = v.Passwd + } + + return auth, nil +} + +func (s *Server) getSchema(db string) *Schema { + return s.schemas[db] +} diff --git a/proxy/server.go b/proxy/server.go new file mode 100644 index 0000000..33c8816 --- /dev/null +++ b/proxy/server.go @@ -0,0 +1,103 @@ +package proxy + +import ( + "github.com/wangjild/go-mysql-proxy/config" + . "github.com/wangjild/go-mysql-proxy/log" + "net" + // "runtime" +) + +type Server struct { + cfg *config.Config + + addr string + user string + password string + + running bool + + listener net.Listener + + nodes map[string]*Node + + schemas map[string]*Schema + + users *userAuth +} + +func NewServer(cfg *config.Config) (*Server, error) { + s := new(Server) + + s.cfg = cfg + + s.addr = cfg.Addr + s.user = cfg.User + s.password = cfg.Password + + if err := s.parseNodes(); err != nil { + return nil, err + } + + if err := s.parseSchemas(); err != nil { + return nil, err + } + + if err := s.parseUserAuths(); err != nil { + return nil, err + } + + var err error + s.listener, err = net.Listen("tcp4", s.addr) + if err != nil { + return nil, err + } + + SysLog.Notice("Go-MySQL-Proxy Listen(tcp4) at [%s]", s.addr) + return s, nil +} + +func (s *Server) Run() error { + s.running = true + + for s.running { + conn, err := s.listener.Accept() + if err != nil { + SysLog.Warn("accept error %s", err.Error()) + continue + } + + go s.onConn(conn) + } + + return nil +} + +func (s *Server) Close() { + s.running = false + if s.listener != nil { + s.listener.Close() + } +} + +func (s *Server) onConn(c net.Conn) { + conn := s.newConn(c) + + defer func() { + /*if err := recover(); err != nil { + const size = 4096 + buf := make([]byte, size) + buf = buf[:runtime.Stack(buf, false)] + AppLog.Warn("onConn panic %v: %v\n%s", c.RemoteAddr().String(), err, buf) + }*/ + + conn.Close() + }() + + if err := conn.Handshake(); err != nil { + AppLog.Warn("handshake error %s", err.Error()) + c.Close() + return + } + + conn.Run() +} diff --git a/proxy/server/server.go b/proxy/server/server.go new file mode 100644 index 0000000..252c8c7 --- /dev/null +++ b/proxy/server/server.go @@ -0,0 +1,18 @@ +// Copyright (c) 2014 Xiaomi.com, Inc. All Rights Reserved +// @file server.go +// @author 王靖 (wangjing1@xiaomi.com) +// @date 14-11-27 11:11:59 +// @version $Revision: 1.0 $ +// @brief + +package server + +import () + +type Proxy interface { + Run() error + Stop() error + Close() +} + +/* vim: set expandtab ts=4 sw=4 */ diff --git a/proxy/server_test.go b/proxy/server_test.go new file mode 100644 index 0000000..974a143 --- /dev/null +++ b/proxy/server_test.go @@ -0,0 +1,124 @@ +package proxy + +import ( + "github.com/wangjild/go-mysql-proxy/client" + "github.com/wangjild/go-mysql-proxy/config" + "sync" + "testing" + "time" +) + +var testServerOnce sync.Once +var testServer *Server +var testDBOnce sync.Once +var testDB *client.DB + +var testConfigData = []byte(` +addr : 127.0.0.1:4000 +user : root +password : root + +nodes : +- + name : node1 + down_after_noalive : 300 + idle_conns : 16 + rw_split: false + user: root + password: + master : 127.0.0.1:4306 + slave : +- + name : node2 + down_after_noalive : 300 + idle_conns : 16 + rw_split: false + user: root + password: + master : 127.0.0.1:4307 + +- + name : node3 + down_after_noalive : 300 + idle_conns : 16 + rw_split: false + user: root + password: + master : 127.0.0.1:4308 + +schemas : +- + db : proxy_test + nodes: [node1, node2, node3] + rules: + default: node1 + shard: + - + table: proxy_test_shard_hash + key: id + nodes: [node2, node3] + type: hash + + - + table: proxy_test_shard_range + key: id + nodes: [node2, node3] + range: -10000- + type: range +`) + +func newTestServer(t *testing.T) *Server { + f := func() { + cfg, err := config.ParseConfigData(testConfigData) + if err != nil { + t.Fatal(err.Error()) + } + + testServer, err = NewServer(cfg) + if err != nil { + t.Fatal(err) + } + + go testServer.Run() + + time.Sleep(1 * time.Second) + } + + testServerOnce.Do(f) + + return testServer +} + +func newTestDB(t *testing.T) *client.DB { + newTestServer(t) + + f := func() { + var err error + testDB, err = client.Open("127.0.0.1:4000", "root", "", "go_proxy") + + if err != nil { + t.Fatal(err) + } + + testDB.SetMaxIdleConnNum(4) + } + + testDBOnce.Do(f) + return testDB +} + +func newTestDBConn(t *testing.T) *client.SqlConn { + db := newTestDB(t) + + c, err := db.GetConn() + + if err != nil { + t.Fatal(err) + } + + return c +} + +func TestServer(t *testing.T) { + newTestServer(t) +} diff --git a/proxy/signal.go b/proxy/signal.go new file mode 100644 index 0000000..9a08d0e --- /dev/null +++ b/proxy/signal.go @@ -0,0 +1,46 @@ +// Copyright (c) 2014 Xiaomi.com, Inc. All Rights Reserved +// @file signal.go +// @author 王靖 (wangjing1@xiaomi.com) +// @date 14-11-26 16:04:09 +// @version $Revision: 1.0 $ +// @brief + +package proxy + +import ( + . "github.com/wangjild/go-mysql-proxy/log" + "github.com/wangjild/go-mysql-proxy/signal" + "os" + "os/signal" + "syscall" +) + +// ignore SIGPIPE +func sigPipeHandler(s os.Signal, arg interface{}) error { + return nil +} + +func processSignals() { + ss := signal2.NewSignalSet() + ss.Register(syscall.SIGPIPE, sigPipeHandler) + + for { + c := make(chan os.Signal, 16) + var sigs []os.Signal + for sig := range ss.M { + sigs = append(sigs, sig) + } + + signal.Notify(c, sigs...) + sig := <-c + if err := ss.Handle(sig, nil); err != nil { + SysLog.Warn("hanle signal %v error: %s", sig, err.Error()) + } + + if sig == syscall.SIGINT || sig == syscall.SIGTERM { + return + } + } +} + +/* vim: set expandtab ts=4 sw=4 */ diff --git a/run.sh b/run.sh new file mode 100644 index 0000000..f1b750a --- /dev/null +++ b/run.sh @@ -0,0 +1,3 @@ +#!/bin/sh + +GOGC=1000 ./cmd/proxy/proxy --config=etc/proxy_single.yaml --logfile=log/proxy.log --loglevel=0 \ No newline at end of file diff --git a/signal/signal.go b/signal/signal.go new file mode 100644 index 0000000..2e96457 --- /dev/null +++ b/signal/signal.go @@ -0,0 +1,46 @@ +// Copyright (c) 2014 Xiaomi.com, Inc. All Rights Reserved +// @file signal.go +// @author 王靖 (wangjing1@xiaomi.com) +// @date 14-11-26 15:36:24 +// @version $Revision: 1.0 $ +// @brief + +package signal2 + +import ( + . "github.com/wangjild/go-mysql-proxy/log" + "os" +) + +type SignalHandler func(s os.Signal, arg interface{}) error + +type SignalSet struct { + M map[os.Signal]SignalHandler +} + +func NewSignalSet() *SignalSet { + s := new(SignalSet) + s.M = make(map[os.Signal]SignalHandler) + return s +} + +func (s *SignalSet) Register(sig os.Signal, handler SignalHandler) { + if _, exist := s.M[sig]; !exist { + s.M[sig] = handler + } +} + +func (s *SignalSet) Handle(sig os.Signal, arg interface{}) error { + if handler, exist := s.M[sig]; exist { + return handler(sig, arg) + } else { + SysLog.Warn("no available handler for signal %v, ignore!", sig) + return nil + } +} + +func init() { + +} + +/* vim: set expandtab ts=4 sw=4 */ diff --git a/sql/.gitignore b/sql/.gitignore index 7de0b67..9e2a6e6 100644 --- a/sql/.gitignore +++ b/sql/.gitignore @@ -1 +1,2 @@ *.output +sql_yacc.go diff --git a/sql/ast_expr.go b/sql/ast_expr.go index 1c98a1d..b4b28bb 100644 --- a/sql/ast_expr.go +++ b/sql/ast_expr.go @@ -1,5 +1,10 @@ package sql +import ( + "strconv" + "strings" +) + // IExpr represents an expression. type IExpr interface { IExpr() @@ -215,9 +220,25 @@ const ( // StrVal represents a string value. type StrVal []byte +func (s StrVal) Trim() string { + if len(s) < 1 { + return "" + } + + return strings.Trim(string([]byte(s)), `"'`) +} + // NumVal represents a number. type NumVal []byte +func (n NumVal) ParseInt() (int, error) { + if i, err := strconv.Atoi(string([]byte(n))); err != nil { + return 0, err + } else { + return i, nil + } +} + type BoolVal bool type HexVal []byte type BinVal []byte diff --git a/sql/lex.go b/sql/lex.go index ac167ac..2006017 100644 --- a/sql/lex.go +++ b/sql/lex.go @@ -120,7 +120,7 @@ func (lex *SQLLexer) Lex(lval *MySQLSymType) (retstate int) { if c == ',' { lex.tok_start = lex.ptr - } else if c == '?' && lex.stmt_prepare_mode && ident_map[lex.yyPeek()] != 0 { + } else if c == '?' && ident_map[lex.yyPeek()] == 0 { retstate = PARAM_MARKER goto TG_RET } diff --git a/sql/lex_ident_test.go b/sql/lex_ident_test.go index 7c8a728..7645f06 100644 --- a/sql/lex_ident_test.go +++ b/sql/lex_ident_test.go @@ -30,6 +30,18 @@ func TestMultiIdentifier(t *testing.T) { lexExpect(t, lex, lval, END_OF_INPUT) } +func TestParamMarker(t *testing.T) { + str := "select ?,?,? from t1;" + lex, lval := getLexer(str) + + lexExpect(t, lex, lval, SELECT_SYM) + lexExpect(t, lex, lval, PARAM_MARKER) + lexExpect(t, lex, lval, ',') + lexExpect(t, lex, lval, PARAM_MARKER) + lexExpect(t, lex, lval, ',') + lexExpect(t, lex, lval, PARAM_MARKER) +} + func TestMultiIdentifier1(t *testing.T) { str := "s n insert `s` `` s" lex, lval := getLexer(str) diff --git a/sql/parser_dml_test.go b/sql/parser_dml_test.go index 9881f9f..8b39c50 100644 --- a/sql/parser_dml_test.go +++ b/sql/parser_dml_test.go @@ -107,6 +107,8 @@ func TestSelect(t *testing.T) { st = testParse(`select last_insert_id() as a`, t, false) st = testParse(`SELECT substr('''a''bc',0,3) FROM dual`, t, false) testParse(`SELECT /*mark for picman*/ * FROM filterd limit 1;`, t, false) + + testParse(`SELECT ?,?,? from t1;`, t, false) } func TestInsert(t *testing.T) { diff --git a/sqltypes/sqltypes.go b/sqltypes/sqltypes.go index bd107b3..0ebf2c4 100644 --- a/sqltypes/sqltypes.go +++ b/sqltypes/sqltypes.go @@ -10,10 +10,9 @@ import ( "encoding/gob" "encoding/json" "fmt" + "github.com/wangjild/go-mysql-proxy/hack" "strconv" "time" - - "micode.be.xiaomi.com/wangjing1/go-mysql-proxy/hack" ) var ( diff --git a/testfiles/locate.go b/testfiles/locate.go new file mode 100644 index 0000000..1160733 --- /dev/null +++ b/testfiles/locate.go @@ -0,0 +1,34 @@ +// Copyright 2013, Google Inc. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package testfiles locates test files within the Vitess directory tree. +package testfiles + +import ( + "fmt" + "os" + "path" + "path/filepath" +) + +func Locate(filename string) string { + vtroot := os.Getenv("VTROOT") + if vtroot == "" { + panic(fmt.Errorf("VTROOT is not set")) + } + return path.Join(vtroot, "data", "test", filename) +} + +func Glob(pattern string) []string { + vtroot := os.Getenv("VTROOT") + if vtroot == "" { + panic(fmt.Errorf("VTROOT is not set")) + } + resolved := path.Join(vtroot, "data", "test", pattern) + out, err := filepath.Glob(resolved) + if err != nil { + panic(err) + } + return out +} From 29a0bdc95cee5527404d8c00f9ee5726c1865115 Mon Sep 17 00:00:00 2001 From: Wang Jing Date: Tue, 3 Mar 2015 18:05:28 +0800 Subject: [PATCH 2/7] add log --- log/logger.go | 27 +++-- log/milog.go | 252 ++++++++++++++++++++++++++++++++++++++++++++++ log/milog_test.go | 117 +++++++++++++++++++++ 3 files changed, 382 insertions(+), 14 deletions(-) create mode 100644 log/milog.go create mode 100644 log/milog_test.go diff --git a/log/logger.go b/log/logger.go index 2940366..a581a1d 100644 --- a/log/logger.go +++ b/log/logger.go @@ -11,7 +11,6 @@ import ( "crypto/rand" "fmt" "math/big" - "micode.be.xiaomi.com/golib/milog" "path/filepath" "runtime" "strconv" @@ -20,14 +19,14 @@ import ( ) // SysLog 系统Log -var SysLog *Logger = nil +var SysLog *ProxyLogger = nil // AppLog 应用Log -var AppLog *Logger = nil +var AppLog *ProxyLogger = nil -// Logger the milog.Logger wrapper -type Logger struct { - l *milog.Logger +// Logger the log.Logger wrapper +type ProxyLogger struct { + l *Logger } func logidGenerator() string { @@ -62,22 +61,22 @@ func comMessage(strfmt string, args ...interface{}) map[string]string { } // Notice print notice message to logfile -func (lg *Logger) Notice(strfmt string, args ...interface{}) { +func (lg *ProxyLogger) Notice(strfmt string, args ...interface{}) { lg.l.Notice(comMessage(strfmt, args...), logidGenerator()) } // Debug print debug message to logfile -func (lg *Logger) Debug(strfmt string, args ...interface{}) { +func (lg *ProxyLogger) Debug(strfmt string, args ...interface{}) { lg.l.Debug(comMessage(strfmt, args...), logidGenerator()) } // Warn print warning message to logfile -func (lg *Logger) Warn(strfmt string, args ...interface{}) { +func (lg *ProxyLogger) Warn(strfmt string, args ...interface{}) { lg.l.Warn(comMessage(strfmt, args...), logidGenerator()) } // Fatal print fatal message to logfile -func (lg *Logger) Fatal(strfmt string, args ...interface{}) { +func (lg *ProxyLogger) Fatal(strfmt string, args ...interface{}) { lg.l.Fatal(comMessage(strfmt, args...), logidGenerator()) } @@ -103,14 +102,14 @@ func Init(syslog, applog *Config) { } func realInit(syslog, applog *Config) { - SysLog = &Logger{ - l: milog.NewLogger(syslog.FilePath), + SysLog = &ProxyLogger{ + l: NewLogger(syslog.FilePath), } SysLog.l.SetLevel(syslog.LogLevel) SysLog.l.SetAppTag(defaultAppTag()) - AppLog = &Logger{ - l: milog.NewLogger(applog.FilePath), + AppLog = &ProxyLogger{ + l: NewLogger(applog.FilePath), } AppLog.l.SetLevel(applog.LogLevel) AppLog.l.SetAppTag(defaultAppTag()) diff --git a/log/milog.go b/log/milog.go new file mode 100644 index 0000000..adf1ccb --- /dev/null +++ b/log/milog.go @@ -0,0 +1,252 @@ +package log + +import ( + "encoding/json" + "os" + "strings" + "sync" + "time" +) + +const ( + LevelTrace = iota + LevelDebug + LevelNotice + LevelWarn + LevelFatal +) + +const ( + DefaultKey = "DefaultKey" + DefaultLogId = "000000000000" + DefaultAppTag = "DefaultAppTag" +) + +// map TRACE, DEBUG, NOTICE, WARN, FATAL to 0, 1, 2, 3, 4 +var ( + Level = []string{"TRACE", "DEBUG", "NOTICE", "WARN", "FATAL"} +) + +type Logger struct { + logfd *os.File + level int + apptag string + hostname string + lock *sync.Mutex +} + +// NewLogger return a Logger instance, +// the params is filename and apptag is optional +func NewLogger(filename string, apptag ...string) *Logger { + var realAppTag string + if len(apptag) == 0 { + realAppTag = DefaultAppTag + } else { + realAppTag = apptag[0] + } + + // panic when can not get hostname + hostname, err := os.Hostname() + if err != nil { + panic(err) + } + + // panic when can not open log file + logfd, err := os.OpenFile( + filename, + os.O_CREATE|os.O_APPEND|os.O_WRONLY, + 0644, + ) + if err != nil { + panic(err) + } + + return &Logger{ + logfd: logfd, + level: LevelNotice, + apptag: realAppTag, + hostname: hostname, + lock: new(sync.Mutex), + } +} + +// SetLevel set the log level, default is LevelNotice +func (this *Logger) SetLevel(level int) { + this.level = level +} + +// SetAppTag set log's apptag +func (this *Logger) SetAppTag(apptag string) { + this.apptag = apptag +} + +// Level return this logger's level +func (this *Logger) Level() int { + return this.level +} + +// AppTag return this logger's apptag +func (this *Logger) AppTag() string { + return this.apptag +} + +// It should be locked while calling write method. +func (this *Logger) write(msg string) error { + if !strings.HasSuffix(msg, "\n") { + msg = msg + "\n" + } + + this.lock.Lock() + defer this.lock.Unlock() + _, err := this.logfd.WriteString(msg) + return err +} + +// Flush will write all logs from os's buffer to disk +func (this *Logger) Flush() { + this.logfd.Sync() + this.logfd.Close() +} + +func (this *Logger) Trace(v interface{}, logid ...string) error { + if !this.suitLevel(LevelTrace) { + return nil + } + return this.write(this.format(LevelTrace, v, logid)) +} + +func (this *Logger) Debug(v interface{}, logid ...string) error { + if !this.suitLevel(LevelDebug) { + return nil + } + return this.write(this.format(LevelDebug, v, logid)) +} + +func (this *Logger) Notice(v interface{}, logid ...string) error { + if !this.suitLevel(LevelNotice) { + return nil + } + return this.write(this.format(LevelNotice, v, logid)) +} + +func (this *Logger) Warn(v interface{}, logid ...string) error { + if !this.suitLevel(LevelWarn) { + return nil + } + return this.write(this.format(LevelWarn, v, logid)) +} + +func (this *Logger) Fatal(v interface{}, logid ...string) error { + if !this.suitLevel(LevelFatal) { + return nil + } + return this.write(this.format(LevelFatal, v, logid)) +} + +func (this *Logger) suitLevel(level int) bool { + if level < this.level { + return false + } + return true +} + +// format generate a standard line of log +func (this *Logger) format(level int, v interface{}, logid []string) string { + var id string + if len(logid) > 0 { + id = logid[0] + } else { + id = DefaultLogId + } + + prefix := "" + var logTuples = []string{ + time.Now().Format("2006-01-02 15:04:05"), + this.apptag, + this.hostname, + Level[level], + id, + } + + for _, item := range logTuples { + prefix += "[" + item + "] " + } + + var ( + body []byte + err error + ) + body, err = json.Marshal(v) + if err != nil { + body, _ = json.Marshal( + map[string]interface{}{ + DefaultKey: v, + }, + ) + } + + return prefix + string(body) +} + +// StdContent used to store temporary log content +type StdContent struct { + data map[string]interface{} + logger *Logger + lock *sync.Mutex +} + +// NewStdContent return an temporary StdContent +func (this *Logger) NewStdContent() *StdContent { + return &StdContent{ + data: make(map[string]interface{}), + logger: this, + lock: &sync.Mutex{}, + } +} + +// SetVal add (key, value) pair to log +func (sc *StdContent) SetVal(key string, val interface{}) { + sc.lock.Lock() + sc.data[key] = val + sc.lock.Unlock() +} + +func (sc *StdContent) Trace(logid ...string) error { + if !sc.logger.suitLevel(LevelTrace) { + return nil + } + formatStr := sc.logger.format(LevelTrace, sc.data, logid) + return sc.logger.write(formatStr) +} + +func (sc *StdContent) Debug(logid ...string) error { + if !sc.logger.suitLevel(LevelDebug) { + return nil + } + formatStr := sc.logger.format(LevelDebug, sc.data, logid) + return sc.logger.write(formatStr) +} + +func (sc *StdContent) Notice(logid ...string) error { + if !sc.logger.suitLevel(LevelNotice) { + return nil + } + formatStr := sc.logger.format(LevelNotice, sc.data, logid) + return sc.logger.write(formatStr) +} + +func (sc *StdContent) Warn(logid ...string) error { + if !sc.logger.suitLevel(LevelWarn) { + return nil + } + formatStr := sc.logger.format(LevelWarn, sc.data, logid) + return sc.logger.write(formatStr) +} + +func (sc *StdContent) Fatal(logid ...string) error { + if !sc.logger.suitLevel(LevelFatal) { + return nil + } + formatStr := sc.logger.format(LevelFatal, sc.data, logid) + return sc.logger.write(formatStr) +} diff --git a/log/milog_test.go b/log/milog_test.go new file mode 100644 index 0000000..2fa8761 --- /dev/null +++ b/log/milog_test.go @@ -0,0 +1,117 @@ +package log + +import ( + "testing" +) + +func TestLog(t *testing.T) { + logger := NewLogger("test.log", "testtag") + for i := 0; i <= LevelFatal; i++ { + logger.SetLevel(i) + outs(logger) + } + + logger.Flush() +} + +func outs(logger *Logger) { + logger.Trace("trace") + logger.Debug("debug") + logger.Notice("notice") + logger.Warn("warn") + logger.Fatal("fatal") +} + +func TestSetLevel(t *testing.T) { + logger := NewLogger("test.log", "testtag") + logger.SetAppTag("testtag") + _ = logger.Level() + _ = logger.AppTag() +} + +func TestLevel(t *testing.T) { + logger := NewLogger("test.log", "testtag") + + levels := []string{"Trace", "Debug", "Notice", "Warn", "Fatal"} + + levelMap := map[string]int{ + "Trace": LevelTrace, + "Debug": LevelDebug, + "Notice": LevelNotice, + "Warn": LevelWarn, + "Fatal": LevelFatal, + } + for i, level := range levels { + logger.SetLevel(levelMap[level]) + if logger.level != i { + t.Error("Test Log SetLevel Error") + } + } + logger.Flush() + t.Log("Test Level Pass") +} + +func TestLogContentLog(t *testing.T) { + logger := NewLogger("test.log") + logger.SetLevel(LevelDebug) + + sc := logger.NewStdContent() + t.Log("Test NewStdContent With Id Pass") + + mkContent(sc) + + scNoId := logger.NewStdContent() + t.Log("Test NewStdContent Without Id Pass") + mkContent(scNoId) + + for i := 0; i <= LevelFatal; i++ { + logger.SetLevel(i) + stdOuts(sc, "LogIddddddd") + stdOuts(scNoId) + } + logger.Flush() +} + +func stdOuts(sc *StdContent, logId ...string) { + sc.Trace(logId...) + sc.Debug(logId...) + sc.Notice(logId...) + sc.Warn(logId...) + sc.Fatal(logId...) +} + +func BenchmarkLog(b *testing.B) { + logger := NewLogger("test.log") + logger.SetLevel(LevelDebug) + for i := 0; i < b.N; i++ { + sc := logger.NewStdContent() + mkBenchContent(sc) + sc.Trace("LogIddddddd") + sc.Debug("LogIddddddd") + sc.Notice("LogIddddddd") + sc.Warn("LogIddddddd") + sc.Fatal("LogIddddddd") + } + logger.Flush() +} + +func mkBenchContent(sc *StdContent) { + sc.SetVal("key0", "val0") + sc.SetVal("nullval", nil) + sc.SetVal("123", 123) +} + +func mkContent(sc *StdContent) { + sc.SetVal("key0", "val0") + sc.SetVal("arr", []string{"val0", "val1", "val2"}) + sc.SetVal("hash", map[string]string{ + "v0": "val0", + "v1": "val1", + "v2": "val2", + }) + sc.SetVal("nullval", nil) + var interfaceVal interface{} + interfaceVal = []interface{}{"123", 123, map[string]string{"v4": "val4"}} + sc.SetVal("interface", interfaceVal) + sc.SetVal("123", 123) +} From 906f815b0b5f02826526e365f3b62c7cd2dd1fb6 Mon Sep 17 00:00:00 2001 From: Wang Jing Date: Mon, 9 Mar 2015 18:06:07 +0800 Subject: [PATCH 3/7] change the copyright --- LICENSE | 223 +++++---------------------------------------------- bootstrap.sh | 1 - 2 files changed, 21 insertions(+), 203 deletions(-) diff --git a/LICENSE b/LICENSE index bbb549c..3daa87d 100644 --- a/LICENSE +++ b/LICENSE @@ -1,202 +1,21 @@ -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 2014 Wang Jing (wangjild@gmail.com) - - 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. - +The MIT License (MIT) + +Copyright (c) 2015 Wang Jing wangjild@gmail.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/bootstrap.sh b/bootstrap.sh index a172720..61138ca 100755 --- a/bootstrap.sh +++ b/bootstrap.sh @@ -7,5 +7,4 @@ fi source ./dev.env -go get micode.be.xiaomi.com/golib/v1/log go get gopkg.in/yaml.v2 From e384b7a8e0d529789ee0d3f0d5650ed7605ef5f3 Mon Sep 17 00:00:00 2001 From: Wang Jing Date: Mon, 9 Mar 2015 18:18:09 +0800 Subject: [PATCH 4/7] add oracle opensource license --- sql/sql_yacc.yy | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index adc36b5..1758c29 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -1,4 +1,20 @@ -// Copyright Oracle.Inc +/* + Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ + +/* sql_yacc.yy */ %{ package sql From d8b40ba0238c5f8edeb12f31ac75de8e8ae5543b Mon Sep 17 00:00:00 2001 From: Wang Jing Date: Thu, 12 Mar 2015 11:20:03 +0800 Subject: [PATCH 5/7] add sql_yacc.go --- sql/.gitignore | 1 - sql/sql_yacc.go | 14246 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 14246 insertions(+), 1 deletion(-) create mode 100644 sql/sql_yacc.go diff --git a/sql/.gitignore b/sql/.gitignore index 9e2a6e6..7de0b67 100644 --- a/sql/.gitignore +++ b/sql/.gitignore @@ -1,2 +1 @@ *.output -sql_yacc.go diff --git a/sql/sql_yacc.go b/sql/sql_yacc.go new file mode 100644 index 0000000..8fef324 --- /dev/null +++ b/sql/sql_yacc.go @@ -0,0 +1,14246 @@ +//line sql_yacc.yy:20 +package sql + +import __yyfmt__ "fmt" + +//line sql_yacc.yy:20 +import () + +//line sql_yacc.yy:26 +type MySQLSymType struct { + yys int + empty struct{} + interf interface{} + bytes []byte + str string + strval StrVal + numval NumVal + + statement IStatement + select_statement ISelect + subquery *SubQuery + table ISimpleTable + table_list ISimpleTables + table_ref ITable + table_ref_list ITables + table_to_table *TableToTable + table_to_table_list []*TableToTable + + table_index *TableIndex + table_index_list []*TableIndex + + spname *Spname + + expr IExpr + exprs IExprs + valexpr IValExpr + valexprs IValExprs + boolexpr IBoolExpr + + lock_type LockType + view_tail *viewTail + event_tail *eventTail + trigger_tail *triggerTail + sf_tail *sfTail + sp_tail *spTail + udf_tail *udfTail + + like_or_where *LikeOrWhere + + variable *Variable + vars Vars + var_type VarType + life_type LifeType +} + +const ABORT_SYM = 57346 +const ACCESSIBLE_SYM = 57347 +const ACTION = 57348 +const ADD = 57349 +const ADDDATE_SYM = 57350 +const AFTER_SYM = 57351 +const AGAINST = 57352 +const AGGREGATE_SYM = 57353 +const ALGORITHM_SYM = 57354 +const ALL = 57355 +const ALTER = 57356 +const ANALYSE_SYM = 57357 +const ANALYZE_SYM = 57358 +const AND_AND_SYM = 57359 +const AND_SYM = 57360 +const ANY_SYM = 57361 +const AS = 57362 +const ASC = 57363 +const ASCII_SYM = 57364 +const ASENSITIVE_SYM = 57365 +const AT_SYM = 57366 +const AUTOEXTEND_SIZE_SYM = 57367 +const AUTO_INC = 57368 +const AVG_ROW_LENGTH = 57369 +const AVG_SYM = 57370 +const BACKUP_SYM = 57371 +const BEFORE_SYM = 57372 +const BEGIN_SYM = 57373 +const BETWEEN_SYM = 57374 +const BIGINT = 57375 +const BINARY = 57376 +const BINLOG_SYM = 57377 +const BIN_NUM = 57378 +const BIT_AND = 57379 +const BIT_OR = 57380 +const BIT_SYM = 57381 +const BIT_XOR = 57382 +const BLOB_SYM = 57383 +const BLOCK_SYM = 57384 +const BOOLEAN_SYM = 57385 +const BOOL_SYM = 57386 +const BOTH = 57387 +const BTREE_SYM = 57388 +const BY = 57389 +const BYTE_SYM = 57390 +const CACHE_SYM = 57391 +const CALL_SYM = 57392 +const CASCADE = 57393 +const CASCADED = 57394 +const CASE_SYM = 57395 +const CAST_SYM = 57396 +const CATALOG_NAME_SYM = 57397 +const CHAIN_SYM = 57398 +const CHANGE = 57399 +const CHANGED = 57400 +const CHARSET = 57401 +const CHAR_SYM = 57402 +const CHECKSUM_SYM = 57403 +const CHECK_SYM = 57404 +const CIPHER_SYM = 57405 +const CLASS_ORIGIN_SYM = 57406 +const CLIENT_SYM = 57407 +const CLOSE_SYM = 57408 +const COALESCE = 57409 +const CODE_SYM = 57410 +const COLLATE_SYM = 57411 +const COLLATION_SYM = 57412 +const COLUMNS = 57413 +const COLUMN_SYM = 57414 +const COLUMN_FORMAT_SYM = 57415 +const COLUMN_NAME_SYM = 57416 +const COMMENT_SYM = 57417 +const COMMITTED_SYM = 57418 +const COMMIT_SYM = 57419 +const COMPACT_SYM = 57420 +const COMPLETION_SYM = 57421 +const COMPRESSED_SYM = 57422 +const CONCURRENT = 57423 +const CONDITION_SYM = 57424 +const CONNECTION_SYM = 57425 +const CONSISTENT_SYM = 57426 +const CONSTRAINT = 57427 +const CONSTRAINT_CATALOG_SYM = 57428 +const CONSTRAINT_NAME_SYM = 57429 +const CONSTRAINT_SCHEMA_SYM = 57430 +const CONTAINS_SYM = 57431 +const CONTEXT_SYM = 57432 +const CONTINUE_SYM = 57433 +const CONVERT_SYM = 57434 +const COUNT_SYM = 57435 +const CPU_SYM = 57436 +const CREATE = 57437 +const CROSS = 57438 +const CUBE_SYM = 57439 +const CURDATE = 57440 +const CURRENT_SYM = 57441 +const CURRENT_USER = 57442 +const CURSOR_SYM = 57443 +const CURSOR_NAME_SYM = 57444 +const CURTIME = 57445 +const DATABASE = 57446 +const DATABASES = 57447 +const DATAFILE_SYM = 57448 +const DATA_SYM = 57449 +const DATETIME = 57450 +const DATE_ADD_INTERVAL = 57451 +const DATE_SUB_INTERVAL = 57452 +const DATE_SYM = 57453 +const DAY_HOUR_SYM = 57454 +const DAY_MICROSECOND_SYM = 57455 +const DAY_MINUTE_SYM = 57456 +const DAY_SECOND_SYM = 57457 +const DAY_SYM = 57458 +const DEALLOCATE_SYM = 57459 +const DECIMAL_NUM = 57460 +const DECIMAL_SYM = 57461 +const DECLARE_SYM = 57462 +const DEFAULT = 57463 +const DEFAULT_AUTH_SYM = 57464 +const DEFINER_SYM = 57465 +const DELAYED_SYM = 57466 +const DELAY_KEY_WRITE_SYM = 57467 +const DELETE_SYM = 57468 +const DESC = 57469 +const DESCRIBE = 57470 +const DES_KEY_FILE = 57471 +const DETERMINISTIC_SYM = 57472 +const DIAGNOSTICS_SYM = 57473 +const DIRECTORY_SYM = 57474 +const DISABLE_SYM = 57475 +const DISCARD = 57476 +const DISK_SYM = 57477 +const DISTINCT = 57478 +const DIV_SYM = 57479 +const DOUBLE_SYM = 57480 +const DO_SYM = 57481 +const DROP = 57482 +const DUAL_SYM = 57483 +const DUMPFILE = 57484 +const DUPLICATE_SYM = 57485 +const DYNAMIC_SYM = 57486 +const EACH_SYM = 57487 +const ELSE = 57488 +const ELSEIF_SYM = 57489 +const ENABLE_SYM = 57490 +const ENCLOSED = 57491 +const END = 57492 +const ENDS_SYM = 57493 +const END_OF_INPUT = 57494 +const ENGINES_SYM = 57495 +const ENGINE_SYM = 57496 +const ENUM = 57497 +const EQ = 57498 +const EQUAL_SYM = 57499 +const ERROR_SYM = 57500 +const ERRORS = 57501 +const ESCAPED = 57502 +const ESCAPE_SYM = 57503 +const EVENTS_SYM = 57504 +const EVENT_SYM = 57505 +const EVERY_SYM = 57506 +const EXCHANGE_SYM = 57507 +const EXECUTE_SYM = 57508 +const EXISTS = 57509 +const EXIT_SYM = 57510 +const EXPANSION_SYM = 57511 +const EXPIRE_SYM = 57512 +const EXPORT_SYM = 57513 +const EXTENDED_SYM = 57514 +const EXTENT_SIZE_SYM = 57515 +const EXTRACT_SYM = 57516 +const FALSE_SYM = 57517 +const FAST_SYM = 57518 +const FAULTS_SYM = 57519 +const FETCH_SYM = 57520 +const FILE_SYM = 57521 +const FIRST_SYM = 57522 +const FIXED_SYM = 57523 +const FLOAT_NUM = 57524 +const FLOAT_SYM = 57525 +const FLUSH_SYM = 57526 +const FORCE_SYM = 57527 +const FOREIGN = 57528 +const FOR_SYM = 57529 +const FORMAT_SYM = 57530 +const FOUND_SYM = 57531 +const FROM = 57532 +const FULL = 57533 +const FULLTEXT_SYM = 57534 +const FUNCTION_SYM = 57535 +const GE = 57536 +const GENERAL = 57537 +const GEOMETRYCOLLECTION = 57538 +const GEOMETRY_SYM = 57539 +const GET_FORMAT = 57540 +const GET_SYM = 57541 +const GLOBAL_SYM = 57542 +const GRANT = 57543 +const GRANTS = 57544 +const GROUP_SYM = 57545 +const GROUP_CONCAT_SYM = 57546 +const GT_SYM = 57547 +const HANDLER_SYM = 57548 +const HASH_SYM = 57549 +const HAVING = 57550 +const HELP_SYM = 57551 +const HEX_NUM = 57552 +const HIGH_PRIORITY = 57553 +const HOST_SYM = 57554 +const HOSTS_SYM = 57555 +const HOUR_MICROSECOND_SYM = 57556 +const HOUR_MINUTE_SYM = 57557 +const HOUR_SECOND_SYM = 57558 +const HOUR_SYM = 57559 +const IDENT = 57560 +const IDENTIFIED_SYM = 57561 +const IDENT_QUOTED = 57562 +const IF = 57563 +const IGNORE_SYM = 57564 +const IGNORE_SERVER_IDS_SYM = 57565 +const IMPORT = 57566 +const INDEXES = 57567 +const INDEX_SYM = 57568 +const INFILE = 57569 +const INITIAL_SIZE_SYM = 57570 +const INNER_SYM = 57571 +const INOUT_SYM = 57572 +const INSENSITIVE_SYM = 57573 +const INSERT = 57574 +const INSERT_METHOD = 57575 +const INSTALL_SYM = 57576 +const INTERVAL_SYM = 57577 +const INTO = 57578 +const INT_SYM = 57579 +const INVOKER_SYM = 57580 +const IN_SYM = 57581 +const IO_AFTER_GTIDS = 57582 +const IO_BEFORE_GTIDS = 57583 +const IO_SYM = 57584 +const IPC_SYM = 57585 +const IS = 57586 +const ISOLATION = 57587 +const ISSUER_SYM = 57588 +const ITERATE_SYM = 57589 +const JOIN_SYM = 57590 +const KEYS = 57591 +const KEY_BLOCK_SIZE = 57592 +const KEY_SYM = 57593 +const KILL_SYM = 57594 +const LANGUAGE_SYM = 57595 +const LAST_SYM = 57596 +const LE = 57597 +const LEADING = 57598 +const LEAVES = 57599 +const LEAVE_SYM = 57600 +const LEFT = 57601 +const LESS_SYM = 57602 +const LEVEL_SYM = 57603 +const LEX_HOSTNAME = 57604 +const LIKE = 57605 +const LIMIT = 57606 +const LINEAR_SYM = 57607 +const LINES = 57608 +const LINESTRING = 57609 +const LIST_SYM = 57610 +const LOAD = 57611 +const LOCAL_SYM = 57612 +const LOCATOR_SYM = 57613 +const LOCKS_SYM = 57614 +const LOCK_SYM = 57615 +const LOGFILE_SYM = 57616 +const LOGS_SYM = 57617 +const LONGBLOB = 57618 +const LONGTEXT = 57619 +const LONG_NUM = 57620 +const LONG_SYM = 57621 +const LOOP_SYM = 57622 +const LOW_PRIORITY = 57623 +const LT = 57624 +const MASTER_AUTO_POSITION_SYM = 57625 +const MASTER_BIND_SYM = 57626 +const MASTER_CONNECT_RETRY_SYM = 57627 +const MASTER_DELAY_SYM = 57628 +const MASTER_HOST_SYM = 57629 +const MASTER_LOG_FILE_SYM = 57630 +const MASTER_LOG_POS_SYM = 57631 +const MASTER_PASSWORD_SYM = 57632 +const MASTER_PORT_SYM = 57633 +const MASTER_RETRY_COUNT_SYM = 57634 +const MASTER_SERVER_ID_SYM = 57635 +const MASTER_SSL_CAPATH_SYM = 57636 +const MASTER_SSL_CA_SYM = 57637 +const MASTER_SSL_CERT_SYM = 57638 +const MASTER_SSL_CIPHER_SYM = 57639 +const MASTER_SSL_CRL_SYM = 57640 +const MASTER_SSL_CRLPATH_SYM = 57641 +const MASTER_SSL_KEY_SYM = 57642 +const MASTER_SSL_SYM = 57643 +const MASTER_SSL_VERIFY_SERVER_CERT_SYM = 57644 +const MASTER_SYM = 57645 +const MASTER_USER_SYM = 57646 +const MASTER_HEARTBEAT_PERIOD_SYM = 57647 +const MATCH = 57648 +const MAX_CONNECTIONS_PER_HOUR = 57649 +const MAX_QUERIES_PER_HOUR = 57650 +const MAX_ROWS = 57651 +const MAX_SIZE_SYM = 57652 +const MAX_SYM = 57653 +const MAX_UPDATES_PER_HOUR = 57654 +const MAX_USER_CONNECTIONS_SYM = 57655 +const MAX_VALUE_SYM = 57656 +const MEDIUMBLOB = 57657 +const MEDIUMINT = 57658 +const MEDIUMTEXT = 57659 +const MEDIUM_SYM = 57660 +const MEMORY_SYM = 57661 +const MERGE_SYM = 57662 +const MESSAGE_TEXT_SYM = 57663 +const MICROSECOND_SYM = 57664 +const MIGRATE_SYM = 57665 +const MINUTE_MICROSECOND_SYM = 57666 +const MINUTE_SECOND_SYM = 57667 +const MINUTE_SYM = 57668 +const MIN_ROWS = 57669 +const MIN_SYM = 57670 +const MODE_SYM = 57671 +const MODIFIES_SYM = 57672 +const MODIFY_SYM = 57673 +const MOD_SYM = 57674 +const MONTH_SYM = 57675 +const MULTILINESTRING = 57676 +const MULTIPOINT = 57677 +const MULTIPOLYGON = 57678 +const MUTEX_SYM = 57679 +const MYSQL_ERRNO_SYM = 57680 +const NAMES_SYM = 57681 +const NAME_SYM = 57682 +const NATIONAL_SYM = 57683 +const NATURAL = 57684 +const NCHAR_STRING = 57685 +const NCHAR_SYM = 57686 +const NDBCLUSTER_SYM = 57687 +const NE = 57688 +const NEG = 57689 +const NEW_SYM = 57690 +const NEXT_SYM = 57691 +const NODEGROUP_SYM = 57692 +const NONE_SYM = 57693 +const NOT2_SYM = 57694 +const NOT_SYM = 57695 +const NOW_SYM = 57696 +const NO_SYM = 57697 +const NO_WAIT_SYM = 57698 +const NO_WRITE_TO_BINLOG = 57699 +const NULL_SYM = 57700 +const NUM = 57701 +const NUMBER_SYM = 57702 +const NUMERIC_SYM = 57703 +const NVARCHAR_SYM = 57704 +const OFFSET_SYM = 57705 +const OLD_PASSWORD = 57706 +const ON = 57707 +const ONE_SYM = 57708 +const ONLY_SYM = 57709 +const OPEN_SYM = 57710 +const OPTIMIZE = 57711 +const OPTIONS_SYM = 57712 +const OPTION = 57713 +const OPTIONALLY = 57714 +const OR2_SYM = 57715 +const ORDER_SYM = 57716 +const OR_OR_SYM = 57717 +const OR_SYM = 57718 +const OUTER = 57719 +const OUTFILE = 57720 +const OUT_SYM = 57721 +const OWNER_SYM = 57722 +const PACK_KEYS_SYM = 57723 +const PAGE_SYM = 57724 +const PARAM_MARKER = 57725 +const PARSER_SYM = 57726 +const PARTIAL = 57727 +const PARTITION_SYM = 57728 +const PARTITIONS_SYM = 57729 +const PARTITIONING_SYM = 57730 +const PASSWORD = 57731 +const PHASE_SYM = 57732 +const PLUGIN_DIR_SYM = 57733 +const PLUGIN_SYM = 57734 +const PLUGINS_SYM = 57735 +const POINT_SYM = 57736 +const POLYGON = 57737 +const PORT_SYM = 57738 +const POSITION_SYM = 57739 +const PRECISION = 57740 +const PREPARE_SYM = 57741 +const PRESERVE_SYM = 57742 +const PREV_SYM = 57743 +const PRIMARY_SYM = 57744 +const PRIVILEGES = 57745 +const PROCEDURE_SYM = 57746 +const PROCESS = 57747 +const PROCESSLIST_SYM = 57748 +const PROFILE_SYM = 57749 +const PROFILES_SYM = 57750 +const PROXY_SYM = 57751 +const PURGE = 57752 +const QUARTER_SYM = 57753 +const QUERY_SYM = 57754 +const QUICK = 57755 +const RANGE_SYM = 57756 +const READS_SYM = 57757 +const READ_ONLY_SYM = 57758 +const READ_SYM = 57759 +const READ_WRITE_SYM = 57760 +const REAL = 57761 +const REBUILD_SYM = 57762 +const RECOVER_SYM = 57763 +const REDOFILE_SYM = 57764 +const REDO_BUFFER_SIZE_SYM = 57765 +const REDUNDANT_SYM = 57766 +const REFERENCES = 57767 +const REGEXP = 57768 +const RELAY = 57769 +const RELAYLOG_SYM = 57770 +const RELAY_LOG_FILE_SYM = 57771 +const RELAY_LOG_POS_SYM = 57772 +const RELAY_THREAD = 57773 +const RELEASE_SYM = 57774 +const RELOAD = 57775 +const REMOVE_SYM = 57776 +const RENAME = 57777 +const REORGANIZE_SYM = 57778 +const REPAIR = 57779 +const REPEATABLE_SYM = 57780 +const REPEAT_SYM = 57781 +const REPLACE = 57782 +const REPLICATION = 57783 +const REQUIRE_SYM = 57784 +const RESET_SYM = 57785 +const RESIGNAL_SYM = 57786 +const RESOURCES = 57787 +const RESTORE_SYM = 57788 +const RESTRICT = 57789 +const RESUME_SYM = 57790 +const RETURNED_SQLSTATE_SYM = 57791 +const RETURNS_SYM = 57792 +const RETURN_SYM = 57793 +const REVERSE_SYM = 57794 +const REVOKE = 57795 +const RIGHT = 57796 +const ROLLBACK_SYM = 57797 +const ROLLUP_SYM = 57798 +const ROUTINE_SYM = 57799 +const ROWS_SYM = 57800 +const ROW_FORMAT_SYM = 57801 +const ROW_SYM = 57802 +const ROW_COUNT_SYM = 57803 +const RTREE_SYM = 57804 +const SAVEPOINT_SYM = 57805 +const SCHEDULE_SYM = 57806 +const SCHEMA_NAME_SYM = 57807 +const SECOND_MICROSECOND_SYM = 57808 +const SECOND_SYM = 57809 +const SECURITY_SYM = 57810 +const SELECT_SYM = 57811 +const SENSITIVE_SYM = 57812 +const SEPARATOR_SYM = 57813 +const SERIALIZABLE_SYM = 57814 +const SERIAL_SYM = 57815 +const SESSION_SYM = 57816 +const SERVER_SYM = 57817 +const SERVER_OPTIONS = 57818 +const SET = 57819 +const SET_VAR = 57820 +const SHARE_SYM = 57821 +const SHIFT_LEFT = 57822 +const SHIFT_RIGHT = 57823 +const SHOW = 57824 +const SHUTDOWN = 57825 +const SIGNAL_SYM = 57826 +const SIGNED_SYM = 57827 +const SIMPLE_SYM = 57828 +const SLAVE = 57829 +const SLOW = 57830 +const SMALLINT = 57831 +const SNAPSHOT_SYM = 57832 +const SOCKET_SYM = 57833 +const SONAME_SYM = 57834 +const SOUNDS_SYM = 57835 +const SOURCE_SYM = 57836 +const SPATIAL_SYM = 57837 +const SPECIFIC_SYM = 57838 +const SQLEXCEPTION_SYM = 57839 +const SQLSTATE_SYM = 57840 +const SQLWARNING_SYM = 57841 +const SQL_AFTER_GTIDS = 57842 +const SQL_AFTER_MTS_GAPS = 57843 +const SQL_BEFORE_GTIDS = 57844 +const SQL_BIG_RESULT = 57845 +const SQL_BUFFER_RESULT = 57846 +const SQL_CACHE_SYM = 57847 +const SQL_CALC_FOUND_ROWS = 57848 +const SQL_NO_CACHE_SYM = 57849 +const SQL_SMALL_RESULT = 57850 +const SQL_SYM = 57851 +const SQL_THREAD = 57852 +const SSL_SYM = 57853 +const STARTING = 57854 +const STARTS_SYM = 57855 +const START_SYM = 57856 +const STATS_AUTO_RECALC_SYM = 57857 +const STATS_PERSISTENT_SYM = 57858 +const STATS_SAMPLE_PAGES_SYM = 57859 +const STATUS_SYM = 57860 +const STDDEV_SAMP_SYM = 57861 +const STD_SYM = 57862 +const STOP_SYM = 57863 +const STORAGE_SYM = 57864 +const STRAIGHT_JOIN = 57865 +const STRING_SYM = 57866 +const SUBCLASS_ORIGIN_SYM = 57867 +const SUBDATE_SYM = 57868 +const SUBJECT_SYM = 57869 +const SUBPARTITIONS_SYM = 57870 +const SUBPARTITION_SYM = 57871 +const SUBSTRING = 57872 +const SUM_SYM = 57873 +const SUPER_SYM = 57874 +const SUSPEND_SYM = 57875 +const SWAPS_SYM = 57876 +const SWITCHES_SYM = 57877 +const SYSDATE = 57878 +const TABLES = 57879 +const TABLESPACE = 57880 +const TABLE_REF_PRIORITY = 57881 +const TABLE_SYM = 57882 +const TABLE_CHECKSUM_SYM = 57883 +const TABLE_NAME_SYM = 57884 +const TEMPORARY = 57885 +const TEMPTABLE_SYM = 57886 +const TERMINATED = 57887 +const TEXT_STRING = 57888 +const TEXT_SYM = 57889 +const THAN_SYM = 57890 +const THEN_SYM = 57891 +const TIMESTAMP = 57892 +const TIMESTAMP_ADD = 57893 +const TIMESTAMP_DIFF = 57894 +const TIME_SYM = 57895 +const TINYBLOB = 57896 +const TINYINT = 57897 +const TINYTEXT = 57898 +const TO_SYM = 57899 +const TRAILING = 57900 +const TRANSACTION_SYM = 57901 +const TRIGGERS_SYM = 57902 +const TRIGGER_SYM = 57903 +const TRIM = 57904 +const TRUE_SYM = 57905 +const TRUNCATE_SYM = 57906 +const TYPES_SYM = 57907 +const TYPE_SYM = 57908 +const UDF_RETURNS_SYM = 57909 +const ULONGLONG_NUM = 57910 +const UNCOMMITTED_SYM = 57911 +const UNDEFINED_SYM = 57912 +const UNDERSCORE_CHARSET = 57913 +const UNDOFILE_SYM = 57914 +const UNDO_BUFFER_SIZE_SYM = 57915 +const UNDO_SYM = 57916 +const UNICODE_SYM = 57917 +const UNINSTALL_SYM = 57918 +const UNION_SYM = 57919 +const UNIQUE_SYM = 57920 +const UNKNOWN_SYM = 57921 +const UNLOCK_SYM = 57922 +const UNSIGNED = 57923 +const UNTIL_SYM = 57924 +const UPDATE_SYM = 57925 +const UPGRADE_SYM = 57926 +const USAGE = 57927 +const USER = 57928 +const USE_FRM = 57929 +const USE_SYM = 57930 +const USING = 57931 +const UTC_DATE_SYM = 57932 +const UTC_TIMESTAMP_SYM = 57933 +const UTC_TIME_SYM = 57934 +const VALUES = 57935 +const VALUE_SYM = 57936 +const VARBINARY = 57937 +const VARCHAR = 57938 +const VARIABLES = 57939 +const VARIANCE_SYM = 57940 +const VARYING = 57941 +const VAR_SAMP_SYM = 57942 +const VIEW_SYM = 57943 +const WAIT_SYM = 57944 +const WARNINGS = 57945 +const WEEK_SYM = 57946 +const WEIGHT_STRING_SYM = 57947 +const WHEN_SYM = 57948 +const WHERE = 57949 +const WHILE_SYM = 57950 +const WITH = 57951 +const WITH_CUBE_SYM = 57952 +const WITH_ROLLUP_SYM = 57953 +const WORK_SYM = 57954 +const WRAPPER_SYM = 57955 +const WRITE_SYM = 57956 +const X509_SYM = 57957 +const XA_SYM = 57958 +const XML_SYM = 57959 +const XOR = 57960 +const YEAR_MONTH_SYM = 57961 +const YEAR_SYM = 57962 +const ZEROFILL = 57963 + +var MySQLToknames = []string{ + "ABORT_SYM", + "ACCESSIBLE_SYM", + "ACTION", + "ADD", + "ADDDATE_SYM", + "AFTER_SYM", + "AGAINST", + "AGGREGATE_SYM", + "ALGORITHM_SYM", + "ALL", + "ALTER", + "ANALYSE_SYM", + "ANALYZE_SYM", + "AND_AND_SYM", + "AND_SYM", + "ANY_SYM", + "AS", + "ASC", + "ASCII_SYM", + "ASENSITIVE_SYM", + "AT_SYM", + "AUTOEXTEND_SIZE_SYM", + "AUTO_INC", + "AVG_ROW_LENGTH", + "AVG_SYM", + "BACKUP_SYM", + "BEFORE_SYM", + "BEGIN_SYM", + "BETWEEN_SYM", + "BIGINT", + "BINARY", + "BINLOG_SYM", + "BIN_NUM", + "BIT_AND", + "BIT_OR", + "BIT_SYM", + "BIT_XOR", + "BLOB_SYM", + "BLOCK_SYM", + "BOOLEAN_SYM", + "BOOL_SYM", + "BOTH", + "BTREE_SYM", + "BY", + "BYTE_SYM", + "CACHE_SYM", + "CALL_SYM", + "CASCADE", + "CASCADED", + "CASE_SYM", + "CAST_SYM", + "CATALOG_NAME_SYM", + "CHAIN_SYM", + "CHANGE", + "CHANGED", + "CHARSET", + "CHAR_SYM", + "CHECKSUM_SYM", + "CHECK_SYM", + "CIPHER_SYM", + "CLASS_ORIGIN_SYM", + "CLIENT_SYM", + "CLOSE_SYM", + "COALESCE", + "CODE_SYM", + "COLLATE_SYM", + "COLLATION_SYM", + "COLUMNS", + "COLUMN_SYM", + "COLUMN_FORMAT_SYM", + "COLUMN_NAME_SYM", + "COMMENT_SYM", + "COMMITTED_SYM", + "COMMIT_SYM", + "COMPACT_SYM", + "COMPLETION_SYM", + "COMPRESSED_SYM", + "CONCURRENT", + "CONDITION_SYM", + "CONNECTION_SYM", + "CONSISTENT_SYM", + "CONSTRAINT", + "CONSTRAINT_CATALOG_SYM", + "CONSTRAINT_NAME_SYM", + "CONSTRAINT_SCHEMA_SYM", + "CONTAINS_SYM", + "CONTEXT_SYM", + "CONTINUE_SYM", + "CONVERT_SYM", + "COUNT_SYM", + "CPU_SYM", + "CREATE", + "CROSS", + "CUBE_SYM", + "CURDATE", + "CURRENT_SYM", + "CURRENT_USER", + "CURSOR_SYM", + "CURSOR_NAME_SYM", + "CURTIME", + "DATABASE", + "DATABASES", + "DATAFILE_SYM", + "DATA_SYM", + "DATETIME", + "DATE_ADD_INTERVAL", + "DATE_SUB_INTERVAL", + "DATE_SYM", + "DAY_HOUR_SYM", + "DAY_MICROSECOND_SYM", + "DAY_MINUTE_SYM", + "DAY_SECOND_SYM", + "DAY_SYM", + "DEALLOCATE_SYM", + "DECIMAL_NUM", + "DECIMAL_SYM", + "DECLARE_SYM", + "DEFAULT", + "DEFAULT_AUTH_SYM", + "DEFINER_SYM", + "DELAYED_SYM", + "DELAY_KEY_WRITE_SYM", + "DELETE_SYM", + "DESC", + "DESCRIBE", + "DES_KEY_FILE", + "DETERMINISTIC_SYM", + "DIAGNOSTICS_SYM", + "DIRECTORY_SYM", + "DISABLE_SYM", + "DISCARD", + "DISK_SYM", + "DISTINCT", + "DIV_SYM", + "DOUBLE_SYM", + "DO_SYM", + "DROP", + "DUAL_SYM", + "DUMPFILE", + "DUPLICATE_SYM", + "DYNAMIC_SYM", + "EACH_SYM", + "ELSE", + "ELSEIF_SYM", + "ENABLE_SYM", + "ENCLOSED", + "END", + "ENDS_SYM", + "END_OF_INPUT", + "ENGINES_SYM", + "ENGINE_SYM", + "ENUM", + "EQ", + "EQUAL_SYM", + "ERROR_SYM", + "ERRORS", + "ESCAPED", + "ESCAPE_SYM", + "EVENTS_SYM", + "EVENT_SYM", + "EVERY_SYM", + "EXCHANGE_SYM", + "EXECUTE_SYM", + "EXISTS", + "EXIT_SYM", + "EXPANSION_SYM", + "EXPIRE_SYM", + "EXPORT_SYM", + "EXTENDED_SYM", + "EXTENT_SIZE_SYM", + "EXTRACT_SYM", + "FALSE_SYM", + "FAST_SYM", + "FAULTS_SYM", + "FETCH_SYM", + "FILE_SYM", + "FIRST_SYM", + "FIXED_SYM", + "FLOAT_NUM", + "FLOAT_SYM", + "FLUSH_SYM", + "FORCE_SYM", + "FOREIGN", + "FOR_SYM", + "FORMAT_SYM", + "FOUND_SYM", + "FROM", + "FULL", + "FULLTEXT_SYM", + "FUNCTION_SYM", + "GE", + "GENERAL", + "GEOMETRYCOLLECTION", + "GEOMETRY_SYM", + "GET_FORMAT", + "GET_SYM", + "GLOBAL_SYM", + "GRANT", + "GRANTS", + "GROUP_SYM", + "GROUP_CONCAT_SYM", + "GT_SYM", + "HANDLER_SYM", + "HASH_SYM", + "HAVING", + "HELP_SYM", + "HEX_NUM", + "HIGH_PRIORITY", + "HOST_SYM", + "HOSTS_SYM", + "HOUR_MICROSECOND_SYM", + "HOUR_MINUTE_SYM", + "HOUR_SECOND_SYM", + "HOUR_SYM", + "IDENT", + "IDENTIFIED_SYM", + "IDENT_QUOTED", + "IF", + "IGNORE_SYM", + "IGNORE_SERVER_IDS_SYM", + "IMPORT", + "INDEXES", + "INDEX_SYM", + "INFILE", + "INITIAL_SIZE_SYM", + "INNER_SYM", + "INOUT_SYM", + "INSENSITIVE_SYM", + "INSERT", + "INSERT_METHOD", + "INSTALL_SYM", + "INTERVAL_SYM", + "INTO", + "INT_SYM", + "INVOKER_SYM", + "IN_SYM", + "IO_AFTER_GTIDS", + "IO_BEFORE_GTIDS", + "IO_SYM", + "IPC_SYM", + "IS", + "ISOLATION", + "ISSUER_SYM", + "ITERATE_SYM", + "JOIN_SYM", + "KEYS", + "KEY_BLOCK_SIZE", + "KEY_SYM", + "KILL_SYM", + "LANGUAGE_SYM", + "LAST_SYM", + "LE", + "LEADING", + "LEAVES", + "LEAVE_SYM", + "LEFT", + "LESS_SYM", + "LEVEL_SYM", + "LEX_HOSTNAME", + "LIKE", + "LIMIT", + "LINEAR_SYM", + "LINES", + "LINESTRING", + "LIST_SYM", + "LOAD", + "LOCAL_SYM", + "LOCATOR_SYM", + "LOCKS_SYM", + "LOCK_SYM", + "LOGFILE_SYM", + "LOGS_SYM", + "LONGBLOB", + "LONGTEXT", + "LONG_NUM", + "LONG_SYM", + "LOOP_SYM", + "LOW_PRIORITY", + "LT", + "MASTER_AUTO_POSITION_SYM", + "MASTER_BIND_SYM", + "MASTER_CONNECT_RETRY_SYM", + "MASTER_DELAY_SYM", + "MASTER_HOST_SYM", + "MASTER_LOG_FILE_SYM", + "MASTER_LOG_POS_SYM", + "MASTER_PASSWORD_SYM", + "MASTER_PORT_SYM", + "MASTER_RETRY_COUNT_SYM", + "MASTER_SERVER_ID_SYM", + "MASTER_SSL_CAPATH_SYM", + "MASTER_SSL_CA_SYM", + "MASTER_SSL_CERT_SYM", + "MASTER_SSL_CIPHER_SYM", + "MASTER_SSL_CRL_SYM", + "MASTER_SSL_CRLPATH_SYM", + "MASTER_SSL_KEY_SYM", + "MASTER_SSL_SYM", + "MASTER_SSL_VERIFY_SERVER_CERT_SYM", + "MASTER_SYM", + "MASTER_USER_SYM", + "MASTER_HEARTBEAT_PERIOD_SYM", + "MATCH", + "MAX_CONNECTIONS_PER_HOUR", + "MAX_QUERIES_PER_HOUR", + "MAX_ROWS", + "MAX_SIZE_SYM", + "MAX_SYM", + "MAX_UPDATES_PER_HOUR", + "MAX_USER_CONNECTIONS_SYM", + "MAX_VALUE_SYM", + "MEDIUMBLOB", + "MEDIUMINT", + "MEDIUMTEXT", + "MEDIUM_SYM", + "MEMORY_SYM", + "MERGE_SYM", + "MESSAGE_TEXT_SYM", + "MICROSECOND_SYM", + "MIGRATE_SYM", + "MINUTE_MICROSECOND_SYM", + "MINUTE_SECOND_SYM", + "MINUTE_SYM", + "MIN_ROWS", + "MIN_SYM", + "MODE_SYM", + "MODIFIES_SYM", + "MODIFY_SYM", + "MOD_SYM", + "MONTH_SYM", + "MULTILINESTRING", + "MULTIPOINT", + "MULTIPOLYGON", + "MUTEX_SYM", + "MYSQL_ERRNO_SYM", + "NAMES_SYM", + "NAME_SYM", + "NATIONAL_SYM", + "NATURAL", + "NCHAR_STRING", + "NCHAR_SYM", + "NDBCLUSTER_SYM", + "NE", + "NEG", + "NEW_SYM", + "NEXT_SYM", + "NODEGROUP_SYM", + "NONE_SYM", + "NOT2_SYM", + "NOT_SYM", + "NOW_SYM", + "NO_SYM", + "NO_WAIT_SYM", + "NO_WRITE_TO_BINLOG", + "NULL_SYM", + "NUM", + "NUMBER_SYM", + "NUMERIC_SYM", + "NVARCHAR_SYM", + "OFFSET_SYM", + "OLD_PASSWORD", + "ON", + "ONE_SYM", + "ONLY_SYM", + "OPEN_SYM", + "OPTIMIZE", + "OPTIONS_SYM", + "OPTION", + "OPTIONALLY", + "OR2_SYM", + "ORDER_SYM", + "OR_OR_SYM", + "OR_SYM", + "OUTER", + "OUTFILE", + "OUT_SYM", + "OWNER_SYM", + "PACK_KEYS_SYM", + "PAGE_SYM", + "PARAM_MARKER", + "PARSER_SYM", + "PARTIAL", + "PARTITION_SYM", + "PARTITIONS_SYM", + "PARTITIONING_SYM", + "PASSWORD", + "PHASE_SYM", + "PLUGIN_DIR_SYM", + "PLUGIN_SYM", + "PLUGINS_SYM", + "POINT_SYM", + "POLYGON", + "PORT_SYM", + "POSITION_SYM", + "PRECISION", + "PREPARE_SYM", + "PRESERVE_SYM", + "PREV_SYM", + "PRIMARY_SYM", + "PRIVILEGES", + "PROCEDURE_SYM", + "PROCESS", + "PROCESSLIST_SYM", + "PROFILE_SYM", + "PROFILES_SYM", + "PROXY_SYM", + "PURGE", + "QUARTER_SYM", + "QUERY_SYM", + "QUICK", + "RANGE_SYM", + "READS_SYM", + "READ_ONLY_SYM", + "READ_SYM", + "READ_WRITE_SYM", + "REAL", + "REBUILD_SYM", + "RECOVER_SYM", + "REDOFILE_SYM", + "REDO_BUFFER_SIZE_SYM", + "REDUNDANT_SYM", + "REFERENCES", + "REGEXP", + "RELAY", + "RELAYLOG_SYM", + "RELAY_LOG_FILE_SYM", + "RELAY_LOG_POS_SYM", + "RELAY_THREAD", + "RELEASE_SYM", + "RELOAD", + "REMOVE_SYM", + "RENAME", + "REORGANIZE_SYM", + "REPAIR", + "REPEATABLE_SYM", + "REPEAT_SYM", + "REPLACE", + "REPLICATION", + "REQUIRE_SYM", + "RESET_SYM", + "RESIGNAL_SYM", + "RESOURCES", + "RESTORE_SYM", + "RESTRICT", + "RESUME_SYM", + "RETURNED_SQLSTATE_SYM", + "RETURNS_SYM", + "RETURN_SYM", + "REVERSE_SYM", + "REVOKE", + "RIGHT", + "ROLLBACK_SYM", + "ROLLUP_SYM", + "ROUTINE_SYM", + "ROWS_SYM", + "ROW_FORMAT_SYM", + "ROW_SYM", + "ROW_COUNT_SYM", + "RTREE_SYM", + "SAVEPOINT_SYM", + "SCHEDULE_SYM", + "SCHEMA_NAME_SYM", + "SECOND_MICROSECOND_SYM", + "SECOND_SYM", + "SECURITY_SYM", + "SELECT_SYM", + "SENSITIVE_SYM", + "SEPARATOR_SYM", + "SERIALIZABLE_SYM", + "SERIAL_SYM", + "SESSION_SYM", + "SERVER_SYM", + "SERVER_OPTIONS", + "SET", + "SET_VAR", + "SHARE_SYM", + "SHIFT_LEFT", + "SHIFT_RIGHT", + "SHOW", + "SHUTDOWN", + "SIGNAL_SYM", + "SIGNED_SYM", + "SIMPLE_SYM", + "SLAVE", + "SLOW", + "SMALLINT", + "SNAPSHOT_SYM", + "SOCKET_SYM", + "SONAME_SYM", + "SOUNDS_SYM", + "SOURCE_SYM", + "SPATIAL_SYM", + "SPECIFIC_SYM", + "SQLEXCEPTION_SYM", + "SQLSTATE_SYM", + "SQLWARNING_SYM", + "SQL_AFTER_GTIDS", + "SQL_AFTER_MTS_GAPS", + "SQL_BEFORE_GTIDS", + "SQL_BIG_RESULT", + "SQL_BUFFER_RESULT", + "SQL_CACHE_SYM", + "SQL_CALC_FOUND_ROWS", + "SQL_NO_CACHE_SYM", + "SQL_SMALL_RESULT", + "SQL_SYM", + "SQL_THREAD", + "SSL_SYM", + "STARTING", + "STARTS_SYM", + "START_SYM", + "STATS_AUTO_RECALC_SYM", + "STATS_PERSISTENT_SYM", + "STATS_SAMPLE_PAGES_SYM", + "STATUS_SYM", + "STDDEV_SAMP_SYM", + "STD_SYM", + "STOP_SYM", + "STORAGE_SYM", + "STRAIGHT_JOIN", + "STRING_SYM", + "SUBCLASS_ORIGIN_SYM", + "SUBDATE_SYM", + "SUBJECT_SYM", + "SUBPARTITIONS_SYM", + "SUBPARTITION_SYM", + "SUBSTRING", + "SUM_SYM", + "SUPER_SYM", + "SUSPEND_SYM", + "SWAPS_SYM", + "SWITCHES_SYM", + "SYSDATE", + "TABLES", + "TABLESPACE", + "TABLE_REF_PRIORITY", + "TABLE_SYM", + "TABLE_CHECKSUM_SYM", + "TABLE_NAME_SYM", + "TEMPORARY", + "TEMPTABLE_SYM", + "TERMINATED", + "TEXT_STRING", + "TEXT_SYM", + "THAN_SYM", + "THEN_SYM", + "TIMESTAMP", + "TIMESTAMP_ADD", + "TIMESTAMP_DIFF", + "TIME_SYM", + "TINYBLOB", + "TINYINT", + "TINYTEXT", + "TO_SYM", + "TRAILING", + "TRANSACTION_SYM", + "TRIGGERS_SYM", + "TRIGGER_SYM", + "TRIM", + "TRUE_SYM", + "TRUNCATE_SYM", + "TYPES_SYM", + "TYPE_SYM", + "UDF_RETURNS_SYM", + "ULONGLONG_NUM", + "UNCOMMITTED_SYM", + "UNDEFINED_SYM", + "UNDERSCORE_CHARSET", + "UNDOFILE_SYM", + "UNDO_BUFFER_SIZE_SYM", + "UNDO_SYM", + "UNICODE_SYM", + "UNINSTALL_SYM", + "UNION_SYM", + "UNIQUE_SYM", + "UNKNOWN_SYM", + "UNLOCK_SYM", + "UNSIGNED", + "UNTIL_SYM", + "UPDATE_SYM", + "UPGRADE_SYM", + "USAGE", + "USER", + "USE_FRM", + "USE_SYM", + "USING", + "UTC_DATE_SYM", + "UTC_TIMESTAMP_SYM", + "UTC_TIME_SYM", + "VALUES", + "VALUE_SYM", + "VARBINARY", + "VARCHAR", + "VARIABLES", + "VARIANCE_SYM", + "VARYING", + "VAR_SAMP_SYM", + "VIEW_SYM", + "WAIT_SYM", + "WARNINGS", + "WEEK_SYM", + "WEIGHT_STRING_SYM", + "WHEN_SYM", + "WHERE", + "WHILE_SYM", + "WITH", + "WITH_CUBE_SYM", + "WITH_ROLLUP_SYM", + "WORK_SYM", + "WRAPPER_SYM", + "WRITE_SYM", + "X509_SYM", + "XA_SYM", + "XML_SYM", + "XOR", + "YEAR_MONTH_SYM", + "YEAR_SYM", + "ZEROFILL", + " |", + " &", + " -", + " +", + " *", + " /", + " %", + " ^", + " ~", + " .", +} +var MySQLStatenames = []string{} + +const MySQLEofCode = 1 +const MySQLErrCode = 2 +const MySQLMaxDepth = 200 + +//line sql_yacc.yy:5046 + +//line yacctab:1 +var MySQLExca = []int{ + -1, 1, + 1, -1, + -2, 0, + -1, 59, + 540, 922, + -2, 2409, + -1, 67, + 226, 790, + 540, 511, + -2, 2409, + -1, 72, + 399, 62, + -2, 1500, + -1, 101, + 153, 1639, + 518, 2186, + 597, 2186, + -2, 1643, + -1, 516, + 601, 2418, + -2, 1055, + -1, 517, + 601, 2418, + -2, 1055, + -1, 535, + 126, 1664, + 232, 1664, + 440, 1664, + 469, 1664, + 583, 1664, + 635, 1664, + -2, 1948, + -1, 536, + 126, 1665, + 232, 1665, + 440, 1665, + 469, 1665, + 583, 1665, + 635, 1665, + -2, 2052, + -1, 689, + 368, 1798, + -2, 1803, + -1, 746, + 156, 1963, + 478, 1963, + 631, 1963, + -2, 2183, + -1, 747, + 156, 1985, + 478, 1985, + 631, 1985, + -2, 2184, + -1, 748, + 156, 2103, + 478, 2103, + 631, 2103, + -2, 2185, + -1, 752, + 156, 1826, + 478, 1826, + 631, 1826, + -2, 709, + -1, 1018, + 636, 1246, + -2, 1055, + -1, 1078, + 154, 1639, + -2, 1502, + -1, 1129, + 152, 1395, + 632, 1395, + -2, 1392, + -1, 1141, + 281, 1395, + 417, 1395, + 614, 1395, + -2, 1392, + -1, 1302, + 152, 857, + 632, 857, + -2, 725, + -1, 1303, + 152, 832, + 632, 832, + -2, 725, + -1, 1389, + 152, 505, + 632, 505, + -2, 725, + -1, 1407, + 589, 1565, + 634, 1565, + -2, 1798, + -1, 1429, + 635, 1125, + -2, 1877, + -1, 1607, + 154, 1639, + -2, 1503, + -1, 1614, + 154, 1639, + -2, 1502, + -1, 1665, + 152, 2242, + 264, 2242, + 607, 2242, + 632, 2242, + -2, 1956, + -1, 1666, + 152, 2243, + 264, 2243, + 607, 2243, + 632, 2243, + -2, 2037, + -1, 1883, + 62, 590, + 186, 590, + 402, 590, + 578, 590, + -2, 920, + -1, 1898, + 59, 725, + 60, 725, + 69, 725, + -2, 520, + -1, 1948, + 154, 1639, + -2, 368, + -1, 1949, + 154, 1639, + -2, 368, + -1, 1951, + 154, 1639, + -2, 390, + -1, 1990, + 59, 725, + 60, 725, + 69, 725, + -2, 518, + -1, 1996, + 152, 506, + 632, 506, + -2, 725, + -1, 2000, + 154, 1639, + -2, 378, + -1, 2345, + 96, 1395, + 152, 1395, + 185, 1395, + 187, 1395, + 203, 1395, + 208, 1395, + 222, 1395, + 229, 1395, + 236, 1395, + 248, 1395, + 259, 1395, + 264, 1395, + 273, 1395, + 342, 1395, + 365, 1395, + 374, 1395, + 404, 1395, + 454, 1395, + 477, 1395, + 523, 1395, + 577, 1395, + 588, 1395, + 589, 1395, + 607, 1395, + 609, 1395, + 632, 1395, + 634, 1395, + 636, 1395, + 640, 1395, + -2, 1392, + -1, 2481, + 154, 1639, + -2, 369, + -1, 2490, + 154, 1639, + -2, 391, + -1, 2550, + 469, 429, + -2, 590, + -1, 2554, + 59, 725, + 60, 725, + 69, 725, + -2, 522, + -1, 2565, + 154, 1639, + -2, 379, + -1, 2578, + 154, 1639, + -2, 355, + -1, 2583, + 636, 188, + -2, 193, + -1, 2593, + 589, 1565, + 634, 1565, + -2, 1799, + -1, 2843, + 62, 590, + 186, 590, + 402, 590, + 578, 590, + -2, 920, + -1, 2890, + 251, 759, + -2, 683, + -1, 3041, + 152, 425, + 632, 425, + -2, 1718, + -1, 3063, + 154, 1639, + -2, 356, + -1, 3279, + 96, 1395, + 152, 1395, + 187, 1395, + 203, 1395, + 208, 1395, + 229, 1395, + 236, 1395, + 248, 1395, + 259, 1395, + 264, 1395, + 273, 1395, + 342, 1395, + 365, 1395, + 374, 1395, + 404, 1395, + 454, 1395, + 477, 1395, + 523, 1395, + 577, 1395, + 589, 1395, + 607, 1395, + 609, 1395, + 632, 1395, + 634, 1395, + 636, 1395, + 640, 1395, + -2, 1392, + -1, 3326, + 251, 759, + -2, 684, + -1, 3390, + 251, 759, + -2, 683, + -1, 3432, + 59, 725, + 60, 725, + 69, 725, + -2, 518, + -1, 3742, + 154, 1639, + -2, 490, + -1, 3844, + 152, 425, + 632, 425, + -2, 1718, + -1, 3892, + 152, 2306, + 609, 2306, + 632, 2306, + -2, 2303, + -1, 3904, + 154, 1639, + -2, 491, + -1, 4208, + 154, 1639, + -2, 490, + -1, 4217, + 634, 483, + 636, 483, + -2, 1094, +} + +const MySQLNprod = 2463 +const MySQLPrivate = 57344 + +var MySQLTokenNames []string +var MySQLStates []string + +const MySQLLast = 58646 + +var MySQLAct = []int{ + + 570, 4313, 4284, 4253, 1297, 2372, 3329, 4169, 2428, 2765, + 4306, 145, 46, 3965, 571, 3762, 1286, 4286, 3980, 3903, + 4149, 2267, 3981, 3872, 4132, 4050, 3871, 2958, 3581, 1611, + 3870, 3869, 3700, 4055, 4089, 3916, 4091, 1856, 4177, 3801, + 3868, 3998, 3867, 4004, 3821, 3866, 1329, 3865, 3417, 3864, + 3900, 3863, 3285, 3862, 2887, 3861, 3888, 3860, 3995, 3399, + 3292, 2682, 4009, 140, 2427, 4011, 3353, 4023, 2696, 3997, + 3822, 533, 3823, 4006, 682, 2834, 3977, 3933, 689, 691, + 2735, 2736, 1931, 2745, 3000, 543, 3694, 1714, 711, 2769, + 3434, 3905, 1711, 3685, 3219, 731, 3110, 1857, 736, 3765, + 749, 731, 1291, 2232, 3348, 3886, 1858, 2499, 1942, 799, + 3039, 2038, 3673, 2241, 1204, 3609, 595, 1760, 3630, 3758, + 3358, 831, 140, 140, 2878, 690, 843, 2245, 691, 3462, + 1459, 767, 3220, 3734, 2952, 3081, 550, 1391, 3006, 627, + 551, 3089, 1860, 1846, 2013, 2551, 809, 3325, 1789, 3064, + 3416, 2300, 3653, 2883, 1991, 1681, 1827, 1861, 3327, 2257, + 2866, 2846, 1658, 1203, 3034, 1477, 743, 1841, 775, 2803, + 3109, 3684, 3273, 2737, 845, 2485, 1610, 2749, 552, 1633, + 2180, 3210, 2681, 3183, 2123, 2484, 1677, 2573, 2570, 2708, + 2680, 2865, 2353, 1825, 3091, 3454, 2491, 1609, 2472, 2500, + 1619, 545, 1992, 3701, 2566, 2411, 3130, 2857, 2482, 2900, + 2035, 3674, 2897, 2553, 134, 2867, 2165, 2855, 1367, 2383, + 2885, 2366, 1823, 1362, 2811, 2274, 1294, 3128, 2271, 2266, + 2747, 2005, 1149, 1751, 1706, 3435, 2483, 2764, 2196, 2219, + 3046, 3119, 3175, 2697, 2881, 2299, 2698, 1393, 2836, 2541, + 709, 2200, 2872, 3118, 2346, 2554, 542, 1880, 1719, 1824, + 1740, 2258, 1762, 1221, 1632, 2730, 1678, 1617, 3125, 1238, + 1214, 1538, 2618, 1608, 2045, 960, 813, 2041, 544, 1822, + 3628, 2031, 538, 810, 1408, 3999, 1341, 1893, 1392, 683, + 2713, 1918, 2480, 1867, 139, 1919, 1304, 3111, 1295, 707, + 3040, 2884, 1847, 1273, 1278, 2311, 719, 1244, 98, 1183, + 741, 1184, 2273, 1157, 1189, 2189, 1140, 1106, 1688, 1705, + 1146, 1606, 1086, 897, 864, 1951, 1303, 1369, 1946, 2268, + 1620, 982, 2381, 1783, 855, 1778, 1222, 1560, 1182, 1639, + 1180, 903, 1380, 725, 1163, 1161, 1689, 1566, 1478, 1641, + 967, 1285, 1324, 832, 833, 1310, 835, 812, 1271, 824, + 119, 1170, 858, 4316, 1102, 4315, 842, 686, 2069, 3967, + 1003, 3355, 923, 922, 1564, 4216, 1070, 4215, 1712, 2343, + 4214, 2477, 4213, 3354, 4273, 4207, 1708, 4206, 1522, 2513, + 923, 922, 3218, 3240, 4158, 4157, 3240, 3352, 4156, 497, + 4218, 2477, 923, 922, 4155, 3541, 4154, 4078, 790, 751, + 1908, 1905, 1712, 916, 3849, 2068, 4077, 4159, 4143, 923, + 922, 3849, 3849, 4076, 4075, 633, 2476, 3849, 3023, 4074, + 4017, 2577, 3960, 3849, 3959, 3948, 4112, 3240, 2577, 3921, + 3849, 4106, 3853, 923, 922, 1913, 2124, 3849, 3849, 3852, + 3848, 3796, 3796, 3797, 3795, 923, 922, 3280, 3541, 1907, + 3776, 923, 922, 734, 2064, 500, 2064, 1925, 4280, 916, + 3715, 3716, 3713, 113, 916, 3721, 3706, 3718, 4020, 3541, + 69, 3540, 3237, 706, 3533, 916, 3430, 3465, 3429, 2261, + 717, 1921, 923, 922, 4018, 3414, 846, 3413, 533, 3991, + 3613, 533, 1709, 1710, 1712, 1308, 797, 667, 3240, 1915, + 3239, 843, 2342, 916, 3412, 3113, 3279, 3023, 3842, 3024, + 691, 878, 886, 2757, 1460, 2756, 893, 898, 1375, 3073, + 3730, 2341, 902, 3729, 849, 914, 1709, 1710, 1902, 923, + 922, 2721, 2339, 2720, 1707, 908, 923, 922, 901, 916, + 935, 2687, 3720, 916, 1613, 2609, 1479, 1480, 1481, 1482, + 1490, 3719, 965, 970, 630, 916, 889, 2160, 916, 3714, + 2158, 668, 3162, 3713, 923, 922, 3712, 3711, 2755, 916, + 916, 2157, 2156, 916, 2476, 2155, 79, 923, 922, 3944, + 3945, 2476, 2083, 916, 916, 2154, 2108, 923, 922, 632, + 1466, 3710, 2053, 3681, 2476, 3679, 3664, 923, 922, 3547, + 1922, 3546, 3538, 3943, 3507, 3412, 3501, 1920, 3470, 3456, + 923, 922, 3452, 1851, 3432, 2338, 1851, 923, 922, 3322, + 3249, 3310, 3359, 3248, 1926, 3236, 3297, 691, 3226, 114, + 2066, 1882, 1374, 3217, 3139, 3138, 1372, 2552, 3135, 923, + 922, 3134, 3117, 1058, 3112, 3104, 3102, 1376, 1483, 1484, + 1485, 1492, 2758, 2690, 2689, 1521, 2478, 665, 2688, 1850, + 3847, 1069, 2686, 2685, 2673, 2046, 2613, 2598, 2316, 843, + 3675, 1410, 2149, 1043, 2148, 2147, 2478, 2126, 2146, 1881, + 1461, 825, 2145, 1903, 2143, 2141, 936, 2139, 2137, 1133, + 1240, 2167, 923, 922, 2136, 2135, 2576, 533, 2132, 533, + 2103, 1904, 1613, 2576, 2092, 2063, 2062, 1155, 533, 1613, + 786, 533, 2067, 923, 922, 2049, 2066, 4299, 921, 1958, + 2260, 920, 663, 923, 922, 1862, 1555, 2340, 1544, 4145, + 997, 749, 1691, 691, 691, 691, 921, 629, 664, 920, + 1192, 1518, 1502, 1202, 1208, 1455, 1299, 1379, 921, 4145, + 4221, 920, 691, 995, 969, 1909, 1497, 4051, 1486, 1487, + 1493, 985, 4038, 1906, 3930, 921, 3926, 1494, 920, 923, + 922, 3411, 3925, 3923, 3919, 3851, 2575, 3783, 1373, 1195, + 1200, 1206, 3781, 3780, 92, 533, 3779, 1283, 3778, 921, + 1612, 949, 920, 3745, 3704, 3604, 2337, 1852, 1229, 3601, + 3735, 921, 3595, 3566, 920, 923, 922, 921, 3439, 3532, + 920, 3438, 3437, 113, 3382, 3381, 3131, 3120, 854, 996, + 533, 857, 3020, 956, 957, 958, 959, 140, 3126, 3344, + 3318, 2047, 971, 1916, 1998, 1325, 976, 691, 921, 691, + 533, 920, 994, 1339, 2275, 1495, 2477, 826, 3176, 2201, + 984, 2984, 1386, 1387, 1388, 1389, 2743, 691, 1325, 2741, + 2734, 2724, 1390, 871, 880, 2585, 866, 869, 786, 3309, + 2583, 1397, 1398, 1371, 2538, 786, 3259, 4318, 2692, 2380, + 1618, 2469, 1402, 2318, 2304, 921, 1407, 2303, 920, 1910, + 1911, 1912, 921, 934, 2262, 920, 1924, 1292, 2279, 2249, + 1488, 1496, 1690, 2233, 1414, 2051, 691, 2025, 4236, 2022, + 983, 1002, 1923, 3269, 3356, 1914, 2011, 938, 1239, 1239, + 921, 1953, 1421, 920, 1015, 662, 2574, 107, 1642, 3615, + 923, 922, 3614, 921, 1430, 1237, 920, 1067, 3349, 1066, + 1065, 1368, 631, 921, 1064, 691, 920, 666, 1612, 1063, + 634, 1917, 1415, 921, 1062, 1612, 920, 1061, 1038, 970, + 1012, 2010, 1300, 918, 1016, 1017, 921, 970, 1475, 920, + 1060, 1500, 1004, 921, 3120, 1057, 920, 923, 922, 114, + 3448, 918, 1476, 1056, 1055, 2050, 950, 3057, 1378, 1474, + 1054, 1453, 1998, 918, 1053, 921, 1052, 3169, 920, 3168, + 3013, 1956, 1051, 3612, 3611, 1050, 953, 952, 1049, 2550, + 918, 3163, 1435, 1539, 1059, 1438, 1439, 1440, 1441, 1442, + 1443, 1445, 1447, 1448, 1449, 1450, 1451, 1452, 2082, 1048, + 1047, 1241, 1074, 1412, 918, 1078, 1256, 1257, 1491, 1072, + 1073, 1191, 1075, 1076, 1077, 1132, 918, 1080, 921, 2476, + 2125, 920, 918, 1489, 1498, 1046, 1045, 1845, 1313, 1068, + 1845, 1597, 3717, 1599, 140, 691, 533, 140, 140, 921, + 1325, 691, 920, 1084, 949, 533, 1159, 1037, 1036, 921, + 939, 1035, 920, 918, 1328, 1531, 1334, 2166, 1178, 1175, + 1034, 1634, 1033, 1235, 1368, 116, 1032, 1142, 1031, 3160, + 4274, 3161, 923, 922, 1030, 1213, 923, 922, 1029, 1160, + 1028, 1027, 1306, 1026, 1025, 1411, 1305, 1615, 1024, 1282, + 1023, 1022, 1664, 533, 1021, 921, 1020, 1019, 920, 1018, + 918, 2478, 1014, 533, 942, 943, 1013, 918, 916, 923, + 922, 1011, 1281, 1287, 1288, 1289, 1290, 937, 4019, 1284, + 691, 533, 1010, 533, 2317, 3782, 1009, 1008, 1007, 1298, + 969, 921, 1006, 1525, 920, 918, 923, 922, 1473, 1005, + 1335, 1001, 749, 1425, 1426, 1385, 1301, 1613, 918, 1311, + 1000, 1312, 1501, 3728, 999, 998, 923, 922, 918, 993, + 1750, 992, 991, 990, 1757, 4259, 3727, 3298, 918, 989, + 691, 1767, 1768, 988, 3137, 4034, 3136, 1437, 987, 1368, + 1395, 918, 986, 1775, 3106, 1998, 3105, 981, 918, 977, + 923, 922, 1542, 3120, 1454, 975, 533, 2600, 3715, 2599, + 1463, 1790, 923, 922, 2122, 1403, 2121, 972, 743, 964, + 918, 963, 851, 3732, 923, 922, 923, 922, 3731, 691, + 2335, 533, 533, 140, 140, 140, 140, 3457, 3726, 140, + 3453, 140, 1588, 1589, 1590, 1591, 1592, 3394, 1594, 950, + 3323, 923, 922, 3298, 1368, 533, 940, 941, 945, 944, + 946, 947, 948, 951, 923, 922, 921, 3291, 1855, 920, + 923, 922, 633, 918, 1673, 1600, 1690, 3237, 1604, 1605, + 923, 922, 3227, 3218, 3197, 533, 3179, 3178, 916, 1467, + 2829, 3725, 1602, 2823, 918, 2799, 2762, 923, 922, 2760, + 2727, 2168, 923, 922, 918, 2288, 2285, 923, 922, 2280, + 2081, 2255, 2080, 921, 1368, 2178, 920, 2172, 2164, 2100, + 2065, 2061, 1456, 786, 2104, 2102, 2101, 2096, 1960, 1959, + 1954, 1836, 1534, 1535, 1818, 1817, 1797, 1181, 1744, 533, + 1743, 1700, 1676, 1672, 1928, 1638, 1621, 3613, 1466, 138, + 918, 1791, 1166, 4195, 667, 4187, 533, 949, 4100, 2586, + 2596, 3657, 3297, 3527, 3201, 3200, 2060, 1571, 140, 140, + 3099, 140, 2006, 2944, 2759, 2684, 1603, 1703, 923, 922, + 2067, 533, 898, 2374, 2016, 2163, 918, 2131, 2130, 2129, + 1468, 1568, 1569, 1570, 1572, 1574, 1576, 1578, 1579, 1580, + 1581, 1582, 1614, 1612, 3724, 2012, 1586, 1849, 1413, 1211, + 1210, 630, 913, 980, 852, 1595, 951, 1296, 668, 2017, + 1787, 2064, 923, 922, 2733, 2588, 118, 1766, 1643, 1644, + 1645, 3832, 923, 922, 1820, 3018, 1696, 970, 921, 2054, + 1692, 920, 921, 1674, 3184, 920, 632, 2176, 1667, 923, + 922, 1771, 1772, 923, 922, 3631, 4001, 2225, 3887, 1776, + 1777, 1704, 1774, 2009, 1807, 1808, 1809, 1810, 1693, 2562, + 1812, 1746, 1814, 3671, 3472, 921, 1803, 1713, 920, 704, + 1717, 3307, 4268, 1280, 1732, 1215, 1734, 2201, 2026, 1471, + 2028, 1736, 2030, 1314, 3384, 1801, 1802, 3385, 4093, 1749, + 1748, 3656, 921, 1653, 1758, 920, 3349, 1254, 1811, 3386, + 1813, 918, 4093, 3791, 665, 1649, 1897, 923, 922, 1896, + 1173, 2792, 921, 1613, 3743, 920, 1773, 1457, 1898, 1456, + 2338, 691, 923, 922, 1782, 2058, 2039, 3757, 1785, 3755, + 852, 945, 944, 946, 947, 948, 951, 1082, 2579, 1490, + 3185, 3632, 950, 3261, 1804, 115, 921, 2152, 918, 920, + 1993, 1994, 1848, 2325, 2558, 1306, 533, 533, 921, 1305, + 1927, 920, 4080, 4001, 923, 922, 3723, 2128, 499, 663, + 921, 498, 921, 920, 1987, 920, 1255, 2557, 2476, 691, + 653, 3633, 1309, 2223, 629, 664, 1651, 1853, 702, 2002, + 2003, 1647, 970, 3078, 4256, 1868, 691, 921, 691, 3739, + 920, 3616, 2825, 2197, 1816, 1293, 2036, 1948, 1949, 3895, + 921, 923, 922, 920, 4048, 3276, 921, 718, 2875, 920, + 2199, 4000, 1957, 2261, 2780, 2173, 921, 2498, 2052, 920, + 533, 887, 1332, 533, 1650, 3228, 2227, 533, 923, 922, + 1492, 1306, 2188, 921, 3477, 1305, 920, 2423, 921, 1648, + 2014, 920, 3277, 921, 3203, 2248, 920, 691, 1986, 791, + 859, 533, 533, 1985, 3202, 1279, 2023, 3639, 2269, 1475, + 3833, 1821, 2027, 918, 1699, 1240, 1996, 918, 3199, 786, + 3477, 2000, 1476, 1476, 2004, 2001, 923, 922, 949, 3003, + 2272, 3722, 2719, 3172, 2424, 2015, 691, 2044, 2287, 3076, + 2256, 1219, 749, 2250, 790, 751, 1613, 2236, 1747, 1701, + 918, 2019, 853, 877, 138, 4033, 923, 922, 905, 749, + 2243, 3935, 691, 1765, 921, 1041, 3167, 920, 2181, 4032, + 3054, 792, 4031, 997, 533, 2305, 995, 918, 4000, 923, + 922, 667, 2871, 1530, 2140, 1497, 1527, 985, 1764, 1493, + 3440, 523, 2731, 2099, 3934, 2151, 1494, 918, 3740, 1612, + 2265, 2784, 2783, 923, 922, 2322, 906, 3262, 2302, 1292, + 2182, 4243, 662, 3592, 2277, 3487, 3615, 2497, 921, 3614, + 2224, 920, 860, 2422, 2244, 1852, 829, 2344, 795, 631, + 3116, 918, 3894, 2183, 666, 921, 2377, 634, 920, 921, + 2376, 2198, 920, 918, 3475, 668, 1655, 1799, 1226, 3486, + 1838, 691, 533, 2348, 4133, 918, 2235, 918, 838, 1216, + 2373, 3485, 3917, 499, 40, 2231, 498, 875, 16, 3835, + 923, 922, 512, 3192, 1495, 3191, 946, 947, 948, 951, + 3475, 2169, 918, 1266, 1231, 2193, 2413, 923, 922, 1225, + 3612, 3611, 923, 922, 1270, 918, 1333, 2368, 1268, 2175, + 3174, 918, 3838, 921, 2260, 3186, 920, 2462, 923, 922, + 876, 918, 786, 3173, 55, 923, 922, 2345, 921, 3171, + 3421, 920, 1331, 950, 2449, 3481, 2161, 3053, 918, 3170, + 1496, 26, 904, 918, 2021, 526, 2171, 3891, 918, 1040, + 2133, 665, 124, 2357, 2177, 1763, 3158, 923, 922, 2461, + 2142, 3157, 2144, 1239, 3165, 691, 2194, 691, 2150, 3895, + 921, 3478, 874, 920, 836, 2460, 2429, 2430, 2431, 2432, + 2433, 2434, 2435, 2436, 2437, 2438, 2439, 2440, 2441, 2442, + 2443, 2444, 2445, 2286, 2296, 2446, 2397, 2213, 4090, 2221, + 2452, 2453, 1612, 2454, 2455, 2791, 2278, 2229, 2873, 691, + 2283, 3419, 3978, 2510, 2358, 140, 2247, 921, 2587, 918, + 920, 2591, 533, 2593, 2253, 2459, 3703, 873, 1239, 705, + 4008, 1275, 664, 2276, 2458, 2057, 2386, 3156, 1293, 1654, + 923, 922, 923, 922, 921, 971, 838, 920, 3834, 2405, + 2327, 3459, 2306, 2307, 923, 922, 2412, 2309, 2310, 2282, + 2315, 872, 1191, 918, 2291, 2290, 2289, 1781, 3275, 4079, + 1668, 2563, 691, 918, 877, 2319, 834, 1491, 2638, 2298, + 691, 942, 943, 923, 922, 3387, 1220, 3181, 2262, 2190, + 918, 3155, 921, 1498, 918, 920, 2347, 2333, 1657, 3284, + 3077, 2314, 3668, 793, 2558, 923, 922, 3889, 3151, 1559, + 1274, 4303, 3150, 2399, 2400, 2321, 2415, 2416, 1206, 1539, + 2419, 2665, 921, 3893, 2477, 920, 1206, 2557, 2537, 1780, + 3392, 2331, 2475, 2332, 1193, 2487, 2487, 1212, 2494, 2334, + 2375, 2369, 2474, 1171, 3476, 921, 3189, 2617, 920, 2018, + 2466, 1712, 3894, 3455, 2356, 2359, 2486, 2486, 918, 2493, + 2352, 2360, 1738, 2711, 1898, 2020, 3355, 2779, 2463, 921, + 2379, 2595, 920, 918, 2699, 691, 3148, 2378, 3354, 838, + 3476, 1315, 923, 922, 2874, 1193, 2633, 2572, 3094, 1634, + 1634, 3146, 3352, 2473, 2639, 123, 2425, 2409, 2492, 1232, + 2715, 2715, 2715, 790, 751, 727, 923, 922, 2571, 2607, + 2608, 3890, 2508, 716, 2610, 918, 1209, 1217, 4244, 3047, + 3420, 2284, 3956, 940, 941, 945, 944, 946, 947, 948, + 951, 876, 4205, 3144, 2421, 1529, 921, 4310, 1528, 920, + 1218, 666, 923, 922, 2738, 2702, 2584, 2567, 1646, 1179, + 3186, 1698, 2488, 921, 2293, 1561, 920, 2512, 921, 3698, + 2750, 920, 918, 522, 2712, 3096, 691, 691, 2167, 2616, + 3640, 2589, 2808, 892, 921, 2294, 2594, 920, 906, 2611, + 3143, 921, 3215, 2809, 920, 1039, 1834, 2637, 2556, 918, + 2770, 2761, 970, 2715, 2715, 2715, 2605, 2561, 1306, 749, + 2191, 2592, 1305, 1927, 4269, 2590, 3095, 2722, 2597, 2295, + 1779, 2601, 2465, 921, 728, 1988, 920, 2782, 2889, 2604, + 838, 2606, 923, 922, 3768, 1562, 2781, 2476, 1790, 1790, + 2612, 2875, 2615, 2044, 2614, 3769, 1130, 918, 2704, 1187, + 4171, 700, 1382, 2632, 2746, 1475, 533, 533, 533, 923, + 922, 3707, 1640, 3164, 1269, 533, 1422, 2192, 1267, 1476, + 2320, 4071, 2515, 2516, 2517, 743, 2804, 918, 2358, 2709, + 2529, 2530, 2531, 2532, 2533, 3403, 2535, 2536, 691, 2577, + 3049, 2540, 525, 2547, 2838, 2840, 2664, 3383, 2695, 726, + 918, 923, 922, 2847, 2413, 885, 921, 2413, 921, 920, + 3184, 920, 2847, 890, 796, 2847, 2847, 910, 3142, 2478, + 921, 912, 2413, 920, 918, 2728, 3957, 3559, 2413, 1381, + 698, 2413, 2700, 1186, 2830, 2945, 2413, 2413, 2181, 4311, + 2413, 533, 3141, 3893, 923, 922, 2192, 1475, 2955, 921, + 2957, 691, 920, 2351, 2518, 2525, 2526, 2527, 2528, 2396, + 2703, 1476, 2701, 2706, 2534, 1613, 1194, 911, 2953, 2539, + 1685, 921, 3005, 2548, 920, 691, 691, 3391, 1791, 1791, + 2182, 888, 2772, 899, 909, 3032, 2793, 2794, 2810, 1239, + 3011, 918, 1239, 2603, 2797, 1955, 1835, 2959, 3093, 4233, + 883, 2717, 2718, 2183, 692, 2729, 923, 922, 918, 2119, + 3214, 2950, 1716, 918, 2807, 3221, 3185, 1194, 2754, 3004, + 2862, 1206, 2302, 2751, 2752, 2768, 2116, 3958, 2817, 918, + 1656, 2115, 2989, 2990, 1363, 1364, 918, 1882, 2545, 1563, + 4115, 2753, 2476, 953, 952, 2467, 2408, 2114, 921, 1424, + 2806, 920, 923, 922, 2112, 882, 2395, 3767, 2816, 2771, + 2394, 3014, 3015, 3016, 2848, 2523, 137, 2851, 918, 2778, + 2393, 2413, 921, 533, 141, 920, 533, 2861, 2868, 2868, + 533, 533, 2788, 2392, 691, 2813, 2405, 2790, 2785, 881, + 2391, 2412, 2786, 2773, 2774, 2775, 2946, 2947, 923, 922, + 2948, 2787, 2546, 3092, 2789, 1187, 3090, 1432, 921, 691, + 2845, 920, 949, 2812, 2676, 2805, 2390, 2389, 1152, 2876, + 2388, 1151, 2822, 2852, 2853, 2854, 1932, 2858, 2859, 2524, + 3055, 786, 2860, 2864, 954, 1852, 2890, 530, 2993, 2869, + 1935, 2831, 2832, 2877, 1897, 3048, 605, 1896, 2827, 2828, + 2819, 918, 4122, 918, 4173, 3097, 1898, 2520, 2842, 3058, + 3059, 3060, 3061, 1240, 2576, 918, 4105, 2475, 2863, 2109, + 1613, 2107, 923, 922, 2166, 1365, 1366, 2474, 2487, 2983, + 701, 2981, 3041, 2106, 2888, 954, 2838, 2494, 921, 1683, + 3012, 920, 923, 922, 918, 4104, 529, 1131, 2544, 2486, + 3987, 2960, 2961, 3898, 2889, 3187, 2965, 3019, 2493, 3245, + 3017, 1612, 2090, 3461, 1682, 921, 918, 1652, 920, 1326, + 4101, 2994, 2978, 691, 1129, 2521, 2405, 891, 2473, 3356, + 3766, 2412, 1840, 4226, 2079, 3085, 4222, 2575, 3955, 3405, + 691, 3451, 2197, 3401, 3083, 2980, 4170, 2492, 533, 3929, + 3195, 3263, 1849, 3098, 1420, 2847, 3086, 921, 3101, 2726, + 920, 3108, 2572, 2243, 2750, 923, 922, 1150, 2055, 2959, + 1423, 3225, 2560, 1852, 3067, 3071, 4172, 2032, 2269, 2542, + 3232, 1475, 2979, 2571, 3066, 4300, 3072, 3069, 3043, 2358, + 3056, 3234, 1476, 918, 3927, 1476, 3070, 2559, 691, 2555, + 921, 1941, 2272, 920, 1933, 4090, 2519, 950, 1735, 1733, + 1637, 2078, 4224, 1636, 1431, 3038, 3231, 918, 1596, 3050, + 4254, 4003, 2567, 3882, 3635, 3480, 3224, 2244, 528, 533, + 2795, 3103, 3606, 3260, 136, 3065, 786, 2243, 1433, 2987, + 1384, 3186, 1318, 533, 2387, 653, 3473, 923, 922, 1680, + 691, 923, 922, 918, 3973, 2238, 953, 952, 3295, 2995, + 3881, 823, 921, 3708, 3100, 920, 3580, 2824, 2265, 3785, + 2413, 2076, 2450, 2847, 2847, 2847, 496, 3204, 715, 2847, + 3107, 1937, 1627, 723, 3084, 2477, 1137, 2574, 2413, 3129, + 2413, 2413, 1317, 4196, 3121, 3122, 2368, 1626, 2847, 1625, + 3321, 2244, 1624, 1623, 722, 696, 1934, 1622, 921, 1230, + 533, 920, 1154, 2988, 3286, 3127, 1612, 2354, 1900, 3196, + 3928, 135, 2962, 2239, 3074, 1901, 2966, 2968, 2970, 2972, + 2974, 2975, 2976, 918, 3166, 3246, 3212, 143, 3177, 144, + 955, 3306, 2992, 2732, 923, 922, 2358, 1671, 2039, 3290, + 3763, 2075, 1152, 3281, 921, 942, 943, 920, 2384, 3238, + 918, 1240, 3194, 3463, 3193, 3388, 1936, 2413, 1436, 2126, + 1745, 691, 3216, 3840, 3535, 1319, 923, 922, 2072, 3915, + 3205, 3709, 3206, 3839, 818, 3264, 3213, 3208, 2543, 3619, + 3618, 955, 697, 3534, 3223, 3222, 3031, 3421, 1683, 2418, + 3914, 1434, 918, 2355, 2237, 533, 3316, 3230, 3235, 3233, + 2358, 3229, 1683, 3972, 2986, 2522, 2523, 1206, 3140, 2405, + 2386, 3315, 4001, 1682, 140, 2982, 2850, 3035, 921, 2849, + 3300, 920, 923, 922, 3395, 3569, 3247, 1682, 3371, 3374, + 3311, 3376, 3377, 3255, 2417, 918, 3568, 3268, 921, 4223, + 2868, 920, 923, 922, 3265, 3266, 2451, 3267, 533, 817, + 1939, 723, 695, 2071, 2815, 3282, 3278, 2814, 1186, 3544, + 2503, 3287, 923, 922, 3258, 1798, 2826, 3250, 3419, 3312, + 2524, 3313, 3314, 2399, 2400, 3299, 1138, 1223, 2476, 1784, + 3301, 3302, 3303, 1687, 3304, 1675, 3305, 940, 941, 945, + 944, 946, 947, 948, 951, 3320, 2998, 918, 2520, 3124, + 3317, 3123, 3625, 3545, 4180, 605, 1944, 2649, 3537, 3343, + 3464, 921, 2220, 1850, 920, 2070, 3626, 2412, 1135, 605, + 605, 605, 605, 605, 3393, 3404, 1224, 1686, 605, 1383, + 605, 3345, 3445, 3370, 605, 3474, 3372, 714, 3422, 3422, + 3422, 2654, 3433, 918, 2653, 3129, 3346, 863, 3449, 3347, + 3357, 3360, 3361, 3362, 3363, 3341, 3378, 3379, 3380, 2159, + 2478, 3390, 3389, 4292, 2385, 862, 2521, 3364, 2502, 1901, + 3129, 3129, 3129, 3368, 861, 3211, 3423, 3424, 1322, 3375, + 3355, 3841, 3422, 3422, 3365, 3366, 3367, 4000, 708, 918, + 949, 129, 3354, 921, 4186, 3396, 920, 921, 4175, 2475, + 920, 865, 143, 2240, 144, 2487, 3352, 2494, 1634, 2474, + 691, 2999, 1414, 691, 691, 1071, 3508, 790, 3373, 3443, + 3444, 1945, 3415, 3447, 3585, 2039, 2486, 3426, 2493, 2738, + 3467, 3410, 3543, 3427, 4247, 2647, 3479, 3425, 2750, 691, + 1999, 1320, 4241, 1321, 2572, 3402, 3450, 2519, 3500, 3067, + 3071, 3552, 970, 691, 691, 691, 4024, 3550, 3738, 3066, + 2473, 3072, 3069, 918, 605, 2571, 3289, 2492, 3436, 1079, + 1475, 3070, 3442, 867, 844, 2776, 3510, 3420, 533, 533, + 3564, 923, 922, 918, 1476, 1399, 923, 922, 1399, 2007, + 921, 2804, 2097, 920, 923, 922, 3458, 691, 4087, 2153, + 3627, 3460, 3283, 3557, 2567, 923, 922, 3244, 2638, 2847, + 3065, 3243, 3468, 3242, 3469, 1401, 2777, 1851, 1400, 2312, + 2095, 1153, 921, 4297, 4267, 920, 2413, 3466, 3488, 3489, + 3490, 923, 922, 4266, 2413, 3491, 2504, 4265, 923, 922, + 4013, 820, 821, 1206, 822, 2505, 819, 3526, 691, 3759, + 3529, 3530, 2507, 3551, 2350, 1796, 918, 1258, 3483, 1404, + 3622, 816, 4027, 4025, 691, 2879, 1800, 4026, 4028, 2705, + 3499, 3428, 3504, 4083, 3505, 2509, 3506, 3587, 921, 3880, + 3503, 920, 3594, 3624, 1997, 950, 733, 2709, 2181, 1598, + 3554, 3555, 3556, 1234, 2302, 1233, 1660, 3511, 921, 3748, + 3560, 920, 3539, 3008, 3536, 1475, 2728, 3253, 3654, 3654, + 1206, 1849, 3562, 3241, 3593, 3548, 605, 3198, 921, 1476, + 3623, 920, 2801, 2800, 2798, 3677, 2953, 2744, 2281, 2187, + 2182, 3641, 3553, 4041, 3571, 3573, 1984, 1983, 918, 3563, + 3575, 3576, 918, 923, 922, 1982, 2358, 2506, 3686, 3686, + 3686, 1981, 3578, 2183, 2120, 3574, 2522, 3608, 3579, 3577, + 3583, 3692, 3637, 1980, 1979, 3696, 3693, 1978, 3090, 1977, + 3589, 3570, 3572, 1976, 1790, 3591, 3645, 3610, 3638, 3598, + 1975, 605, 605, 605, 605, 3648, 3549, 3602, 3644, 2405, + 3649, 605, 605, 3646, 2412, 3605, 1974, 1973, 1972, 3621, + 1971, 605, 1970, 605, 605, 605, 605, 605, 605, 605, + 605, 605, 605, 605, 605, 605, 605, 3599, 1292, 1969, + 605, 3662, 1968, 3672, 3658, 3596, 3597, 3590, 605, 1967, + 605, 1966, 1661, 942, 943, 918, 2880, 605, 1965, 3663, + 605, 1964, 2501, 3007, 605, 3655, 605, 1963, 3659, 605, + 1962, 605, 605, 605, 605, 605, 605, 605, 605, 605, + 1961, 605, 915, 605, 848, 605, 605, 918, 691, 3676, + 605, 605, 2029, 3422, 605, 605, 605, 2770, 847, 533, + 533, 3733, 3669, 2118, 605, 605, 605, 605, 3680, 605, + 605, 605, 605, 605, 605, 605, 605, 605, 605, 3695, + 605, 605, 605, 533, 3697, 3678, 3686, 2170, 3690, 3699, + 3691, 1236, 828, 3985, 1791, 3787, 4232, 4184, 4082, 3101, + 3687, 3688, 3705, 918, 2628, 605, 605, 605, 605, 605, + 605, 605, 605, 3634, 3067, 3071, 3636, 921, 3938, 2117, + 920, 1375, 921, 918, 3066, 920, 3072, 3069, 1695, 4202, + 921, 3207, 691, 920, 2387, 3647, 3070, 3502, 3774, 2113, + 4203, 921, 3666, 918, 920, 1843, 3751, 2407, 3798, 3650, + 3651, 3652, 3773, 3736, 3737, 940, 941, 945, 944, 946, + 947, 948, 951, 3746, 3741, 1585, 3002, 921, 3831, 1567, + 920, 949, 1567, 4046, 921, 3065, 1567, 920, 1206, 4045, + 3815, 3001, 3750, 3814, 533, 3747, 3760, 3813, 3812, 1567, + 1769, 3859, 2456, 1567, 4255, 1100, 3831, 3811, 2448, 3810, + 3761, 2447, 3809, 4014, 3808, 133, 3807, 3856, 3806, 3845, + 3805, 3252, 3804, 3356, 3803, 3752, 3753, 1849, 3770, 3873, + 3913, 3876, 2387, 3790, 3293, 4263, 3661, 3660, 3617, 1308, + 1475, 533, 4097, 3369, 2934, 1374, 3850, 605, 3792, 1372, + 3918, 3788, 3789, 721, 1476, 2997, 3794, 605, 2996, 3793, + 1376, 3901, 3911, 2008, 514, 1930, 1741, 3777, 1947, 713, + 685, 605, 3907, 2466, 730, 3846, 3800, 3857, 1842, 3686, + 3686, 3686, 3686, 1742, 3799, 2343, 1819, 2387, 3843, 921, + 117, 3844, 920, 923, 922, 923, 922, 3610, 1683, 4239, + 2407, 3400, 1583, 923, 922, 1577, 3875, 2387, 3885, 1575, + 928, 926, 3879, 3962, 3582, 790, 751, 539, 4240, 3877, + 923, 922, 1573, 1682, 4281, 1929, 1565, 3970, 1761, 3974, + 954, 3989, 3988, 1989, 3946, 131, 3831, 3831, 132, 2675, + 3294, 4260, 3896, 3897, 4234, 3831, 2384, 3831, 929, 2403, + 3686, 1669, 605, 2402, 3983, 790, 751, 501, 1628, 930, + 949, 798, 1169, 4272, 3936, 2674, 740, 3941, 2039, 3968, + 3969, 762, 918, 3931, 949, 753, 950, 918, 3953, 3947, + 3990, 3912, 4067, 738, 4065, 918, 1683, 735, 2111, 4064, + 4061, 1373, 4060, 2110, 4007, 4012, 918, 3940, 925, 3035, + 3961, 2098, 3963, 517, 3939, 3937, 516, 514, 3586, 931, + 4035, 1682, 2094, 3190, 710, 2742, 2426, 505, 2342, 732, + 4056, 504, 918, 2371, 2770, 732, 2770, 2738, 2358, 918, + 3359, 2738, 3643, 3642, 3907, 3992, 932, 2341, 2093, 2582, + 3994, 1683, 3683, 4002, 1292, 2091, 4021, 949, 2339, 3993, + 3949, 3950, 3951, 3952, 4066, 3441, 4068, 4069, 2398, 4015, + 2581, 4081, 3009, 4016, 3909, 4030, 1682, 923, 922, 859, + 4163, 4040, 4086, 4042, 4043, 4044, 1465, 1567, 4047, 4052, + 923, 922, 3910, 1829, 1168, 605, 1371, 605, 605, 605, + 4036, 605, 3831, 2645, 2246, 3831, 4039, 1900, 130, 605, + 933, 605, 4053, 4098, 2746, 3908, 4098, 4073, 4059, 1952, + 4063, 4062, 605, 4057, 1396, 4058, 923, 922, 4118, 4072, + 4225, 1950, 2349, 3859, 942, 943, 605, 1839, 3831, 3816, + 4, 2338, 1837, 1833, 918, 1475, 800, 3670, 4085, 4120, + 4084, 691, 1259, 3010, 2468, 4129, 2382, 4007, 837, 1476, + 2077, 521, 4012, 4092, 531, 950, 3901, 518, 2043, 4153, + 2037, 687, 2385, 4111, 4107, 4109, 4108, 515, 962, 950, + 605, 605, 605, 4113, 4144, 4119, 4117, 4148, 4116, 4114, + 1859, 4160, 4161, 1737, 4162, 4128, 4127, 4134, 4174, 4130, + 4121, 4022, 4137, 4138, 605, 3831, 3831, 3831, 4191, 3857, + 2195, 1265, 4176, 3286, 4136, 3831, 4135, 3892, 3831, 4029, + 4139, 4140, 4185, 3831, 605, 1104, 4007, 4012, 4165, 4188, + 4197, 605, 3531, 4182, 4179, 4181, 605, 1101, 605, 4178, + 4178, 1263, 4168, 4164, 691, 4167, 691, 4152, 4166, 605, + 1174, 2207, 950, 2340, 4199, 2202, 1663, 1662, 2222, 921, + 2292, 921, 920, 2214, 920, 1185, 4056, 3422, 3422, 921, + 4312, 4304, 920, 4210, 4309, 3932, 940, 941, 945, 944, + 946, 947, 948, 951, 3764, 4302, 921, 786, 4298, 920, + 4209, 4231, 2959, 2251, 4291, 4204, 1670, 1136, 3831, 4220, + 4219, 703, 699, 3906, 1697, 712, 1167, 3831, 3831, 4098, + 3884, 724, 1085, 942, 943, 4235, 2174, 532, 4098, 3831, + 515, 900, 2337, 70, 774, 3831, 756, 942, 943, 1795, + 4098, 1243, 1242, 4237, 935, 794, 527, 3815, 4249, 2802, + 3814, 4152, 4248, 4246, 3813, 3812, 4217, 4251, 3907, 4264, + 4250, 3831, 4257, 4245, 3811, 3831, 3810, 3831, 4258, 3809, + 3899, 3808, 4261, 3807, 605, 3806, 3831, 3805, 4098, 3804, + 4277, 3803, 4271, 4275, 4276, 2763, 2270, 4270, 4287, 2313, + 3831, 2264, 720, 3831, 4289, 2725, 694, 823, 4294, 4282, + 1607, 4098, 1601, 4279, 4098, 2477, 669, 2361, 2365, 4293, + 942, 943, 2364, 4252, 130, 3831, 2242, 4287, 1788, 4301, + 1475, 2833, 4152, 4289, 1475, 605, 4295, 2951, 3942, 691, + 3772, 605, 605, 1659, 1476, 3271, 3272, 1475, 1476, 1475, + 4321, 4307, 3274, 4319, 4322, 4314, 2042, 4320, 1830, 4324, + 3270, 1476, 4323, 1476, 1715, 2577, 921, 2336, 4307, 920, + 4314, 3509, 1262, 1042, 3188, 940, 941, 945, 944, 946, + 947, 948, 951, 2691, 1584, 4317, 1537, 3471, 924, 3115, + 941, 945, 944, 946, 947, 948, 951, 2636, 1536, 625, + 1526, 2056, 921, 1470, 973, 920, 961, 2523, 1363, 1364, + 2973, 2523, 3114, 974, 2971, 966, 506, 978, 1479, 1480, + 1481, 1482, 1490, 553, 918, 549, 918, 548, 547, 546, + 818, 557, 1427, 919, 918, 133, 2523, 917, 811, 2969, + 2074, 4070, 2073, 3584, 3288, 1679, 2226, 2457, 671, 2523, + 2048, 918, 2967, 1702, 1370, 2259, 1377, 2326, 1272, 3558, + 3251, 2796, 2479, 3073, 945, 944, 946, 947, 948, 951, + 2324, 2524, 1277, 1276, 2323, 2524, 2514, 2514, 2514, 2514, + 2619, 1815, 1895, 1253, 2420, 2514, 2514, 2514, 2514, 2514, + 1885, 2514, 2514, 2343, 3319, 3308, 2514, 1878, 2514, 2520, + 2524, 1869, 1866, 2520, 514, 817, 2620, 676, 1260, 1327, + 3665, 856, 1247, 2524, 856, 1940, 1863, 2683, 2476, 4010, + 1483, 1484, 1485, 1492, 4123, 4124, 4125, 4126, 2520, 1264, + 4005, 3996, 766, 3786, 3954, 3784, 3603, 672, 2677, 2679, + 2678, 2520, 3132, 3180, 605, 3182, 3351, 1134, 3350, 1365, + 1366, 3334, 3607, 3326, 2626, 3629, 2910, 2624, 2901, 2898, + 1248, 3342, 2892, 2891, 1245, 2627, 2406, 2521, 130, 1261, + 670, 2521, 2870, 2404, 2401, 2886, 2882, 1227, 2631, 1307, + 2985, 2977, 520, 3904, 4208, 4131, 509, 4147, 4146, 4049, + 4142, 806, 4037, 3742, 3542, 4054, 2521, 3744, 2748, 2740, + 2478, 2234, 1684, 1148, 3682, 3036, 2490, 2569, 4200, 2521, + 605, 918, 2568, 2565, 605, 2481, 3068, 605, 679, 3063, + 2329, 2330, 2328, 2471, 2496, 2495, 2342, 2489, 1497, 1323, + 1486, 1487, 1493, 605, 2564, 839, 605, 803, 3062, 1494, + 2576, 2578, 605, 605, 1114, 2341, 1613, 918, 2519, 605, + 605, 605, 2519, 2470, 840, 1316, 2339, 3332, 605, 605, + 120, 841, 605, 3075, 2580, 3976, 605, 4088, 605, 3820, + 605, 3819, 605, 4227, 605, 4230, 605, 2519, 3971, 133, + 605, 605, 605, 605, 605, 605, 605, 605, 524, 3512, + 2519, 2710, 2707, 2179, 1630, 605, 605, 1629, 605, 1338, + 3337, 684, 605, 605, 3338, 605, 3336, 605, 1718, 729, + 801, 1172, 4285, 1250, 3518, 4283, 4192, 1495, 4262, 4190, + 1141, 4095, 1147, 3513, 3979, 1115, 4096, 3082, 3080, 3079, + 3088, 1158, 3087, 3521, 1165, 1337, 1336, 850, 605, 2338, + 1938, 3855, 3802, 3984, 605, 3515, 3517, 3516, 673, 122, + 3837, 3874, 3330, 511, 868, 1394, 1111, 1995, 503, 2549, + 502, 3522, 3756, 3033, 1416, 1417, 1418, 1419, 1340, 1616, + 1116, 1081, 1488, 1496, 1694, 68, 5, 827, 129, 628, + 2343, 626, 541, 1739, 927, 884, 605, 519, 2464, 1246, + 2621, 2217, 2215, 1127, 1144, 1143, 1117, 820, 821, 815, + 822, 814, 819, 2216, 1145, 1156, 896, 515, 856, 1121, + 1406, 1462, 786, 1464, 1844, 1828, 1139, 816, 1409, 680, + 1469, 688, 1164, 1472, 1188, 879, 870, 1499, 507, 1197, + 126, 1122, 1503, 605, 1504, 1505, 1506, 1507, 1508, 1509, + 1510, 1511, 1512, 1302, 1513, 1198, 1514, 830, 1519, 1520, + 510, 2340, 1249, 1523, 1524, 523, 1113, 2522, 1532, 1533, + 605, 2522, 1108, 856, 142, 907, 56, 1540, 1541, 25, + 1543, 17, 1545, 1546, 1547, 1548, 1549, 1550, 1551, 1552, + 1553, 1554, 678, 1556, 1557, 1558, 2522, 681, 2839, 48, + 513, 42, 1612, 22, 35, 20, 15, 50, 508, 2522, + 36, 10, 737, 1125, 2208, 677, 754, 1083, 1587, 1405, + 1491, 49, 47, 2342, 1593, 43, 41, 34, 33, 32, + 2337, 28, 53, 27, 23, 1489, 1498, 21, 2203, 39, + 674, 2622, 2341, 31, 12, 11, 8, 7, 57, 54, + 51, 45, 2209, 2339, 44, 675, 37, 30, 13, 2963, + 2964, 2820, 1458, 2211, 3409, 3408, 605, 1908, 1905, 802, + 121, 2821, 2040, 2818, 1252, 808, 894, 2991, 2928, 2899, + 29, 24, 18, 9, 2894, 52, 2909, 38, 2896, 2895, + 3523, 805, 19, 953, 952, 14, 6, 3, 1, 3328, + 0, 0, 1913, 0, 0, 2931, 3331, 3524, 0, 2625, + 0, 0, 2206, 2210, 1251, 0, 1907, 0, 0, 0, + 0, 0, 3021, 3022, 1925, 804, 3025, 3026, 3027, 3028, + 3029, 3030, 0, 0, 0, 0, 2338, 2623, 0, 0, + 2212, 127, 0, 3340, 0, 1120, 0, 0, 1921, 0, + 1752, 0, 0, 2907, 0, 0, 2904, 0, 1725, 3754, + 1759, 0, 1308, 0, 2918, 1110, 1915, 1720, 0, 0, + 0, 0, 0, 1118, 1770, 0, 0, 1728, 0, 0, + 0, 1126, 0, 2930, 807, 0, 0, 0, 0, 1722, + 1724, 1723, 0, 0, 0, 1902, 0, 0, 0, 856, + 2921, 0, 0, 0, 125, 1729, 0, 2204, 856, 1107, + 0, 0, 0, 0, 3333, 0, 0, 0, 3525, 0, + 0, 0, 1123, 1119, 0, 0, 2920, 0, 2893, 0, + 0, 0, 0, 0, 3519, 0, 0, 0, 0, 0, + 0, 2937, 2936, 0, 0, 0, 0, 0, 2340, 0, + 0, 0, 128, 0, 0, 1854, 1165, 0, 0, 2205, + 0, 0, 0, 3339, 0, 0, 856, 1922, 0, 0, + 0, 0, 1124, 0, 1920, 0, 0, 0, 0, 0, + 0, 0, 2924, 0, 856, 0, 1165, 0, 0, 0, + 2839, 1926, 0, 0, 3514, 605, 0, 0, 605, 0, + 0, 1128, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3520, 2940, 0, 0, 0, 0, 2337, 0, 3335, + 0, 2912, 2917, 1109, 2913, 1112, 605, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 605, 0, 605, 0, 605, 0, 0, 605, 605, 605, + 1903, 0, 0, 0, 605, 0, 0, 0, 0, 1786, + 2911, 2927, 2916, 0, 0, 0, 1091, 0, 1904, 0, + 0, 0, 0, 715, 764, 0, 0, 0, 0, 2941, + 2939, 2943, 0, 0, 1805, 1806, 2933, 0, 2024, 2932, + 0, 0, 1091, 0, 0, 0, 0, 0, 790, 751, + 0, 0, 2033, 0, 2034, 0, 2919, 2935, 0, 776, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 605, + 0, 0, 1909, 3254, 1730, 3256, 3257, 0, 2843, 2059, + 1906, 0, 769, 1900, 778, 1890, 0, 0, 1943, 2938, + 2942, 1731, 0, 0, 755, 0, 0, 1908, 1905, 0, + 0, 0, 0, 0, 0, 0, 605, 0, 0, 0, + 0, 1098, 3296, 0, 2929, 0, 0, 0, 0, 0, + 0, 0, 0, 2084, 2086, 2088, 0, 605, 1886, 0, + 0, 0, 1913, 0, 0, 0, 1088, 1098, 0, 0, + 1087, 0, 856, 761, 0, 0, 1907, 2105, 771, 0, + 1916, 757, 0, 0, 1925, 0, 0, 0, 0, 1990, + 0, 0, 1088, 1892, 0, 0, 1087, 2127, 2923, 0, + 0, 0, 2922, 0, 2134, 0, 0, 1089, 1921, 2134, + 782, 0, 781, 0, 2926, 0, 0, 0, 0, 787, + 0, 777, 1308, 0, 0, 1094, 1915, 0, 0, 0, + 0, 0, 0, 1089, 1888, 0, 1910, 1911, 1912, 0, + 0, 2844, 0, 1924, 785, 784, 0, 0, 1726, 1889, + 0, 1094, 0, 0, 0, 1902, 0, 0, 0, 1923, + 0, 0, 1914, 0, 0, 0, 0, 0, 783, 0, + 0, 0, 2915, 0, 0, 2906, 0, 0, 2905, 2908, + 2925, 2914, 0, 0, 0, 0, 1894, 1096, 0, 788, + 0, 0, 0, 0, 3397, 3398, 0, 0, 1917, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1721, 0, + 0, 0, 0, 1096, 0, 0, 0, 0, 0, 0, + 2902, 2934, 779, 0, 0, 1727, 0, 1922, 0, 0, + 0, 0, 0, 0, 1920, 0, 0, 2252, 0, 0, + 0, 0, 0, 0, 0, 2903, 0, 0, 0, 0, + 0, 1926, 0, 0, 0, 3044, 0, 0, 0, 4238, + 0, 1176, 1114, 0, 0, 0, 3446, 0, 0, 0, + 0, 0, 0, 0, 1901, 0, 0, 0, 0, 0, + 0, 0, 605, 605, 0, 0, 0, 759, 1752, 3418, + 3418, 3418, 0, 0, 0, 2297, 0, 0, 0, 856, + 2162, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1903, 0, 760, 0, 0, 1095, 0, 0, 0, 0, + 0, 0, 768, 780, 1093, 0, 773, 772, 1904, 0, + 0, 0, 1887, 3418, 3418, 0, 0, 0, 0, 1092, + 0, 1095, 0, 1115, 0, 0, 0, 765, 0, 0, + 1093, 0, 0, 0, 0, 0, 0, 1099, 0, 0, + 0, 0, 0, 0, 0, 1092, 0, 0, 0, 0, + 0, 0, 0, 2218, 1111, 1899, 1141, 0, 0, 0, + 2230, 605, 1909, 1099, 0, 0, 0, 0, 1116, 0, + 1906, 0, 0, 789, 0, 0, 0, 0, 0, 0, + 1090, 0, 0, 0, 1158, 2254, 763, 605, 0, 0, + 0, 1127, 605, 0, 1117, 605, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1090, 1121, 0, 0, + 1097, 0, 0, 0, 0, 605, 1891, 605, 0, 605, + 605, 786, 605, 0, 605, 0, 0, 605, 0, 1122, + 0, 0, 0, 0, 0, 0, 1097, 0, 3561, 758, + 1916, 0, 0, 0, 0, 605, 0, 0, 0, 0, + 0, 0, 0, 0, 1113, 499, 0, 2308, 498, 0, + 1108, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2511, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1360, 0, + 0, 0, 605, 0, 0, 0, 1910, 1911, 1912, 0, + 0, 1125, 770, 1924, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 605, 605, 0, 605, 1923, + 0, 3620, 1914, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2602, 0, 0, 605, 0, 1361, 1343, + 1347, 1349, 1342, 1363, 1364, 1345, 1346, 1348, 1917, 1352, + 1351, 1353, 1354, 1357, 1358, 1355, 1350, 1356, 0, 1344, + 1359, 0, 0, 605, 0, 2629, 2630, 0, 1105, 1114, + 0, 0, 2634, 2635, 0, 3667, 0, 0, 0, 0, + 0, 2640, 2641, 0, 0, 2642, 0, 0, 0, 2643, + 0, 2644, 0, 2646, 0, 2648, 0, 2650, 0, 2651, + 0, 0, 0, 2655, 2656, 2657, 2658, 2660, 2661, 2662, + 2663, 0, 0, 0, 0, 0, 3689, 0, 2666, 2667, + 0, 2668, 0, 1120, 0, 2669, 2670, 1177, 2671, 0, + 2672, 0, 0, 0, 3702, 0, 0, 0, 0, 0, + 0, 0, 0, 1110, 0, 0, 0, 0, 0, 0, + 1115, 1118, 0, 0, 0, 0, 0, 0, 0, 1126, + 0, 2693, 0, 0, 0, 0, 0, 2694, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1111, 0, 0, 1365, 1366, 0, 1107, 0, 0, + 0, 0, 0, 0, 3418, 1116, 59, 0, 60, 0, + 1123, 1119, 0, 0, 0, 0, 0, 0, 0, 2723, + 0, 0, 0, 58, 0, 0, 0, 61, 1127, 0, + 0, 1117, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 85, 62, 0, 1121, 3749, 0, 0, 0, 63, + 0, 0, 0, 65, 64, 0, 0, 0, 0, 0, + 1124, 0, 0, 0, 0, 0, 1122, 0, 0, 66, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 67, 0, 1128, + 0, 1113, 0, 2766, 0, 0, 0, 1108, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 110, + 0, 1109, 0, 1112, 0, 0, 0, 0, 69, 111, + 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 71, 72, 0, 0, 0, 0, 0, 1125, 0, + 605, 605, 0, 0, 2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 73, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2716, 2716, 2716, 74, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 3878, 2835, + 0, 75, 0, 76, 0, 0, 0, 0, 77, 0, + 0, 78, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3830, 0, 0, 79, 0, 80, 0, 0, 0, + 0, 0, 0, 3920, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 81, 0, 0, 0, 0, 3830, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 82, 0, 0, 0, 83, 2716, 2716, 2716, 0, + 1120, 0, 605, 0, 1103, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 605, 0, 0, + 1110, 0, 0, 0, 0, 0, 0, 0, 1118, 0, + 0, 0, 0, 0, 0, 0, 1126, 0, 0, 605, + 0, 605, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 137, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1107, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1123, 1119, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 605, 605, 0, 0, 0, 0, 86, 3830, + 3830, 0, 0, 0, 605, 0, 0, 0, 3830, 605, + 3830, 87, 0, 605, 0, 0, 0, 1124, 0, 0, + 0, 0, 88, 0, 2949, 0, 0, 0, 0, 1908, + 1905, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 89, 0, 1128, 90, 0, 91, + 0, 0, 92, 0, 0, 93, 94, 0, 0, 0, + 0, 0, 0, 0, 1913, 95, 0, 96, 1109, 3133, + 1112, 0, 0, 0, 0, 97, 0, 0, 1907, 0, + 0, 113, 0, 3145, 0, 3147, 1925, 3149, 0, 99, + 3152, 3153, 3154, 605, 101, 0, 100, 3159, 0, 0, + 0, 0, 0, 0, 0, 0, 4110, 0, 0, 0, + 1921, 0, 0, 0, 0, 0, 0, 0, 605, 0, + 0, 0, 0, 0, 1308, 0, 102, 0, 1915, 0, + 0, 0, 0, 103, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4141, 605, 0, 3830, 3042, 1902, 3830, 3045, + 605, 0, 2766, 3051, 3052, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 104, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 105, 0, + 0, 3830, 106, 0, 0, 107, 0, 0, 0, 2766, + 108, 0, 0, 0, 0, 2928, 2899, 0, 0, 0, + 605, 2894, 0, 2909, 0, 2896, 2895, 0, 0, 0, + 1752, 0, 0, 0, 0, 0, 605, 0, 109, 1922, + 0, 0, 2931, 0, 0, 0, 1920, 0, 0, 0, + 0, 0, 0, 0, 4211, 4212, 0, 114, 0, 0, + 0, 0, 0, 1926, 0, 0, 0, 0, 3830, 3830, + 3830, 0, 0, 0, 0, 605, 0, 0, 3830, 0, + 0, 3830, 0, 0, 0, 0, 3830, 605, 0, 0, + 2907, 0, 0, 2904, 0, 0, 0, 0, 0, 0, + 4201, 2918, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2930, 0, 1903, 0, 0, 0, 0, 0, 0, 0, + 605, 0, 0, 0, 0, 605, 0, 2921, 0, 0, + 1904, 3209, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3830, 0, 2920, 0, 2893, 0, 0, 0, 0, + 3830, 3830, 0, 0, 0, 0, 0, 0, 2937, 2936, + 0, 0, 3830, 0, 0, 0, 0, 0, 3830, 0, + 0, 0, 0, 0, 1909, 0, 0, 0, 0, 0, + 0, 605, 1906, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 605, 3830, 0, 0, 0, 3830, 2924, + 3830, 0, 0, 0, 0, 0, 0, 0, 0, 3830, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3830, 0, 0, 3830, 0, 605, 2940, + 0, 0, 0, 0, 0, 3406, 3407, 0, 2912, 2917, + 0, 2913, 0, 0, 0, 0, 0, 0, 3830, 0, + 0, 0, 1916, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2911, 2927, 2916, + 0, 0, 0, 3324, 0, 0, 0, 605, 0, 0, + 0, 0, 0, 0, 0, 0, 2941, 2939, 2943, 0, + 0, 0, 0, 2933, 0, 0, 2932, 0, 1910, 1911, + 1912, 0, 0, 0, 0, 1924, 0, 0, 0, 0, + 0, 0, 0, 2919, 2935, 0, 0, 0, 0, 0, + 0, 1923, 0, 0, 1914, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2938, 2942, 0, 0, + 3482, 0, 0, 0, 0, 0, 0, 0, 3484, 0, + 1917, 0, 0, 0, 0, 0, 0, 0, 856, 0, + 0, 2929, 0, 0, 0, 0, 0, 0, 3492, 0, + 3493, 0, 3494, 3495, 0, 3496, 0, 3497, 0, 0, + 3498, 0, 0, 0, 0, 0, 0, 1883, 0, 0, + 0, 0, 1900, 0, 1890, 0, 1873, 0, 2835, 0, + 0, 0, 0, 0, 0, 0, 1908, 1905, 0, 0, + 0, 3431, 0, 0, 0, 2923, 0, 0, 0, 2922, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2926, 0, 0, 0, 0, 0, 1886, 0, 0, + 0, 1913, 1874, 0, 0, 2766, 0, 1876, 0, 0, + 0, 0, 0, 0, 0, 1907, 0, 0, 0, 0, + 0, 0, 0, 1925, 0, 0, 0, 0, 2766, 3565, + 0, 3567, 1892, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1921, 0, 2915, + 0, 0, 2906, 0, 0, 2905, 2908, 2925, 2914, 2835, + 0, 1308, 0, 0, 0, 1915, 0, 0, 0, 0, + 0, 0, 0, 1888, 1864, 0, 0, 0, 0, 0, + 1870, 0, 0, 0, 0, 0, 3600, 0, 1889, 0, + 0, 0, 0, 0, 1902, 0, 0, 2902, 2934, 0, + 0, 0, 0, 0, 0, 1879, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2903, 0, 0, 1894, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1865, 0, 1922, 0, 0, 0, + 0, 0, 0, 1920, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1926, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1901, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1903, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1904, 0, 0, + 0, 1887, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1872, + 0, 0, 0, 0, 1899, 0, 0, 0, 0, 0, + 0, 1909, 0, 0, 0, 0, 1882, 0, 0, 1906, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3771, 2835, 0, 0, 0, 0, 0, + 1871, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1881, 1891, 1884, 1875, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1916, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1910, 1911, 1912, 0, 0, + 0, 0, 1924, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1923, 0, + 0, 1914, 0, 0, 0, 3883, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2835, 0, 0, 0, 1877, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1917, 0, 0, + 0, 0, 3922, 0, 3924, 0, 3775, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 3964, 3966, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 3975, 0, 0, + 0, 0, 3982, 0, 0, 0, 3986, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 3854, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3902, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2835, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 4094, 0, 0, 0, + 0, 0, 0, 4103, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2766, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 4183, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4198, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 195, 0, 588, 197, 198, 199, 200, 961, 0, + 201, 0, 0, 0, 202, 0, 0, 606, 0, 203, + 205, 204, 206, 637, 147, 0, 148, 0, 0, 563, + 208, 633, 638, 639, 209, 640, 0, 210, 212, 211, + 1517, 213, 0, 149, 150, 0, 0, 214, 565, 564, + 215, 216, 0, 217, 607, 572, 152, 0, 218, 220, + 219, 153, 608, 222, 0, 609, 226, 0, 225, 224, + 154, 227, 155, 228, 229, 230, 231, 0, 232, 233, + 0, 234, 236, 235, 654, 237, 3966, 566, 641, 238, + 0, 0, 239, 589, 240, 573, 0, 241, 590, 610, + 0, 243, 242, 244, 591, 592, 574, 0, 0, 0, + 0, 575, 157, 667, 0, 0, 567, 247, 248, 0, + 249, 4278, 0, 0, 250, 0, 251, 252, 253, 254, + 255, 0, 0, 0, 158, 0, 0, 256, 257, 258, + 0, 0, 0, 278, 0, 159, 259, 0, 262, 261, + 260, 0, 0, 263, 264, 0, 265, 267, 266, 268, + 269, 160, 560, 0, 270, 271, 272, 273, 274, 593, + 630, 276, 275, 0, 280, 281, 282, 668, 0, 161, + 2766, 0, 0, 612, 277, 0, 279, 0, 476, 0, + 283, 655, 284, 594, 0, 288, 0, 287, 0, 649, + 0, 163, 289, 0, 164, 632, 0, 165, 290, 0, + 0, 0, 576, 143, 292, 144, 611, 0, 293, 295, + 296, 0, 0, 297, 0, 0, 0, 577, 302, 166, + 569, 0, 0, 294, 0, 0, 0, 298, 299, 0, + 300, 301, 0, 0, 0, 303, 0, 0, 167, 304, + 0, 1515, 305, 0, 578, 306, 307, 0, 0, 0, + 0, 0, 656, 309, 0, 310, 0, 311, 0, 312, + 313, 0, 0, 665, 0, 0, 0, 0, 335, 0, + 324, 326, 317, 319, 320, 322, 318, 325, 323, 329, + 328, 330, 331, 332, 333, 334, 327, 0, 315, 321, + 316, 562, 336, 337, 314, 338, 643, 339, 340, 0, + 0, 0, 0, 341, 342, 343, 344, 613, 346, 0, + 0, 579, 348, 642, 350, 0, 349, 614, 580, 657, + 658, 659, 355, 356, 358, 357, 359, 0, 663, 360, + 361, 0, 0, 363, 362, 365, 366, 651, 540, 653, + 168, 364, 0, 629, 664, 367, 0, 368, 369, 615, + 0, 371, 372, 169, 0, 170, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 171, 373, 374, 635, 172, + 375, 0, 377, 376, 616, 379, 380, 381, 382, 660, + 661, 173, 596, 0, 174, 385, 386, 0, 387, 0, + 388, 389, 390, 391, 392, 0, 617, 394, 395, 0, + 0, 396, 0, 0, 0, 397, 398, 400, 399, 401, + 0, 0, 402, 403, 404, 405, 406, 0, 407, 175, + 0, 408, 176, 409, 618, 619, 410, 0, 177, 0, + 411, 178, 0, 412, 413, 414, 0, 620, 0, 581, + 179, 416, 417, 418, 420, 559, 621, 422, 180, 423, + 424, 0, 582, 181, 0, 0, 0, 427, 426, 428, + 182, 0, 0, 0, 430, 0, 0, 0, 431, 0, + 183, 429, 185, 432, 0, 433, 184, 186, 434, 435, + 0, 0, 0, 0, 0, 436, 437, 438, 0, 440, + 439, 0, 441, 0, 0, 442, 0, 0, 443, 187, + 444, 445, 446, 447, 646, 644, 188, 448, 0, 449, + 450, 597, 452, 454, 453, 598, 648, 455, 456, 457, + 458, 599, 460, 462, 0, 0, 461, 459, 463, 464, + 0, 662, 465, 466, 0, 584, 600, 601, 583, 0, + 0, 0, 0, 1516, 467, 468, 0, 585, 631, 622, + 473, 474, 475, 666, 477, 478, 634, 480, 479, 0, + 190, 191, 0, 0, 481, 0, 0, 482, 0, 194, + 0, 586, 484, 0, 0, 602, 604, 603, 568, 487, + 0, 0, 485, 645, 0, 647, 486, 489, 488, 623, + 624, 0, 0, 0, 0, 0, 0, 491, 192, 0, + 493, 193, 494, 0, 0, 587, 0, 0, 0, 555, + 554, 0, 0, 0, 0, 556, 652, 0, 636, 0, + 558, 0, 0, 650, 561, 195, 0, 588, 197, 198, + 199, 200, 1755, 0, 201, 0, 0, 0, 202, 0, + 0, 606, 0, 203, 205, 204, 206, 637, 147, 0, + 148, 0, 0, 1756, 208, 633, 638, 639, 209, 640, + 0, 210, 212, 211, 0, 213, 0, 149, 150, 0, + 0, 214, 565, 564, 215, 216, 0, 217, 607, 572, + 152, 0, 218, 220, 219, 153, 608, 222, 0, 609, + 226, 0, 225, 224, 154, 227, 155, 228, 229, 230, + 231, 0, 232, 233, 0, 234, 236, 235, 654, 237, + 0, 566, 641, 238, 0, 0, 239, 589, 240, 573, + 0, 241, 590, 610, 0, 243, 242, 244, 591, 592, + 574, 0, 0, 0, 0, 575, 157, 667, 0, 0, + 1753, 247, 248, 0, 249, 0, 0, 0, 250, 0, + 251, 252, 253, 254, 255, 0, 0, 0, 158, 0, + 0, 256, 257, 258, 0, 0, 0, 278, 0, 159, + 259, 0, 262, 261, 260, 0, 0, 263, 264, 0, + 265, 267, 266, 268, 269, 160, 560, 0, 270, 271, + 272, 273, 274, 593, 630, 276, 275, 0, 280, 281, + 282, 668, 0, 161, 0, 0, 0, 612, 277, 0, + 279, 0, 476, 0, 283, 655, 284, 594, 0, 288, + 0, 287, 0, 649, 0, 163, 289, 0, 164, 632, + 0, 165, 290, 0, 0, 0, 576, 143, 292, 144, + 611, 0, 293, 295, 296, 0, 0, 297, 0, 0, + 0, 577, 302, 166, 569, 0, 0, 294, 0, 0, + 0, 298, 299, 0, 300, 301, 0, 0, 0, 303, + 0, 0, 167, 304, 0, 0, 305, 0, 578, 306, + 307, 0, 0, 0, 0, 0, 656, 309, 0, 310, + 0, 311, 0, 312, 313, 0, 0, 665, 0, 0, + 0, 0, 335, 0, 324, 326, 317, 319, 320, 322, + 318, 325, 323, 329, 328, 330, 331, 332, 333, 334, + 327, 0, 315, 321, 316, 562, 336, 337, 314, 338, + 643, 339, 340, 0, 0, 0, 0, 341, 342, 343, + 344, 613, 346, 0, 0, 579, 348, 642, 350, 0, + 349, 614, 580, 657, 658, 659, 355, 356, 358, 357, + 359, 0, 663, 360, 361, 0, 0, 363, 362, 365, + 366, 651, 540, 653, 168, 364, 0, 629, 664, 367, + 0, 368, 369, 615, 1754, 371, 372, 169, 0, 170, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 171, + 373, 374, 635, 172, 375, 0, 377, 376, 616, 379, + 380, 381, 382, 660, 661, 173, 596, 0, 174, 385, + 386, 0, 387, 0, 388, 389, 390, 391, 392, 0, + 617, 394, 395, 0, 0, 396, 0, 0, 0, 397, + 398, 400, 399, 401, 0, 0, 402, 403, 404, 405, + 406, 0, 407, 175, 0, 408, 176, 409, 618, 619, + 410, 0, 177, 0, 411, 178, 0, 412, 413, 414, + 0, 620, 0, 581, 179, 416, 417, 418, 420, 559, + 621, 422, 180, 423, 424, 0, 582, 181, 0, 0, + 0, 427, 426, 428, 182, 0, 0, 0, 430, 0, + 0, 0, 431, 0, 183, 429, 185, 432, 0, 433, + 184, 186, 434, 435, 0, 0, 0, 0, 0, 436, + 437, 438, 0, 440, 439, 0, 441, 0, 0, 442, + 0, 0, 443, 187, 444, 445, 446, 447, 646, 644, + 188, 448, 0, 449, 450, 597, 452, 454, 453, 598, + 648, 455, 456, 457, 458, 599, 460, 462, 0, 0, + 461, 459, 463, 464, 0, 662, 465, 466, 0, 584, + 600, 601, 583, 0, 0, 0, 0, 0, 467, 468, + 0, 585, 631, 622, 473, 474, 475, 666, 477, 478, + 634, 480, 479, 0, 190, 191, 0, 0, 481, 0, + 0, 482, 0, 194, 0, 586, 484, 0, 0, 602, + 604, 603, 568, 487, 0, 0, 485, 645, 0, 647, + 486, 489, 488, 623, 624, 0, 0, 0, 0, 0, + 0, 491, 192, 0, 493, 193, 494, 0, 0, 587, + 0, 0, 0, 555, 554, 0, 0, 0, 0, 556, + 652, 0, 636, 0, 558, 0, 0, 650, 561, 195, + 0, 588, 197, 198, 199, 200, 0, 0, 201, 0, + 0, 0, 202, 0, 0, 606, 0, 203, 205, 204, + 206, 637, 147, 0, 148, 0, 0, 563, 208, 633, + 638, 639, 209, 640, 0, 210, 212, 211, 0, 213, + 0, 149, 150, 0, 0, 214, 565, 564, 215, 216, + 0, 217, 607, 572, 152, 0, 218, 220, 219, 153, + 608, 222, 0, 609, 226, 0, 225, 224, 154, 227, + 155, 228, 229, 230, 231, 0, 232, 233, 0, 234, + 236, 235, 654, 237, 0, 566, 641, 238, 0, 0, + 239, 589, 240, 573, 0, 241, 590, 610, 0, 243, + 242, 244, 591, 592, 574, 0, 0, 0, 0, 575, + 157, 667, 0, 0, 567, 247, 248, 0, 249, 0, + 0, 0, 250, 0, 251, 252, 253, 254, 255, 0, + 0, 0, 158, 0, 0, 256, 257, 258, 0, 0, + 0, 278, 0, 159, 259, 0, 262, 261, 260, 0, + 0, 263, 264, 0, 265, 267, 266, 268, 269, 160, + 560, 0, 270, 271, 272, 273, 274, 593, 630, 276, + 275, 0, 280, 281, 282, 668, 0, 161, 0, 0, + 0, 612, 277, 0, 279, 0, 476, 0, 283, 655, + 284, 594, 0, 288, 0, 287, 0, 649, 0, 163, + 289, 0, 164, 632, 0, 165, 290, 0, 0, 0, + 576, 143, 292, 144, 611, 0, 293, 295, 296, 0, + 0, 297, 0, 0, 0, 577, 302, 166, 569, 0, + 0, 294, 0, 0, 0, 298, 299, 0, 300, 301, + 0, 0, 0, 303, 0, 0, 167, 304, 0, 0, + 305, 0, 578, 306, 307, 0, 0, 0, 0, 0, + 656, 309, 0, 310, 0, 311, 0, 312, 313, 0, + 0, 665, 0, 0, 0, 0, 335, 0, 324, 326, + 317, 319, 320, 322, 318, 325, 323, 329, 328, 330, + 331, 332, 333, 334, 327, 0, 315, 321, 316, 562, + 336, 337, 314, 338, 643, 339, 340, 4151, 0, 0, + 0, 341, 342, 343, 344, 613, 346, 0, 0, 579, + 348, 642, 350, 0, 349, 614, 580, 657, 658, 659, + 355, 356, 358, 357, 359, 0, 663, 360, 361, 0, + 0, 363, 362, 365, 366, 651, 540, 653, 168, 364, + 0, 629, 664, 367, 0, 368, 369, 615, 0, 371, + 372, 169, 0, 170, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 171, 373, 374, 635, 172, 375, 0, + 377, 376, 616, 379, 380, 381, 382, 660, 661, 173, + 596, 0, 174, 385, 386, 0, 387, 0, 388, 389, + 390, 391, 392, 0, 617, 394, 395, 0, 0, 396, + 0, 0, 0, 397, 398, 400, 399, 401, 0, 0, + 402, 403, 404, 405, 406, 0, 407, 175, 0, 408, + 176, 409, 618, 619, 410, 0, 177, 0, 411, 178, + 0, 412, 413, 414, 0, 620, 0, 581, 179, 416, + 417, 418, 420, 559, 621, 422, 180, 423, 424, 0, + 582, 181, 0, 0, 0, 427, 426, 428, 182, 0, + 0, 0, 430, 0, 0, 0, 431, 0, 183, 429, + 185, 432, 0, 433, 184, 186, 434, 435, 0, 0, + 0, 0, 0, 436, 437, 438, 0, 440, 439, 0, + 441, 0, 0, 442, 0, 0, 443, 187, 444, 445, + 446, 447, 646, 644, 188, 448, 0, 449, 450, 597, + 452, 454, 453, 598, 648, 455, 456, 457, 458, 599, + 460, 462, 0, 0, 461, 459, 463, 464, 0, 662, + 465, 466, 0, 584, 600, 601, 583, 0, 0, 0, + 0, 0, 467, 468, 0, 585, 631, 622, 473, 474, + 475, 666, 477, 478, 634, 480, 479, 0, 190, 191, + 0, 0, 481, 0, 0, 482, 0, 194, 0, 586, + 484, 0, 0, 602, 604, 603, 568, 487, 0, 0, + 485, 645, 0, 647, 486, 489, 488, 623, 624, 0, + 0, 0, 0, 0, 0, 491, 192, 0, 493, 193, + 494, 0, 0, 587, 0, 0, 0, 555, 554, 0, + 0, 0, 0, 556, 652, 0, 636, 0, 558, 0, + 0, 650, 561, 195, 0, 588, 197, 198, 199, 200, + 0, 0, 201, 0, 0, 0, 202, 0, 0, 606, + 0, 203, 205, 204, 206, 637, 147, 0, 148, 0, + 0, 563, 208, 633, 638, 639, 209, 640, 0, 210, + 212, 211, 0, 213, 0, 149, 150, 0, 0, 214, + 565, 564, 215, 216, 0, 217, 607, 572, 152, 0, + 218, 220, 219, 153, 608, 222, 0, 609, 226, 0, + 225, 224, 154, 227, 155, 228, 229, 230, 231, 0, + 232, 233, 0, 234, 236, 235, 654, 237, 0, 566, + 641, 238, 0, 0, 239, 589, 240, 573, 0, 241, + 590, 610, 0, 243, 242, 244, 591, 592, 574, 0, + 0, 0, 0, 575, 157, 667, 0, 0, 567, 247, + 248, 0, 249, 0, 0, 0, 250, 0, 251, 252, + 253, 254, 255, 0, 0, 0, 158, 0, 0, 256, + 257, 258, 0, 0, 0, 278, 0, 159, 259, 0, + 262, 261, 260, 0, 0, 263, 264, 0, 265, 267, + 266, 268, 269, 160, 560, 0, 270, 271, 272, 273, + 274, 593, 630, 276, 275, 0, 280, 281, 282, 668, + 0, 161, 0, 0, 0, 612, 277, 0, 279, 0, + 476, 0, 283, 655, 284, 594, 0, 288, 0, 287, + 0, 649, 0, 163, 289, 0, 164, 632, 0, 165, + 290, 0, 0, 0, 576, 143, 292, 144, 611, 0, + 293, 295, 296, 0, 0, 297, 0, 0, 0, 577, + 302, 166, 569, 0, 0, 294, 0, 0, 0, 298, + 299, 0, 300, 301, 0, 0, 0, 303, 0, 0, + 167, 304, 0, 0, 305, 0, 578, 306, 307, 0, + 0, 0, 0, 0, 656, 309, 0, 310, 0, 311, + 0, 312, 313, 0, 0, 665, 0, 0, 0, 0, + 335, 0, 324, 326, 317, 319, 320, 322, 318, 325, + 323, 329, 328, 330, 331, 332, 333, 334, 327, 0, + 315, 321, 316, 562, 336, 337, 314, 338, 643, 339, + 340, 0, 0, 0, 0, 341, 342, 343, 344, 613, + 346, 0, 0, 579, 348, 642, 350, 0, 349, 614, + 580, 657, 658, 659, 355, 356, 358, 357, 359, 0, + 663, 360, 361, 0, 0, 363, 362, 365, 366, 651, + 540, 653, 168, 364, 0, 629, 664, 367, 0, 368, + 369, 615, 0, 371, 372, 169, 0, 170, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 171, 373, 374, + 635, 172, 375, 0, 377, 376, 616, 379, 380, 381, + 382, 660, 661, 173, 596, 0, 174, 385, 386, 0, + 387, 0, 388, 389, 390, 391, 392, 0, 617, 394, + 395, 0, 0, 396, 0, 0, 0, 397, 398, 400, + 399, 401, 0, 0, 402, 403, 404, 405, 406, 0, + 407, 175, 0, 408, 176, 409, 618, 619, 410, 0, + 177, 0, 411, 178, 0, 412, 413, 414, 0, 620, + 0, 581, 179, 416, 417, 418, 420, 559, 621, 422, + 180, 423, 424, 0, 582, 181, 0, 0, 0, 427, + 426, 428, 182, 0, 0, 0, 430, 0, 0, 0, + 431, 0, 183, 429, 185, 432, 0, 433, 184, 186, + 434, 435, 0, 0, 0, 0, 0, 436, 437, 438, + 0, 440, 439, 0, 441, 0, 0, 442, 0, 0, + 443, 187, 444, 445, 446, 447, 646, 644, 188, 448, + 0, 449, 450, 597, 452, 454, 453, 598, 648, 455, + 456, 457, 458, 599, 460, 462, 0, 0, 461, 459, + 463, 464, 0, 662, 465, 466, 0, 584, 600, 601, + 583, 0, 0, 0, 0, 0, 467, 468, 0, 585, + 631, 622, 473, 474, 475, 666, 477, 478, 634, 480, + 479, 0, 190, 191, 0, 0, 481, 0, 0, 482, + 0, 194, 0, 586, 484, 0, 0, 602, 604, 603, + 568, 487, 0, 0, 485, 645, 0, 647, 486, 489, + 488, 623, 624, 3978, 0, 0, 0, 0, 0, 491, + 192, 0, 493, 193, 494, 0, 0, 587, 0, 0, + 0, 555, 554, 0, 0, 0, 0, 556, 652, 0, + 636, 0, 558, 0, 0, 650, 561, 195, 0, 588, + 197, 198, 199, 200, 0, 0, 201, 0, 0, 0, + 202, 0, 0, 606, 0, 203, 205, 204, 206, 637, + 147, 0, 148, 0, 0, 563, 208, 633, 638, 639, + 209, 640, 0, 210, 212, 211, 0, 213, 0, 149, + 150, 0, 0, 214, 565, 564, 215, 216, 0, 217, + 607, 572, 152, 0, 218, 220, 219, 153, 608, 222, + 0, 609, 226, 0, 225, 224, 154, 227, 155, 228, + 229, 230, 231, 0, 232, 233, 0, 234, 236, 235, + 654, 237, 0, 566, 641, 238, 0, 0, 239, 589, + 240, 573, 0, 241, 590, 610, 0, 243, 242, 244, + 591, 592, 574, 0, 0, 0, 0, 575, 157, 667, + 0, 0, 567, 247, 248, 0, 249, 0, 0, 0, + 250, 0, 251, 252, 253, 254, 255, 0, 0, 0, + 158, 0, 0, 256, 257, 258, 0, 0, 0, 278, + 0, 159, 259, 0, 262, 261, 260, 0, 0, 263, + 264, 0, 265, 267, 266, 268, 269, 160, 560, 0, + 270, 271, 272, 273, 274, 593, 630, 276, 275, 0, + 280, 281, 282, 668, 0, 161, 0, 0, 0, 612, + 277, 0, 279, 0, 476, 0, 283, 655, 284, 594, + 0, 288, 0, 287, 0, 649, 0, 163, 289, 0, + 164, 632, 0, 165, 290, 0, 0, 0, 576, 143, + 292, 144, 611, 0, 293, 295, 296, 0, 0, 297, + 0, 0, 0, 577, 302, 166, 569, 0, 0, 294, + 0, 0, 0, 298, 299, 0, 300, 301, 0, 0, + 0, 303, 0, 0, 167, 304, 0, 0, 305, 0, + 578, 306, 307, 0, 0, 0, 0, 0, 656, 309, + 0, 310, 0, 311, 0, 312, 313, 0, 0, 665, + 0, 0, 0, 0, 335, 0, 324, 326, 317, 319, + 320, 322, 318, 325, 323, 329, 328, 330, 331, 332, + 333, 334, 327, 0, 315, 321, 316, 562, 336, 337, + 314, 338, 643, 339, 340, 0, 0, 0, 0, 341, + 342, 343, 344, 613, 346, 0, 0, 579, 348, 642, + 350, 0, 349, 614, 580, 657, 658, 659, 355, 356, + 358, 357, 359, 0, 663, 360, 361, 0, 0, 363, + 362, 365, 366, 651, 540, 653, 168, 364, 0, 629, + 664, 367, 0, 368, 369, 615, 0, 371, 372, 169, + 0, 170, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 171, 373, 374, 635, 172, 375, 0, 377, 376, + 616, 379, 380, 381, 382, 660, 661, 173, 596, 0, + 174, 385, 386, 0, 387, 0, 388, 389, 390, 391, + 392, 0, 617, 394, 395, 0, 0, 396, 0, 0, + 0, 397, 398, 400, 399, 401, 0, 0, 402, 403, + 404, 405, 406, 0, 407, 175, 0, 408, 176, 409, + 618, 619, 410, 0, 177, 0, 411, 178, 0, 412, + 413, 414, 0, 620, 0, 581, 179, 416, 417, 418, + 420, 559, 621, 422, 180, 423, 424, 0, 582, 181, + 0, 0, 0, 427, 426, 428, 182, 0, 0, 0, + 430, 0, 0, 0, 431, 0, 183, 429, 185, 432, + 0, 433, 184, 186, 434, 435, 0, 0, 0, 0, + 0, 436, 437, 438, 0, 440, 439, 0, 441, 0, + 0, 442, 0, 0, 443, 187, 444, 445, 446, 447, + 646, 644, 188, 448, 0, 449, 450, 597, 452, 454, + 453, 598, 648, 455, 456, 457, 458, 599, 460, 462, + 0, 0, 461, 459, 463, 464, 0, 662, 465, 466, + 0, 584, 600, 601, 583, 0, 0, 0, 0, 0, + 467, 468, 0, 585, 631, 622, 473, 474, 475, 666, + 477, 478, 634, 480, 479, 0, 190, 191, 0, 0, + 481, 0, 0, 482, 0, 194, 0, 586, 484, 0, + 0, 602, 604, 603, 568, 487, 0, 0, 485, 645, + 0, 647, 486, 489, 488, 623, 624, 0, 0, 0, + 0, 0, 0, 491, 192, 0, 493, 193, 494, 0, + 0, 587, 0, 0, 0, 555, 554, 2138, 0, 0, + 0, 556, 652, 0, 636, 0, 558, 0, 0, 650, + 561, 195, 0, 588, 197, 198, 199, 200, 0, 0, + 201, 0, 0, 0, 202, 0, 0, 606, 0, 203, + 205, 204, 206, 637, 147, 0, 148, 0, 0, 563, + 208, 633, 638, 639, 209, 640, 0, 210, 212, 211, + 0, 213, 0, 149, 150, 0, 0, 214, 565, 564, + 215, 216, 0, 217, 607, 572, 152, 0, 218, 220, + 219, 153, 608, 222, 0, 609, 226, 0, 225, 224, + 154, 227, 155, 228, 229, 230, 231, 0, 232, 233, + 0, 234, 236, 235, 654, 237, 0, 566, 641, 238, + 0, 0, 239, 589, 240, 573, 0, 241, 590, 610, + 0, 243, 242, 244, 591, 592, 574, 0, 0, 0, + 0, 575, 157, 667, 0, 0, 567, 247, 248, 0, + 249, 0, 0, 0, 250, 0, 251, 252, 253, 254, + 255, 0, 0, 0, 158, 0, 0, 256, 257, 258, + 0, 0, 0, 278, 0, 159, 259, 0, 262, 261, + 260, 0, 0, 263, 264, 0, 265, 267, 266, 268, + 269, 160, 560, 0, 270, 271, 272, 273, 274, 593, + 630, 276, 275, 0, 280, 281, 282, 668, 0, 161, + 0, 0, 0, 612, 277, 2089, 279, 0, 476, 0, + 283, 655, 284, 594, 0, 288, 0, 287, 0, 649, + 0, 163, 289, 0, 164, 632, 0, 165, 290, 0, + 0, 0, 576, 143, 292, 144, 611, 0, 293, 295, + 296, 0, 0, 297, 0, 0, 0, 577, 302, 166, + 569, 0, 0, 294, 0, 0, 0, 298, 299, 0, + 300, 301, 0, 0, 0, 303, 0, 0, 167, 304, + 0, 0, 305, 0, 578, 306, 307, 0, 0, 0, + 0, 0, 656, 309, 0, 310, 0, 311, 0, 312, + 313, 0, 0, 665, 0, 0, 0, 0, 335, 0, + 324, 326, 317, 319, 320, 322, 318, 325, 323, 329, + 328, 330, 331, 332, 333, 334, 327, 0, 315, 321, + 316, 562, 336, 337, 314, 338, 643, 339, 340, 0, + 0, 0, 0, 341, 342, 343, 344, 613, 346, 0, + 0, 579, 348, 642, 350, 0, 349, 614, 580, 657, + 658, 659, 355, 356, 358, 357, 359, 0, 663, 360, + 361, 0, 0, 363, 362, 365, 366, 651, 540, 653, + 168, 364, 0, 629, 664, 367, 0, 368, 369, 615, + 0, 371, 372, 169, 0, 170, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 171, 373, 374, 635, 172, + 375, 0, 377, 376, 616, 379, 380, 381, 382, 660, + 661, 173, 596, 0, 174, 385, 386, 0, 387, 0, + 388, 389, 390, 391, 392, 0, 617, 394, 395, 0, + 0, 396, 0, 0, 0, 397, 398, 400, 399, 401, + 0, 0, 402, 403, 404, 405, 406, 0, 407, 175, + 0, 408, 176, 409, 618, 619, 410, 0, 177, 0, + 411, 178, 0, 412, 413, 414, 0, 620, 0, 581, + 179, 416, 417, 418, 420, 559, 621, 422, 180, 423, + 424, 0, 582, 181, 0, 0, 0, 427, 426, 428, + 182, 0, 0, 0, 430, 0, 0, 0, 431, 0, + 183, 429, 185, 432, 0, 433, 184, 186, 434, 435, + 0, 0, 0, 0, 0, 436, 437, 438, 0, 440, + 439, 0, 441, 0, 0, 442, 0, 0, 443, 187, + 444, 445, 446, 447, 646, 644, 188, 448, 0, 449, + 450, 597, 452, 454, 453, 598, 648, 455, 456, 457, + 458, 599, 460, 462, 0, 0, 461, 459, 463, 464, + 0, 662, 465, 466, 0, 584, 600, 601, 583, 0, + 0, 0, 0, 0, 467, 468, 0, 585, 631, 622, + 473, 474, 475, 666, 477, 478, 634, 480, 479, 0, + 190, 191, 0, 0, 481, 0, 0, 482, 0, 194, + 0, 586, 484, 0, 0, 602, 604, 603, 568, 487, + 0, 0, 485, 645, 0, 647, 486, 489, 488, 623, + 624, 0, 0, 0, 0, 0, 0, 491, 192, 0, + 493, 193, 494, 0, 0, 587, 0, 0, 0, 555, + 554, 0, 0, 0, 0, 556, 652, 0, 636, 0, + 558, 0, 0, 650, 561, 195, 0, 588, 197, 198, + 199, 200, 0, 0, 201, 0, 0, 0, 202, 0, + 0, 606, 0, 203, 205, 204, 206, 637, 147, 0, + 148, 0, 0, 563, 208, 633, 638, 639, 209, 640, + 0, 210, 212, 211, 0, 213, 0, 149, 150, 0, + 0, 214, 565, 564, 215, 216, 0, 217, 607, 572, + 152, 0, 218, 220, 219, 153, 608, 222, 0, 609, + 226, 0, 225, 224, 154, 227, 155, 228, 229, 230, + 231, 0, 232, 233, 0, 234, 236, 235, 654, 237, + 0, 566, 641, 238, 0, 0, 239, 589, 240, 573, + 0, 241, 590, 610, 0, 243, 242, 244, 591, 592, + 574, 0, 0, 0, 0, 575, 157, 667, 0, 0, + 567, 247, 248, 0, 249, 0, 0, 0, 250, 0, + 251, 252, 253, 254, 255, 0, 0, 0, 158, 0, + 0, 256, 257, 258, 0, 0, 0, 278, 0, 159, + 259, 0, 262, 261, 260, 0, 0, 263, 264, 0, + 265, 267, 266, 268, 269, 160, 560, 0, 270, 271, + 272, 273, 274, 593, 630, 276, 275, 0, 280, 281, + 282, 668, 0, 161, 0, 0, 0, 612, 277, 2087, + 279, 0, 476, 0, 283, 655, 284, 594, 0, 288, + 0, 287, 0, 649, 0, 163, 289, 0, 164, 632, + 0, 165, 290, 0, 0, 0, 576, 143, 292, 144, + 611, 0, 293, 295, 296, 0, 0, 297, 0, 0, + 0, 577, 302, 166, 569, 0, 0, 294, 0, 0, + 0, 298, 299, 0, 300, 301, 0, 0, 0, 303, + 0, 0, 167, 304, 0, 0, 305, 0, 578, 306, + 307, 0, 0, 0, 0, 0, 656, 309, 0, 310, + 0, 311, 0, 312, 313, 0, 0, 665, 0, 0, + 0, 0, 335, 0, 324, 326, 317, 319, 320, 322, + 318, 325, 323, 329, 328, 330, 331, 332, 333, 334, + 327, 0, 315, 321, 316, 562, 336, 337, 314, 338, + 643, 339, 340, 0, 0, 0, 0, 341, 342, 343, + 344, 613, 346, 0, 0, 579, 348, 642, 350, 0, + 349, 614, 580, 657, 658, 659, 355, 356, 358, 357, + 359, 0, 663, 360, 361, 0, 0, 363, 362, 365, + 366, 651, 540, 653, 168, 364, 0, 629, 664, 367, + 0, 368, 369, 615, 0, 371, 372, 169, 0, 170, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 171, + 373, 374, 635, 172, 375, 0, 377, 376, 616, 379, + 380, 381, 382, 660, 661, 173, 596, 0, 174, 385, + 386, 0, 387, 0, 388, 389, 390, 391, 392, 0, + 617, 394, 395, 0, 0, 396, 0, 0, 0, 397, + 398, 400, 399, 401, 0, 0, 402, 403, 404, 405, + 406, 0, 407, 175, 0, 408, 176, 409, 618, 619, + 410, 0, 177, 0, 411, 178, 0, 412, 413, 414, + 0, 620, 0, 581, 179, 416, 417, 418, 420, 559, + 621, 422, 180, 423, 424, 0, 582, 181, 0, 0, + 0, 427, 426, 428, 182, 0, 0, 0, 430, 0, + 0, 0, 431, 0, 183, 429, 185, 432, 0, 433, + 184, 186, 434, 435, 0, 0, 0, 0, 0, 436, + 437, 438, 0, 440, 439, 0, 441, 0, 0, 442, + 0, 0, 443, 187, 444, 445, 446, 447, 646, 644, + 188, 448, 0, 449, 450, 597, 452, 454, 453, 598, + 648, 455, 456, 457, 458, 599, 460, 462, 0, 0, + 461, 459, 463, 464, 0, 662, 465, 466, 0, 584, + 600, 601, 583, 0, 0, 0, 0, 0, 467, 468, + 0, 585, 631, 622, 473, 474, 475, 666, 477, 478, + 634, 480, 479, 0, 190, 191, 0, 0, 481, 0, + 0, 482, 0, 194, 0, 586, 484, 0, 0, 602, + 604, 603, 568, 487, 0, 0, 485, 645, 0, 647, + 486, 489, 488, 623, 624, 0, 0, 0, 0, 0, + 0, 491, 192, 0, 493, 193, 494, 0, 0, 587, + 0, 0, 0, 555, 554, 0, 0, 0, 0, 556, + 652, 0, 636, 0, 558, 0, 0, 650, 561, 195, + 0, 588, 197, 198, 199, 200, 0, 0, 201, 0, + 0, 0, 202, 0, 0, 606, 0, 203, 205, 204, + 206, 637, 147, 0, 148, 0, 0, 563, 208, 633, + 638, 639, 209, 640, 0, 210, 212, 211, 0, 213, + 0, 149, 150, 0, 0, 214, 565, 564, 215, 216, + 0, 217, 607, 572, 152, 0, 218, 220, 219, 153, + 608, 222, 0, 609, 226, 0, 225, 224, 154, 227, + 155, 228, 229, 230, 231, 0, 232, 233, 0, 234, + 236, 235, 654, 237, 0, 566, 641, 238, 0, 0, + 239, 589, 240, 573, 0, 241, 590, 610, 0, 243, + 242, 244, 591, 592, 574, 0, 0, 0, 0, 575, + 157, 667, 0, 0, 567, 247, 248, 0, 249, 0, + 0, 0, 250, 0, 251, 252, 253, 254, 255, 0, + 0, 0, 158, 0, 0, 256, 257, 258, 0, 0, + 0, 278, 0, 159, 259, 0, 262, 261, 260, 0, + 0, 263, 264, 0, 265, 267, 266, 268, 269, 160, + 560, 0, 270, 271, 272, 273, 274, 593, 630, 276, + 275, 0, 280, 281, 282, 668, 0, 161, 0, 0, + 0, 612, 277, 2085, 279, 0, 476, 0, 283, 655, + 284, 594, 0, 288, 0, 287, 0, 649, 0, 163, + 289, 0, 164, 632, 0, 165, 290, 0, 0, 0, + 576, 143, 292, 144, 611, 0, 293, 295, 296, 0, + 0, 297, 0, 0, 0, 577, 302, 166, 569, 0, + 0, 294, 0, 0, 0, 298, 299, 0, 300, 301, + 0, 0, 0, 303, 0, 0, 167, 304, 0, 0, + 305, 0, 578, 306, 307, 0, 0, 0, 0, 0, + 656, 309, 0, 310, 0, 311, 0, 312, 313, 0, + 0, 665, 0, 0, 0, 0, 335, 0, 324, 326, + 317, 319, 320, 322, 318, 325, 323, 329, 328, 330, + 331, 332, 333, 334, 327, 0, 315, 321, 316, 562, + 336, 337, 314, 338, 643, 339, 340, 0, 0, 0, + 0, 341, 342, 343, 344, 613, 346, 0, 0, 579, + 348, 642, 350, 0, 349, 614, 580, 657, 658, 659, + 355, 356, 358, 357, 359, 0, 663, 360, 361, 0, + 0, 363, 362, 365, 366, 651, 540, 653, 168, 364, + 0, 629, 664, 367, 0, 368, 369, 615, 0, 371, + 372, 169, 0, 170, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 171, 373, 374, 635, 172, 375, 0, + 377, 376, 616, 379, 380, 381, 382, 660, 661, 173, + 596, 0, 174, 385, 386, 0, 387, 0, 388, 389, + 390, 391, 392, 0, 617, 394, 395, 0, 0, 396, + 0, 0, 0, 397, 398, 400, 399, 401, 0, 0, + 402, 403, 404, 405, 406, 0, 407, 175, 0, 408, + 176, 409, 618, 619, 410, 0, 177, 0, 411, 178, + 0, 412, 413, 414, 0, 620, 0, 581, 179, 416, + 417, 418, 420, 559, 621, 422, 180, 423, 424, 0, + 582, 181, 0, 0, 0, 427, 426, 428, 182, 0, + 0, 0, 430, 0, 0, 0, 431, 0, 183, 429, + 185, 432, 0, 433, 184, 186, 434, 435, 0, 0, + 0, 0, 0, 436, 437, 438, 0, 440, 439, 0, + 441, 0, 0, 442, 0, 0, 443, 187, 444, 445, + 446, 447, 646, 644, 188, 448, 0, 449, 450, 597, + 452, 454, 453, 598, 648, 455, 456, 457, 458, 599, + 460, 462, 0, 0, 461, 459, 463, 464, 0, 662, + 465, 466, 0, 584, 600, 601, 583, 0, 0, 0, + 0, 0, 467, 468, 0, 585, 631, 622, 473, 474, + 475, 666, 477, 478, 634, 480, 479, 0, 190, 191, + 0, 0, 481, 0, 0, 482, 0, 194, 0, 586, + 484, 0, 0, 602, 604, 603, 568, 487, 0, 0, + 485, 645, 0, 647, 486, 489, 488, 623, 624, 0, + 0, 0, 0, 0, 0, 491, 192, 0, 493, 193, + 494, 0, 0, 587, 0, 0, 0, 555, 554, 0, + 0, 0, 0, 556, 652, 0, 636, 0, 558, 0, + 0, 650, 561, 195, 0, 588, 197, 198, 199, 200, + 0, 0, 201, 0, 0, 0, 202, 0, 0, 606, + 0, 203, 205, 204, 206, 637, 147, 0, 148, 0, + 0, 563, 208, 633, 638, 639, 209, 640, 0, 210, + 212, 211, 0, 213, 0, 149, 150, 0, 0, 214, + 565, 564, 215, 216, 0, 217, 607, 572, 152, 0, + 218, 220, 219, 153, 608, 222, 0, 609, 226, 0, + 225, 224, 154, 227, 155, 228, 229, 230, 231, 0, + 232, 233, 0, 234, 236, 235, 654, 237, 0, 566, + 641, 238, 0, 0, 239, 589, 240, 573, 0, 241, + 590, 610, 0, 243, 242, 244, 591, 592, 574, 0, + 0, 0, 0, 575, 157, 667, 0, 0, 2767, 247, + 248, 0, 249, 0, 0, 0, 250, 0, 251, 252, + 253, 254, 255, 0, 0, 0, 158, 0, 0, 256, + 257, 258, 0, 0, 0, 278, 0, 159, 259, 0, + 262, 261, 260, 0, 0, 263, 264, 0, 265, 267, + 266, 268, 269, 160, 560, 0, 270, 271, 272, 273, + 274, 593, 630, 276, 275, 0, 280, 281, 282, 668, + 0, 161, 0, 0, 0, 612, 277, 0, 279, 0, + 476, 0, 283, 655, 284, 594, 0, 288, 0, 287, + 0, 649, 0, 163, 289, 0, 164, 632, 0, 165, + 290, 0, 0, 0, 576, 143, 292, 144, 611, 0, + 293, 295, 296, 0, 0, 297, 0, 0, 0, 577, + 302, 166, 569, 0, 0, 294, 0, 0, 0, 298, + 299, 0, 300, 301, 0, 0, 0, 303, 0, 0, + 167, 304, 0, 0, 305, 0, 578, 306, 307, 0, + 0, 0, 0, 0, 656, 309, 0, 310, 0, 311, + 0, 312, 313, 0, 0, 665, 0, 0, 0, 0, + 335, 0, 324, 326, 317, 319, 320, 322, 318, 325, + 323, 329, 328, 330, 331, 332, 333, 334, 327, 0, + 315, 321, 316, 562, 336, 337, 314, 338, 643, 339, + 340, 0, 0, 0, 0, 341, 342, 343, 344, 613, + 346, 0, 0, 579, 348, 642, 350, 0, 349, 614, + 580, 657, 658, 659, 355, 356, 358, 357, 359, 0, + 663, 360, 361, 0, 0, 363, 362, 365, 366, 651, + 540, 653, 168, 364, 0, 629, 664, 367, 0, 368, + 369, 615, 0, 371, 372, 169, 0, 170, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 171, 373, 374, + 635, 172, 375, 0, 377, 376, 616, 379, 380, 381, + 382, 660, 661, 173, 596, 0, 174, 385, 386, 0, + 387, 0, 388, 389, 390, 391, 392, 0, 617, 394, + 395, 0, 0, 396, 0, 0, 0, 397, 398, 400, + 399, 401, 0, 0, 402, 403, 404, 405, 406, 0, + 407, 175, 0, 408, 176, 409, 618, 619, 410, 0, + 177, 0, 411, 178, 0, 412, 413, 414, 0, 620, + 0, 581, 179, 416, 417, 418, 420, 559, 621, 422, + 180, 423, 424, 0, 582, 181, 0, 0, 0, 427, + 426, 428, 182, 0, 0, 0, 430, 0, 0, 0, + 431, 0, 183, 429, 185, 432, 0, 433, 184, 186, + 434, 435, 0, 0, 0, 0, 0, 436, 437, 438, + 0, 440, 439, 0, 441, 0, 0, 442, 0, 0, + 443, 187, 444, 445, 446, 447, 646, 644, 188, 448, + 0, 449, 450, 597, 452, 454, 453, 598, 648, 455, + 456, 457, 458, 599, 460, 462, 0, 0, 461, 459, + 463, 464, 0, 662, 465, 466, 0, 584, 600, 601, + 583, 0, 0, 0, 0, 0, 467, 468, 0, 585, + 631, 622, 473, 474, 475, 666, 477, 478, 634, 480, + 479, 0, 190, 191, 0, 0, 481, 0, 0, 482, + 0, 194, 0, 586, 484, 0, 0, 602, 604, 603, + 568, 487, 0, 0, 485, 645, 0, 647, 486, 489, + 488, 623, 624, 0, 0, 0, 0, 0, 0, 491, + 192, 0, 493, 193, 494, 0, 0, 587, 0, 0, + 0, 555, 554, 0, 0, 0, 0, 556, 652, 0, + 636, 0, 558, 0, 0, 650, 561, 195, 0, 588, + 197, 198, 199, 200, 0, 0, 201, 0, 0, 0, + 202, 0, 0, 606, 0, 203, 205, 204, 206, 637, + 147, 0, 148, 0, 0, 563, 208, 633, 638, 639, + 209, 640, 0, 210, 212, 211, 0, 213, 0, 149, + 150, 0, 0, 214, 565, 564, 215, 216, 0, 217, + 607, 572, 152, 0, 218, 220, 219, 153, 608, 222, + 0, 609, 226, 0, 225, 224, 154, 227, 155, 228, + 229, 230, 231, 0, 232, 233, 0, 234, 236, 235, + 654, 237, 0, 566, 641, 238, 0, 0, 239, 589, + 240, 573, 0, 241, 590, 610, 0, 243, 242, 244, + 591, 592, 574, 0, 0, 0, 0, 575, 157, 667, + 0, 0, 567, 247, 248, 0, 249, 0, 0, 0, + 250, 0, 251, 252, 253, 254, 255, 0, 0, 0, + 158, 0, 0, 256, 257, 258, 0, 0, 0, 278, + 0, 159, 259, 0, 262, 261, 260, 0, 0, 263, + 264, 0, 265, 267, 266, 268, 269, 160, 560, 0, + 270, 271, 272, 273, 274, 593, 630, 276, 275, 0, + 280, 281, 282, 668, 0, 161, 0, 0, 0, 612, + 277, 0, 279, 0, 476, 0, 283, 655, 284, 594, + 0, 288, 0, 287, 0, 649, 0, 163, 289, 0, + 164, 632, 0, 165, 290, 0, 0, 0, 576, 143, + 292, 144, 611, 0, 293, 295, 296, 0, 0, 297, + 0, 0, 0, 577, 302, 166, 569, 0, 0, 294, + 0, 0, 0, 298, 299, 0, 300, 301, 0, 0, + 0, 303, 0, 0, 167, 304, 0, 0, 305, 0, + 578, 306, 307, 0, 0, 0, 0, 0, 656, 309, + 0, 310, 0, 311, 0, 312, 313, 0, 0, 665, + 0, 0, 0, 0, 335, 0, 324, 326, 317, 319, + 320, 322, 318, 325, 323, 329, 328, 330, 331, 332, + 333, 334, 327, 0, 315, 321, 316, 562, 336, 337, + 314, 338, 643, 339, 340, 0, 0, 0, 0, 341, + 342, 343, 344, 613, 346, 0, 0, 579, 348, 642, + 350, 0, 349, 614, 580, 657, 658, 659, 355, 356, + 358, 357, 359, 0, 663, 360, 361, 0, 0, 363, + 362, 365, 366, 651, 540, 653, 168, 364, 0, 629, + 664, 367, 0, 368, 369, 615, 0, 371, 372, 169, + 0, 170, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 171, 373, 374, 635, 172, 375, 0, 377, 376, + 616, 379, 380, 381, 382, 660, 661, 173, 596, 0, + 174, 385, 386, 0, 387, 0, 388, 389, 390, 391, + 392, 0, 617, 394, 395, 0, 0, 396, 0, 0, + 0, 397, 398, 400, 399, 401, 0, 0, 402, 403, + 404, 405, 406, 0, 407, 175, 0, 408, 176, 409, + 618, 619, 410, 0, 177, 0, 411, 178, 0, 412, + 413, 414, 0, 620, 0, 581, 179, 416, 417, 418, + 420, 559, 621, 422, 180, 423, 424, 0, 582, 181, + 0, 0, 0, 427, 426, 428, 182, 0, 0, 0, + 430, 0, 0, 0, 431, 0, 183, 429, 185, 432, + 0, 433, 184, 186, 434, 435, 0, 0, 0, 0, + 0, 436, 437, 438, 0, 440, 439, 0, 441, 0, + 0, 442, 0, 0, 443, 187, 444, 445, 446, 447, + 646, 644, 188, 448, 0, 449, 450, 597, 452, 454, + 453, 598, 648, 455, 456, 457, 458, 599, 460, 462, + 0, 0, 461, 459, 463, 464, 0, 662, 465, 466, + 0, 584, 600, 601, 583, 0, 0, 0, 0, 0, + 467, 468, 0, 585, 631, 622, 473, 474, 475, 666, + 477, 478, 634, 480, 479, 0, 190, 191, 0, 0, + 481, 0, 0, 482, 0, 194, 0, 586, 484, 0, + 0, 602, 604, 603, 568, 487, 0, 0, 485, 645, + 0, 647, 486, 489, 488, 623, 624, 0, 0, 0, + 0, 0, 0, 491, 192, 0, 493, 193, 494, 0, + 0, 587, 0, 0, 0, 555, 554, 0, 0, 0, + 0, 556, 652, 0, 636, 0, 558, 0, 0, 650, + 561, 195, 0, 588, 197, 198, 199, 200, 0, 0, + 201, 0, 0, 0, 202, 0, 0, 606, 0, 203, + 205, 204, 206, 637, 147, 0, 148, 0, 0, 563, + 208, 633, 638, 639, 209, 640, 0, 210, 212, 211, + 0, 213, 0, 149, 150, 0, 0, 214, 565, 564, + 215, 216, 0, 217, 607, 572, 152, 0, 218, 220, + 219, 153, 608, 222, 0, 609, 226, 0, 225, 224, + 154, 227, 155, 228, 229, 230, 231, 0, 232, 233, + 0, 234, 236, 235, 654, 237, 0, 566, 641, 238, + 0, 0, 239, 589, 240, 573, 0, 241, 590, 610, + 0, 243, 242, 244, 591, 592, 574, 0, 0, 0, + 0, 575, 157, 667, 0, 0, 567, 247, 248, 0, + 249, 0, 0, 0, 250, 0, 251, 252, 253, 254, + 255, 0, 0, 0, 158, 0, 0, 256, 257, 258, + 0, 0, 0, 278, 0, 159, 259, 0, 262, 261, + 260, 0, 0, 263, 264, 0, 265, 267, 266, 268, + 269, 160, 560, 0, 270, 271, 272, 273, 274, 593, + 630, 276, 275, 0, 280, 281, 282, 668, 0, 161, + 0, 0, 0, 612, 277, 0, 279, 0, 476, 0, + 283, 655, 284, 594, 0, 288, 0, 287, 0, 649, + 0, 163, 289, 0, 164, 632, 0, 165, 290, 0, + 0, 0, 576, 143, 292, 144, 611, 0, 293, 295, + 296, 0, 0, 297, 0, 0, 0, 577, 302, 166, + 569, 0, 0, 294, 0, 0, 0, 298, 299, 0, + 300, 301, 0, 0, 0, 303, 0, 0, 167, 304, + 0, 0, 305, 0, 578, 306, 307, 0, 0, 0, + 0, 0, 656, 309, 0, 310, 0, 311, 0, 312, + 313, 0, 0, 665, 0, 0, 0, 0, 335, 0, + 324, 326, 317, 319, 320, 322, 318, 325, 323, 329, + 328, 330, 331, 332, 333, 334, 327, 0, 315, 321, + 316, 562, 336, 337, 314, 338, 643, 339, 340, 4151, + 0, 0, 0, 341, 342, 343, 344, 613, 346, 0, + 0, 579, 348, 642, 350, 0, 349, 614, 580, 657, + 658, 659, 355, 356, 358, 357, 359, 0, 663, 360, + 361, 0, 0, 363, 362, 365, 366, 651, 0, 653, + 168, 364, 0, 629, 664, 367, 0, 368, 369, 615, + 0, 371, 372, 169, 0, 170, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 171, 373, 374, 635, 172, + 375, 0, 377, 376, 616, 379, 380, 381, 382, 660, + 661, 173, 596, 0, 174, 385, 386, 0, 387, 0, + 388, 389, 390, 391, 392, 0, 617, 394, 395, 0, + 0, 396, 0, 0, 0, 397, 398, 400, 399, 401, + 0, 0, 402, 403, 404, 405, 406, 0, 407, 175, + 0, 408, 176, 409, 618, 619, 410, 0, 177, 0, + 411, 178, 0, 412, 413, 414, 0, 620, 0, 581, + 179, 416, 417, 418, 420, 559, 621, 422, 180, 423, + 424, 0, 582, 181, 0, 0, 0, 427, 426, 428, + 182, 0, 0, 0, 430, 0, 0, 0, 431, 0, + 183, 429, 185, 432, 0, 433, 184, 186, 434, 435, + 0, 0, 0, 0, 0, 436, 437, 438, 0, 440, + 439, 0, 441, 0, 0, 442, 0, 0, 443, 187, + 444, 445, 446, 447, 646, 644, 188, 448, 0, 449, + 450, 597, 452, 454, 453, 598, 648, 455, 456, 457, + 458, 599, 460, 462, 0, 0, 461, 459, 463, 464, + 0, 662, 465, 466, 0, 584, 600, 601, 583, 0, + 0, 0, 0, 0, 467, 468, 0, 585, 631, 622, + 473, 474, 475, 666, 477, 478, 634, 480, 479, 0, + 190, 191, 0, 0, 481, 0, 0, 482, 0, 194, + 0, 586, 484, 0, 0, 602, 604, 603, 568, 487, + 0, 0, 485, 645, 0, 647, 486, 489, 488, 623, + 624, 0, 0, 0, 0, 0, 0, 491, 192, 0, + 493, 193, 494, 0, 0, 587, 0, 0, 0, 555, + 554, 0, 0, 0, 0, 556, 652, 0, 636, 0, + 558, 0, 0, 650, 561, 195, 0, 588, 197, 198, + 199, 200, 0, 0, 201, 0, 0, 0, 202, 0, + 0, 606, 0, 203, 205, 204, 206, 637, 147, 0, + 148, 0, 0, 563, 208, 633, 638, 639, 209, 640, + 0, 210, 212, 211, 0, 213, 0, 149, 150, 0, + 0, 214, 565, 564, 215, 216, 0, 217, 607, 572, + 152, 0, 218, 220, 219, 153, 608, 222, 0, 609, + 226, 0, 225, 224, 154, 227, 155, 228, 229, 230, + 231, 0, 232, 233, 0, 234, 236, 235, 654, 237, + 0, 566, 641, 238, 0, 0, 239, 589, 240, 573, + 0, 241, 590, 610, 0, 243, 242, 244, 591, 592, + 574, 0, 0, 0, 0, 575, 157, 667, 0, 0, + 567, 247, 248, 0, 249, 0, 0, 0, 250, 0, + 251, 252, 253, 254, 255, 0, 0, 0, 158, 0, + 0, 256, 257, 258, 0, 0, 0, 278, 0, 159, + 259, 0, 262, 261, 260, 0, 0, 263, 264, 0, + 265, 267, 266, 268, 269, 160, 560, 0, 270, 271, + 272, 273, 274, 593, 630, 276, 275, 0, 280, 281, + 282, 668, 0, 161, 0, 0, 0, 612, 277, 0, + 279, 0, 476, 0, 283, 655, 284, 594, 0, 288, + 0, 287, 0, 649, 0, 163, 289, 0, 164, 632, + 0, 165, 290, 0, 0, 0, 576, 143, 292, 144, + 611, 0, 293, 295, 296, 0, 0, 297, 0, 0, + 0, 577, 302, 166, 569, 0, 0, 294, 0, 0, + 0, 298, 299, 0, 300, 301, 0, 0, 0, 303, + 0, 0, 167, 304, 0, 0, 305, 0, 578, 306, + 307, 0, 0, 0, 0, 0, 656, 309, 0, 310, + 0, 311, 0, 312, 313, 0, 0, 665, 0, 0, + 0, 0, 335, 0, 324, 326, 317, 319, 320, 322, + 318, 325, 323, 329, 328, 330, 331, 332, 333, 334, + 327, 0, 315, 321, 316, 562, 336, 337, 314, 338, + 643, 339, 340, 4151, 0, 0, 0, 341, 342, 343, + 344, 613, 346, 0, 0, 579, 348, 642, 350, 0, + 349, 614, 580, 657, 658, 659, 355, 356, 358, 357, + 359, 0, 663, 360, 361, 0, 0, 363, 362, 365, + 366, 651, 0, 653, 168, 364, 0, 629, 664, 367, + 0, 368, 369, 615, 0, 371, 372, 169, 0, 170, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 171, + 373, 374, 635, 172, 375, 0, 377, 376, 616, 379, + 380, 381, 382, 660, 661, 173, 596, 0, 174, 385, + 386, 0, 387, 0, 388, 389, 390, 391, 392, 0, + 617, 394, 395, 0, 0, 396, 0, 0, 0, 397, + 398, 400, 399, 401, 0, 0, 402, 403, 404, 405, + 406, 0, 407, 175, 0, 408, 176, 409, 618, 619, + 410, 0, 177, 0, 411, 178, 0, 412, 413, 414, + 0, 620, 0, 581, 179, 416, 417, 418, 420, 559, + 621, 422, 180, 423, 424, 0, 582, 181, 0, 0, + 0, 427, 426, 428, 182, 0, 0, 0, 430, 0, + 0, 0, 431, 0, 183, 429, 185, 432, 0, 433, + 184, 186, 434, 435, 0, 0, 0, 0, 0, 436, + 437, 438, 0, 440, 439, 0, 441, 0, 0, 442, + 0, 0, 443, 187, 444, 445, 446, 447, 646, 644, + 188, 448, 0, 449, 450, 597, 452, 454, 453, 598, + 648, 455, 456, 457, 458, 599, 460, 462, 0, 0, + 461, 459, 463, 464, 0, 662, 465, 466, 0, 584, + 600, 601, 583, 0, 0, 0, 0, 0, 467, 468, + 0, 585, 631, 622, 473, 474, 475, 666, 477, 478, + 634, 480, 479, 0, 190, 191, 0, 0, 481, 0, + 0, 482, 0, 194, 0, 586, 484, 0, 0, 602, + 604, 603, 568, 487, 0, 0, 485, 645, 0, 647, + 486, 489, 488, 623, 624, 0, 0, 0, 0, 0, + 0, 491, 192, 0, 493, 193, 494, 0, 0, 587, + 0, 0, 0, 555, 554, 0, 0, 0, 0, 556, + 652, 0, 636, 0, 4150, 0, 0, 650, 561, 195, + 0, 588, 197, 198, 199, 200, 0, 0, 201, 0, + 0, 0, 202, 0, 0, 606, 0, 203, 205, 204, + 206, 637, 147, 0, 148, 0, 0, 563, 208, 633, + 638, 639, 209, 640, 0, 210, 212, 211, 0, 213, + 0, 149, 150, 0, 0, 214, 565, 564, 215, 216, + 0, 217, 607, 572, 152, 0, 218, 220, 219, 153, + 608, 222, 0, 609, 226, 0, 225, 224, 154, 227, + 155, 228, 229, 230, 231, 0, 232, 233, 0, 234, + 236, 235, 654, 237, 0, 566, 641, 238, 0, 0, + 239, 589, 240, 573, 0, 241, 590, 610, 0, 243, + 242, 244, 591, 592, 574, 0, 0, 0, 0, 575, + 157, 667, 0, 0, 567, 247, 248, 0, 249, 0, + 0, 0, 250, 0, 251, 252, 253, 254, 255, 0, + 0, 0, 158, 0, 0, 256, 257, 258, 0, 0, + 0, 278, 0, 159, 259, 0, 262, 261, 260, 0, + 0, 263, 264, 0, 265, 267, 266, 268, 269, 160, + 560, 0, 270, 271, 272, 273, 274, 593, 630, 276, + 275, 0, 280, 281, 282, 668, 0, 161, 0, 0, + 0, 612, 277, 0, 279, 0, 476, 0, 283, 655, + 284, 594, 0, 288, 0, 287, 0, 649, 0, 163, + 289, 0, 164, 632, 0, 165, 290, 0, 0, 0, + 576, 143, 292, 144, 611, 0, 293, 295, 296, 0, + 0, 297, 0, 0, 0, 577, 302, 166, 569, 0, + 0, 294, 0, 0, 0, 298, 299, 0, 300, 301, + 0, 0, 0, 303, 0, 0, 167, 304, 0, 0, + 305, 0, 578, 306, 307, 0, 0, 0, 0, 0, + 656, 309, 0, 310, 0, 311, 0, 312, 313, 0, + 0, 665, 0, 0, 0, 0, 335, 0, 324, 326, + 317, 319, 320, 322, 318, 325, 323, 329, 328, 330, + 331, 332, 333, 334, 327, 0, 315, 321, 316, 562, + 336, 337, 314, 338, 643, 339, 340, 0, 0, 0, + 0, 341, 342, 343, 344, 613, 346, 0, 0, 579, + 348, 642, 350, 0, 349, 614, 580, 657, 658, 659, + 355, 356, 358, 357, 359, 0, 663, 360, 361, 0, + 0, 363, 362, 365, 366, 651, 540, 653, 168, 364, + 0, 629, 664, 367, 0, 368, 369, 615, 0, 371, + 372, 169, 0, 170, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 171, 373, 374, 635, 172, 375, 0, + 377, 376, 616, 379, 380, 381, 382, 660, 661, 173, + 596, 0, 174, 385, 386, 0, 387, 0, 388, 389, + 390, 391, 392, 0, 617, 394, 395, 0, 0, 396, + 0, 0, 0, 397, 398, 400, 399, 401, 0, 0, + 402, 403, 404, 405, 406, 0, 407, 175, 0, 408, + 176, 409, 618, 619, 410, 0, 177, 0, 411, 178, + 0, 412, 413, 414, 0, 620, 0, 581, 179, 416, + 417, 418, 420, 559, 621, 422, 180, 423, 424, 0, + 582, 181, 0, 0, 0, 427, 426, 428, 182, 0, + 0, 0, 430, 0, 0, 0, 431, 0, 183, 429, + 185, 432, 0, 433, 184, 186, 434, 435, 0, 0, + 0, 0, 0, 436, 437, 438, 0, 440, 439, 0, + 441, 0, 0, 442, 0, 0, 443, 187, 444, 445, + 446, 447, 646, 644, 188, 448, 0, 449, 450, 597, + 452, 454, 453, 598, 648, 455, 456, 457, 458, 599, + 460, 462, 0, 0, 461, 459, 463, 464, 0, 662, + 465, 466, 0, 584, 600, 601, 583, 0, 0, 0, + 0, 0, 467, 468, 0, 585, 631, 622, 473, 474, + 475, 666, 477, 478, 634, 480, 479, 0, 190, 191, + 0, 0, 481, 0, 0, 482, 0, 194, 0, 586, + 484, 0, 0, 602, 604, 603, 568, 487, 0, 0, + 485, 645, 0, 647, 486, 489, 488, 623, 624, 0, + 0, 0, 0, 0, 0, 491, 192, 0, 493, 193, + 494, 0, 0, 587, 0, 0, 0, 555, 554, 0, + 0, 0, 0, 556, 652, 0, 636, 0, 979, 0, + 0, 650, 561, 195, 0, 588, 197, 198, 199, 200, + 0, 0, 201, 0, 0, 0, 202, 0, 0, 606, + 0, 203, 205, 204, 206, 637, 147, 0, 148, 0, + 0, 563, 208, 633, 638, 639, 209, 640, 0, 210, + 212, 211, 0, 213, 0, 149, 150, 0, 0, 214, + 565, 564, 215, 216, 0, 217, 607, 572, 152, 0, + 218, 220, 219, 153, 608, 222, 0, 609, 226, 0, + 225, 224, 154, 227, 155, 228, 229, 230, 231, 0, + 232, 233, 0, 234, 236, 235, 654, 237, 0, 566, + 641, 238, 0, 0, 239, 589, 240, 573, 0, 241, + 590, 610, 0, 243, 242, 244, 591, 592, 574, 0, + 0, 0, 0, 575, 157, 667, 0, 0, 567, 247, + 248, 0, 249, 0, 0, 0, 250, 0, 251, 252, + 253, 254, 255, 0, 0, 0, 158, 0, 0, 256, + 257, 258, 0, 0, 0, 278, 0, 159, 259, 0, + 262, 261, 260, 0, 0, 263, 264, 0, 265, 267, + 266, 268, 269, 160, 560, 0, 270, 271, 272, 273, + 274, 593, 630, 276, 275, 0, 280, 281, 282, 668, + 0, 161, 0, 0, 0, 612, 277, 0, 279, 0, + 476, 0, 283, 655, 284, 594, 0, 288, 0, 287, + 0, 649, 0, 163, 289, 0, 164, 632, 0, 165, + 290, 0, 0, 0, 576, 143, 292, 144, 611, 0, + 293, 295, 296, 0, 0, 297, 0, 0, 0, 577, + 302, 166, 2659, 0, 0, 294, 0, 0, 0, 298, + 299, 0, 300, 301, 0, 0, 0, 303, 0, 0, + 167, 304, 0, 0, 305, 0, 578, 306, 307, 0, + 0, 0, 0, 0, 656, 309, 0, 310, 0, 311, + 0, 312, 313, 0, 0, 665, 0, 0, 0, 0, + 335, 0, 324, 326, 317, 319, 320, 322, 318, 325, + 323, 329, 328, 330, 331, 332, 333, 334, 327, 0, + 315, 321, 316, 562, 336, 337, 314, 338, 643, 339, + 340, 0, 0, 0, 0, 341, 342, 343, 344, 613, + 346, 0, 0, 579, 348, 642, 350, 0, 349, 614, + 580, 657, 658, 659, 355, 356, 358, 357, 359, 0, + 663, 360, 361, 0, 0, 363, 362, 365, 366, 651, + 540, 653, 168, 364, 0, 629, 664, 367, 0, 368, + 369, 615, 0, 371, 372, 169, 0, 170, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 171, 373, 374, + 635, 172, 375, 0, 377, 376, 616, 379, 380, 381, + 382, 660, 661, 173, 596, 0, 174, 385, 386, 0, + 387, 0, 388, 389, 390, 391, 392, 0, 617, 394, + 395, 0, 0, 396, 0, 0, 0, 397, 398, 400, + 399, 401, 0, 0, 402, 403, 404, 405, 406, 0, + 407, 175, 0, 408, 176, 409, 618, 619, 410, 0, + 177, 0, 411, 178, 0, 412, 413, 414, 0, 620, + 0, 581, 179, 416, 417, 418, 420, 559, 621, 422, + 180, 423, 424, 0, 582, 181, 0, 0, 0, 427, + 426, 428, 182, 0, 0, 0, 430, 0, 0, 0, + 431, 0, 183, 429, 185, 432, 0, 433, 184, 186, + 434, 435, 0, 0, 0, 0, 0, 436, 437, 438, + 0, 440, 439, 0, 441, 0, 0, 442, 0, 0, + 443, 187, 444, 445, 446, 447, 646, 644, 188, 448, + 0, 449, 450, 597, 452, 454, 453, 598, 648, 455, + 456, 457, 458, 599, 460, 462, 0, 0, 461, 459, + 463, 464, 0, 662, 465, 466, 0, 584, 600, 601, + 583, 0, 0, 0, 0, 0, 467, 468, 0, 585, + 631, 622, 473, 474, 475, 666, 477, 478, 634, 480, + 479, 0, 190, 191, 0, 0, 481, 0, 0, 482, + 0, 194, 0, 586, 484, 0, 0, 602, 604, 603, + 568, 487, 0, 0, 485, 645, 0, 647, 486, 489, + 488, 623, 624, 0, 0, 0, 0, 0, 0, 491, + 192, 0, 493, 193, 494, 0, 0, 587, 0, 0, + 0, 555, 554, 0, 0, 0, 0, 556, 652, 0, + 636, 0, 558, 0, 0, 650, 561, 195, 0, 588, + 197, 198, 199, 200, 0, 0, 201, 0, 0, 0, + 202, 0, 0, 606, 0, 203, 205, 204, 206, 637, + 147, 0, 148, 0, 0, 563, 208, 633, 638, 639, + 209, 640, 0, 210, 212, 211, 0, 213, 0, 149, + 150, 0, 0, 214, 565, 564, 215, 216, 0, 217, + 607, 572, 152, 0, 218, 220, 219, 153, 608, 222, + 0, 609, 226, 0, 225, 224, 154, 227, 155, 228, + 229, 230, 231, 0, 232, 233, 0, 234, 236, 235, + 654, 237, 0, 566, 641, 238, 0, 0, 239, 589, + 240, 573, 0, 241, 590, 610, 0, 243, 242, 244, + 591, 592, 574, 0, 0, 0, 0, 575, 157, 667, + 0, 0, 567, 247, 248, 0, 249, 0, 0, 0, + 250, 0, 251, 252, 253, 254, 255, 0, 0, 0, + 158, 0, 0, 256, 257, 258, 0, 0, 0, 278, + 0, 159, 259, 0, 262, 261, 260, 0, 0, 263, + 264, 0, 265, 267, 266, 268, 269, 160, 560, 0, + 270, 271, 272, 273, 274, 593, 630, 276, 275, 0, + 280, 281, 282, 668, 0, 161, 0, 0, 0, 612, + 277, 0, 279, 0, 476, 0, 283, 655, 284, 594, + 0, 288, 0, 287, 0, 649, 0, 163, 289, 0, + 164, 632, 0, 165, 290, 0, 0, 0, 576, 143, + 292, 144, 611, 0, 293, 295, 296, 0, 0, 297, + 0, 0, 0, 577, 302, 166, 2652, 0, 0, 294, + 0, 0, 0, 298, 299, 0, 300, 301, 0, 0, + 0, 303, 0, 0, 167, 304, 0, 0, 305, 0, + 578, 306, 307, 0, 0, 0, 0, 0, 656, 309, + 0, 310, 0, 311, 0, 312, 313, 0, 0, 665, + 0, 0, 0, 0, 335, 0, 324, 326, 317, 319, + 320, 322, 318, 325, 323, 329, 328, 330, 331, 332, + 333, 334, 327, 0, 315, 321, 316, 562, 336, 337, + 314, 338, 643, 339, 340, 0, 0, 0, 0, 341, + 342, 343, 344, 613, 346, 0, 0, 579, 348, 642, + 350, 0, 349, 614, 580, 657, 658, 659, 355, 356, + 358, 357, 359, 0, 663, 360, 361, 0, 0, 363, + 362, 365, 366, 651, 540, 653, 168, 364, 0, 629, + 664, 367, 0, 368, 369, 615, 0, 371, 372, 169, + 0, 170, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 171, 373, 374, 635, 172, 375, 0, 377, 376, + 616, 379, 380, 381, 382, 660, 661, 173, 596, 0, + 174, 385, 386, 0, 387, 0, 388, 389, 390, 391, + 392, 0, 617, 394, 395, 0, 0, 396, 0, 0, + 0, 397, 398, 400, 399, 401, 0, 0, 402, 403, + 404, 405, 406, 0, 407, 175, 0, 408, 176, 409, + 618, 619, 410, 0, 177, 0, 411, 178, 0, 412, + 413, 414, 0, 620, 0, 581, 179, 416, 417, 418, + 420, 559, 621, 422, 180, 423, 424, 0, 582, 181, + 0, 0, 0, 427, 426, 428, 182, 0, 0, 0, + 430, 0, 0, 0, 431, 0, 183, 429, 185, 432, + 0, 433, 184, 186, 434, 435, 0, 0, 0, 0, + 0, 436, 437, 438, 0, 440, 439, 0, 441, 0, + 0, 442, 0, 0, 443, 187, 444, 445, 446, 447, + 646, 644, 188, 448, 0, 449, 450, 597, 452, 454, + 453, 598, 648, 455, 456, 457, 458, 599, 460, 462, + 0, 0, 461, 459, 463, 464, 0, 662, 465, 466, + 0, 584, 600, 601, 583, 0, 0, 0, 0, 0, + 467, 468, 0, 585, 631, 622, 473, 474, 475, 666, + 477, 478, 634, 480, 479, 0, 190, 191, 0, 0, + 481, 0, 0, 482, 0, 194, 0, 586, 484, 0, + 0, 602, 604, 603, 568, 487, 0, 0, 485, 645, + 0, 647, 486, 489, 488, 623, 624, 0, 0, 0, + 0, 0, 0, 491, 192, 0, 493, 193, 494, 0, + 0, 587, 0, 0, 0, 555, 554, 0, 0, 0, + 0, 556, 652, 0, 636, 0, 558, 0, 0, 650, + 561, 195, 0, 588, 197, 198, 199, 200, 1428, 0, + 201, 0, 0, 0, 1429, 0, 0, 606, 0, 203, + 205, 204, 206, 637, 147, 0, 148, 0, 0, 563, + 208, 633, 638, 639, 209, 640, 0, 210, 212, 211, + 0, 213, 0, 149, 150, 0, 0, 214, 565, 564, + 215, 216, 0, 217, 607, 572, 152, 0, 218, 220, + 219, 153, 608, 222, 0, 609, 226, 0, 225, 224, + 154, 227, 155, 228, 229, 230, 231, 0, 232, 233, + 0, 234, 236, 235, 654, 237, 0, 566, 641, 238, + 0, 0, 239, 589, 240, 573, 0, 241, 590, 610, + 0, 243, 242, 244, 591, 592, 574, 0, 0, 0, + 0, 575, 157, 667, 0, 0, 567, 247, 248, 0, + 249, 0, 0, 0, 250, 0, 251, 252, 253, 254, + 255, 0, 0, 0, 158, 0, 0, 256, 257, 258, + 0, 0, 0, 278, 0, 159, 259, 0, 262, 261, + 260, 0, 0, 263, 264, 0, 265, 267, 266, 268, + 269, 160, 560, 0, 270, 271, 272, 273, 274, 593, + 630, 276, 275, 0, 280, 281, 282, 668, 0, 161, + 0, 0, 0, 612, 277, 0, 279, 0, 476, 0, + 283, 655, 284, 594, 0, 288, 0, 287, 0, 649, + 0, 163, 289, 0, 164, 632, 0, 165, 290, 0, + 0, 0, 576, 143, 292, 144, 611, 0, 293, 295, + 296, 0, 0, 297, 0, 0, 0, 577, 302, 166, + 569, 0, 0, 294, 0, 0, 0, 298, 299, 0, + 300, 301, 0, 0, 0, 303, 0, 0, 167, 304, + 0, 0, 305, 0, 578, 306, 307, 0, 0, 0, + 0, 0, 656, 309, 0, 310, 0, 311, 0, 312, + 313, 0, 0, 665, 0, 0, 0, 0, 335, 0, + 324, 326, 317, 319, 320, 322, 318, 325, 323, 329, + 328, 330, 331, 332, 333, 334, 327, 0, 315, 321, + 316, 562, 336, 337, 314, 338, 643, 339, 340, 0, + 0, 0, 0, 341, 342, 343, 344, 613, 346, 0, + 0, 579, 348, 642, 350, 0, 349, 614, 580, 657, + 658, 659, 355, 356, 358, 357, 359, 0, 663, 360, + 361, 0, 0, 363, 362, 365, 366, 651, 0, 653, + 168, 364, 0, 629, 664, 367, 0, 368, 369, 615, + 0, 371, 372, 169, 0, 170, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 171, 373, 374, 635, 172, + 375, 0, 377, 376, 616, 379, 380, 381, 382, 660, + 661, 173, 596, 0, 174, 385, 386, 0, 387, 0, + 388, 389, 390, 391, 392, 0, 617, 394, 395, 0, + 0, 396, 0, 0, 0, 397, 398, 400, 399, 401, + 0, 0, 402, 403, 404, 405, 406, 0, 407, 175, + 0, 408, 176, 409, 618, 619, 410, 0, 177, 0, + 411, 178, 0, 412, 413, 414, 0, 620, 0, 581, + 179, 416, 417, 418, 420, 559, 621, 422, 180, 423, + 424, 0, 582, 181, 0, 0, 0, 427, 426, 428, + 182, 0, 0, 0, 430, 0, 0, 0, 431, 0, + 183, 429, 185, 432, 0, 433, 184, 186, 434, 435, + 0, 0, 0, 0, 0, 436, 437, 438, 0, 440, + 439, 0, 441, 0, 0, 442, 0, 0, 443, 187, + 444, 445, 446, 447, 646, 644, 188, 448, 0, 449, + 450, 597, 452, 454, 453, 598, 648, 455, 456, 457, + 458, 599, 460, 462, 0, 0, 461, 459, 463, 464, + 0, 662, 465, 466, 0, 584, 600, 601, 583, 0, + 0, 0, 0, 0, 467, 468, 0, 585, 631, 622, + 473, 474, 475, 666, 477, 478, 634, 480, 479, 0, + 190, 191, 0, 0, 481, 0, 0, 482, 0, 194, + 0, 586, 484, 0, 0, 602, 604, 603, 568, 487, + 0, 0, 485, 645, 0, 647, 486, 489, 488, 623, + 624, 0, 0, 0, 0, 0, 0, 491, 192, 0, + 493, 193, 494, 0, 0, 587, 0, 0, 0, 555, + 554, 0, 0, 0, 0, 556, 652, 0, 636, 0, + 558, 0, 0, 650, 561, 195, 0, 588, 197, 198, + 199, 200, 0, 0, 201, 0, 0, 0, 202, 0, + 0, 606, 0, 203, 205, 204, 206, 637, 147, 0, + 148, 0, 0, 563, 208, 633, 638, 639, 209, 640, + 0, 210, 212, 211, 0, 213, 0, 149, 150, 0, + 0, 214, 565, 564, 215, 216, 0, 217, 607, 572, + 152, 0, 218, 220, 219, 153, 608, 222, 0, 609, + 226, 0, 225, 224, 154, 227, 155, 228, 229, 230, + 231, 0, 232, 233, 0, 234, 236, 235, 654, 237, + 0, 566, 641, 238, 0, 0, 239, 589, 240, 573, + 0, 241, 590, 610, 0, 243, 242, 244, 591, 592, + 574, 0, 0, 0, 0, 575, 157, 667, 0, 0, + 567, 247, 248, 0, 249, 0, 0, 0, 250, 0, + 251, 252, 253, 254, 255, 0, 0, 0, 158, 0, + 0, 256, 257, 258, 0, 0, 0, 278, 0, 159, + 259, 0, 262, 261, 260, 0, 0, 263, 264, 0, + 265, 267, 266, 268, 269, 160, 560, 0, 270, 271, + 272, 273, 274, 593, 630, 276, 275, 0, 280, 281, + 282, 668, 0, 161, 0, 0, 0, 612, 277, 0, + 279, 0, 476, 0, 283, 655, 284, 594, 0, 288, + 0, 287, 0, 649, 0, 163, 289, 0, 164, 632, + 0, 165, 290, 0, 0, 0, 576, 143, 292, 144, + 611, 0, 293, 295, 296, 0, 0, 297, 0, 0, + 0, 577, 302, 166, 569, 0, 0, 294, 0, 0, + 0, 298, 299, 0, 300, 301, 0, 0, 0, 303, + 0, 0, 167, 304, 0, 0, 305, 0, 578, 306, + 307, 0, 0, 0, 0, 0, 656, 309, 0, 310, + 0, 311, 0, 312, 313, 0, 0, 665, 0, 0, + 0, 0, 335, 0, 324, 326, 317, 319, 320, 322, + 318, 325, 323, 329, 328, 330, 331, 332, 333, 334, + 327, 0, 315, 321, 316, 562, 336, 337, 314, 338, + 643, 339, 340, 0, 0, 0, 0, 341, 342, 343, + 344, 613, 346, 0, 0, 579, 348, 642, 350, 0, + 349, 614, 580, 657, 658, 659, 355, 356, 358, 357, + 359, 0, 663, 360, 361, 0, 0, 363, 362, 365, + 366, 651, 0, 653, 168, 364, 0, 629, 664, 367, + 0, 368, 369, 615, 0, 371, 372, 169, 0, 170, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 171, + 373, 374, 635, 172, 375, 0, 377, 376, 616, 379, + 380, 381, 382, 660, 661, 173, 596, 0, 174, 385, + 386, 0, 387, 0, 388, 389, 390, 391, 392, 0, + 617, 394, 395, 0, 0, 396, 0, 0, 0, 397, + 398, 400, 399, 401, 0, 0, 402, 403, 404, 405, + 406, 0, 407, 175, 0, 408, 176, 409, 618, 619, + 410, 0, 177, 0, 411, 178, 0, 412, 413, 414, + 0, 620, 0, 581, 179, 416, 417, 418, 420, 559, + 621, 422, 180, 423, 424, 0, 582, 181, 0, 0, + 0, 427, 426, 428, 182, 0, 0, 0, 430, 0, + 0, 0, 431, 0, 183, 429, 185, 432, 0, 433, + 184, 186, 434, 435, 0, 0, 0, 0, 0, 436, + 437, 438, 0, 440, 439, 0, 441, 0, 0, 442, + 0, 0, 443, 187, 444, 445, 446, 447, 646, 644, + 188, 448, 0, 449, 450, 597, 452, 454, 453, 598, + 648, 455, 456, 457, 458, 599, 460, 462, 0, 0, + 461, 459, 463, 464, 0, 662, 465, 466, 0, 584, + 600, 601, 583, 0, 0, 0, 0, 0, 467, 468, + 0, 585, 631, 622, 473, 474, 475, 666, 477, 478, + 634, 480, 479, 0, 190, 191, 0, 0, 481, 0, + 0, 482, 0, 194, 0, 586, 484, 0, 0, 602, + 604, 603, 568, 487, 0, 0, 485, 645, 0, 647, + 486, 489, 488, 623, 624, 0, 0, 0, 0, 0, + 0, 491, 192, 0, 493, 193, 494, 0, 0, 587, + 0, 0, 0, 555, 554, 0, 0, 0, 0, 556, + 652, 0, 636, 0, 558, 0, 0, 650, 561, 195, + 0, 588, 197, 198, 199, 200, 0, 0, 201, 0, + 0, 0, 202, 0, 0, 606, 0, 203, 205, 204, + 206, 637, 147, 0, 148, 0, 0, 563, 208, 633, + 638, 639, 209, 640, 0, 210, 212, 211, 0, 213, + 0, 149, 150, 0, 0, 214, 565, 564, 215, 216, + 0, 217, 607, 572, 152, 0, 218, 220, 219, 153, + 608, 222, 0, 609, 226, 0, 225, 224, 154, 227, + 155, 228, 229, 230, 231, 0, 232, 233, 0, 234, + 236, 235, 654, 237, 0, 566, 641, 238, 0, 0, + 239, 589, 240, 573, 0, 241, 590, 610, 0, 243, + 242, 244, 591, 592, 574, 0, 0, 0, 0, 575, + 157, 667, 0, 0, 567, 247, 248, 0, 249, 0, + 0, 0, 250, 0, 251, 252, 253, 254, 255, 0, + 0, 0, 158, 0, 0, 256, 257, 258, 0, 0, + 0, 278, 0, 159, 259, 0, 262, 261, 260, 0, + 0, 263, 264, 0, 265, 267, 266, 268, 269, 160, + 560, 0, 270, 271, 272, 273, 274, 593, 630, 276, + 275, 0, 280, 281, 282, 668, 0, 161, 0, 0, + 0, 612, 277, 0, 279, 0, 476, 0, 283, 655, + 284, 594, 0, 288, 0, 287, 0, 649, 0, 163, + 289, 0, 164, 632, 0, 165, 290, 0, 0, 0, + 576, 143, 292, 144, 611, 0, 293, 295, 296, 0, + 0, 297, 0, 0, 0, 577, 302, 166, 1446, 0, + 0, 294, 0, 0, 0, 298, 299, 0, 300, 301, + 0, 0, 0, 303, 0, 0, 167, 304, 0, 0, + 305, 0, 578, 306, 307, 0, 0, 0, 0, 0, + 656, 309, 0, 310, 0, 311, 0, 312, 313, 0, + 0, 665, 0, 0, 0, 0, 335, 0, 324, 326, + 317, 319, 320, 322, 318, 325, 323, 329, 328, 330, + 331, 332, 333, 334, 327, 0, 315, 321, 316, 562, + 336, 337, 314, 338, 643, 339, 340, 0, 0, 0, + 0, 341, 342, 343, 344, 613, 346, 0, 0, 579, + 348, 642, 350, 0, 349, 614, 580, 657, 658, 659, + 355, 356, 358, 357, 359, 0, 663, 360, 361, 0, + 0, 363, 362, 365, 366, 651, 0, 653, 168, 364, + 0, 629, 664, 367, 0, 368, 369, 615, 0, 371, + 372, 169, 0, 170, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 171, 373, 374, 635, 172, 375, 0, + 377, 376, 616, 379, 380, 381, 382, 660, 661, 173, + 596, 0, 174, 385, 386, 0, 387, 0, 388, 389, + 390, 391, 392, 0, 617, 394, 395, 0, 0, 396, + 0, 0, 0, 397, 398, 400, 399, 401, 0, 0, + 402, 403, 404, 405, 406, 0, 407, 175, 0, 408, + 176, 409, 618, 619, 410, 0, 177, 0, 411, 178, + 0, 412, 413, 414, 0, 620, 0, 581, 179, 416, + 417, 418, 420, 559, 621, 422, 180, 423, 424, 0, + 582, 181, 0, 0, 0, 427, 426, 428, 182, 0, + 0, 0, 430, 0, 0, 0, 431, 0, 183, 429, + 185, 432, 0, 433, 184, 186, 434, 435, 0, 0, + 0, 0, 0, 436, 437, 438, 0, 440, 439, 0, + 441, 0, 0, 442, 0, 0, 443, 187, 444, 445, + 446, 447, 646, 644, 188, 448, 0, 449, 450, 597, + 452, 454, 453, 598, 648, 455, 456, 457, 458, 599, + 460, 462, 0, 0, 461, 459, 463, 464, 0, 662, + 465, 466, 0, 584, 600, 601, 583, 0, 0, 0, + 0, 0, 467, 468, 0, 585, 631, 622, 473, 474, + 475, 666, 477, 478, 634, 480, 479, 0, 190, 191, + 0, 0, 481, 0, 0, 482, 0, 194, 0, 586, + 484, 0, 0, 602, 604, 603, 568, 487, 0, 0, + 485, 645, 0, 647, 486, 489, 488, 623, 624, 0, + 0, 0, 0, 0, 0, 491, 192, 0, 493, 193, + 494, 0, 0, 587, 0, 0, 0, 555, 554, 0, + 0, 0, 0, 556, 652, 0, 636, 0, 558, 0, + 0, 650, 561, 195, 0, 588, 197, 198, 199, 200, + 0, 0, 201, 0, 0, 0, 202, 0, 0, 606, + 0, 203, 205, 204, 206, 637, 147, 0, 148, 0, + 0, 563, 208, 633, 638, 639, 209, 640, 0, 210, + 212, 211, 0, 213, 0, 149, 150, 0, 0, 214, + 565, 564, 215, 216, 0, 217, 607, 572, 152, 0, + 218, 220, 219, 153, 608, 222, 0, 609, 226, 0, + 225, 224, 154, 227, 155, 228, 229, 230, 231, 0, + 232, 233, 0, 234, 236, 235, 654, 237, 0, 566, + 641, 238, 0, 0, 239, 589, 240, 573, 0, 241, + 590, 610, 0, 243, 242, 244, 591, 592, 574, 0, + 0, 0, 0, 575, 157, 667, 0, 0, 567, 247, + 248, 0, 249, 0, 0, 0, 250, 0, 251, 252, + 253, 254, 255, 0, 0, 0, 158, 0, 0, 256, + 257, 258, 0, 0, 0, 278, 0, 159, 259, 0, + 262, 261, 260, 0, 0, 263, 264, 0, 265, 267, + 266, 268, 269, 160, 560, 0, 270, 271, 272, 273, + 274, 593, 630, 276, 275, 0, 280, 281, 282, 668, + 0, 161, 0, 0, 0, 612, 277, 0, 279, 0, + 476, 0, 283, 655, 284, 594, 0, 288, 0, 287, + 0, 649, 0, 163, 289, 0, 164, 632, 0, 165, + 290, 0, 0, 0, 576, 143, 292, 144, 611, 0, + 293, 295, 296, 0, 0, 297, 0, 0, 0, 577, + 302, 166, 1444, 0, 0, 294, 0, 0, 0, 298, + 299, 0, 300, 301, 0, 0, 0, 303, 0, 0, + 167, 304, 0, 0, 305, 0, 578, 306, 307, 0, + 0, 0, 0, 0, 656, 309, 0, 310, 0, 311, + 0, 312, 313, 0, 0, 665, 0, 0, 0, 0, + 335, 0, 324, 326, 317, 319, 320, 322, 318, 325, + 323, 329, 328, 330, 331, 332, 333, 334, 327, 0, + 315, 321, 316, 562, 336, 337, 314, 338, 643, 339, + 340, 0, 0, 0, 0, 341, 342, 343, 344, 613, + 346, 0, 0, 579, 348, 642, 350, 0, 349, 614, + 580, 657, 658, 659, 355, 356, 358, 357, 359, 0, + 663, 360, 361, 0, 0, 363, 362, 365, 366, 651, + 0, 653, 168, 364, 0, 629, 664, 367, 0, 368, + 369, 615, 0, 371, 372, 169, 0, 170, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 171, 373, 374, + 635, 172, 375, 0, 377, 376, 616, 379, 380, 381, + 382, 660, 661, 173, 596, 0, 174, 385, 386, 0, + 387, 0, 388, 389, 390, 391, 392, 0, 617, 394, + 395, 0, 0, 396, 0, 0, 0, 397, 398, 400, + 399, 401, 0, 0, 402, 403, 404, 405, 406, 0, + 407, 175, 0, 408, 176, 409, 618, 619, 410, 0, + 177, 0, 411, 178, 0, 412, 413, 414, 0, 620, + 0, 581, 179, 416, 417, 418, 420, 559, 621, 422, + 180, 423, 424, 0, 582, 181, 0, 0, 0, 427, + 426, 428, 182, 0, 0, 0, 430, 0, 0, 0, + 431, 0, 183, 429, 185, 432, 0, 433, 184, 186, + 434, 435, 0, 0, 0, 0, 0, 436, 437, 438, + 0, 440, 439, 0, 441, 0, 0, 442, 0, 0, + 443, 187, 444, 445, 446, 447, 646, 644, 188, 448, + 0, 449, 450, 597, 452, 454, 453, 598, 648, 455, + 456, 457, 458, 599, 460, 462, 0, 0, 461, 459, + 463, 464, 0, 662, 465, 466, 0, 584, 600, 601, + 583, 0, 0, 0, 0, 0, 467, 468, 0, 585, + 631, 622, 473, 474, 475, 666, 477, 478, 634, 480, + 479, 0, 190, 191, 0, 0, 481, 0, 0, 482, + 0, 194, 0, 586, 484, 0, 0, 602, 604, 603, + 568, 487, 0, 0, 485, 645, 0, 647, 486, 489, + 488, 623, 624, 0, 0, 0, 0, 0, 0, 491, + 192, 0, 493, 193, 494, 0, 0, 587, 0, 0, + 0, 555, 554, 0, 0, 0, 0, 556, 652, 0, + 636, 0, 558, 0, 0, 650, 561, 195, 0, 196, + 197, 198, 199, 200, 0, 59, 201, 60, 0, 0, + 202, 0, 0, 0, 0, 203, 205, 204, 206, 207, + 0, 0, 3832, 0, 0, 0, 3836, 0, 0, 0, + 209, 0, 0, 210, 212, 211, 0, 213, 0, 0, + 85, 62, 0, 214, 3829, 0, 215, 216, 63, 217, + 0, 0, 65, 64, 218, 220, 219, 3828, 221, 222, + 0, 223, 226, 0, 225, 224, 1932, 227, 66, 228, + 229, 230, 231, 0, 232, 233, 0, 234, 236, 235, + 1935, 237, 0, 0, 0, 238, 67, 0, 239, 0, + 240, 0, 0, 241, 0, 0, 0, 243, 242, 244, + 0, 0, 245, 0, 0, 0, 0, 246, 110, 0, + 0, 0, 0, 247, 248, 0, 249, 69, 111, 112, + 250, 3858, 251, 252, 253, 254, 255, 0, 0, 0, + 71, 72, 0, 256, 257, 258, 0, 0, 0, 278, + 0, 0, 259, 0, 262, 261, 260, 0, 0, 263, + 264, 0, 265, 267, 266, 268, 269, 73, 0, 0, + 270, 271, 272, 273, 274, 0, 0, 276, 275, 3827, + 280, 281, 282, 0, 0, 74, 0, 0, 0, 0, + 277, 0, 279, 0, 476, 0, 283, 285, 284, 286, + 75, 288, 76, 287, 0, 0, 0, 77, 289, 0, + 78, 0, 0, 0, 290, 0, 0, 0, 291, 143, + 292, 144, 3818, 0, 293, 295, 296, 0, 0, 297, + 0, 0, 0, 79, 302, 80, 0, 0, 0, 294, + 0, 0, 0, 298, 299, 0, 300, 301, 3825, 0, + 0, 303, 0, 81, 1933, 304, 0, 0, 305, 3824, + 0, 306, 307, 0, 0, 0, 0, 0, 308, 309, + 82, 310, 0, 311, 83, 312, 313, 0, 0, 0, + 0, 3833, 0, 0, 335, 0, 324, 326, 317, 319, + 320, 322, 318, 325, 323, 329, 328, 330, 331, 332, + 333, 334, 327, 0, 315, 321, 316, 0, 336, 337, + 314, 338, 0, 339, 340, 0, 0, 0, 0, 341, + 342, 343, 344, 345, 346, 0, 0, 347, 348, 0, + 350, 1937, 349, 0, 351, 352, 353, 354, 355, 356, + 358, 357, 359, 0, 0, 360, 361, 0, 0, 363, + 362, 365, 366, 953, 952, 0, 1934, 364, 0, 0, + 0, 367, 0, 368, 369, 370, 0, 371, 372, 3826, + 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 373, 374, 0, 0, 375, 86, 377, 376, + 378, 379, 380, 381, 382, 383, 384, 0, 0, 0, + 87, 385, 386, 0, 387, 0, 388, 389, 390, 391, + 392, 88, 393, 394, 395, 0, 1936, 396, 0, 0, + 0, 397, 398, 400, 399, 401, 0, 0, 402, 403, + 404, 405, 406, 89, 407, 0, 90, 408, 91, 409, + 3835, 92, 410, 0, 93, 94, 411, 0, 0, 412, + 413, 414, 3817, 415, 95, 0, 96, 416, 417, 418, + 420, 421, 419, 422, 97, 423, 424, 0, 425, 0, + 113, 0, 0, 427, 426, 428, 0, 0, 99, 0, + 430, 0, 0, 101, 431, 100, 0, 429, 0, 432, + 0, 433, 0, 0, 434, 435, 0, 0, 0, 0, + 0, 436, 437, 438, 0, 440, 439, 0, 441, 0, + 1939, 442, 0, 0, 443, 102, 444, 445, 446, 447, + 0, 0, 103, 448, 0, 449, 450, 451, 452, 454, + 453, 0, 0, 455, 456, 457, 458, 0, 460, 462, + 0, 0, 461, 459, 463, 464, 0, 0, 465, 466, + 0, 469, 470, 471, 472, 0, 0, 0, 0, 0, + 467, 468, 0, 0, 0, 104, 473, 474, 475, 0, + 477, 478, 0, 480, 479, 0, 0, 105, 0, 0, + 481, 106, 0, 482, 107, 0, 0, 483, 484, 108, + 0, 0, 0, 0, 0, 487, 0, 0, 485, 0, + 0, 0, 486, 489, 488, 490, 492, 0, 0, 3834, + 0, 0, 0, 491, 0, 0, 493, 109, 494, 0, + 195, 495, 196, 197, 198, 199, 200, 0, 59, 201, + 60, 0, 0, 202, 0, 0, 114, 0, 203, 205, + 204, 206, 207, 0, 0, 3832, 0, 0, 0, 3836, + 0, 0, 0, 209, 0, 0, 210, 212, 211, 0, + 213, 0, 0, 85, 62, 0, 214, 3829, 0, 215, + 216, 63, 217, 0, 0, 65, 64, 218, 220, 219, + 3828, 221, 222, 0, 223, 226, 0, 225, 224, 0, + 227, 66, 228, 229, 230, 231, 0, 232, 233, 0, + 234, 236, 235, 0, 237, 0, 0, 0, 238, 67, + 0, 239, 0, 240, 0, 0, 241, 0, 0, 0, + 243, 242, 244, 0, 0, 245, 0, 0, 0, 0, + 246, 110, 0, 0, 0, 0, 247, 248, 0, 249, + 69, 111, 112, 250, 0, 251, 252, 253, 254, 255, + 0, 0, 0, 71, 72, 0, 256, 257, 258, 0, + 4229, 4228, 278, 0, 0, 259, 0, 262, 261, 260, + 0, 0, 263, 264, 0, 265, 267, 266, 268, 269, + 73, 0, 0, 270, 271, 272, 273, 274, 0, 0, + 276, 275, 3827, 280, 281, 282, 0, 0, 74, 0, + 0, 0, 0, 277, 0, 279, 0, 476, 0, 283, + 285, 284, 286, 75, 288, 76, 287, 0, 0, 0, + 77, 289, 0, 78, 0, 0, 0, 290, 0, 0, + 0, 291, 143, 292, 144, 3818, 0, 293, 295, 296, + 0, 0, 297, 0, 0, 0, 79, 302, 80, 0, + 0, 0, 294, 0, 0, 0, 298, 299, 0, 300, + 301, 3825, 0, 0, 303, 0, 81, 0, 304, 0, + 0, 305, 3824, 0, 306, 307, 0, 0, 0, 0, + 0, 308, 309, 82, 310, 0, 311, 83, 312, 313, + 0, 0, 0, 0, 3833, 0, 0, 335, 0, 324, + 326, 317, 319, 320, 322, 318, 325, 323, 329, 328, + 330, 331, 332, 333, 334, 327, 0, 315, 321, 316, + 0, 336, 337, 314, 338, 0, 339, 340, 0, 0, + 0, 0, 341, 342, 343, 344, 345, 346, 0, 0, + 347, 348, 0, 350, 0, 349, 0, 351, 352, 353, + 354, 355, 356, 358, 357, 359, 0, 0, 360, 361, + 0, 0, 363, 362, 365, 366, 0, 0, 0, 0, + 364, 0, 0, 0, 367, 0, 368, 369, 370, 0, + 371, 372, 3826, 84, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 373, 374, 0, 0, 375, + 86, 377, 376, 378, 379, 380, 381, 382, 383, 384, + 0, 0, 0, 87, 385, 386, 0, 387, 0, 388, + 389, 390, 391, 392, 88, 393, 394, 395, 0, 0, + 396, 0, 0, 0, 397, 398, 400, 399, 401, 0, + 0, 402, 403, 404, 405, 406, 89, 407, 0, 90, + 408, 91, 409, 3835, 92, 410, 0, 93, 94, 411, + 0, 0, 412, 413, 414, 3817, 415, 95, 0, 96, + 416, 417, 418, 420, 421, 419, 422, 97, 423, 424, + 0, 425, 0, 113, 0, 0, 427, 426, 428, 0, + 0, 99, 0, 430, 0, 0, 101, 431, 100, 0, + 429, 0, 432, 0, 433, 0, 0, 434, 435, 0, + 0, 0, 0, 0, 436, 437, 438, 0, 440, 439, + 0, 441, 0, 0, 442, 0, 0, 443, 102, 444, + 445, 446, 447, 0, 0, 103, 448, 0, 449, 450, + 451, 452, 454, 453, 0, 0, 455, 456, 457, 458, + 0, 460, 462, 0, 0, 461, 459, 463, 464, 0, + 0, 465, 466, 0, 469, 470, 471, 472, 0, 0, + 0, 0, 0, 467, 468, 0, 0, 0, 104, 473, + 474, 475, 0, 477, 478, 0, 480, 479, 0, 0, + 105, 0, 0, 481, 106, 0, 482, 107, 0, 0, + 483, 484, 108, 0, 0, 0, 0, 0, 487, 0, + 0, 485, 0, 0, 0, 486, 489, 488, 490, 492, + 0, 0, 3834, 0, 0, 0, 491, 0, 0, 493, + 109, 494, 0, 195, 495, 196, 197, 198, 199, 200, + 0, 59, 201, 60, 0, 0, 202, 0, 0, 114, + 0, 203, 205, 204, 206, 207, 0, 0, 3832, 0, + 0, 0, 3836, 0, 0, 0, 209, 0, 0, 210, + 212, 211, 0, 213, 0, 0, 85, 62, 0, 214, + 3829, 0, 215, 216, 63, 217, 0, 0, 65, 64, + 218, 220, 219, 3828, 221, 222, 0, 223, 226, 0, + 225, 224, 0, 227, 66, 228, 229, 230, 231, 0, + 232, 233, 0, 234, 236, 235, 0, 237, 0, 0, + 0, 238, 67, 0, 239, 0, 240, 0, 0, 241, + 0, 0, 0, 243, 242, 244, 0, 0, 245, 0, + 0, 0, 0, 246, 110, 0, 0, 0, 0, 247, + 248, 0, 249, 69, 111, 112, 250, 0, 251, 252, + 253, 254, 255, 0, 0, 0, 71, 72, 0, 256, + 257, 258, 0, 0, 0, 278, 0, 0, 259, 0, + 262, 261, 260, 0, 0, 263, 264, 0, 265, 267, + 266, 268, 269, 73, 0, 0, 270, 271, 272, 273, + 274, 0, 0, 276, 275, 3827, 280, 281, 282, 0, + 0, 74, 0, 0, 0, 0, 277, 0, 279, 0, + 476, 0, 283, 285, 284, 286, 75, 288, 76, 287, + 0, 0, 0, 77, 289, 0, 78, 0, 0, 0, + 290, 0, 0, 0, 291, 143, 292, 144, 3818, 0, + 293, 295, 296, 0, 0, 297, 0, 0, 0, 79, + 302, 80, 0, 0, 0, 294, 0, 0, 0, 298, + 299, 0, 300, 301, 3825, 0, 0, 303, 0, 81, + 0, 304, 0, 0, 305, 3824, 0, 306, 307, 0, + 0, 0, 0, 0, 308, 309, 82, 310, 0, 311, + 83, 312, 313, 0, 0, 0, 0, 3833, 0, 0, + 335, 0, 324, 326, 317, 319, 320, 322, 318, 325, + 323, 329, 328, 330, 331, 332, 333, 334, 327, 0, + 315, 321, 316, 0, 336, 337, 314, 338, 0, 339, + 340, 0, 0, 0, 0, 341, 342, 343, 344, 345, + 346, 0, 0, 347, 348, 0, 350, 0, 349, 0, + 351, 352, 353, 354, 355, 356, 358, 357, 359, 0, + 0, 360, 361, 0, 0, 363, 362, 365, 366, 0, + 0, 0, 0, 364, 0, 0, 0, 367, 0, 368, + 369, 370, 0, 371, 372, 3826, 84, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 373, 374, + 0, 0, 375, 86, 377, 376, 378, 379, 380, 381, + 382, 383, 384, 0, 0, 0, 87, 385, 386, 0, + 387, 0, 388, 389, 390, 391, 392, 88, 393, 394, + 395, 0, 0, 396, 0, 0, 0, 397, 398, 400, + 399, 401, 0, 0, 402, 403, 404, 405, 406, 89, + 407, 0, 90, 408, 91, 409, 3835, 92, 410, 0, + 93, 94, 411, 0, 0, 412, 413, 414, 3817, 415, + 95, 0, 96, 416, 417, 418, 420, 421, 419, 422, + 97, 423, 424, 0, 425, 0, 113, 0, 0, 427, + 426, 428, 0, 0, 99, 0, 430, 0, 0, 101, + 431, 100, 0, 429, 0, 432, 0, 433, 0, 0, + 434, 435, 0, 0, 0, 0, 0, 436, 437, 438, + 0, 440, 439, 0, 441, 0, 0, 442, 0, 0, + 443, 102, 444, 445, 446, 447, 0, 0, 103, 448, + 0, 449, 450, 451, 452, 454, 453, 0, 0, 455, + 456, 457, 458, 0, 460, 462, 0, 0, 461, 459, + 463, 464, 0, 0, 465, 466, 0, 469, 470, 471, + 472, 0, 0, 0, 0, 0, 467, 468, 0, 0, + 0, 104, 473, 474, 475, 0, 477, 478, 0, 480, + 479, 0, 0, 105, 0, 0, 481, 106, 0, 482, + 107, 0, 0, 483, 484, 108, 0, 0, 0, 0, + 0, 487, 0, 0, 485, 0, 0, 0, 486, 489, + 488, 490, 492, 0, 0, 3834, 0, 0, 0, 491, + 0, 0, 493, 109, 494, 0, 195, 495, 196, 197, + 198, 199, 200, 0, 59, 201, 60, 0, 0, 202, + 0, 4296, 114, 0, 203, 205, 204, 206, 207, 0, + 0, 3832, 0, 0, 0, 3836, 0, 0, 0, 209, + 0, 0, 210, 212, 211, 0, 213, 0, 0, 85, + 62, 0, 214, 3829, 0, 215, 216, 63, 217, 0, + 0, 65, 64, 218, 220, 219, 3828, 221, 222, 0, + 223, 226, 0, 225, 224, 0, 227, 66, 228, 229, + 230, 231, 0, 232, 233, 0, 234, 236, 235, 0, + 237, 0, 0, 0, 238, 67, 0, 239, 0, 240, + 0, 0, 241, 0, 0, 0, 243, 242, 244, 0, + 0, 245, 0, 0, 0, 0, 246, 110, 0, 0, + 0, 0, 247, 248, 0, 249, 69, 111, 112, 250, + 0, 251, 252, 253, 254, 255, 0, 0, 0, 71, + 72, 0, 256, 257, 258, 0, 0, 0, 278, 0, + 4242, 259, 0, 262, 261, 260, 0, 0, 263, 264, + 0, 265, 267, 266, 268, 269, 73, 0, 0, 270, + 271, 272, 273, 274, 0, 0, 276, 275, 3827, 280, + 281, 282, 0, 0, 74, 0, 0, 0, 0, 277, + 0, 279, 0, 476, 0, 283, 285, 284, 286, 75, + 288, 76, 287, 0, 0, 0, 77, 289, 0, 78, + 0, 0, 0, 290, 0, 0, 0, 291, 143, 292, + 144, 3818, 0, 293, 295, 296, 0, 0, 297, 0, + 0, 0, 79, 302, 80, 0, 0, 0, 294, 0, + 0, 0, 298, 299, 0, 300, 301, 3825, 0, 0, + 303, 0, 81, 0, 304, 0, 0, 305, 3824, 0, + 306, 307, 0, 0, 0, 0, 0, 308, 309, 82, + 310, 0, 311, 83, 312, 313, 0, 0, 0, 0, + 3833, 0, 0, 335, 0, 324, 326, 317, 319, 320, + 322, 318, 325, 323, 329, 328, 330, 331, 332, 333, + 334, 327, 0, 315, 321, 316, 0, 336, 337, 314, + 338, 0, 339, 340, 0, 0, 0, 0, 341, 342, + 343, 344, 345, 346, 0, 0, 347, 348, 0, 350, + 0, 349, 0, 351, 352, 353, 354, 355, 356, 358, + 357, 359, 0, 0, 360, 361, 0, 0, 363, 362, + 365, 366, 0, 0, 0, 0, 364, 0, 0, 0, + 367, 0, 368, 369, 370, 0, 371, 372, 3826, 84, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 373, 374, 0, 0, 375, 86, 377, 376, 378, + 379, 380, 381, 382, 383, 384, 0, 0, 0, 87, + 385, 386, 0, 387, 0, 388, 389, 390, 391, 392, + 88, 393, 394, 395, 0, 0, 396, 0, 0, 0, + 397, 398, 400, 399, 401, 0, 0, 402, 403, 404, + 405, 406, 89, 407, 0, 90, 408, 91, 409, 3835, + 92, 410, 0, 93, 94, 411, 0, 0, 412, 413, + 414, 3817, 415, 95, 0, 96, 416, 417, 418, 420, + 421, 419, 422, 97, 423, 424, 0, 425, 0, 113, + 0, 0, 427, 426, 428, 0, 0, 99, 0, 430, + 0, 0, 101, 431, 100, 0, 429, 0, 432, 0, + 433, 0, 0, 434, 435, 0, 0, 0, 0, 0, + 436, 437, 438, 0, 440, 439, 0, 441, 0, 0, + 442, 0, 0, 443, 102, 444, 445, 446, 447, 0, + 0, 103, 448, 0, 449, 450, 451, 452, 454, 453, + 0, 0, 455, 456, 457, 458, 0, 460, 462, 0, + 0, 461, 459, 463, 464, 0, 0, 465, 466, 0, + 469, 470, 471, 472, 0, 0, 0, 0, 0, 467, + 468, 0, 0, 0, 104, 473, 474, 475, 0, 477, + 478, 0, 480, 479, 0, 0, 105, 0, 0, 481, + 106, 0, 482, 107, 0, 0, 483, 484, 108, 0, + 0, 0, 0, 0, 487, 0, 0, 485, 0, 0, + 0, 486, 489, 488, 490, 492, 0, 0, 3834, 0, + 0, 0, 491, 0, 0, 493, 109, 494, 0, 195, + 495, 196, 197, 198, 199, 200, 0, 59, 201, 60, + 0, 0, 202, 0, 0, 114, 0, 203, 205, 204, + 206, 207, 0, 0, 3832, 0, 0, 0, 3836, 0, + 0, 0, 209, 0, 0, 210, 212, 211, 0, 213, + 0, 0, 85, 62, 0, 214, 3829, 0, 215, 216, + 63, 217, 0, 0, 65, 64, 218, 220, 219, 3828, + 221, 222, 0, 223, 226, 0, 225, 224, 0, 227, + 66, 228, 229, 230, 231, 0, 232, 233, 0, 234, + 236, 235, 0, 237, 0, 0, 0, 238, 67, 0, + 239, 0, 240, 0, 0, 241, 0, 0, 0, 243, + 242, 244, 0, 0, 245, 0, 0, 0, 0, 246, + 110, 0, 0, 0, 0, 247, 248, 0, 249, 69, + 111, 112, 250, 0, 251, 252, 253, 254, 255, 0, + 0, 0, 71, 72, 0, 256, 257, 258, 0, 0, + 0, 278, 0, 4189, 259, 0, 262, 261, 260, 0, + 0, 263, 264, 0, 265, 267, 266, 268, 269, 73, + 0, 0, 270, 271, 272, 273, 274, 0, 0, 276, + 275, 3827, 280, 281, 282, 0, 0, 74, 0, 0, + 0, 0, 277, 0, 279, 0, 476, 0, 283, 285, + 284, 286, 75, 288, 76, 287, 0, 0, 0, 77, + 289, 0, 78, 0, 0, 0, 290, 0, 0, 0, + 291, 143, 292, 144, 3818, 0, 293, 295, 296, 0, + 0, 297, 0, 0, 0, 79, 302, 80, 0, 0, + 0, 294, 0, 0, 0, 298, 299, 0, 300, 301, + 3825, 0, 0, 303, 0, 81, 0, 304, 0, 0, + 305, 3824, 0, 306, 307, 0, 0, 0, 0, 0, + 308, 309, 82, 310, 0, 311, 83, 312, 313, 0, + 0, 0, 0, 3833, 0, 0, 335, 0, 324, 326, + 317, 319, 320, 322, 318, 325, 323, 329, 328, 330, + 331, 332, 333, 334, 327, 0, 315, 321, 316, 0, + 336, 337, 314, 338, 0, 339, 340, 0, 0, 0, + 0, 341, 342, 343, 344, 345, 346, 0, 0, 347, + 348, 0, 350, 0, 349, 0, 351, 352, 353, 354, + 355, 356, 358, 357, 359, 0, 0, 360, 361, 0, + 0, 363, 362, 365, 366, 0, 0, 0, 0, 364, + 0, 0, 0, 367, 0, 368, 369, 370, 0, 371, + 372, 3826, 84, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 373, 374, 0, 0, 375, 86, + 377, 376, 378, 379, 380, 381, 382, 383, 384, 0, + 0, 0, 87, 385, 386, 0, 387, 0, 388, 389, + 390, 391, 392, 88, 393, 394, 395, 0, 0, 396, + 0, 0, 0, 397, 398, 400, 399, 401, 0, 0, + 402, 403, 404, 405, 406, 89, 407, 0, 90, 408, + 91, 409, 3835, 92, 410, 0, 93, 94, 411, 0, + 0, 412, 413, 414, 3817, 415, 95, 0, 96, 416, + 417, 418, 420, 421, 419, 422, 97, 423, 424, 0, + 425, 0, 113, 0, 0, 427, 426, 428, 0, 0, + 99, 0, 430, 0, 0, 101, 431, 100, 0, 429, + 0, 432, 0, 433, 0, 0, 434, 435, 0, 0, + 0, 0, 0, 436, 437, 438, 0, 440, 439, 0, + 441, 0, 0, 442, 0, 0, 443, 102, 444, 445, + 446, 447, 0, 0, 103, 448, 0, 449, 450, 451, + 452, 454, 453, 0, 0, 455, 456, 457, 458, 0, + 460, 462, 0, 0, 461, 459, 463, 464, 0, 0, + 465, 466, 0, 469, 470, 471, 472, 0, 0, 0, + 0, 0, 467, 468, 0, 0, 0, 104, 473, 474, + 475, 0, 477, 478, 0, 480, 479, 0, 0, 105, + 0, 0, 481, 106, 0, 482, 107, 0, 0, 483, + 484, 108, 0, 0, 0, 0, 0, 487, 0, 0, + 485, 0, 0, 0, 486, 489, 488, 490, 492, 0, + 0, 3834, 0, 0, 0, 491, 0, 0, 493, 109, + 494, 0, 195, 495, 196, 197, 198, 199, 200, 0, + 59, 201, 60, 0, 0, 202, 0, 0, 114, 0, + 203, 205, 204, 206, 207, 0, 0, 3832, 0, 0, + 0, 3836, 0, 0, 0, 209, 0, 0, 210, 212, + 211, 0, 213, 0, 0, 85, 62, 0, 214, 3829, + 0, 215, 216, 63, 217, 0, 0, 65, 64, 218, + 220, 219, 3828, 221, 222, 0, 223, 226, 0, 225, + 224, 0, 227, 66, 228, 229, 230, 231, 0, 232, + 233, 0, 234, 236, 235, 0, 237, 0, 0, 0, + 238, 67, 0, 239, 0, 240, 0, 0, 241, 0, + 0, 0, 243, 242, 244, 0, 0, 245, 0, 0, + 0, 0, 246, 110, 0, 0, 0, 0, 247, 248, + 0, 249, 69, 111, 112, 250, 0, 251, 252, 253, + 254, 255, 0, 0, 0, 71, 72, 0, 256, 257, + 258, 0, 0, 0, 278, 0, 4099, 259, 0, 262, + 261, 260, 0, 0, 263, 264, 0, 265, 267, 266, + 268, 269, 73, 0, 0, 270, 271, 272, 273, 274, + 0, 0, 276, 275, 3827, 280, 281, 282, 0, 0, + 74, 0, 0, 0, 0, 277, 0, 279, 0, 476, + 0, 283, 285, 284, 286, 75, 288, 76, 287, 0, + 0, 0, 77, 289, 0, 78, 0, 0, 0, 290, + 0, 0, 0, 291, 143, 292, 144, 3818, 0, 293, + 295, 296, 0, 0, 297, 0, 0, 0, 79, 302, + 80, 0, 0, 0, 294, 0, 0, 0, 298, 299, + 0, 300, 301, 3825, 0, 0, 303, 0, 81, 0, + 304, 0, 0, 305, 3824, 0, 306, 307, 0, 0, + 0, 0, 0, 308, 309, 82, 310, 0, 311, 83, + 312, 313, 0, 0, 0, 0, 3833, 0, 0, 335, + 0, 324, 326, 317, 319, 320, 322, 318, 325, 323, + 329, 328, 330, 331, 332, 333, 334, 327, 0, 315, + 321, 316, 0, 336, 337, 314, 338, 0, 339, 340, + 0, 0, 0, 0, 341, 342, 343, 344, 345, 346, + 0, 0, 347, 348, 0, 350, 0, 349, 0, 351, + 352, 353, 354, 355, 356, 358, 357, 359, 0, 0, + 360, 361, 0, 0, 363, 362, 365, 366, 0, 0, + 0, 0, 364, 0, 0, 0, 367, 0, 368, 369, + 370, 0, 371, 372, 3826, 84, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 373, 374, 0, + 0, 375, 86, 377, 376, 378, 379, 380, 381, 382, + 383, 384, 0, 0, 0, 87, 385, 386, 0, 387, + 0, 388, 389, 390, 391, 392, 88, 393, 394, 395, + 0, 0, 396, 0, 0, 0, 397, 398, 400, 399, + 401, 0, 0, 402, 403, 404, 405, 406, 89, 407, + 0, 90, 408, 91, 409, 3835, 92, 410, 0, 93, + 94, 411, 0, 0, 412, 413, 414, 3817, 415, 95, + 0, 96, 416, 417, 418, 420, 421, 419, 422, 97, + 423, 424, 0, 425, 0, 113, 0, 0, 427, 426, + 428, 0, 0, 99, 0, 430, 0, 0, 101, 431, + 100, 0, 429, 0, 432, 0, 433, 0, 0, 434, + 435, 0, 0, 0, 0, 0, 436, 437, 438, 0, + 440, 439, 0, 441, 0, 0, 442, 0, 0, 443, + 102, 444, 445, 446, 447, 0, 0, 103, 448, 0, + 449, 450, 451, 452, 454, 453, 0, 0, 455, 456, + 457, 458, 0, 460, 462, 0, 0, 461, 459, 463, + 464, 0, 0, 465, 466, 0, 469, 470, 471, 472, + 0, 0, 0, 0, 0, 467, 468, 0, 0, 0, + 104, 473, 474, 475, 0, 477, 478, 0, 480, 479, + 0, 0, 105, 0, 0, 481, 106, 0, 482, 107, + 0, 0, 483, 484, 108, 0, 0, 0, 0, 0, + 487, 0, 0, 485, 0, 0, 0, 486, 489, 488, + 490, 492, 0, 0, 3834, 0, 0, 0, 491, 0, + 0, 493, 109, 494, 0, 195, 495, 196, 197, 198, + 199, 200, 0, 59, 201, 60, 0, 0, 202, 0, + 0, 114, 0, 203, 205, 204, 206, 207, 0, 0, + 3832, 0, 0, 0, 3836, 0, 0, 0, 209, 0, + 0, 210, 212, 211, 0, 213, 0, 0, 85, 62, + 0, 214, 3829, 0, 215, 216, 63, 217, 0, 0, + 65, 64, 218, 220, 219, 3828, 221, 222, 0, 223, + 226, 0, 225, 224, 0, 227, 66, 228, 229, 230, + 231, 0, 232, 233, 0, 234, 236, 235, 0, 237, + 0, 0, 0, 238, 67, 0, 239, 0, 240, 0, + 0, 241, 0, 0, 0, 243, 242, 244, 0, 0, + 245, 0, 0, 0, 0, 246, 110, 0, 0, 0, + 0, 247, 248, 0, 249, 69, 111, 112, 250, 0, + 251, 252, 253, 254, 255, 0, 0, 0, 71, 72, + 0, 256, 257, 258, 0, 0, 0, 278, 0, 0, + 259, 0, 262, 261, 260, 0, 0, 263, 264, 0, + 265, 267, 266, 268, 269, 73, 0, 0, 270, 271, + 272, 273, 274, 0, 0, 276, 275, 3827, 280, 281, + 282, 0, 0, 74, 0, 0, 0, 0, 277, 0, + 279, 0, 476, 0, 283, 285, 284, 286, 75, 288, + 76, 287, 0, 0, 0, 77, 289, 0, 78, 0, + 0, 0, 290, 0, 0, 0, 291, 143, 292, 144, + 3818, 0, 293, 295, 296, 0, 0, 297, 0, 0, + 0, 79, 302, 80, 0, 0, 0, 294, 0, 0, + 0, 298, 299, 0, 300, 301, 3825, 0, 0, 303, + 0, 81, 0, 304, 0, 0, 305, 3824, 0, 306, + 307, 0, 0, 0, 0, 0, 308, 309, 82, 310, + 0, 311, 83, 312, 313, 0, 0, 0, 0, 3833, + 0, 0, 335, 0, 324, 326, 317, 319, 320, 322, + 318, 325, 323, 329, 328, 330, 331, 332, 333, 334, + 327, 0, 315, 321, 316, 0, 336, 337, 314, 338, + 0, 339, 340, 0, 0, 0, 0, 341, 342, 343, + 344, 345, 346, 0, 0, 347, 348, 0, 350, 0, + 349, 0, 351, 352, 353, 354, 355, 356, 358, 357, + 359, 0, 0, 360, 361, 0, 0, 363, 362, 365, + 366, 0, 0, 0, 0, 364, 0, 0, 0, 367, + 0, 368, 369, 370, 0, 371, 372, 3826, 84, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 373, 374, 0, 0, 375, 86, 377, 376, 378, 379, + 380, 381, 382, 383, 384, 0, 0, 0, 87, 385, + 386, 0, 387, 0, 388, 389, 390, 391, 392, 88, + 393, 394, 395, 0, 0, 396, 0, 0, 0, 397, + 398, 400, 399, 401, 0, 0, 402, 403, 404, 405, + 406, 89, 407, 0, 90, 408, 91, 409, 3835, 92, + 410, 0, 93, 94, 411, 0, 0, 412, 413, 414, + 3817, 415, 95, 0, 96, 416, 417, 418, 420, 421, + 419, 422, 97, 423, 424, 0, 425, 0, 113, 0, + 0, 427, 426, 428, 0, 0, 99, 0, 430, 0, + 0, 101, 431, 100, 0, 429, 0, 432, 0, 433, + 0, 0, 434, 435, 0, 0, 0, 0, 0, 436, + 437, 438, 0, 440, 439, 0, 441, 0, 0, 442, + 0, 0, 443, 102, 444, 445, 446, 447, 0, 0, + 103, 448, 0, 449, 450, 451, 452, 454, 453, 0, + 0, 455, 456, 457, 458, 0, 460, 462, 0, 0, + 461, 459, 463, 464, 0, 0, 465, 466, 0, 469, + 470, 471, 472, 0, 0, 0, 0, 0, 467, 468, + 0, 0, 0, 104, 473, 474, 475, 0, 477, 478, + 0, 480, 479, 0, 0, 105, 0, 0, 481, 106, + 0, 482, 107, 0, 0, 483, 484, 108, 0, 0, + 0, 0, 0, 487, 0, 0, 485, 0, 0, 0, + 486, 489, 488, 490, 492, 0, 0, 3834, 0, 0, + 0, 491, 0, 0, 493, 109, 494, 0, 195, 495, + 196, 197, 198, 199, 200, 0, 59, 201, 60, 0, + 0, 202, 0, 0, 114, 0, 203, 205, 204, 206, + 207, 0, 0, 3832, 0, 0, 0, 3836, 0, 0, + 0, 209, 0, 0, 210, 212, 211, 0, 213, 0, + 0, 85, 62, 0, 214, 3829, 0, 215, 216, 63, + 217, 0, 0, 65, 64, 218, 220, 219, 3828, 221, + 222, 0, 223, 226, 0, 225, 224, 0, 227, 66, + 228, 229, 230, 231, 0, 232, 233, 0, 234, 236, + 235, 0, 237, 0, 0, 0, 238, 67, 0, 239, + 0, 240, 0, 0, 241, 0, 0, 0, 243, 242, + 244, 0, 0, 245, 0, 0, 0, 0, 246, 110, + 0, 0, 0, 0, 247, 248, 0, 249, 69, 111, + 112, 250, 0, 251, 252, 253, 254, 255, 0, 0, + 0, 71, 72, 0, 256, 257, 258, 0, 0, 0, + 278, 0, 0, 259, 0, 262, 261, 260, 0, 0, + 263, 264, 0, 265, 267, 266, 268, 269, 73, 0, + 0, 270, 271, 272, 273, 274, 0, 0, 276, 275, + 3827, 280, 281, 282, 0, 0, 74, 0, 0, 0, + 0, 277, 0, 279, 0, 476, 0, 283, 285, 284, + 286, 75, 288, 76, 287, 0, 0, 0, 77, 289, + 0, 78, 0, 0, 0, 290, 0, 0, 0, 291, + 143, 292, 144, 3818, 0, 293, 295, 296, 0, 0, + 297, 0, 0, 0, 79, 302, 80, 0, 0, 0, + 294, 0, 0, 0, 298, 299, 0, 300, 301, 3825, + 0, 0, 303, 0, 81, 0, 304, 0, 0, 305, + 3824, 0, 306, 307, 0, 0, 0, 0, 0, 308, + 309, 82, 310, 0, 311, 83, 312, 313, 0, 0, + 0, 0, 3833, 0, 0, 335, 0, 324, 326, 317, + 319, 320, 322, 318, 325, 323, 329, 328, 330, 331, + 332, 333, 334, 327, 0, 315, 321, 316, 0, 336, + 337, 314, 338, 0, 339, 340, 0, 0, 0, 0, + 341, 342, 343, 344, 345, 346, 0, 0, 347, 348, + 0, 350, 0, 349, 0, 351, 352, 353, 354, 355, + 356, 358, 357, 359, 0, 0, 360, 361, 0, 0, + 363, 362, 365, 366, 0, 0, 0, 0, 364, 0, + 0, 0, 367, 0, 368, 369, 370, 0, 371, 372, + 3826, 84, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 373, 374, 0, 0, 375, 86, 377, + 376, 378, 379, 380, 381, 382, 383, 384, 0, 0, + 0, 87, 385, 386, 0, 387, 0, 388, 389, 390, + 391, 392, 88, 393, 394, 395, 0, 0, 396, 0, + 0, 0, 397, 398, 400, 399, 401, 0, 0, 402, + 403, 404, 405, 406, 89, 407, 0, 90, 408, 91, + 409, 3835, 92, 410, 0, 93, 94, 411, 0, 0, + 412, 413, 414, 3817, 415, 95, 0, 96, 416, 417, + 418, 420, 421, 419, 422, 97, 423, 424, 0, 425, + 0, 113, 0, 0, 427, 426, 428, 0, 0, 99, + 0, 430, 0, 0, 101, 431, 100, 0, 429, 0, + 432, 0, 433, 0, 0, 434, 435, 0, 0, 0, + 0, 0, 436, 437, 438, 0, 440, 439, 0, 441, + 0, 0, 442, 0, 0, 443, 102, 444, 445, 446, + 447, 0, 0, 103, 448, 0, 449, 450, 451, 452, + 454, 453, 0, 0, 455, 456, 457, 458, 0, 460, + 462, 0, 0, 461, 459, 463, 464, 0, 0, 465, + 466, 0, 469, 470, 471, 472, 0, 0, 0, 0, + 0, 467, 468, 0, 0, 0, 104, 473, 474, 475, + 0, 477, 478, 0, 480, 479, 0, 0, 105, 0, + 0, 481, 106, 0, 4102, 107, 0, 0, 483, 484, + 108, 0, 0, 0, 0, 0, 487, 0, 0, 485, + 0, 0, 0, 486, 489, 488, 490, 492, 0, 0, + 3834, 0, 0, 0, 491, 0, 0, 493, 109, 494, + 0, 0, 495, 195, 0, 196, 197, 198, 199, 200, + 0, 0, 201, 0, 0, 0, 202, 114, 0, 146, + 0, 203, 205, 204, 206, 207, 147, 0, 148, 0, + 0, 0, 208, 633, 0, 0, 209, 0, 0, 210, + 212, 211, 0, 213, 0, 149, 150, 0, 0, 214, + 0, 0, 215, 216, 0, 217, 151, 0, 152, 0, + 218, 220, 219, 153, 221, 222, 0, 223, 226, 0, + 225, 224, 154, 227, 155, 228, 229, 230, 231, 0, + 232, 233, 0, 234, 236, 235, 156, 237, 0, 0, + 0, 238, 0, 0, 239, 0, 240, 0, 0, 241, + 0, 0, 0, 243, 242, 244, 0, 0, 2184, 0, + 0, 0, 0, 246, 157, 667, 0, 0, 0, 247, + 248, 0, 249, 0, 0, 0, 250, 0, 251, 252, + 253, 254, 255, 0, 0, 0, 158, 0, 0, 256, + 257, 258, 0, 0, 0, 278, 0, 159, 259, 0, + 262, 261, 260, 0, 0, 263, 264, 0, 265, 267, + 266, 268, 269, 160, 0, 0, 270, 271, 272, 273, + 274, 0, 630, 276, 275, 0, 280, 281, 282, 668, + 0, 161, 0, 0, 0, 162, 277, 0, 279, 0, + 476, 0, 283, 285, 284, 286, 0, 288, 0, 287, + 0, 0, 0, 163, 289, 0, 164, 632, 0, 165, + 290, 0, 0, 0, 291, 143, 292, 144, 0, 0, + 293, 295, 296, 0, 0, 297, 0, 0, 0, 0, + 302, 166, 0, 0, 0, 294, 0, 0, 0, 298, + 299, 0, 300, 301, 0, 0, 0, 303, 0, 0, + 167, 304, 0, 0, 305, 0, 0, 306, 307, 0, + 0, 0, 0, 0, 308, 309, 0, 310, 0, 311, + 0, 312, 313, 0, 0, 665, 0, 0, 0, 0, + 335, 0, 324, 326, 317, 319, 320, 322, 318, 325, + 323, 329, 328, 330, 331, 332, 333, 334, 327, 0, + 315, 321, 316, 0, 336, 337, 314, 338, 0, 339, + 340, 0, 0, 0, 0, 341, 342, 343, 344, 345, + 346, 0, 0, 347, 348, 0, 350, 0, 349, 0, + 351, 352, 353, 354, 355, 356, 358, 357, 359, 0, + 663, 360, 361, 0, 0, 363, 362, 365, 366, 0, + 0, 0, 168, 364, 0, 629, 664, 367, 0, 368, + 369, 370, 0, 371, 372, 169, 0, 170, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 171, 373, 374, + 0, 172, 375, 0, 377, 376, 378, 379, 380, 381, + 382, 383, 384, 173, 0, 0, 174, 385, 386, 0, + 387, 0, 388, 389, 390, 391, 392, 0, 393, 394, + 395, 0, 0, 396, 0, 0, 0, 397, 398, 400, + 399, 401, 0, 0, 402, 403, 404, 405, 406, 0, + 407, 175, 0, 408, 176, 409, 0, 0, 410, 0, + 177, 0, 411, 178, 0, 412, 413, 414, 0, 415, + 0, 0, 179, 416, 417, 418, 420, 421, 419, 422, + 180, 423, 424, 0, 425, 181, 0, 0, 0, 427, + 426, 428, 182, 0, 0, 0, 430, 0, 0, 0, + 431, 0, 183, 429, 185, 432, 0, 433, 184, 186, + 434, 435, 0, 0, 0, 0, 0, 436, 437, 438, + 0, 440, 439, 0, 441, 0, 0, 442, 0, 0, + 443, 187, 444, 445, 446, 447, 0, 0, 188, 448, + 0, 449, 450, 451, 452, 454, 453, 0, 0, 455, + 456, 457, 458, 0, 460, 462, 0, 0, 461, 459, + 463, 464, 0, 662, 465, 466, 0, 2186, 470, 471, + 2185, 0, 0, 0, 0, 0, 467, 468, 0, 0, + 631, 189, 473, 474, 475, 666, 477, 478, 634, 480, + 479, 0, 190, 191, 0, 0, 481, 0, 0, 482, + 0, 194, 0, 483, 484, 0, 0, 0, 0, 0, + 0, 487, 0, 0, 485, 0, 0, 0, 486, 489, + 488, 490, 492, 0, 0, 0, 0, 0, 0, 491, + 192, 0, 493, 193, 494, 0, 195, 495, 196, 197, + 198, 199, 200, 0, 0, 201, 0, 0, 652, 202, + 636, 0, 146, 0, 203, 205, 204, 206, 207, 147, + 0, 148, 0, 0, 0, 208, 0, 0, 0, 209, + 0, 0, 210, 212, 211, 0, 213, 0, 149, 150, + 0, 0, 214, 0, 0, 215, 216, 0, 217, 151, + 0, 152, 0, 218, 220, 219, 153, 221, 222, 0, + 223, 226, 0, 225, 224, 154, 227, 155, 228, 229, + 230, 231, 0, 232, 233, 0, 234, 236, 235, 156, + 237, 0, 0, 0, 238, 0, 0, 239, 0, 240, + 0, 0, 241, 0, 0, 0, 243, 242, 244, 0, + 0, 245, 0, 0, 0, 0, 246, 157, 0, 0, + 0, 0, 247, 248, 0, 249, 0, 0, 0, 250, + 0, 251, 252, 253, 254, 255, 0, 0, 0, 158, + 0, 2370, 256, 257, 258, 0, 0, 0, 278, 0, + 159, 259, 0, 262, 261, 260, 0, 0, 263, 264, + 0, 265, 267, 266, 268, 269, 160, 0, 0, 270, + 271, 272, 273, 274, 0, 0, 276, 275, 0, 280, + 281, 282, 0, 0, 161, 0, 0, 0, 162, 277, + 0, 279, 0, 476, 0, 283, 285, 284, 286, 0, + 288, 0, 287, 0, 0, 0, 163, 289, 0, 164, + 0, 0, 165, 290, 0, 0, 0, 291, 143, 292, + 144, 0, 0, 293, 295, 296, 0, 0, 297, 0, + 0, 0, 0, 302, 166, 0, 0, 0, 294, 0, + 0, 0, 298, 299, 0, 300, 301, 0, 0, 0, + 303, 0, 0, 167, 304, 0, 0, 305, 0, 0, + 306, 307, 0, 0, 0, 0, 0, 308, 309, 0, + 310, 0, 311, 0, 312, 313, 0, 0, 0, 0, + 0, 0, 0, 335, 0, 324, 326, 317, 319, 320, + 322, 318, 325, 323, 329, 328, 330, 331, 332, 333, + 334, 327, 0, 315, 321, 316, 0, 336, 337, 314, + 338, 0, 339, 340, 0, 0, 0, 0, 341, 342, + 343, 344, 345, 346, 0, 0, 347, 348, 0, 350, + 0, 349, 0, 351, 352, 353, 354, 355, 356, 358, + 357, 359, 0, 0, 360, 361, 0, 0, 363, 362, + 365, 366, 0, 0, 0, 168, 364, 0, 0, 0, + 367, 0, 368, 369, 370, 0, 371, 372, 169, 0, + 170, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 171, 373, 374, 0, 172, 375, 0, 377, 376, 378, + 379, 380, 381, 382, 383, 384, 173, 0, 0, 174, + 385, 386, 0, 387, 0, 388, 389, 390, 391, 392, + 0, 393, 394, 395, 0, 0, 396, 0, 0, 0, + 397, 398, 400, 399, 401, 0, 0, 402, 403, 404, + 405, 406, 0, 407, 175, 0, 408, 176, 409, 0, + 0, 410, 0, 177, 0, 411, 178, 0, 412, 413, + 414, 0, 415, 0, 0, 179, 416, 417, 418, 420, + 421, 419, 422, 180, 423, 424, 0, 425, 181, 1832, + 0, 0, 427, 426, 428, 182, 0, 0, 0, 430, + 0, 0, 0, 431, 0, 183, 429, 185, 432, 0, + 433, 184, 186, 434, 435, 0, 0, 0, 0, 0, + 436, 437, 438, 0, 440, 439, 0, 441, 0, 0, + 442, 0, 0, 443, 187, 444, 445, 446, 447, 0, + 0, 188, 448, 0, 449, 450, 451, 452, 454, 453, + 0, 0, 455, 456, 457, 458, 0, 460, 462, 0, + 0, 461, 459, 463, 464, 0, 0, 465, 466, 0, + 469, 470, 471, 472, 0, 0, 0, 0, 0, 467, + 468, 0, 0, 0, 189, 473, 474, 475, 0, 477, + 478, 0, 480, 479, 0, 190, 191, 0, 0, 481, + 0, 0, 482, 0, 194, 0, 483, 484, 0, 0, + 0, 0, 0, 0, 487, 0, 0, 485, 0, 0, + 0, 486, 489, 488, 490, 492, 0, 0, 0, 0, + 0, 0, 491, 192, 0, 493, 193, 494, 0, 0, + 495, 0, 0, 0, 195, 0, 196, 197, 198, 199, + 200, 534, 0, 201, 0, 1831, 0, 202, 0, 1826, + 146, 0, 203, 205, 204, 206, 207, 147, 0, 148, + 0, 0, 0, 208, 0, 0, 0, 209, 0, 0, + 210, 212, 211, 0, 213, 0, 149, 150, 0, 0, + 214, 0, 0, 215, 216, 0, 217, 151, 0, 152, + 0, 218, 220, 219, 153, 221, 222, 0, 223, 226, + 0, 225, 224, 154, 227, 155, 228, 229, 230, 231, + 0, 232, 233, 0, 234, 236, 235, 156, 237, 0, + 0, 0, 238, 0, 0, 239, 0, 240, 0, 0, + 241, 0, 0, 0, 243, 242, 244, 0, 0, 245, + 0, 0, 0, 0, 246, 157, 0, 0, 0, 0, + 247, 248, 0, 249, 0, 0, 0, 250, 0, 251, + 252, 253, 254, 255, 0, 0, 0, 158, 0, 0, + 256, 257, 258, 0, 0, 0, 278, 0, 159, 259, + 0, 262, 261, 260, 0, 0, 263, 264, 0, 265, + 267, 266, 268, 269, 160, 0, 0, 270, 271, 272, + 273, 274, 0, 0, 276, 275, 0, 280, 281, 282, + 0, 0, 161, 0, 0, 0, 162, 277, 0, 279, + 0, 476, 0, 283, 285, 284, 286, 0, 288, 0, + 287, 0, 0, 0, 163, 289, 0, 164, 0, 0, + 165, 290, 0, 0, 0, 291, 143, 292, 144, 0, + 0, 293, 295, 296, 0, 0, 297, 0, 0, 0, + 0, 302, 166, 0, 0, 0, 294, 0, 0, 0, + 298, 299, 0, 300, 301, 0, 0, 0, 303, 0, + 0, 167, 304, 0, 0, 305, 0, 0, 306, 307, + 0, 0, 0, 0, 0, 308, 309, 0, 310, 0, + 311, 0, 312, 313, 0, 0, 0, 0, 0, 0, + 0, 335, 0, 324, 326, 317, 319, 320, 322, 318, + 325, 323, 329, 328, 330, 331, 332, 333, 334, 327, + 0, 315, 321, 316, 0, 336, 337, 314, 338, 0, + 339, 340, 0, 0, 0, 0, 341, 342, 343, 344, + 345, 346, 0, 0, 347, 348, 0, 350, 0, 349, + 0, 351, 352, 353, 354, 355, 356, 358, 357, 359, + 0, 0, 360, 361, 0, 0, 363, 362, 365, 366, + 0, 0, 0, 168, 364, 0, 0, 0, 367, 0, + 368, 369, 370, 0, 371, 372, 169, 0, 170, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 171, 373, + 374, 0, 172, 375, 0, 377, 376, 378, 379, 380, + 381, 382, 383, 384, 173, 0, 0, 174, 385, 386, + 0, 387, 0, 388, 389, 390, 391, 392, 0, 393, + 394, 395, 0, 0, 396, 0, 0, 0, 397, 398, + 400, 399, 401, 0, 0, 402, 403, 404, 405, 406, + 0, 407, 175, 0, 408, 176, 409, 0, 0, 410, + 0, 177, 0, 411, 178, 0, 412, 413, 414, 0, + 415, 0, 0, 179, 416, 417, 418, 420, 421, 419, + 422, 180, 423, 424, 0, 425, 181, 1832, 0, 0, + 427, 426, 428, 182, 0, 0, 0, 430, 0, 0, + 0, 431, 0, 183, 429, 185, 432, 0, 433, 184, + 186, 434, 435, 0, 0, 0, 0, 0, 436, 437, + 438, 0, 440, 439, 0, 441, 0, 0, 442, 0, + 0, 443, 187, 444, 445, 446, 447, 0, 0, 188, + 448, 0, 449, 450, 451, 452, 454, 453, 0, 0, + 455, 456, 457, 458, 0, 460, 462, 0, 0, 461, + 459, 463, 464, 0, 0, 465, 466, 0, 469, 470, + 471, 472, 0, 0, 0, 0, 0, 467, 468, 0, + 0, 0, 189, 473, 474, 475, 0, 477, 478, 0, + 480, 479, 0, 190, 191, 0, 0, 481, 0, 0, + 482, 0, 194, 0, 483, 484, 0, 0, 0, 0, + 0, 0, 487, 0, 0, 485, 0, 0, 0, 486, + 489, 488, 490, 492, 0, 0, 0, 0, 0, 0, + 491, 192, 0, 493, 193, 494, 0, 0, 495, 0, + 0, 0, 195, 0, 196, 197, 198, 199, 200, 534, + 0, 201, 0, 1831, 0, 202, 0, 1826, 146, 0, + 203, 205, 204, 206, 207, 147, 0, 148, 0, 0, + 0, 208, 0, 0, 0, 209, 0, 0, 210, 212, + 211, 0, 213, 0, 149, 150, 0, 0, 214, 0, + 0, 215, 216, 0, 217, 151, 0, 152, 0, 218, + 220, 219, 153, 221, 222, 0, 223, 226, 0, 225, + 224, 154, 227, 155, 228, 229, 230, 231, 0, 232, + 233, 0, 234, 236, 235, 156, 237, 0, 0, 0, + 238, 0, 0, 239, 0, 240, 0, 0, 241, 0, + 0, 0, 243, 242, 244, 0, 0, 245, 0, 0, + 0, 0, 246, 157, 0, 0, 0, 0, 247, 248, + 0, 249, 0, 0, 0, 250, 0, 251, 252, 253, + 254, 255, 0, 0, 0, 158, 0, 0, 256, 257, + 258, 0, 0, 0, 278, 0, 159, 259, 0, 262, + 261, 260, 0, 0, 263, 264, 0, 265, 267, 266, + 268, 269, 160, 0, 0, 270, 271, 272, 273, 274, + 0, 0, 276, 275, 0, 280, 281, 282, 0, 0, + 161, 0, 0, 0, 162, 277, 0, 279, 0, 476, + 0, 283, 285, 284, 286, 0, 288, 0, 287, 0, + 0, 0, 163, 289, 0, 164, 0, 0, 165, 290, + 0, 0, 0, 291, 143, 292, 144, 0, 0, 293, + 295, 296, 0, 0, 297, 0, 0, 0, 0, 302, + 166, 0, 0, 0, 294, 0, 0, 0, 298, 299, + 0, 300, 301, 0, 0, 0, 303, 0, 0, 167, + 304, 0, 0, 305, 0, 0, 306, 307, 0, 0, + 0, 0, 0, 308, 309, 0, 310, 0, 311, 0, + 312, 313, 0, 0, 0, 0, 0, 0, 0, 335, + 0, 324, 326, 317, 319, 320, 322, 318, 325, 323, + 329, 328, 330, 331, 332, 333, 334, 327, 0, 315, + 321, 316, 0, 336, 337, 314, 338, 0, 339, 340, + 0, 0, 0, 0, 341, 342, 343, 344, 345, 346, + 0, 0, 347, 348, 0, 350, 0, 349, 0, 351, + 352, 353, 354, 355, 356, 358, 357, 359, 0, 0, + 360, 361, 0, 0, 363, 362, 365, 366, 0, 0, + 0, 168, 364, 0, 0, 0, 367, 0, 368, 369, + 370, 0, 371, 372, 169, 0, 170, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 171, 373, 374, 0, + 172, 375, 0, 377, 376, 378, 379, 380, 381, 382, + 383, 384, 173, 0, 0, 174, 385, 386, 0, 387, + 0, 388, 389, 390, 391, 392, 0, 393, 394, 395, + 0, 0, 396, 0, 0, 0, 397, 398, 400, 399, + 401, 0, 0, 402, 403, 404, 405, 406, 0, 407, + 175, 0, 408, 176, 409, 0, 0, 410, 0, 177, + 0, 411, 178, 0, 412, 413, 414, 0, 415, 0, + 0, 179, 416, 417, 418, 420, 421, 419, 422, 180, + 423, 424, 0, 425, 181, 0, 0, 0, 427, 426, + 428, 182, 0, 0, 0, 430, 0, 0, 0, 431, + 0, 183, 429, 185, 432, 0, 433, 184, 186, 434, + 435, 0, 0, 0, 0, 0, 436, 437, 438, 0, + 440, 439, 0, 441, 0, 0, 442, 0, 0, 443, + 187, 444, 445, 446, 447, 0, 0, 188, 448, 0, + 449, 450, 451, 452, 454, 453, 0, 0, 455, 456, + 457, 458, 0, 460, 462, 0, 0, 461, 459, 463, + 464, 0, 0, 465, 466, 0, 469, 470, 471, 472, + 0, 0, 0, 0, 0, 467, 468, 0, 0, 0, + 189, 473, 474, 475, 0, 477, 478, 0, 480, 479, + 0, 190, 191, 0, 0, 481, 0, 0, 482, 0, + 194, 0, 483, 484, 0, 0, 0, 0, 0, 0, + 487, 0, 0, 485, 0, 0, 0, 486, 489, 488, + 490, 492, 0, 0, 0, 0, 0, 0, 491, 192, + 0, 493, 193, 494, 0, 195, 495, 196, 197, 198, + 199, 200, 0, 0, 201, 0, 0, 652, 202, 4308, + 0, 146, 4305, 203, 205, 204, 206, 207, 147, 0, + 148, 0, 0, 0, 208, 0, 0, 0, 209, 0, + 0, 210, 212, 211, 0, 213, 0, 149, 150, 0, + 0, 214, 0, 0, 215, 216, 0, 217, 151, 0, + 152, 0, 218, 220, 219, 153, 221, 222, 0, 223, + 226, 0, 225, 224, 154, 227, 155, 228, 229, 230, + 231, 0, 232, 233, 2407, 234, 236, 235, 156, 237, + 0, 0, 0, 238, 0, 0, 239, 0, 240, 0, + 0, 241, 0, 0, 0, 243, 242, 244, 0, 0, + 245, 0, 0, 0, 0, 246, 157, 0, 0, 0, + 0, 247, 248, 0, 249, 0, 0, 0, 250, 0, + 251, 252, 253, 254, 255, 0, 0, 0, 158, 0, + 0, 256, 257, 258, 0, 0, 0, 278, 0, 159, + 259, 0, 262, 261, 260, 0, 0, 263, 264, 0, + 265, 267, 266, 268, 269, 160, 0, 0, 270, 271, + 272, 273, 274, 0, 0, 276, 275, 0, 280, 281, + 282, 0, 0, 161, 0, 0, 0, 162, 277, 0, + 279, 514, 476, 0, 283, 285, 284, 286, 0, 288, + 0, 287, 0, 0, 0, 163, 289, 0, 164, 0, + 0, 165, 290, 0, 0, 0, 291, 143, 292, 144, + 0, 0, 293, 295, 296, 1683, 0, 297, 0, 0, + 0, 0, 302, 166, 0, 0, 0, 294, 0, 0, + 0, 298, 299, 0, 300, 301, 0, 0, 0, 303, + 1682, 0, 167, 304, 0, 0, 305, 0, 0, 306, + 307, 0, 3037, 0, 0, 0, 308, 309, 0, 310, + 0, 311, 0, 312, 313, 0, 0, 0, 0, 0, + 0, 0, 335, 0, 324, 326, 317, 319, 320, 322, + 318, 325, 323, 329, 328, 330, 331, 332, 333, 334, + 327, 0, 315, 321, 316, 0, 336, 337, 314, 338, + 0, 339, 340, 0, 0, 0, 0, 341, 342, 343, + 344, 345, 346, 0, 0, 347, 348, 0, 350, 0, + 349, 0, 351, 352, 353, 354, 355, 356, 358, 357, + 359, 0, 0, 360, 361, 0, 0, 363, 362, 365, + 366, 0, 0, 0, 168, 364, 0, 0, 0, 367, + 0, 368, 369, 370, 0, 371, 372, 169, 0, 170, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 171, + 373, 374, 0, 172, 375, 1882, 377, 376, 378, 379, + 380, 381, 382, 383, 384, 173, 0, 0, 174, 385, + 386, 0, 387, 0, 388, 389, 390, 391, 392, 0, + 393, 394, 395, 0, 0, 396, 0, 0, 0, 397, + 398, 400, 399, 401, 0, 0, 402, 403, 404, 405, + 406, 0, 407, 175, 0, 408, 176, 409, 0, 0, + 410, 0, 177, 0, 411, 178, 0, 412, 413, 414, + 0, 415, 0, 0, 179, 416, 417, 418, 420, 421, + 419, 422, 180, 423, 424, 0, 425, 181, 0, 0, + 0, 427, 426, 428, 182, 0, 0, 0, 430, 0, + 0, 0, 431, 0, 183, 429, 185, 432, 0, 433, + 184, 186, 434, 435, 515, 0, 0, 0, 0, 436, + 437, 438, 0, 440, 439, 0, 441, 0, 0, 442, + 0, 0, 443, 187, 444, 445, 446, 447, 0, 0, + 188, 448, 0, 449, 450, 451, 452, 454, 453, 0, + 0, 455, 456, 457, 458, 0, 460, 462, 0, 0, + 461, 459, 463, 464, 0, 0, 465, 466, 0, 469, + 470, 471, 472, 0, 0, 0, 0, 0, 467, 468, + 0, 0, 0, 189, 473, 474, 475, 0, 477, 478, + 0, 480, 479, 0, 190, 191, 0, 0, 481, 0, + 0, 482, 0, 194, 0, 483, 484, 0, 0, 0, + 0, 0, 0, 487, 0, 0, 485, 0, 0, 0, + 486, 489, 488, 490, 492, 0, 0, 0, 0, 0, + 0, 491, 192, 0, 493, 193, 494, 0, 195, 495, + 196, 197, 198, 199, 200, 0, 0, 201, 0, 0, + 2414, 202, 0, 0, 146, 0, 203, 205, 204, 206, + 207, 147, 0, 148, 0, 0, 0, 208, 0, 0, + 0, 209, 0, 0, 210, 212, 211, 0, 213, 0, + 149, 150, 0, 0, 214, 0, 0, 215, 216, 0, + 217, 151, 0, 152, 0, 218, 220, 219, 153, 221, + 222, 0, 223, 226, 0, 225, 224, 154, 227, 155, + 228, 229, 230, 231, 0, 232, 233, 0, 234, 236, + 235, 156, 237, 0, 0, 0, 238, 0, 0, 239, + 0, 240, 0, 0, 241, 0, 0, 0, 243, 242, + 244, 0, 0, 245, 0, 0, 0, 0, 246, 157, + 0, 0, 0, 0, 247, 248, 0, 249, 0, 0, + 0, 250, 0, 251, 252, 253, 254, 255, 0, 0, + 0, 158, 0, 0, 256, 257, 258, 0, 0, 0, + 278, 0, 159, 259, 0, 262, 261, 260, 0, 0, + 263, 264, 0, 265, 267, 266, 268, 269, 160, 0, + 0, 270, 271, 272, 273, 274, 0, 0, 276, 275, + 0, 280, 281, 282, 0, 0, 161, 0, 0, 0, + 162, 277, 0, 279, 0, 476, 0, 283, 285, 284, + 286, 0, 288, 0, 287, 0, 0, 0, 163, 289, + 0, 164, 0, 0, 165, 290, 0, 0, 0, 291, + 143, 292, 144, 0, 0, 293, 295, 296, 0, 0, + 297, 0, 0, 0, 0, 302, 166, 0, 0, 0, + 294, 0, 0, 0, 298, 299, 0, 300, 301, 0, + 0, 0, 303, 0, 0, 167, 304, 0, 0, 305, + 0, 0, 306, 307, 0, 0, 0, 0, 0, 308, + 309, 0, 310, 0, 311, 0, 312, 313, 0, 0, + 0, 0, 0, 0, 0, 335, 0, 324, 326, 317, + 319, 320, 322, 318, 325, 323, 329, 328, 330, 331, + 332, 333, 334, 327, 0, 315, 321, 316, 0, 336, + 337, 314, 338, 0, 339, 340, 0, 0, 0, 0, + 341, 342, 343, 344, 345, 346, 0, 0, 347, 348, + 0, 350, 0, 349, 0, 351, 352, 353, 354, 355, + 356, 358, 357, 359, 0, 0, 360, 361, 0, 0, + 363, 362, 365, 366, 0, 0, 0, 168, 364, 0, + 0, 0, 367, 0, 368, 369, 370, 0, 371, 372, + 169, 0, 170, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 171, 373, 374, 0, 172, 375, 0, 377, + 376, 378, 379, 380, 381, 382, 383, 384, 173, 0, + 0, 174, 385, 386, 0, 387, 0, 388, 389, 390, + 391, 392, 0, 393, 394, 395, 0, 0, 396, 0, + 0, 0, 397, 398, 400, 399, 401, 0, 0, 402, + 403, 404, 405, 406, 0, 407, 175, 0, 408, 176, + 409, 0, 0, 410, 0, 177, 0, 411, 178, 0, + 412, 413, 414, 0, 415, 0, 0, 179, 416, 417, + 418, 420, 421, 419, 422, 180, 423, 424, 0, 425, + 181, 1712, 0, 0, 427, 426, 428, 182, 0, 0, + 0, 430, 0, 0, 0, 431, 0, 183, 429, 185, + 432, 0, 433, 184, 186, 434, 435, 0, 0, 0, + 0, 0, 436, 437, 438, 0, 440, 439, 0, 441, + 0, 0, 442, 0, 0, 443, 187, 444, 445, 446, + 447, 0, 0, 188, 448, 0, 449, 450, 451, 452, + 454, 453, 0, 0, 455, 456, 457, 458, 0, 460, + 462, 0, 0, 461, 459, 463, 464, 0, 0, 465, + 466, 0, 469, 470, 471, 472, 0, 0, 0, 0, + 0, 467, 468, 0, 0, 0, 189, 473, 474, 475, + 0, 477, 478, 0, 480, 479, 0, 190, 191, 0, + 0, 481, 0, 0, 482, 0, 194, 0, 483, 484, + 0, 0, 0, 0, 0, 0, 487, 0, 0, 485, + 0, 0, 0, 486, 489, 488, 490, 492, 0, 0, + 0, 0, 0, 0, 491, 192, 0, 493, 193, 494, + 0, 195, 495, 196, 197, 198, 199, 200, 0, 0, + 201, 0, 0, 652, 202, 0, 0, 146, 2263, 203, + 205, 204, 206, 207, 147, 0, 148, 0, 0, 0, + 208, 0, 0, 0, 209, 0, 0, 210, 212, 211, + 0, 213, 0, 149, 150, 0, 0, 214, 0, 0, + 215, 216, 0, 217, 151, 0, 152, 0, 218, 220, + 219, 153, 221, 222, 0, 223, 226, 0, 225, 224, + 154, 227, 155, 228, 229, 230, 231, 0, 232, 233, + 0, 234, 236, 235, 156, 237, 0, 0, 0, 238, + 0, 0, 239, 0, 240, 0, 0, 241, 0, 0, + 0, 243, 242, 244, 0, 0, 245, 0, 0, 0, + 0, 246, 157, 0, 0, 0, 0, 247, 248, 0, + 249, 0, 0, 0, 250, 0, 251, 252, 253, 254, + 255, 0, 0, 0, 158, 0, 0, 256, 257, 258, + 0, 0, 0, 278, 0, 159, 259, 0, 262, 261, + 260, 0, 0, 263, 264, 0, 265, 267, 266, 268, + 269, 160, 0, 0, 270, 271, 272, 273, 274, 0, + 0, 276, 275, 0, 280, 281, 282, 0, 0, 161, + 0, 0, 0, 162, 277, 0, 279, 0, 476, 0, + 283, 285, 284, 286, 0, 288, 0, 287, 0, 0, + 0, 163, 289, 0, 164, 0, 0, 165, 290, 0, + 0, 0, 291, 143, 292, 144, 0, 0, 293, 295, + 296, 0, 0, 297, 0, 0, 0, 0, 302, 166, + 0, 0, 0, 294, 0, 0, 0, 298, 299, 0, + 300, 301, 0, 0, 0, 303, 0, 0, 167, 304, + 0, 0, 305, 0, 0, 306, 307, 0, 0, 0, + 0, 0, 308, 309, 0, 310, 0, 311, 0, 312, + 313, 0, 0, 0, 0, 0, 0, 0, 335, 0, + 324, 326, 317, 319, 320, 322, 318, 325, 323, 329, + 328, 330, 331, 332, 333, 334, 327, 0, 315, 321, + 316, 0, 336, 337, 314, 338, 0, 339, 340, 0, + 0, 0, 0, 341, 342, 343, 344, 345, 346, 0, + 0, 347, 348, 0, 350, 0, 349, 0, 351, 352, + 353, 354, 355, 356, 358, 357, 359, 0, 0, 360, + 361, 0, 0, 363, 362, 365, 366, 0, 0, 0, + 168, 364, 0, 0, 0, 367, 0, 368, 369, 370, + 0, 371, 372, 169, 0, 170, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 171, 373, 374, 0, 172, + 375, 0, 377, 376, 378, 379, 380, 381, 382, 383, + 384, 173, 0, 0, 174, 385, 386, 0, 387, 0, + 388, 389, 390, 391, 392, 0, 393, 394, 395, 0, + 0, 396, 0, 0, 0, 397, 398, 400, 399, 401, + 0, 0, 402, 403, 404, 405, 406, 0, 407, 175, + 0, 408, 176, 409, 0, 0, 410, 0, 177, 0, + 411, 178, 0, 412, 413, 414, 0, 415, 0, 0, + 179, 416, 417, 418, 420, 421, 419, 422, 180, 423, + 424, 0, 425, 181, 1832, 0, 0, 427, 426, 428, + 182, 0, 0, 0, 430, 0, 0, 0, 431, 0, + 183, 429, 185, 432, 0, 433, 184, 186, 434, 435, + 0, 0, 0, 0, 0, 436, 437, 438, 0, 440, + 439, 0, 441, 0, 0, 442, 0, 0, 443, 187, + 444, 445, 446, 447, 0, 0, 188, 448, 0, 449, + 450, 451, 452, 454, 453, 0, 0, 455, 456, 457, + 458, 0, 460, 462, 0, 0, 461, 459, 463, 464, + 0, 0, 465, 466, 0, 469, 470, 471, 472, 0, + 0, 0, 0, 0, 467, 468, 0, 0, 0, 189, + 473, 474, 475, 0, 477, 478, 0, 480, 479, 0, + 190, 191, 0, 0, 481, 0, 0, 482, 0, 194, + 0, 483, 484, 0, 0, 0, 0, 0, 0, 487, + 0, 0, 485, 0, 0, 0, 486, 489, 488, 490, + 492, 0, 0, 0, 0, 0, 0, 491, 192, 0, + 493, 193, 494, 0, 0, 495, 195, 0, 196, 197, + 198, 199, 200, 0, 0, 201, 534, 0, 0, 202, + 1831, 0, 146, 0, 203, 205, 204, 206, 207, 147, + 0, 148, 0, 0, 0, 208, 0, 0, 0, 209, + 0, 0, 210, 212, 211, 0, 213, 0, 149, 150, + 0, 0, 214, 0, 0, 215, 216, 0, 217, 151, + 0, 152, 0, 218, 220, 219, 153, 221, 222, 0, + 223, 226, 0, 225, 224, 154, 227, 155, 228, 229, + 230, 231, 0, 232, 233, 2407, 234, 236, 235, 156, + 237, 0, 0, 0, 238, 0, 0, 239, 0, 240, + 0, 0, 241, 0, 0, 0, 243, 242, 244, 0, + 0, 245, 0, 0, 0, 0, 246, 157, 0, 0, + 0, 0, 247, 248, 0, 249, 0, 0, 0, 250, + 0, 251, 252, 253, 254, 255, 0, 0, 0, 158, + 0, 0, 256, 257, 258, 0, 0, 0, 278, 0, + 159, 259, 0, 262, 261, 260, 0, 0, 263, 264, + 0, 265, 267, 266, 268, 269, 160, 0, 0, 270, + 271, 272, 273, 274, 0, 0, 276, 275, 0, 280, + 281, 282, 0, 0, 161, 0, 0, 0, 162, 277, + 0, 279, 514, 476, 0, 283, 285, 284, 286, 0, + 288, 0, 287, 0, 0, 0, 163, 289, 0, 164, + 0, 0, 165, 290, 0, 0, 0, 291, 143, 292, + 144, 0, 0, 293, 295, 296, 1683, 0, 297, 0, + 0, 0, 0, 302, 166, 0, 0, 0, 294, 0, + 0, 0, 298, 299, 0, 300, 301, 0, 0, 0, + 303, 1682, 0, 167, 304, 0, 0, 305, 0, 0, + 306, 307, 0, 0, 0, 0, 0, 308, 309, 0, + 310, 0, 311, 0, 312, 313, 0, 0, 0, 0, + 0, 0, 0, 335, 0, 324, 326, 317, 319, 320, + 322, 318, 325, 323, 329, 328, 330, 331, 332, 333, + 334, 327, 0, 315, 321, 316, 0, 336, 337, 314, + 338, 0, 339, 340, 0, 0, 0, 0, 341, 342, + 343, 344, 345, 346, 0, 0, 347, 348, 0, 350, + 0, 349, 0, 351, 352, 353, 354, 355, 356, 358, + 357, 359, 0, 0, 360, 361, 0, 0, 363, 362, + 365, 366, 0, 0, 0, 168, 364, 0, 0, 0, + 367, 0, 368, 369, 370, 0, 371, 372, 169, 0, + 170, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 171, 373, 374, 0, 172, 375, 0, 377, 376, 378, + 379, 380, 381, 382, 383, 384, 173, 0, 0, 174, + 385, 386, 0, 387, 0, 388, 389, 390, 391, 392, + 0, 393, 394, 395, 0, 0, 396, 0, 0, 0, + 397, 398, 400, 399, 401, 0, 0, 402, 403, 404, + 405, 406, 0, 407, 175, 0, 408, 176, 409, 0, + 0, 410, 0, 177, 0, 411, 178, 0, 412, 413, + 414, 0, 415, 0, 0, 179, 416, 417, 418, 420, + 421, 419, 422, 180, 423, 424, 0, 425, 181, 0, + 0, 0, 427, 426, 428, 182, 0, 0, 0, 430, + 0, 0, 0, 431, 0, 183, 429, 185, 432, 0, + 433, 184, 186, 434, 435, 515, 0, 0, 0, 0, + 436, 437, 438, 0, 440, 439, 0, 441, 0, 0, + 442, 0, 0, 443, 187, 444, 445, 446, 447, 0, + 0, 188, 448, 0, 449, 450, 451, 452, 454, 453, + 0, 0, 455, 456, 457, 458, 0, 460, 462, 0, + 0, 461, 459, 463, 464, 0, 0, 465, 466, 0, + 469, 470, 471, 472, 0, 0, 0, 0, 0, 467, + 468, 0, 0, 0, 189, 473, 474, 475, 0, 477, + 478, 0, 480, 479, 0, 190, 191, 0, 0, 481, + 0, 0, 482, 0, 194, 0, 483, 484, 0, 0, + 0, 0, 0, 0, 487, 0, 0, 485, 0, 0, + 0, 486, 489, 488, 490, 492, 0, 0, 0, 0, + 0, 0, 491, 192, 0, 493, 193, 494, 0, 195, + 495, 196, 197, 198, 199, 200, 0, 0, 201, 0, + 0, 2414, 202, 0, 0, 146, 0, 203, 205, 204, + 206, 207, 147, 0, 148, 0, 0, 0, 208, 0, + 0, 0, 209, 0, 0, 210, 212, 211, 0, 213, + 0, 149, 150, 0, 0, 214, 0, 0, 215, 216, + 0, 217, 151, 0, 152, 0, 218, 220, 219, 153, + 221, 222, 0, 223, 226, 0, 225, 224, 154, 227, + 155, 228, 229, 230, 231, 0, 232, 233, 0, 234, + 236, 235, 156, 237, 0, 0, 0, 238, 0, 0, + 239, 0, 240, 0, 0, 241, 0, 0, 0, 243, + 242, 244, 0, 0, 245, 0, 0, 0, 0, 246, + 157, 0, 0, 0, 0, 247, 248, 0, 249, 0, + 0, 0, 250, 0, 251, 252, 253, 254, 255, 0, + 0, 0, 158, 0, 0, 256, 257, 258, 0, 0, + 0, 278, 0, 159, 259, 0, 262, 261, 260, 0, + 0, 263, 264, 0, 265, 267, 266, 268, 269, 160, + 0, 0, 270, 271, 272, 273, 274, 0, 0, 276, + 275, 0, 280, 281, 282, 0, 0, 161, 0, 0, + 0, 162, 277, 0, 279, 0, 476, 0, 283, 285, + 284, 286, 0, 288, 0, 287, 0, 0, 0, 163, + 289, 0, 164, 0, 0, 165, 290, 0, 0, 0, + 291, 143, 292, 144, 0, 0, 293, 295, 296, 0, + 0, 297, 0, 0, 0, 0, 302, 166, 0, 0, + 0, 294, 0, 0, 0, 298, 299, 0, 300, 301, + 0, 0, 0, 303, 0, 0, 167, 304, 0, 0, + 305, 0, 0, 306, 307, 0, 0, 0, 0, 0, + 308, 309, 0, 310, 0, 311, 0, 312, 313, 0, + 0, 0, 0, 0, 0, 0, 335, 0, 324, 326, + 317, 319, 320, 322, 318, 325, 323, 329, 328, 330, + 331, 332, 333, 334, 327, 0, 315, 321, 316, 0, + 336, 337, 314, 338, 0, 339, 340, 0, 0, 0, + 0, 341, 342, 343, 344, 345, 346, 0, 0, 347, + 348, 0, 350, 0, 349, 0, 351, 352, 353, 354, + 355, 356, 358, 357, 359, 0, 0, 360, 361, 0, + 0, 363, 362, 365, 366, 0, 0, 0, 168, 364, + 0, 0, 0, 367, 0, 368, 369, 370, 0, 371, + 372, 169, 0, 170, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 171, 373, 374, 0, 172, 375, 0, + 377, 376, 378, 379, 380, 381, 382, 383, 384, 173, + 0, 0, 174, 385, 386, 0, 387, 0, 388, 389, + 390, 391, 392, 0, 393, 394, 395, 0, 0, 396, + 0, 0, 0, 397, 398, 400, 399, 401, 0, 0, + 402, 403, 404, 405, 406, 0, 407, 175, 0, 408, + 176, 409, 0, 0, 410, 0, 177, 0, 411, 178, + 0, 412, 413, 414, 0, 415, 0, 0, 179, 416, + 417, 418, 420, 421, 419, 422, 180, 423, 424, 0, + 425, 181, 0, 0, 0, 427, 426, 428, 182, 0, + 0, 0, 430, 0, 0, 0, 431, 0, 183, 429, + 185, 432, 0, 433, 184, 186, 434, 435, 0, 0, + 0, 0, 0, 436, 437, 438, 0, 440, 439, 0, + 441, 0, 0, 442, 0, 0, 443, 187, 444, 445, + 446, 447, 0, 0, 188, 448, 0, 449, 450, 451, + 452, 454, 453, 0, 0, 455, 456, 457, 458, 0, + 460, 462, 0, 0, 461, 459, 463, 464, 0, 0, + 465, 466, 0, 469, 470, 471, 472, 0, 0, 0, + 0, 0, 467, 468, 0, 0, 0, 189, 473, 474, + 475, 0, 477, 478, 0, 480, 479, 0, 190, 191, + 0, 0, 481, 0, 0, 482, 0, 194, 0, 483, + 484, 0, 0, 0, 0, 0, 0, 487, 0, 0, + 485, 0, 0, 0, 486, 489, 488, 490, 492, 0, + 0, 0, 0, 0, 0, 491, 192, 0, 493, 193, + 494, 0, 0, 495, 195, 0, 196, 197, 198, 199, + 200, 0, 0, 201, 2414, 0, 0, 202, 2410, 0, + 146, 0, 203, 205, 204, 206, 207, 147, 0, 148, + 0, 0, 0, 208, 0, 0, 0, 209, 0, 0, + 210, 212, 211, 0, 213, 0, 149, 150, 0, 0, + 214, 0, 0, 215, 216, 0, 217, 151, 0, 152, + 0, 218, 220, 219, 153, 221, 222, 0, 223, 226, + 0, 225, 224, 154, 227, 155, 228, 229, 230, 231, + 0, 232, 233, 0, 234, 236, 235, 156, 237, 0, + 0, 0, 238, 0, 0, 239, 0, 240, 0, 0, + 241, 0, 0, 0, 243, 242, 244, 0, 0, 245, + 0, 0, 0, 0, 246, 157, 0, 0, 0, 0, + 247, 248, 0, 249, 0, 0, 0, 250, 0, 251, + 252, 253, 254, 255, 0, 0, 0, 158, 0, 0, + 2363, 257, 258, 0, 0, 0, 278, 0, 159, 259, + 0, 262, 261, 260, 0, 0, 263, 264, 0, 265, + 267, 266, 268, 269, 160, 0, 0, 270, 271, 272, + 273, 274, 0, 0, 276, 275, 0, 280, 281, 282, + 0, 0, 161, 0, 0, 0, 162, 277, 0, 279, + 0, 476, 0, 283, 285, 284, 286, 0, 288, 0, + 287, 0, 0, 0, 163, 289, 0, 164, 0, 0, + 165, 290, 0, 0, 0, 291, 143, 292, 144, 0, + 0, 293, 295, 296, 0, 0, 297, 0, 0, 0, + 0, 302, 166, 0, 0, 0, 294, 0, 0, 0, + 298, 299, 0, 300, 301, 0, 0, 0, 303, 0, + 0, 167, 304, 0, 0, 305, 0, 0, 306, 307, + 693, 0, 0, 0, 0, 308, 309, 0, 310, 0, + 311, 0, 312, 313, 0, 0, 0, 0, 0, 0, + 0, 335, 0, 324, 326, 317, 319, 320, 322, 318, + 325, 323, 329, 328, 330, 331, 332, 333, 334, 327, + 0, 315, 321, 316, 0, 336, 337, 314, 338, 0, + 339, 340, 0, 0, 0, 0, 341, 342, 343, 344, + 345, 346, 0, 0, 347, 348, 0, 350, 0, 349, + 0, 351, 352, 353, 354, 355, 356, 358, 357, 359, + 0, 0, 360, 361, 0, 0, 363, 362, 365, 366, + 0, 0, 0, 168, 364, 0, 0, 0, 367, 0, + 368, 369, 370, 0, 371, 372, 169, 0, 170, 0, + 0, 0, 0, 0, 0, 0, 2362, 0, 171, 373, + 374, 0, 172, 375, 0, 377, 376, 378, 379, 380, + 381, 382, 383, 384, 173, 0, 0, 174, 385, 386, + 0, 387, 0, 388, 389, 390, 391, 392, 0, 393, + 394, 395, 0, 0, 396, 0, 0, 0, 397, 398, + 400, 399, 401, 0, 0, 402, 403, 404, 405, 406, + 0, 407, 175, 0, 408, 176, 409, 0, 0, 410, + 0, 177, 0, 411, 178, 0, 412, 413, 414, 0, + 415, 0, 0, 179, 416, 417, 418, 420, 421, 419, + 422, 180, 423, 424, 0, 425, 181, 0, 0, 0, + 427, 426, 428, 182, 0, 0, 0, 430, 0, 0, + 0, 431, 0, 183, 429, 185, 432, 0, 433, 184, + 186, 434, 435, 0, 0, 0, 0, 0, 436, 437, + 438, 0, 440, 439, 0, 441, 0, 0, 442, 0, + 0, 443, 187, 444, 445, 446, 447, 0, 0, 188, + 448, 0, 449, 450, 451, 452, 454, 453, 0, 0, + 455, 456, 457, 458, 0, 460, 462, 0, 0, 461, + 459, 463, 464, 0, 138, 465, 466, 0, 469, 470, + 471, 472, 0, 0, 0, 0, 0, 467, 468, 0, + 0, 0, 189, 473, 474, 475, 0, 477, 478, 0, + 480, 479, 0, 190, 191, 0, 0, 481, 0, 0, + 482, 0, 194, 0, 483, 484, 0, 0, 0, 0, + 0, 0, 487, 0, 0, 485, 0, 0, 0, 486, + 489, 488, 490, 492, 0, 0, 0, 0, 0, 0, + 491, 192, 0, 493, 193, 494, 0, 195, 495, 196, + 197, 198, 199, 200, 0, 0, 201, 0, 0, 0, + 202, 2367, 0, 146, 0, 203, 205, 204, 206, 207, + 147, 0, 148, 0, 0, 0, 208, 0, 0, 0, + 209, 0, 0, 210, 212, 211, 0, 213, 0, 149, + 150, 0, 0, 214, 0, 0, 215, 216, 0, 217, + 151, 0, 152, 0, 218, 220, 219, 153, 221, 222, + 0, 223, 226, 0, 225, 224, 154, 227, 155, 228, + 229, 230, 231, 0, 232, 233, 0, 234, 236, 235, + 156, 237, 0, 0, 0, 238, 0, 0, 239, 0, + 240, 0, 0, 241, 0, 0, 0, 243, 242, 244, + 0, 0, 245, 0, 0, 0, 0, 246, 157, 0, + 0, 0, 0, 247, 248, 0, 249, 0, 0, 0, + 250, 0, 251, 252, 253, 254, 255, 0, 0, 0, + 158, 0, 0, 256, 257, 258, 0, 0, 0, 278, + 0, 159, 259, 0, 262, 261, 260, 0, 0, 263, + 264, 0, 265, 267, 266, 268, 269, 160, 0, 0, + 270, 271, 272, 273, 274, 0, 0, 276, 275, 0, + 280, 281, 282, 0, 0, 161, 0, 0, 0, 162, + 277, 0, 279, 0, 476, 0, 283, 285, 284, 286, + 0, 288, 0, 287, 0, 0, 0, 163, 289, 0, + 164, 0, 0, 165, 290, 0, 0, 0, 291, 143, + 292, 144, 0, 0, 293, 295, 296, 0, 0, 297, + 0, 0, 0, 0, 302, 166, 0, 0, 0, 294, + 0, 0, 0, 298, 299, 0, 300, 301, 0, 0, + 0, 303, 0, 0, 167, 304, 0, 0, 305, 0, + 0, 306, 307, 0, 0, 0, 0, 0, 308, 309, + 0, 310, 0, 311, 0, 312, 313, 0, 0, 0, + 0, 0, 0, 0, 335, 0, 324, 326, 317, 319, + 320, 322, 318, 325, 323, 329, 328, 330, 331, 332, + 333, 334, 327, 0, 315, 321, 316, 0, 336, 337, + 314, 338, 0, 339, 340, 0, 0, 0, 0, 341, + 342, 343, 344, 345, 346, 0, 0, 347, 348, 0, + 350, 0, 349, 0, 351, 352, 353, 354, 355, 356, + 358, 357, 359, 0, 0, 360, 361, 0, 0, 363, + 362, 365, 366, 0, 0, 0, 168, 364, 0, 0, + 0, 367, 0, 368, 369, 370, 0, 371, 372, 169, + 0, 170, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 171, 373, 374, 0, 172, 375, 0, 377, 376, + 378, 379, 380, 381, 382, 383, 384, 173, 0, 0, + 174, 385, 386, 0, 387, 0, 388, 389, 390, 391, + 392, 0, 393, 394, 395, 0, 0, 396, 0, 0, + 0, 397, 398, 400, 399, 401, 0, 0, 402, 403, + 404, 405, 406, 0, 407, 175, 0, 408, 176, 409, + 0, 0, 410, 0, 177, 0, 411, 178, 0, 412, + 413, 414, 0, 415, 0, 0, 179, 416, 417, 418, + 420, 421, 419, 422, 180, 423, 424, 0, 425, 181, + 0, 0, 0, 427, 426, 428, 182, 0, 0, 0, + 430, 0, 0, 0, 431, 0, 183, 429, 185, 432, + 0, 433, 184, 186, 434, 435, 0, 0, 0, 0, + 0, 436, 437, 438, 0, 440, 439, 0, 441, 0, + 0, 442, 0, 0, 443, 187, 444, 445, 446, 447, + 0, 0, 188, 448, 0, 449, 450, 451, 452, 454, + 453, 0, 0, 455, 456, 457, 458, 0, 460, 462, + 0, 0, 461, 459, 463, 464, 0, 0, 465, 466, + 0, 469, 470, 471, 472, 0, 0, 0, 0, 0, + 467, 468, 0, 0, 0, 189, 473, 474, 475, 0, + 477, 478, 0, 480, 479, 0, 190, 191, 0, 0, + 481, 0, 0, 482, 0, 194, 0, 483, 484, 0, + 0, 0, 0, 0, 0, 487, 0, 0, 485, 0, + 0, 0, 486, 489, 488, 490, 492, 0, 0, 0, + 0, 0, 0, 491, 192, 0, 493, 193, 494, 0, + 0, 495, 195, 0, 196, 197, 198, 199, 200, 0, + 0, 201, 652, 0, 0, 202, 968, 0, 146, 0, + 203, 205, 204, 206, 207, 147, 0, 148, 0, 0, + 0, 208, 0, 0, 0, 209, 0, 0, 210, 212, + 211, 0, 213, 0, 149, 150, 0, 0, 214, 0, + 0, 215, 216, 0, 217, 151, 0, 152, 0, 218, + 220, 219, 153, 221, 222, 0, 223, 226, 0, 225, + 224, 154, 227, 155, 228, 229, 230, 231, 0, 232, + 233, 0, 234, 236, 235, 156, 237, 0, 0, 0, + 238, 0, 0, 239, 0, 240, 0, 0, 241, 0, + 0, 0, 243, 242, 244, 0, 0, 245, 0, 0, + 0, 0, 246, 157, 0, 0, 0, 0, 247, 248, + 0, 249, 0, 0, 0, 250, 0, 251, 252, 253, + 254, 255, 0, 0, 0, 158, 0, 0, 256, 257, + 258, 0, 0, 0, 278, 0, 159, 259, 0, 262, + 261, 260, 0, 0, 263, 264, 0, 265, 267, 266, + 268, 269, 160, 0, 0, 270, 271, 272, 273, 274, + 0, 0, 276, 275, 0, 280, 281, 282, 0, 0, + 161, 0, 0, 0, 162, 277, 0, 279, 0, 476, + 0, 283, 285, 284, 286, 0, 288, 0, 287, 0, + 0, 0, 163, 289, 0, 164, 0, 0, 165, 290, + 0, 0, 0, 291, 143, 292, 144, 0, 0, 293, + 295, 296, 0, 0, 297, 0, 0, 0, 0, 302, + 166, 0, 0, 0, 294, 0, 0, 0, 298, 299, + 0, 300, 301, 0, 0, 0, 303, 0, 0, 167, + 304, 0, 0, 305, 0, 0, 306, 307, 693, 0, + 0, 0, 0, 308, 309, 0, 310, 0, 311, 0, + 312, 313, 0, 0, 0, 0, 0, 0, 0, 335, + 0, 324, 326, 317, 319, 320, 322, 318, 325, 323, + 329, 328, 330, 331, 332, 333, 334, 327, 0, 315, + 321, 316, 0, 336, 337, 314, 338, 0, 339, 340, + 0, 0, 0, 0, 341, 342, 343, 344, 345, 346, + 0, 0, 347, 348, 0, 350, 0, 349, 0, 351, + 352, 353, 354, 355, 356, 358, 357, 359, 0, 0, + 360, 361, 0, 0, 363, 362, 365, 366, 0, 0, + 0, 168, 364, 0, 0, 0, 367, 0, 368, 369, + 370, 0, 371, 372, 169, 0, 170, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 171, 373, 374, 0, + 172, 375, 0, 377, 376, 378, 379, 380, 381, 382, + 383, 384, 173, 0, 0, 174, 385, 386, 0, 387, + 0, 388, 389, 390, 391, 392, 0, 393, 394, 395, + 0, 0, 396, 0, 0, 0, 397, 398, 400, 399, + 401, 0, 0, 402, 403, 404, 405, 406, 0, 407, + 175, 0, 408, 176, 409, 0, 0, 410, 0, 177, + 0, 411, 178, 0, 412, 413, 414, 0, 415, 0, + 0, 179, 416, 417, 418, 420, 421, 419, 422, 180, + 423, 424, 0, 425, 181, 0, 0, 0, 427, 426, + 428, 182, 0, 0, 0, 430, 0, 0, 0, 431, + 0, 183, 429, 185, 432, 0, 433, 184, 186, 434, + 435, 0, 0, 0, 0, 0, 436, 437, 438, 0, + 440, 439, 0, 441, 0, 0, 442, 0, 0, 443, + 187, 444, 445, 446, 447, 0, 0, 188, 448, 0, + 449, 450, 451, 452, 454, 453, 0, 0, 455, 456, + 457, 458, 0, 460, 462, 0, 0, 461, 459, 463, + 464, 0, 138, 465, 466, 0, 469, 470, 471, 472, + 0, 0, 0, 0, 0, 467, 468, 0, 0, 0, + 189, 473, 474, 475, 0, 477, 478, 0, 480, 479, + 0, 190, 191, 0, 0, 481, 0, 0, 482, 0, + 194, 0, 483, 484, 0, 0, 0, 0, 0, 0, + 487, 0, 0, 485, 0, 0, 0, 486, 489, 488, + 490, 492, 0, 0, 0, 0, 0, 0, 491, 192, + 0, 493, 193, 494, 0, 195, 495, 196, 197, 198, + 199, 200, 0, 0, 201, 0, 0, 0, 202, 2367, + 0, 146, 0, 203, 205, 204, 206, 207, 147, 0, + 148, 0, 0, 0, 208, 0, 0, 0, 209, 0, + 0, 210, 212, 211, 0, 213, 0, 149, 150, 0, + 0, 214, 0, 0, 215, 216, 0, 217, 752, 751, + 152, 0, 218, 220, 219, 153, 221, 222, 0, 223, + 226, 0, 225, 224, 154, 227, 155, 228, 229, 230, + 231, 0, 232, 233, 0, 234, 236, 235, 156, 237, + 0, 0, 0, 238, 0, 0, 239, 0, 240, 0, + 0, 241, 0, 0, 0, 243, 242, 244, 0, 0, + 245, 0, 0, 0, 0, 246, 157, 0, 0, 0, + 750, 247, 248, 0, 249, 0, 0, 0, 250, 0, + 251, 252, 253, 254, 255, 0, 0, 0, 158, 0, + 0, 256, 257, 258, 0, 0, 0, 278, 0, 159, + 259, 0, 262, 261, 260, 0, 0, 263, 264, 0, + 265, 267, 266, 268, 269, 160, 0, 0, 270, 271, + 272, 273, 274, 0, 0, 276, 275, 0, 280, 281, + 282, 0, 0, 161, 0, 0, 0, 162, 277, 0, + 279, 0, 476, 0, 283, 285, 284, 286, 0, 746, + 0, 287, 0, 0, 0, 163, 289, 0, 164, 0, + 0, 165, 290, 0, 0, 0, 291, 143, 292, 144, + 0, 0, 293, 295, 296, 0, 0, 297, 0, 0, + 0, 0, 302, 166, 0, 0, 0, 294, 0, 0, + 0, 298, 299, 0, 300, 301, 0, 0, 0, 303, + 0, 0, 167, 304, 0, 0, 305, 0, 0, 306, + 307, 0, 0, 0, 0, 0, 308, 309, 0, 747, + 0, 311, 0, 312, 313, 0, 0, 0, 0, 0, + 0, 0, 335, 0, 324, 326, 317, 319, 320, 322, + 318, 325, 323, 329, 328, 330, 331, 332, 333, 334, + 327, 0, 315, 321, 316, 0, 336, 337, 314, 338, + 0, 339, 340, 0, 0, 0, 0, 341, 342, 343, + 344, 345, 346, 0, 0, 347, 348, 0, 350, 0, + 349, 0, 351, 352, 353, 354, 355, 356, 744, 357, + 359, 0, 0, 360, 361, 0, 0, 363, 362, 365, + 366, 0, 0, 0, 168, 364, 0, 0, 0, 367, + 0, 368, 369, 370, 0, 371, 372, 169, 0, 170, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 171, + 373, 374, 0, 172, 375, 0, 377, 376, 745, 379, + 380, 381, 382, 383, 384, 173, 0, 0, 174, 385, + 386, 0, 387, 0, 388, 389, 390, 391, 392, 0, + 393, 394, 395, 0, 0, 396, 0, 0, 0, 397, + 398, 400, 399, 401, 0, 0, 402, 403, 404, 405, + 406, 0, 407, 175, 0, 408, 176, 409, 0, 0, + 410, 0, 177, 0, 411, 178, 0, 412, 413, 414, + 0, 415, 0, 0, 179, 416, 417, 418, 420, 421, + 419, 422, 180, 423, 424, 0, 425, 181, 0, 0, + 0, 427, 426, 748, 182, 0, 0, 0, 430, 0, + 0, 0, 431, 0, 183, 429, 185, 432, 0, 433, + 184, 186, 434, 435, 0, 0, 0, 0, 0, 436, + 437, 438, 0, 440, 439, 0, 441, 0, 0, 442, + 0, 0, 443, 187, 444, 445, 446, 447, 0, 0, + 188, 448, 0, 449, 450, 451, 452, 454, 453, 0, + 0, 455, 456, 457, 458, 0, 460, 462, 0, 0, + 461, 459, 463, 464, 0, 0, 465, 466, 0, 469, + 470, 471, 472, 0, 0, 0, 0, 0, 467, 468, + 0, 0, 0, 189, 473, 474, 475, 0, 477, 478, + 0, 480, 479, 0, 190, 191, 0, 0, 481, 0, + 0, 482, 0, 194, 0, 483, 484, 0, 0, 0, + 0, 0, 0, 487, 0, 0, 485, 0, 0, 0, + 486, 489, 488, 490, 492, 0, 0, 0, 0, 0, + 0, 491, 192, 0, 493, 193, 494, 0, 195, 495, + 196, 197, 198, 199, 200, 0, 0, 201, 0, 0, + 0, 202, 742, 0, 146, 0, 203, 205, 204, 206, + 207, 147, 0, 148, 0, 0, 0, 208, 0, 0, + 0, 209, 0, 0, 210, 212, 211, 0, 213, 0, + 149, 150, 0, 0, 214, 0, 0, 215, 216, 0, + 217, 151, 0, 152, 0, 218, 220, 219, 153, 221, + 222, 0, 223, 226, 0, 225, 224, 154, 227, 155, + 228, 229, 230, 231, 0, 232, 233, 0, 234, 236, + 235, 156, 237, 0, 0, 0, 238, 0, 0, 239, + 0, 240, 0, 0, 241, 0, 0, 0, 243, 242, + 244, 0, 0, 245, 0, 0, 0, 0, 246, 157, + 0, 0, 0, 0, 247, 248, 0, 249, 0, 0, + 0, 250, 0, 251, 252, 253, 254, 255, 0, 0, + 0, 158, 0, 0, 256, 257, 258, 0, 0, 0, + 278, 0, 159, 259, 0, 262, 261, 260, 0, 0, + 263, 264, 0, 265, 267, 266, 268, 269, 160, 0, + 0, 270, 271, 272, 273, 274, 0, 0, 276, 275, + 0, 280, 281, 282, 0, 0, 161, 0, 0, 0, + 162, 277, 0, 279, 0, 476, 0, 283, 285, 284, + 286, 0, 288, 0, 287, 0, 0, 0, 163, 289, + 0, 164, 0, 0, 165, 290, 0, 0, 0, 291, + 143, 292, 144, 0, 0, 293, 295, 296, 0, 0, + 297, 0, 0, 0, 0, 302, 166, 0, 0, 0, + 294, 0, 0, 0, 298, 299, 0, 300, 301, 0, + 0, 0, 303, 0, 0, 167, 304, 0, 0, 305, + 0, 0, 306, 307, 693, 0, 0, 0, 0, 308, + 309, 0, 310, 0, 311, 0, 312, 313, 0, 0, + 0, 0, 0, 0, 0, 335, 0, 324, 326, 317, + 319, 320, 322, 318, 325, 323, 329, 328, 330, 331, + 332, 333, 334, 327, 0, 315, 321, 316, 0, 336, + 337, 314, 338, 0, 339, 340, 0, 0, 0, 0, + 341, 342, 343, 344, 345, 346, 0, 0, 347, 348, + 0, 350, 0, 349, 0, 351, 352, 353, 354, 355, + 356, 358, 357, 359, 0, 0, 360, 361, 0, 0, + 363, 362, 365, 366, 0, 0, 0, 168, 364, 0, + 0, 0, 367, 0, 368, 369, 370, 0, 371, 372, + 169, 0, 170, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 171, 373, 374, 0, 172, 375, 0, 377, + 376, 378, 379, 380, 381, 382, 383, 384, 173, 0, + 0, 174, 385, 386, 0, 387, 0, 388, 389, 390, + 391, 392, 0, 393, 394, 395, 0, 0, 396, 0, + 0, 0, 397, 398, 400, 399, 401, 0, 0, 402, + 403, 404, 405, 406, 0, 407, 175, 0, 408, 176, + 409, 0, 0, 410, 0, 177, 0, 411, 178, 0, + 412, 413, 414, 0, 415, 0, 0, 179, 416, 417, + 418, 420, 421, 419, 422, 180, 423, 424, 0, 425, + 181, 0, 0, 0, 427, 426, 428, 182, 0, 0, + 0, 430, 0, 0, 0, 431, 0, 183, 429, 185, + 432, 0, 433, 184, 186, 434, 435, 0, 0, 0, + 0, 0, 436, 437, 438, 0, 440, 439, 0, 441, + 0, 0, 442, 0, 0, 443, 187, 444, 445, 446, + 447, 0, 0, 188, 448, 0, 449, 450, 451, 452, + 454, 453, 0, 0, 455, 456, 457, 458, 0, 460, + 462, 0, 0, 461, 459, 463, 464, 0, 138, 465, + 466, 0, 469, 470, 471, 472, 0, 0, 0, 0, + 0, 467, 468, 0, 0, 0, 189, 473, 474, 475, + 0, 477, 478, 0, 480, 479, 0, 190, 191, 0, + 0, 481, 0, 0, 482, 0, 194, 0, 483, 484, + 0, 0, 0, 0, 0, 0, 487, 0, 0, 485, + 0, 0, 0, 486, 489, 488, 490, 492, 0, 0, + 0, 0, 0, 0, 491, 192, 0, 493, 193, 494, + 0, 195, 495, 196, 197, 198, 199, 200, 0, 0, + 201, 0, 0, 0, 202, 1196, 0, 146, 0, 203, + 205, 204, 206, 207, 147, 0, 148, 0, 0, 0, + 208, 0, 0, 0, 209, 0, 0, 210, 212, 211, + 0, 213, 0, 149, 150, 0, 0, 214, 0, 0, + 215, 216, 0, 217, 151, 0, 152, 0, 218, 220, + 219, 153, 221, 222, 0, 223, 226, 0, 225, 224, + 154, 227, 155, 228, 229, 230, 231, 0, 232, 233, + 0, 234, 236, 235, 156, 237, 0, 0, 0, 238, + 0, 0, 239, 0, 240, 0, 0, 241, 0, 0, + 0, 243, 242, 244, 0, 0, 245, 0, 0, 0, + 0, 246, 157, 0, 0, 0, 0, 247, 248, 0, + 249, 0, 0, 0, 250, 0, 251, 252, 253, 254, + 255, 0, 0, 0, 158, 0, 0, 256, 257, 258, + 0, 0, 0, 278, 0, 159, 259, 0, 262, 261, + 260, 0, 0, 263, 264, 0, 265, 267, 266, 268, + 269, 160, 0, 0, 270, 271, 272, 273, 274, 0, + 0, 276, 275, 0, 280, 281, 282, 0, 0, 161, + 0, 0, 0, 162, 277, 0, 279, 0, 476, 0, + 283, 285, 284, 286, 0, 288, 0, 287, 0, 0, + 0, 163, 289, 0, 164, 0, 0, 165, 290, 0, + 0, 0, 291, 143, 292, 144, 0, 0, 293, 295, + 296, 0, 0, 297, 0, 0, 0, 0, 302, 166, + 0, 0, 0, 294, 0, 0, 0, 298, 299, 0, + 300, 301, 0, 0, 0, 303, 0, 0, 167, 304, + 0, 0, 305, 0, 0, 306, 307, 693, 0, 0, + 0, 0, 308, 309, 0, 310, 0, 311, 0, 312, + 313, 0, 0, 0, 0, 0, 0, 0, 335, 0, + 324, 326, 317, 319, 320, 322, 318, 325, 323, 329, + 328, 330, 331, 332, 333, 334, 327, 0, 315, 321, + 316, 0, 336, 337, 314, 338, 0, 339, 340, 0, + 0, 0, 0, 341, 342, 343, 344, 345, 346, 0, + 0, 347, 348, 0, 350, 0, 349, 0, 351, 352, + 353, 354, 355, 356, 358, 357, 359, 0, 0, 360, + 361, 0, 0, 363, 362, 365, 366, 0, 0, 0, + 168, 364, 0, 0, 0, 367, 0, 368, 369, 370, + 0, 371, 372, 169, 0, 170, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 171, 373, 374, 0, 172, + 375, 0, 377, 376, 378, 379, 380, 381, 382, 383, + 384, 173, 0, 0, 174, 385, 386, 0, 387, 0, + 388, 389, 390, 391, 392, 0, 393, 394, 395, 0, + 0, 396, 0, 0, 0, 397, 398, 400, 399, 401, + 0, 0, 402, 403, 404, 405, 406, 0, 407, 175, + 0, 408, 176, 409, 0, 0, 410, 0, 177, 0, + 411, 178, 0, 412, 413, 414, 0, 415, 0, 0, + 179, 416, 417, 418, 420, 421, 419, 422, 180, 423, + 424, 0, 425, 181, 0, 0, 0, 427, 426, 428, + 182, 0, 0, 0, 430, 0, 0, 0, 431, 0, + 183, 429, 185, 432, 0, 433, 184, 186, 434, 435, + 0, 0, 0, 0, 0, 436, 437, 438, 0, 440, + 439, 0, 441, 0, 0, 442, 0, 0, 443, 187, + 444, 445, 446, 447, 0, 0, 188, 448, 0, 449, + 450, 451, 452, 454, 453, 0, 0, 455, 456, 457, + 458, 0, 460, 462, 0, 0, 461, 459, 463, 464, + 0, 138, 465, 466, 0, 469, 470, 471, 472, 0, + 0, 0, 0, 0, 467, 468, 0, 0, 0, 189, + 473, 474, 475, 0, 477, 478, 0, 480, 479, 0, + 190, 191, 0, 0, 481, 0, 0, 482, 0, 194, + 0, 483, 484, 0, 0, 0, 0, 0, 0, 487, + 0, 0, 485, 0, 0, 0, 486, 489, 488, 490, + 492, 0, 0, 0, 0, 0, 0, 491, 192, 0, + 493, 193, 494, 0, 195, 495, 196, 197, 198, 199, + 200, 0, 0, 201, 0, 0, 0, 202, 1044, 0, + 146, 0, 203, 205, 204, 206, 207, 147, 0, 148, + 0, 0, 0, 208, 0, 0, 0, 209, 0, 0, + 210, 212, 211, 0, 213, 0, 149, 150, 0, 0, + 214, 0, 0, 215, 216, 0, 217, 752, 751, 152, + 0, 218, 220, 219, 153, 221, 222, 0, 223, 226, + 0, 225, 224, 154, 227, 155, 228, 229, 230, 231, + 0, 232, 233, 0, 234, 236, 235, 156, 237, 0, + 0, 0, 238, 0, 0, 239, 0, 240, 0, 0, + 241, 0, 0, 0, 243, 242, 244, 0, 0, 245, + 0, 0, 0, 0, 246, 157, 0, 0, 0, 750, + 247, 248, 0, 249, 0, 0, 0, 250, 0, 251, + 252, 253, 254, 255, 0, 0, 0, 158, 0, 0, + 256, 257, 258, 0, 0, 0, 278, 0, 159, 259, + 0, 262, 261, 260, 0, 0, 263, 264, 0, 265, + 267, 266, 268, 269, 160, 0, 0, 270, 271, 272, + 273, 274, 0, 0, 276, 275, 0, 280, 281, 282, + 0, 0, 161, 0, 0, 0, 162, 277, 0, 279, + 0, 476, 0, 283, 285, 284, 286, 0, 746, 0, + 287, 0, 0, 0, 163, 289, 0, 164, 0, 0, + 165, 290, 0, 0, 0, 291, 143, 292, 144, 0, + 0, 293, 295, 296, 0, 0, 297, 0, 0, 0, + 0, 302, 166, 0, 0, 0, 294, 0, 0, 0, + 298, 299, 0, 300, 301, 0, 0, 0, 303, 0, + 0, 167, 304, 0, 0, 305, 0, 0, 306, 307, + 0, 0, 0, 0, 0, 308, 309, 0, 747, 0, + 311, 0, 312, 313, 0, 0, 0, 0, 0, 0, + 0, 335, 0, 324, 326, 317, 319, 320, 322, 318, + 325, 323, 329, 328, 330, 331, 332, 333, 334, 327, + 0, 315, 321, 316, 0, 336, 337, 314, 338, 0, + 339, 340, 0, 0, 0, 0, 341, 342, 343, 344, + 345, 346, 0, 0, 347, 348, 0, 350, 0, 349, + 0, 351, 352, 353, 354, 355, 356, 744, 357, 359, + 0, 0, 360, 361, 0, 0, 363, 362, 365, 366, + 0, 0, 0, 168, 364, 0, 0, 0, 367, 0, + 368, 369, 370, 0, 371, 372, 169, 0, 170, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 171, 373, + 374, 0, 172, 375, 0, 377, 376, 745, 379, 380, + 381, 382, 383, 384, 173, 0, 0, 174, 385, 386, + 0, 387, 0, 388, 389, 390, 391, 392, 0, 393, + 394, 395, 0, 0, 396, 0, 0, 0, 397, 398, + 400, 399, 401, 0, 0, 402, 403, 404, 405, 406, + 0, 407, 175, 0, 408, 176, 409, 0, 0, 410, + 0, 177, 0, 411, 178, 0, 412, 413, 414, 0, + 415, 0, 0, 179, 416, 417, 418, 420, 421, 419, + 422, 180, 423, 424, 0, 425, 181, 0, 0, 0, + 427, 426, 748, 182, 0, 0, 0, 430, 0, 0, + 0, 431, 0, 183, 429, 185, 432, 0, 433, 184, + 186, 434, 435, 0, 0, 0, 0, 0, 436, 437, + 438, 0, 440, 439, 0, 441, 0, 0, 442, 0, + 0, 443, 187, 444, 445, 446, 447, 0, 0, 188, + 448, 0, 449, 450, 451, 452, 454, 453, 0, 0, + 455, 456, 457, 458, 0, 460, 462, 0, 0, 461, + 459, 463, 464, 0, 0, 465, 466, 0, 469, 470, + 471, 472, 0, 0, 0, 0, 0, 739, 468, 0, + 0, 0, 189, 473, 474, 475, 0, 477, 478, 0, + 480, 479, 0, 190, 191, 0, 0, 481, 0, 0, + 482, 0, 194, 0, 483, 484, 0, 0, 0, 0, + 0, 0, 487, 0, 0, 485, 0, 0, 0, 486, + 489, 488, 490, 492, 0, 0, 0, 0, 0, 0, + 491, 192, 0, 493, 193, 494, 0, 195, 495, 196, + 197, 198, 199, 200, 0, 0, 201, 0, 0, 0, + 202, 742, 0, 146, 0, 203, 205, 204, 206, 207, + 147, 0, 148, 0, 0, 0, 208, 0, 0, 0, + 209, 0, 0, 210, 212, 211, 0, 213, 0, 149, + 150, 0, 0, 214, 0, 0, 215, 216, 0, 217, + 151, 0, 152, 0, 218, 220, 219, 153, 221, 222, + 0, 223, 226, 0, 225, 224, 154, 227, 155, 228, + 229, 230, 231, 0, 232, 233, 0, 234, 236, 235, + 156, 237, 0, 0, 0, 238, 0, 0, 239, 0, + 240, 0, 0, 241, 0, 0, 0, 243, 242, 244, + 0, 0, 245, 0, 0, 0, 0, 246, 157, 0, + 0, 0, 0, 247, 248, 0, 249, 0, 0, 0, + 250, 0, 251, 252, 253, 254, 255, 0, 0, 0, + 158, 0, 0, 256, 257, 258, 0, 0, 0, 278, + 0, 159, 259, 0, 262, 261, 260, 0, 0, 263, + 264, 0, 265, 267, 266, 268, 269, 160, 0, 0, + 270, 271, 272, 273, 274, 0, 0, 276, 275, 0, + 280, 281, 282, 0, 0, 161, 0, 0, 0, 162, + 277, 0, 279, 0, 476, 0, 283, 285, 284, 286, + 0, 288, 0, 287, 0, 0, 0, 163, 289, 0, + 164, 0, 0, 165, 290, 0, 0, 0, 291, 143, + 292, 144, 0, 0, 293, 295, 296, 0, 0, 297, + 0, 0, 0, 0, 302, 166, 0, 0, 0, 294, + 0, 0, 0, 298, 299, 0, 300, 301, 0, 0, + 0, 303, 0, 0, 167, 304, 0, 0, 305, 0, + 0, 306, 307, 0, 0, 0, 0, 0, 308, 309, + 0, 310, 0, 311, 0, 312, 313, 0, 0, 0, + 0, 0, 0, 0, 335, 0, 324, 326, 317, 319, + 320, 322, 318, 325, 323, 329, 328, 330, 331, 332, + 333, 334, 327, 0, 315, 321, 316, 0, 336, 337, + 314, 338, 0, 339, 340, 0, 0, 0, 0, 341, + 342, 343, 344, 345, 346, 0, 0, 347, 348, 0, + 350, 0, 349, 0, 351, 352, 353, 354, 355, 356, + 358, 357, 359, 0, 0, 360, 361, 0, 0, 363, + 362, 365, 366, 0, 0, 0, 168, 364, 0, 0, + 0, 367, 0, 368, 369, 370, 0, 371, 372, 169, + 0, 170, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 171, 373, 374, 0, 172, 375, 0, 377, 376, + 378, 379, 380, 381, 382, 383, 384, 173, 0, 0, + 174, 385, 386, 0, 387, 0, 388, 389, 390, 391, + 392, 0, 393, 394, 395, 0, 0, 396, 0, 0, + 0, 397, 398, 400, 399, 401, 0, 0, 402, 403, + 404, 405, 406, 0, 407, 175, 0, 408, 176, 409, + 0, 0, 410, 0, 177, 0, 411, 178, 0, 412, + 413, 414, 0, 415, 0, 0, 179, 416, 417, 418, + 420, 421, 419, 422, 180, 423, 424, 0, 425, 181, + 0, 0, 0, 427, 426, 428, 182, 0, 0, 0, + 430, 0, 0, 0, 431, 0, 183, 429, 185, 432, + 0, 433, 184, 186, 434, 435, 0, 0, 0, 0, + 0, 436, 437, 438, 0, 440, 439, 0, 441, 0, + 0, 442, 0, 0, 443, 187, 444, 445, 446, 447, + 0, 0, 188, 448, 0, 449, 450, 451, 452, 454, + 453, 0, 0, 455, 456, 457, 458, 0, 460, 462, + 0, 0, 461, 459, 463, 464, 0, 0, 465, 466, + 0, 469, 470, 471, 472, 0, 0, 0, 0, 0, + 467, 468, 0, 0, 0, 189, 473, 474, 475, 0, + 477, 478, 0, 480, 479, 0, 190, 191, 0, 0, + 481, 0, 0, 482, 0, 194, 0, 483, 484, 0, + 0, 0, 0, 0, 0, 487, 0, 0, 485, 0, + 0, 0, 486, 489, 488, 490, 492, 0, 0, 0, + 0, 0, 0, 491, 192, 0, 493, 193, 494, 0, + 195, 495, 196, 197, 198, 199, 200, 0, 0, 201, + 0, 0, 652, 202, 4308, 0, 146, 0, 203, 205, + 204, 206, 207, 147, 0, 148, 0, 0, 0, 208, + 0, 0, 0, 209, 0, 0, 210, 212, 211, 0, + 213, 0, 149, 150, 0, 0, 214, 0, 0, 215, + 216, 0, 217, 151, 0, 152, 0, 218, 220, 219, + 153, 221, 222, 0, 223, 226, 0, 225, 224, 154, + 227, 155, 228, 229, 230, 231, 1631, 232, 233, 0, + 234, 236, 235, 156, 237, 0, 0, 0, 238, 0, + 0, 239, 0, 240, 0, 0, 241, 0, 0, 0, + 243, 242, 244, 0, 0, 245, 0, 0, 0, 0, + 246, 157, 0, 0, 0, 0, 247, 248, 0, 249, + 0, 0, 0, 250, 0, 251, 252, 253, 254, 255, + 0, 0, 0, 158, 0, 0, 256, 257, 258, 0, + 0, 0, 278, 0, 159, 259, 0, 262, 261, 260, + 0, 0, 263, 264, 0, 265, 267, 266, 268, 269, + 160, 0, 0, 270, 271, 272, 273, 274, 0, 0, + 276, 275, 0, 280, 281, 282, 0, 0, 161, 0, + 0, 0, 162, 277, 0, 279, 0, 476, 0, 283, + 285, 284, 286, 0, 288, 0, 287, 0, 0, 0, + 163, 289, 0, 164, 0, 0, 165, 290, 0, 0, + 0, 291, 143, 292, 144, 0, 0, 293, 295, 296, + 0, 0, 297, 0, 0, 0, 0, 302, 166, 0, + 0, 0, 294, 0, 0, 0, 298, 299, 0, 300, + 301, 0, 0, 0, 303, 0, 0, 167, 304, 0, + 0, 305, 0, 0, 306, 307, 0, 0, 0, 0, + 0, 308, 309, 0, 310, 0, 311, 0, 312, 313, + 0, 0, 0, 0, 0, 0, 0, 335, 0, 324, + 326, 317, 319, 320, 322, 318, 325, 323, 329, 328, + 330, 331, 332, 333, 334, 327, 0, 315, 321, 316, + 0, 336, 337, 314, 338, 0, 339, 340, 0, 0, + 0, 0, 341, 342, 343, 344, 345, 346, 0, 0, + 347, 348, 0, 350, 0, 349, 0, 351, 352, 353, + 354, 355, 356, 358, 357, 359, 0, 0, 360, 361, + 0, 0, 363, 362, 365, 366, 0, 0, 0, 168, + 364, 0, 0, 0, 367, 0, 368, 369, 370, 0, + 371, 372, 169, 0, 170, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 171, 373, 374, 0, 172, 375, + 0, 377, 376, 378, 379, 380, 381, 382, 383, 384, + 173, 0, 0, 174, 385, 386, 0, 387, 0, 388, + 389, 390, 391, 392, 0, 393, 394, 395, 0, 0, + 396, 0, 0, 0, 397, 398, 400, 399, 401, 0, + 0, 402, 403, 404, 405, 406, 0, 407, 175, 0, + 408, 176, 409, 0, 0, 410, 0, 177, 0, 411, + 178, 0, 412, 413, 414, 0, 415, 0, 0, 179, + 416, 417, 418, 420, 421, 419, 422, 180, 423, 424, + 0, 425, 181, 0, 0, 0, 427, 426, 428, 182, + 0, 0, 0, 430, 0, 0, 0, 431, 0, 183, + 429, 185, 432, 0, 433, 184, 186, 434, 435, 0, + 0, 0, 0, 0, 436, 437, 438, 0, 440, 439, + 0, 441, 0, 0, 442, 0, 0, 443, 187, 444, + 445, 446, 447, 0, 0, 188, 448, 0, 449, 450, + 451, 452, 454, 453, 0, 0, 455, 456, 457, 458, + 0, 460, 462, 0, 0, 461, 459, 463, 464, 0, + 0, 465, 466, 0, 469, 470, 471, 472, 0, 0, + 0, 0, 0, 467, 468, 0, 0, 0, 189, 473, + 474, 475, 0, 477, 478, 0, 480, 479, 0, 190, + 191, 0, 0, 481, 0, 0, 482, 0, 194, 0, + 483, 484, 0, 0, 0, 0, 0, 0, 487, 0, + 0, 485, 0, 0, 0, 486, 489, 488, 490, 492, + 0, 0, 0, 0, 0, 0, 491, 192, 0, 493, + 193, 494, 0, 195, 495, 196, 197, 198, 199, 200, + 0, 0, 201, 0, 0, 0, 202, 1635, 0, 146, + 0, 203, 205, 204, 206, 207, 147, 0, 148, 0, + 0, 0, 208, 0, 0, 0, 209, 0, 0, 210, + 212, 211, 0, 213, 0, 149, 150, 0, 0, 214, + 0, 0, 215, 216, 0, 217, 151, 0, 152, 0, + 218, 220, 219, 153, 221, 222, 0, 223, 226, 0, + 225, 224, 154, 227, 155, 228, 229, 230, 231, 0, + 232, 233, 0, 234, 236, 235, 156, 237, 0, 0, + 0, 238, 0, 0, 239, 0, 240, 0, 0, 241, + 0, 0, 0, 243, 242, 244, 0, 0, 245, 0, + 0, 0, 0, 246, 157, 0, 0, 0, 0, 247, + 248, 0, 249, 0, 0, 0, 250, 0, 251, 252, + 253, 254, 255, 0, 0, 0, 158, 0, 0, 256, + 257, 258, 0, 0, 0, 278, 0, 159, 259, 0, + 262, 261, 260, 0, 0, 263, 264, 0, 265, 267, + 266, 268, 269, 160, 0, 0, 270, 271, 272, 273, + 274, 0, 0, 276, 275, 0, 280, 281, 282, 0, + 0, 161, 0, 0, 0, 162, 277, 0, 279, 0, + 476, 0, 283, 285, 284, 286, 0, 288, 0, 287, + 0, 0, 0, 163, 289, 0, 164, 0, 0, 165, + 290, 0, 0, 0, 291, 143, 292, 144, 0, 0, + 293, 295, 296, 0, 0, 297, 0, 0, 0, 0, + 302, 166, 0, 0, 0, 294, 0, 0, 0, 298, + 299, 0, 300, 301, 0, 0, 0, 303, 0, 0, + 167, 304, 0, 0, 305, 0, 0, 306, 307, 0, + 0, 0, 0, 0, 308, 309, 0, 310, 0, 311, + 0, 312, 313, 0, 0, 0, 0, 0, 0, 0, + 335, 0, 324, 326, 317, 319, 320, 322, 318, 325, + 323, 329, 328, 330, 331, 332, 333, 334, 327, 0, + 315, 321, 316, 0, 336, 337, 314, 338, 0, 339, + 340, 0, 0, 0, 0, 341, 342, 343, 344, 345, + 346, 0, 0, 347, 348, 0, 350, 0, 349, 0, + 351, 352, 353, 354, 355, 356, 358, 357, 359, 0, + 0, 360, 361, 0, 0, 363, 362, 365, 366, 0, + 0, 0, 168, 364, 0, 0, 0, 367, 0, 368, + 369, 370, 0, 371, 372, 169, 0, 170, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 171, 373, 374, + 0, 172, 375, 0, 377, 376, 378, 379, 380, 381, + 382, 383, 384, 173, 0, 0, 174, 385, 386, 0, + 387, 0, 388, 389, 390, 391, 392, 0, 393, 394, + 395, 0, 0, 396, 0, 0, 0, 397, 398, 400, + 399, 401, 0, 0, 402, 403, 404, 405, 406, 0, + 407, 175, 0, 408, 176, 409, 0, 0, 410, 0, + 177, 0, 411, 178, 0, 412, 413, 414, 0, 415, + 0, 0, 179, 416, 417, 418, 420, 421, 419, 422, + 180, 423, 424, 0, 425, 181, 0, 0, 0, 427, + 426, 428, 182, 0, 0, 0, 430, 0, 0, 0, + 431, 0, 183, 429, 185, 432, 0, 433, 184, 186, + 434, 435, 0, 0, 0, 0, 0, 436, 437, 438, + 0, 440, 439, 0, 441, 0, 0, 442, 0, 0, + 443, 187, 444, 445, 446, 447, 0, 0, 188, 448, + 0, 449, 450, 451, 452, 454, 453, 0, 0, 455, + 456, 457, 458, 0, 460, 462, 0, 0, 461, 459, + 463, 464, 0, 0, 465, 466, 0, 469, 470, 471, + 472, 0, 0, 0, 0, 0, 467, 468, 0, 0, + 0, 189, 473, 474, 475, 0, 477, 478, 0, 480, + 479, 0, 190, 191, 0, 0, 481, 0, 0, 482, + 0, 194, 0, 483, 484, 0, 0, 0, 0, 0, + 0, 487, 0, 0, 485, 0, 0, 0, 486, 489, + 488, 490, 492, 0, 0, 0, 0, 0, 0, 491, + 192, 0, 493, 193, 494, 0, 195, 495, 196, 197, + 198, 199, 200, 0, 0, 201, 0, 0, 0, 202, + 1635, 0, 146, 0, 203, 205, 204, 206, 207, 147, + 0, 148, 0, 0, 0, 208, 0, 0, 0, 209, + 0, 0, 210, 212, 211, 0, 213, 0, 149, 150, + 0, 0, 214, 0, 0, 215, 216, 0, 217, 151, + 0, 152, 0, 218, 220, 219, 153, 221, 222, 0, + 223, 226, 0, 225, 224, 154, 227, 155, 228, 229, + 230, 231, 0, 232, 233, 0, 234, 236, 235, 156, + 237, 0, 0, 0, 238, 0, 0, 239, 0, 240, + 0, 0, 241, 0, 0, 0, 243, 242, 244, 0, + 0, 245, 0, 0, 0, 0, 246, 157, 0, 0, + 0, 0, 247, 248, 0, 249, 0, 0, 0, 250, + 0, 251, 252, 253, 254, 255, 0, 0, 0, 158, + 0, 0, 256, 257, 258, 0, 0, 0, 278, 0, + 159, 259, 0, 262, 261, 260, 0, 0, 263, 264, + 0, 265, 267, 266, 268, 269, 160, 0, 0, 270, + 271, 272, 273, 274, 0, 0, 276, 275, 0, 280, + 281, 282, 0, 0, 161, 0, 0, 0, 162, 277, + 0, 279, 0, 476, 0, 283, 285, 284, 286, 0, + 288, 0, 287, 0, 0, 0, 163, 289, 0, 164, + 0, 0, 165, 290, 0, 0, 0, 291, 143, 292, + 144, 0, 0, 293, 295, 296, 0, 0, 297, 0, + 0, 0, 0, 302, 166, 0, 0, 0, 294, 0, + 0, 0, 298, 299, 0, 300, 301, 0, 0, 0, + 303, 0, 0, 167, 304, 0, 0, 305, 0, 0, + 306, 307, 0, 0, 0, 0, 0, 308, 309, 0, + 310, 0, 311, 0, 312, 313, 0, 0, 0, 0, + 0, 0, 0, 335, 0, 324, 326, 317, 319, 320, + 322, 318, 325, 323, 329, 328, 330, 331, 332, 333, + 334, 327, 0, 315, 321, 316, 0, 336, 337, 314, + 338, 0, 339, 340, 0, 0, 0, 0, 341, 342, + 343, 344, 345, 346, 0, 0, 347, 348, 0, 350, + 0, 349, 0, 351, 352, 353, 354, 355, 356, 358, + 357, 359, 0, 0, 360, 361, 0, 0, 363, 362, + 365, 366, 0, 0, 0, 168, 364, 0, 0, 0, + 367, 0, 368, 369, 370, 0, 371, 372, 169, 0, + 170, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 171, 373, 374, 0, 172, 375, 0, 377, 376, 378, + 379, 380, 381, 382, 383, 384, 173, 0, 0, 174, + 385, 386, 0, 387, 0, 388, 389, 390, 391, 392, + 0, 393, 394, 395, 0, 0, 396, 0, 0, 0, + 397, 398, 400, 399, 401, 0, 0, 402, 403, 404, + 405, 406, 0, 407, 175, 0, 408, 176, 409, 0, + 0, 410, 0, 177, 0, 411, 178, 0, 412, 413, + 414, 0, 415, 0, 0, 179, 416, 417, 418, 420, + 421, 419, 422, 180, 423, 424, 0, 425, 181, 0, + 0, 0, 427, 426, 428, 182, 0, 0, 0, 430, + 0, 0, 0, 431, 0, 183, 429, 185, 432, 0, + 433, 184, 186, 434, 435, 0, 0, 0, 0, 0, + 436, 437, 438, 0, 440, 439, 0, 441, 0, 0, + 442, 0, 0, 443, 187, 444, 445, 446, 447, 0, + 0, 188, 448, 0, 449, 450, 451, 452, 454, 453, + 0, 0, 455, 456, 457, 458, 0, 460, 462, 0, + 0, 461, 459, 463, 464, 0, 0, 465, 466, 0, + 469, 470, 471, 472, 0, 0, 0, 0, 0, 467, + 468, 0, 0, 0, 189, 473, 474, 475, 0, 477, + 478, 0, 480, 479, 0, 190, 191, 0, 0, 481, + 0, 0, 482, 0, 194, 0, 483, 484, 0, 0, + 0, 0, 0, 0, 487, 0, 0, 485, 0, 0, + 0, 486, 489, 488, 490, 492, 0, 0, 0, 0, + 0, 0, 491, 192, 0, 493, 193, 494, 0, 195, + 495, 196, 197, 198, 199, 200, 2714, 0, 201, 0, + 0, 534, 202, 0, 0, 146, 0, 203, 205, 204, + 206, 207, 147, 0, 148, 0, 0, 0, 208, 0, + 0, 0, 209, 0, 0, 210, 212, 211, 0, 213, + 0, 149, 150, 0, 0, 214, 0, 0, 215, 216, + 0, 217, 151, 0, 152, 0, 218, 220, 219, 153, + 221, 222, 0, 223, 226, 0, 225, 224, 154, 227, + 155, 228, 229, 230, 231, 0, 232, 233, 0, 234, + 236, 235, 156, 237, 0, 0, 0, 238, 0, 0, + 239, 0, 240, 0, 0, 241, 0, 0, 0, 243, + 242, 244, 0, 0, 245, 0, 0, 0, 0, 246, + 157, 0, 0, 0, 0, 247, 248, 0, 249, 0, + 0, 0, 250, 0, 251, 252, 253, 254, 255, 0, + 0, 0, 158, 0, 0, 256, 257, 258, 0, 0, + 0, 278, 0, 159, 259, 0, 262, 261, 260, 0, + 0, 263, 264, 0, 265, 267, 266, 268, 269, 160, + 0, 0, 270, 271, 272, 273, 274, 0, 0, 276, + 275, 0, 280, 281, 282, 0, 0, 161, 0, 0, + 0, 162, 277, 0, 279, 0, 476, 0, 283, 285, + 284, 286, 0, 288, 0, 287, 0, 0, 0, 163, + 289, 0, 164, 0, 0, 165, 290, 0, 0, 0, + 291, 143, 292, 144, 0, 0, 293, 295, 296, 0, + 0, 297, 0, 0, 0, 0, 302, 166, 0, 1162, + 0, 294, 0, 0, 0, 298, 299, 0, 300, 301, + 0, 0, 0, 303, 0, 0, 167, 304, 0, 0, + 305, 0, 0, 306, 307, 0, 0, 0, 0, 0, + 308, 309, 0, 310, 0, 311, 0, 312, 313, 0, + 0, 0, 0, 0, 0, 0, 335, 0, 324, 326, + 317, 319, 320, 322, 318, 325, 323, 329, 328, 330, + 331, 332, 333, 334, 327, 0, 315, 321, 316, 0, + 336, 337, 314, 338, 0, 339, 340, 0, 0, 0, + 0, 341, 342, 343, 344, 345, 346, 0, 0, 347, + 348, 0, 350, 0, 349, 0, 351, 352, 353, 354, + 355, 356, 358, 357, 359, 0, 0, 360, 361, 0, + 0, 363, 362, 365, 366, 0, 0, 0, 168, 364, + 0, 0, 0, 367, 0, 368, 369, 370, 0, 371, + 372, 169, 0, 170, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 171, 373, 374, 0, 172, 375, 0, + 377, 376, 378, 379, 380, 381, 382, 383, 384, 173, + 0, 0, 174, 385, 386, 0, 387, 0, 388, 389, + 390, 391, 392, 0, 393, 394, 395, 0, 0, 396, + 0, 0, 0, 397, 398, 400, 399, 401, 0, 0, + 402, 403, 404, 405, 406, 0, 407, 175, 0, 408, + 176, 409, 0, 0, 410, 0, 177, 0, 411, 178, + 0, 412, 413, 414, 0, 415, 0, 0, 179, 416, + 417, 418, 420, 421, 419, 422, 180, 423, 424, 0, + 425, 181, 0, 0, 0, 427, 426, 428, 182, 0, + 0, 0, 430, 0, 0, 0, 431, 0, 183, 429, + 185, 432, 0, 433, 184, 186, 434, 435, 0, 0, + 0, 0, 0, 436, 437, 438, 0, 440, 439, 0, + 441, 0, 0, 442, 0, 0, 443, 187, 444, 445, + 446, 447, 0, 0, 188, 448, 0, 449, 450, 451, + 452, 454, 453, 0, 0, 455, 456, 457, 458, 0, + 460, 462, 0, 0, 461, 459, 463, 464, 0, 0, + 465, 466, 0, 469, 470, 471, 472, 0, 0, 0, + 0, 0, 467, 468, 0, 0, 0, 189, 473, 474, + 475, 0, 477, 478, 0, 480, 479, 0, 190, 191, + 0, 0, 481, 0, 0, 482, 0, 194, 0, 483, + 484, 0, 0, 0, 0, 0, 0, 487, 0, 0, + 485, 0, 0, 0, 486, 489, 488, 490, 492, 0, + 0, 0, 0, 0, 0, 491, 192, 0, 493, 193, + 494, 0, 195, 495, 196, 197, 198, 199, 200, 0, + 0, 201, 0, 0, 534, 202, 0, 0, 146, 0, + 203, 205, 204, 206, 207, 147, 0, 148, 0, 0, + 0, 208, 0, 0, 0, 209, 0, 0, 210, 212, + 211, 0, 213, 0, 149, 150, 0, 0, 214, 0, + 0, 215, 216, 0, 217, 151, 0, 152, 0, 218, + 220, 219, 153, 221, 222, 0, 223, 226, 0, 225, + 224, 154, 227, 155, 228, 229, 230, 231, 0, 232, + 233, 0, 234, 236, 235, 156, 237, 0, 0, 0, + 238, 0, 0, 239, 0, 240, 0, 0, 241, 0, + 0, 0, 243, 242, 244, 0, 0, 245, 0, 0, + 0, 0, 246, 157, 0, 0, 0, 0, 247, 248, + 0, 249, 0, 0, 0, 250, 0, 251, 252, 253, + 254, 255, 0, 0, 0, 158, 0, 0, 256, 257, + 258, 0, 0, 0, 278, 0, 159, 259, 0, 262, + 261, 260, 0, 0, 263, 264, 0, 265, 267, 266, + 268, 269, 160, 0, 0, 270, 271, 272, 273, 274, + 0, 0, 276, 275, 0, 280, 281, 282, 0, 0, + 161, 0, 0, 0, 162, 277, 0, 279, 0, 476, + 0, 283, 285, 284, 286, 0, 288, 0, 287, 0, + 0, 0, 163, 289, 0, 164, 0, 0, 165, 290, + 0, 0, 0, 291, 143, 292, 144, 0, 0, 293, + 295, 296, 0, 0, 297, 0, 0, 0, 0, 302, + 166, 0, 0, 0, 294, 0, 0, 0, 298, 299, + 0, 300, 301, 0, 0, 0, 303, 0, 0, 167, + 304, 0, 0, 305, 0, 0, 306, 307, 0, 0, + 0, 0, 0, 308, 309, 0, 310, 0, 311, 0, + 312, 313, 0, 0, 0, 0, 0, 0, 0, 335, + 0, 324, 326, 317, 319, 320, 322, 318, 325, 323, + 329, 328, 330, 331, 332, 333, 334, 327, 0, 315, + 321, 316, 0, 336, 337, 314, 338, 0, 339, 340, + 0, 0, 0, 0, 341, 342, 343, 344, 345, 346, + 0, 0, 347, 348, 0, 350, 0, 349, 0, 351, + 352, 353, 354, 355, 356, 358, 357, 359, 0, 0, + 360, 361, 0, 0, 363, 362, 365, 366, 0, 0, + 0, 168, 364, 0, 0, 0, 367, 0, 368, 369, + 370, 0, 371, 372, 169, 0, 170, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 171, 373, 374, 0, + 172, 375, 0, 377, 376, 378, 379, 380, 381, 382, + 383, 384, 173, 0, 0, 174, 385, 386, 0, 387, + 0, 388, 389, 390, 391, 392, 0, 393, 394, 395, + 0, 0, 396, 0, 0, 0, 397, 398, 400, 399, + 401, 0, 0, 402, 403, 404, 405, 406, 0, 407, + 175, 0, 408, 176, 409, 0, 0, 410, 0, 177, + 0, 411, 178, 0, 412, 413, 414, 0, 415, 0, + 0, 179, 416, 417, 418, 420, 421, 419, 422, 180, + 423, 424, 0, 425, 181, 0, 0, 0, 427, 426, + 428, 182, 0, 0, 0, 430, 0, 0, 0, 431, + 0, 183, 429, 185, 432, 0, 433, 184, 186, 434, + 435, 0, 0, 0, 0, 0, 436, 437, 438, 0, + 440, 439, 0, 441, 0, 0, 442, 0, 0, 443, + 187, 444, 445, 446, 447, 0, 0, 188, 448, 0, + 449, 450, 451, 452, 454, 453, 0, 0, 455, 456, + 457, 458, 0, 460, 462, 0, 0, 461, 459, 463, + 464, 0, 0, 465, 466, 0, 469, 470, 471, 472, + 0, 0, 0, 0, 0, 467, 468, 0, 0, 0, + 189, 473, 474, 475, 0, 477, 478, 0, 480, 479, + 0, 190, 191, 0, 0, 481, 0, 0, 482, 0, + 194, 0, 483, 484, 0, 0, 0, 0, 0, 0, + 487, 0, 0, 485, 0, 0, 0, 486, 489, 488, + 490, 492, 0, 0, 0, 0, 0, 0, 491, 192, + 0, 493, 193, 494, 0, 195, 495, 196, 197, 198, + 199, 200, 0, 0, 201, 0, 0, 652, 202, 0, + 0, 146, 0, 203, 205, 204, 206, 207, 147, 0, + 148, 0, 0, 0, 208, 0, 0, 0, 209, 0, + 0, 210, 212, 211, 0, 213, 0, 149, 150, 0, + 0, 214, 0, 0, 215, 216, 0, 217, 151, 0, + 152, 0, 218, 220, 219, 153, 221, 222, 0, 223, + 226, 0, 225, 224, 154, 227, 155, 228, 229, 230, + 231, 0, 232, 233, 0, 234, 236, 235, 156, 237, + 0, 0, 0, 238, 0, 0, 239, 0, 240, 0, + 0, 241, 0, 0, 0, 243, 242, 244, 0, 0, + 245, 0, 0, 0, 0, 246, 157, 0, 0, 0, + 0, 247, 248, 0, 249, 0, 0, 0, 250, 0, + 251, 252, 253, 254, 255, 0, 0, 0, 158, 0, + 0, 256, 257, 258, 0, 0, 0, 278, 0, 159, + 259, 0, 262, 261, 260, 0, 0, 263, 264, 0, + 265, 267, 266, 268, 269, 160, 0, 0, 270, 271, + 272, 273, 274, 0, 0, 276, 275, 0, 280, 281, + 282, 0, 0, 161, 0, 0, 0, 162, 277, 0, + 279, 0, 476, 0, 283, 285, 284, 286, 0, 288, + 0, 287, 0, 0, 0, 163, 289, 0, 164, 0, + 0, 165, 290, 0, 0, 0, 291, 143, 292, 144, + 0, 0, 293, 295, 296, 0, 0, 297, 0, 0, + 0, 0, 302, 166, 0, 0, 0, 294, 0, 0, + 0, 298, 299, 0, 300, 301, 0, 0, 0, 303, + 0, 0, 167, 304, 0, 0, 305, 0, 0, 306, + 307, 0, 0, 0, 0, 0, 308, 309, 0, 310, + 0, 311, 0, 312, 313, 0, 0, 0, 0, 0, + 0, 0, 335, 0, 324, 326, 317, 319, 320, 322, + 318, 325, 323, 329, 328, 330, 331, 332, 333, 334, + 327, 0, 315, 321, 316, 0, 336, 337, 314, 338, + 0, 339, 340, 0, 0, 0, 0, 341, 342, 343, + 344, 345, 346, 0, 0, 347, 348, 0, 350, 0, + 349, 0, 351, 352, 353, 354, 355, 356, 358, 357, + 359, 0, 0, 360, 361, 0, 0, 363, 362, 365, + 366, 0, 0, 0, 168, 364, 0, 0, 0, 367, + 0, 368, 369, 370, 0, 371, 372, 169, 0, 170, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 171, + 373, 374, 0, 172, 375, 0, 377, 376, 378, 379, + 380, 381, 382, 383, 384, 173, 0, 0, 174, 385, + 386, 0, 387, 0, 388, 389, 390, 391, 392, 0, + 393, 394, 395, 0, 0, 396, 0, 0, 0, 397, + 398, 400, 399, 401, 0, 0, 402, 403, 404, 405, + 406, 0, 407, 175, 0, 408, 176, 409, 0, 0, + 410, 0, 177, 0, 411, 178, 0, 412, 413, 414, + 0, 415, 0, 0, 179, 416, 417, 418, 420, 421, + 419, 422, 180, 423, 424, 0, 425, 181, 0, 0, + 0, 427, 426, 428, 182, 0, 0, 0, 430, 0, + 0, 0, 431, 0, 183, 429, 185, 432, 0, 433, + 184, 186, 434, 435, 0, 0, 0, 0, 0, 436, + 437, 438, 0, 440, 439, 0, 441, 0, 0, 442, + 0, 0, 443, 187, 444, 445, 446, 447, 0, 0, + 188, 448, 0, 449, 450, 451, 452, 454, 453, 0, + 0, 455, 456, 457, 458, 0, 460, 462, 0, 0, + 461, 459, 463, 464, 0, 0, 465, 466, 0, 469, + 470, 471, 472, 0, 0, 0, 0, 0, 467, 468, + 0, 0, 0, 189, 473, 474, 475, 0, 477, 478, + 0, 480, 479, 0, 190, 191, 0, 0, 481, 0, + 0, 482, 0, 194, 0, 483, 484, 0, 0, 0, + 0, 0, 0, 487, 0, 0, 485, 0, 0, 0, + 486, 489, 488, 490, 492, 0, 0, 0, 0, 0, + 0, 491, 192, 0, 493, 193, 494, 0, 195, 495, + 196, 197, 198, 199, 200, 0, 0, 201, 0, 0, + 534, 202, 0, 0, 146, 0, 203, 205, 204, 206, + 207, 147, 0, 148, 0, 0, 0, 208, 0, 0, + 0, 209, 0, 0, 210, 212, 211, 0, 213, 0, + 149, 150, 0, 0, 214, 0, 0, 215, 216, 0, + 217, 151, 0, 152, 0, 218, 220, 219, 153, 221, + 222, 0, 223, 226, 0, 225, 224, 154, 227, 155, + 228, 229, 230, 231, 0, 232, 233, 0, 234, 236, + 235, 156, 237, 0, 0, 0, 238, 0, 0, 239, + 0, 240, 0, 0, 241, 0, 0, 0, 243, 242, + 244, 0, 0, 245, 0, 0, 0, 0, 246, 157, + 0, 0, 0, 0, 247, 248, 0, 249, 0, 0, + 0, 250, 0, 251, 252, 253, 254, 255, 0, 0, + 0, 158, 0, 0, 256, 257, 258, 0, 0, 0, + 278, 0, 159, 259, 0, 262, 261, 260, 0, 0, + 263, 264, 0, 265, 267, 266, 268, 269, 160, 0, + 0, 270, 271, 272, 273, 274, 0, 0, 276, 275, + 0, 280, 281, 282, 0, 0, 161, 0, 0, 0, + 162, 277, 0, 279, 0, 476, 0, 283, 285, 284, + 286, 0, 288, 0, 287, 0, 0, 0, 163, 289, + 0, 164, 0, 0, 165, 290, 0, 0, 0, 291, + 143, 292, 144, 0, 0, 293, 295, 296, 0, 0, + 297, 0, 0, 0, 0, 302, 166, 0, 0, 0, + 294, 0, 0, 0, 298, 299, 0, 300, 301, 0, + 0, 0, 303, 0, 0, 167, 304, 0, 0, 305, + 0, 0, 306, 307, 0, 0, 0, 0, 0, 308, + 309, 0, 310, 0, 311, 0, 312, 313, 0, 0, + 0, 0, 0, 0, 0, 335, 0, 324, 326, 317, + 319, 320, 322, 318, 325, 323, 329, 328, 330, 331, + 332, 333, 334, 327, 0, 315, 321, 316, 0, 336, + 337, 314, 338, 0, 339, 340, 0, 0, 0, 0, + 341, 342, 343, 344, 345, 346, 0, 0, 347, 348, + 0, 350, 0, 349, 0, 351, 352, 353, 354, 355, + 356, 358, 357, 359, 0, 0, 360, 361, 0, 0, + 363, 362, 365, 366, 0, 0, 0, 168, 364, 0, + 0, 0, 367, 0, 368, 369, 370, 0, 371, 372, + 169, 0, 170, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 171, 373, 374, 0, 172, 375, 0, 377, + 376, 378, 379, 380, 381, 382, 383, 384, 173, 0, + 0, 174, 385, 386, 0, 387, 0, 388, 389, 390, + 391, 392, 0, 393, 394, 395, 0, 0, 396, 0, + 0, 0, 397, 398, 400, 399, 401, 0, 0, 402, + 403, 404, 405, 406, 0, 407, 175, 0, 408, 176, + 409, 0, 0, 410, 0, 177, 0, 411, 178, 0, + 412, 413, 414, 0, 415, 0, 0, 179, 416, 417, + 418, 420, 421, 419, 422, 180, 423, 424, 0, 425, + 181, 0, 0, 0, 427, 426, 428, 182, 0, 0, + 0, 430, 0, 0, 0, 431, 0, 183, 429, 185, + 432, 0, 433, 184, 186, 434, 435, 0, 0, 0, + 0, 0, 436, 437, 438, 0, 440, 439, 0, 441, + 0, 0, 442, 0, 0, 443, 187, 444, 445, 446, + 447, 0, 0, 188, 448, 0, 449, 450, 451, 452, + 454, 453, 0, 0, 455, 456, 457, 458, 0, 460, + 462, 0, 0, 461, 459, 463, 464, 0, 0, 465, + 466, 0, 469, 470, 471, 472, 0, 0, 0, 0, + 0, 467, 468, 0, 0, 0, 189, 473, 474, 475, + 0, 477, 478, 0, 480, 479, 0, 190, 191, 0, + 0, 481, 0, 0, 482, 0, 194, 0, 483, 484, + 0, 0, 0, 0, 0, 0, 487, 0, 0, 485, + 0, 0, 0, 486, 489, 488, 490, 492, 0, 0, + 0, 0, 0, 0, 491, 192, 0, 493, 193, 494, + 0, 195, 495, 196, 197, 198, 199, 200, 0, 0, + 201, 0, 0, 2414, 202, 0, 0, 146, 0, 203, + 205, 204, 206, 207, 147, 0, 148, 0, 0, 0, + 208, 0, 0, 0, 209, 0, 0, 210, 212, 211, + 0, 213, 0, 149, 150, 0, 0, 214, 0, 0, + 215, 216, 0, 217, 151, 0, 152, 0, 218, 220, + 219, 153, 221, 222, 0, 223, 226, 0, 225, 224, + 154, 227, 155, 228, 229, 230, 231, 0, 232, 233, + 0, 234, 236, 235, 156, 237, 0, 0, 0, 238, + 0, 0, 239, 0, 240, 0, 0, 241, 0, 0, + 0, 243, 242, 244, 0, 0, 245, 0, 0, 0, + 0, 246, 157, 0, 0, 0, 0, 247, 248, 0, + 249, 0, 0, 0, 250, 0, 251, 252, 253, 254, + 255, 0, 0, 0, 158, 0, 0, 256, 257, 258, + 0, 0, 0, 278, 0, 159, 259, 0, 262, 261, + 260, 0, 0, 263, 264, 0, 265, 267, 266, 268, + 269, 160, 0, 0, 270, 271, 272, 535, 274, 0, + 0, 276, 275, 0, 280, 281, 282, 0, 0, 161, + 0, 0, 0, 537, 277, 0, 279, 0, 476, 0, + 283, 285, 284, 286, 0, 288, 0, 287, 0, 0, + 0, 163, 289, 0, 164, 0, 0, 165, 290, 0, + 0, 0, 291, 143, 292, 144, 0, 0, 293, 295, + 296, 0, 0, 297, 0, 0, 0, 0, 302, 166, + 0, 0, 0, 294, 0, 0, 0, 298, 299, 0, + 300, 301, 0, 0, 0, 303, 0, 0, 167, 304, + 0, 0, 305, 0, 0, 306, 307, 0, 0, 0, + 0, 0, 308, 309, 0, 310, 0, 311, 0, 312, + 313, 0, 0, 0, 0, 0, 0, 0, 335, 0, + 324, 326, 317, 319, 320, 322, 318, 325, 323, 329, + 328, 330, 331, 332, 333, 334, 327, 0, 315, 321, + 316, 0, 336, 337, 314, 338, 0, 339, 340, 0, + 0, 0, 0, 341, 342, 343, 344, 345, 346, 0, + 0, 347, 348, 0, 350, 0, 349, 0, 351, 352, + 353, 354, 355, 356, 358, 357, 359, 0, 0, 360, + 361, 0, 0, 363, 362, 365, 366, 0, 0, 0, + 168, 364, 0, 0, 0, 367, 0, 368, 369, 370, + 0, 371, 372, 169, 0, 170, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 171, 373, 374, 0, 172, + 375, 0, 536, 376, 378, 379, 380, 381, 382, 383, + 384, 173, 0, 0, 174, 385, 386, 0, 387, 0, + 388, 389, 390, 391, 392, 0, 393, 394, 395, 0, + 0, 396, 0, 0, 0, 397, 398, 400, 399, 401, + 0, 0, 402, 403, 404, 405, 406, 0, 407, 175, + 0, 408, 176, 409, 0, 0, 410, 0, 177, 0, + 411, 178, 0, 412, 413, 414, 0, 415, 0, 0, + 179, 416, 417, 418, 420, 421, 419, 422, 180, 423, + 424, 0, 425, 181, 0, 0, 0, 427, 426, 428, + 182, 0, 0, 0, 430, 0, 0, 0, 431, 0, + 183, 429, 185, 432, 0, 433, 184, 186, 434, 435, + 0, 0, 0, 0, 0, 436, 437, 438, 0, 440, + 439, 0, 441, 0, 0, 442, 0, 0, 443, 187, + 444, 445, 446, 447, 0, 0, 188, 448, 0, 449, + 450, 451, 452, 454, 453, 0, 0, 455, 456, 457, + 458, 0, 460, 462, 0, 0, 461, 459, 463, 464, + 0, 0, 465, 466, 0, 469, 470, 471, 472, 0, + 0, 0, 0, 0, 467, 468, 0, 0, 0, 189, + 473, 474, 475, 0, 477, 478, 0, 480, 479, 0, + 190, 191, 0, 0, 481, 0, 0, 482, 0, 194, + 0, 483, 484, 0, 0, 0, 0, 0, 0, 487, + 0, 0, 485, 0, 0, 0, 486, 489, 488, 490, + 492, 0, 0, 0, 0, 0, 0, 491, 192, 0, + 493, 193, 494, 0, 195, 495, 196, 197, 198, 199, + 200, 0, 0, 201, 0, 0, 534, 202, 0, 0, + 146, 0, 203, 205, 204, 206, 207, 147, 0, 148, + 0, 0, 0, 208, 0, 0, 0, 209, 0, 0, + 210, 212, 211, 0, 213, 0, 149, 150, 0, 0, + 214, 0, 0, 215, 216, 0, 217, 151, 0, 152, + 0, 218, 220, 219, 153, 221, 222, 0, 223, 226, + 0, 225, 224, 154, 227, 155, 228, 229, 230, 231, + 0, 232, 233, 0, 234, 236, 235, 156, 237, 0, + 0, 0, 238, 0, 0, 239, 0, 240, 0, 0, + 241, 0, 0, 0, 243, 242, 244, 0, 0, 245, + 0, 0, 0, 0, 246, 157, 2523, 0, 0, 0, + 247, 248, 0, 249, 0, 0, 0, 250, 0, 251, + 252, 253, 254, 255, 0, 0, 0, 158, 0, 0, + 256, 257, 258, 0, 0, 0, 278, 0, 159, 259, + 0, 262, 261, 260, 0, 0, 263, 264, 0, 265, + 267, 266, 268, 269, 160, 0, 0, 270, 271, 272, + 273, 274, 0, 0, 276, 275, 0, 280, 281, 282, + 2524, 0, 161, 0, 0, 0, 162, 277, 0, 279, + 0, 476, 0, 283, 285, 284, 286, 0, 288, 0, + 287, 0, 0, 0, 163, 289, 0, 164, 2520, 0, + 165, 290, 0, 0, 0, 291, 143, 292, 144, 0, + 0, 293, 295, 296, 0, 0, 297, 0, 0, 0, + 0, 302, 166, 0, 0, 0, 294, 0, 0, 0, + 298, 299, 0, 300, 301, 0, 0, 0, 303, 0, + 0, 167, 304, 0, 0, 305, 0, 0, 306, 307, + 0, 0, 0, 0, 0, 308, 309, 0, 310, 0, + 311, 0, 312, 313, 0, 0, 2521, 0, 0, 0, + 0, 335, 0, 324, 326, 317, 319, 320, 322, 318, + 325, 323, 329, 328, 330, 331, 332, 333, 334, 327, + 0, 315, 321, 316, 0, 336, 337, 314, 338, 0, + 339, 340, 0, 0, 0, 0, 341, 342, 343, 344, + 345, 346, 0, 0, 347, 348, 0, 350, 0, 349, + 0, 351, 352, 353, 354, 355, 356, 358, 357, 359, + 0, 0, 360, 361, 0, 0, 363, 362, 365, 366, + 953, 952, 0, 168, 364, 0, 0, 2519, 367, 0, + 368, 369, 370, 0, 371, 372, 169, 0, 170, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 171, 373, + 374, 0, 172, 375, 0, 377, 376, 378, 379, 380, + 381, 382, 383, 384, 173, 0, 0, 174, 385, 386, + 0, 387, 0, 388, 389, 390, 391, 392, 0, 393, + 394, 395, 0, 0, 396, 0, 0, 0, 397, 398, + 400, 399, 401, 0, 0, 402, 403, 404, 405, 406, + 0, 407, 175, 0, 408, 176, 409, 0, 0, 410, + 0, 177, 0, 411, 178, 0, 412, 413, 414, 0, + 415, 0, 0, 179, 416, 417, 418, 420, 421, 419, + 422, 180, 423, 424, 0, 425, 181, 0, 0, 0, + 427, 426, 428, 182, 0, 0, 0, 430, 0, 0, + 0, 431, 0, 183, 429, 185, 432, 0, 433, 184, + 186, 434, 435, 0, 0, 4290, 733, 4288, 436, 437, + 438, 0, 440, 439, 0, 441, 0, 0, 442, 0, + 0, 443, 187, 444, 445, 446, 447, 0, 0, 188, + 448, 0, 449, 450, 451, 452, 454, 453, 0, 0, + 455, 456, 457, 458, 0, 460, 462, 0, 0, 461, + 459, 463, 464, 0, 0, 465, 466, 0, 469, 470, + 471, 472, 0, 0, 0, 0, 0, 467, 468, 0, + 0, 0, 189, 473, 474, 475, 2522, 477, 478, 0, + 480, 479, 0, 190, 191, 0, 0, 481, 0, 0, + 482, 0, 194, 0, 483, 484, 0, 0, 0, 0, + 0, 0, 487, 0, 0, 485, 0, 0, 0, 486, + 489, 488, 490, 492, 0, 0, 0, 0, 0, 0, + 491, 192, 0, 493, 193, 494, 0, 195, 495, 196, + 197, 198, 199, 200, 0, 0, 201, 0, 0, 0, + 202, 0, 0, 146, 0, 203, 205, 204, 206, 207, + 147, 0, 148, 0, 0, 0, 208, 0, 0, 0, + 209, 0, 0, 210, 212, 211, 0, 213, 0, 149, + 150, 0, 0, 214, 0, 0, 215, 216, 0, 217, + 151, 0, 152, 0, 218, 220, 219, 153, 221, 222, + 0, 223, 226, 0, 225, 224, 154, 227, 155, 228, + 229, 230, 231, 0, 232, 233, 0, 234, 236, 235, + 156, 237, 0, 0, 0, 238, 0, 0, 239, 0, + 240, 0, 0, 241, 0, 0, 0, 243, 242, 244, + 0, 0, 245, 0, 0, 0, 0, 246, 157, 0, + 0, 0, 0, 247, 248, 0, 249, 0, 0, 0, + 250, 0, 251, 252, 253, 254, 255, 0, 0, 0, + 158, 0, 0, 256, 257, 258, 0, 0, 0, 278, + 0, 159, 259, 0, 262, 261, 260, 0, 0, 263, + 264, 0, 265, 267, 266, 268, 269, 160, 0, 0, + 270, 271, 272, 273, 274, 0, 0, 276, 275, 0, + 280, 281, 282, 0, 0, 161, 0, 0, 0, 162, + 277, 0, 279, 0, 476, 0, 283, 285, 284, 286, + 0, 288, 0, 287, 0, 0, 0, 163, 289, 0, + 164, 0, 0, 165, 290, 0, 0, 0, 291, 143, + 292, 144, 0, 0, 293, 295, 296, 0, 0, 297, + 0, 0, 0, 0, 302, 166, 0, 0, 0, 294, + 0, 0, 0, 298, 299, 0, 300, 301, 0, 0, + 0, 303, 0, 0, 167, 304, 0, 0, 305, 0, + 0, 306, 307, 0, 0, 0, 0, 0, 308, 309, + 0, 310, 0, 311, 0, 312, 313, 0, 0, 0, + 0, 0, 0, 0, 335, 0, 324, 326, 317, 319, + 320, 322, 318, 325, 323, 329, 328, 330, 331, 332, + 333, 334, 327, 0, 315, 321, 316, 0, 336, 337, + 314, 338, 0, 339, 340, 0, 0, 0, 0, 341, + 342, 343, 344, 345, 346, 0, 0, 347, 348, 0, + 350, 0, 349, 0, 351, 352, 353, 354, 355, 356, + 358, 357, 359, 0, 0, 360, 361, 0, 0, 363, + 362, 365, 366, 0, 0, 0, 168, 364, 0, 0, + 0, 367, 0, 368, 369, 370, 0, 371, 372, 169, + 0, 170, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 171, 373, 374, 0, 172, 375, 0, 377, 376, + 378, 379, 380, 381, 382, 383, 384, 173, 0, 0, + 174, 385, 386, 0, 387, 0, 388, 389, 390, 391, + 392, 0, 393, 394, 395, 0, 0, 396, 0, 0, + 0, 397, 398, 400, 399, 401, 0, 0, 402, 403, + 404, 405, 406, 0, 407, 175, 0, 408, 176, 409, + 0, 0, 410, 0, 177, 0, 411, 178, 0, 412, + 413, 414, 0, 415, 0, 0, 179, 416, 417, 418, + 420, 421, 419, 422, 180, 423, 424, 0, 425, 181, + 0, 0, 0, 427, 426, 428, 182, 0, 0, 0, + 430, 0, 0, 0, 431, 0, 183, 429, 185, 432, + 0, 433, 184, 186, 434, 435, 0, 0, 0, 0, + 0, 436, 437, 438, 0, 440, 439, 0, 441, 0, + 0, 442, 0, 0, 443, 187, 444, 445, 446, 447, + 0, 0, 188, 448, 0, 449, 450, 451, 452, 454, + 453, 0, 0, 455, 456, 457, 458, 0, 460, 462, + 0, 0, 461, 459, 463, 464, 0, 0, 465, 466, + 0, 469, 470, 471, 472, 0, 0, 0, 0, 0, + 467, 468, 0, 0, 0, 189, 473, 474, 475, 0, + 477, 478, 0, 480, 479, 0, 190, 191, 0, 0, + 481, 0, 0, 482, 0, 194, 0, 483, 484, 0, + 0, 0, 0, 0, 0, 487, 0, 0, 485, 0, + 0, 0, 486, 489, 488, 490, 492, 0, 0, 0, + 0, 0, 0, 491, 192, 0, 493, 193, 494, 0, + 195, 495, 196, 197, 198, 199, 200, 3588, 0, 201, + 0, 0, 0, 202, 0, 0, 146, 0, 203, 205, + 204, 206, 207, 147, 0, 148, 0, 0, 0, 208, + 0, 0, 0, 209, 0, 0, 210, 212, 211, 0, + 213, 0, 149, 150, 0, 0, 214, 0, 0, 215, + 216, 0, 217, 151, 0, 152, 0, 218, 220, 219, + 153, 221, 222, 0, 223, 226, 0, 225, 224, 154, + 227, 155, 228, 229, 230, 231, 0, 232, 233, 0, + 234, 236, 235, 156, 237, 0, 0, 0, 238, 0, + 0, 239, 0, 240, 0, 0, 241, 0, 0, 0, + 243, 242, 244, 0, 0, 245, 0, 0, 0, 0, + 246, 157, 0, 0, 0, 0, 247, 248, 0, 249, + 0, 0, 0, 250, 0, 251, 252, 253, 254, 255, + 0, 0, 0, 158, 0, 0, 256, 257, 258, 0, + 0, 0, 278, 0, 159, 259, 0, 262, 261, 260, + 0, 0, 263, 264, 0, 265, 267, 266, 268, 269, + 160, 0, 0, 270, 271, 272, 273, 274, 0, 0, + 276, 275, 0, 280, 281, 282, 0, 0, 161, 0, + 0, 0, 162, 277, 0, 279, 0, 476, 0, 283, + 285, 284, 286, 0, 288, 0, 287, 0, 0, 0, + 163, 289, 0, 164, 0, 0, 165, 290, 0, 0, + 0, 291, 143, 292, 144, 0, 0, 293, 295, 296, + 0, 0, 297, 0, 0, 0, 0, 302, 166, 0, + 0, 0, 294, 0, 0, 0, 298, 299, 0, 300, + 301, 0, 0, 0, 303, 0, 0, 167, 304, 0, + 0, 305, 0, 0, 306, 307, 0, 0, 0, 0, + 0, 308, 309, 0, 310, 0, 311, 0, 312, 313, + 0, 0, 0, 0, 0, 0, 0, 335, 0, 324, + 326, 317, 319, 320, 322, 318, 325, 323, 329, 328, + 330, 331, 332, 333, 334, 327, 0, 315, 321, 316, + 0, 336, 337, 314, 338, 0, 339, 340, 0, 0, + 0, 0, 341, 342, 343, 344, 345, 346, 0, 0, + 347, 348, 0, 350, 0, 349, 0, 351, 352, 353, + 354, 355, 356, 358, 357, 359, 0, 0, 360, 361, + 0, 0, 363, 362, 365, 366, 0, 0, 0, 168, + 364, 0, 0, 0, 367, 0, 368, 369, 370, 0, + 371, 372, 169, 0, 170, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 171, 373, 374, 0, 172, 375, + 0, 377, 376, 378, 379, 380, 381, 382, 383, 384, + 173, 0, 0, 174, 385, 386, 0, 387, 0, 388, + 389, 390, 391, 392, 0, 393, 394, 395, 0, 0, + 396, 0, 0, 0, 397, 398, 400, 399, 401, 0, + 0, 402, 403, 404, 405, 406, 0, 407, 175, 0, + 408, 176, 409, 0, 0, 410, 0, 177, 0, 411, + 178, 0, 412, 413, 414, 0, 415, 0, 0, 179, + 416, 417, 418, 420, 421, 419, 422, 180, 423, 424, + 0, 425, 181, 0, 0, 0, 427, 426, 428, 182, + 0, 0, 0, 430, 0, 0, 0, 431, 0, 183, + 429, 185, 432, 0, 433, 184, 186, 434, 435, 0, + 0, 0, 0, 0, 436, 437, 438, 0, 440, 439, + 0, 441, 0, 0, 442, 0, 0, 443, 187, 444, + 445, 446, 447, 0, 0, 188, 448, 0, 449, 450, + 451, 452, 454, 453, 0, 0, 455, 456, 457, 458, + 0, 460, 462, 0, 0, 461, 459, 463, 464, 0, + 0, 465, 466, 0, 469, 470, 471, 472, 0, 0, + 0, 0, 0, 467, 468, 0, 0, 0, 189, 473, + 474, 475, 0, 477, 478, 0, 480, 479, 0, 190, + 191, 0, 0, 481, 0, 0, 482, 0, 194, 0, + 483, 484, 0, 0, 0, 0, 0, 0, 487, 0, + 0, 485, 0, 0, 0, 486, 489, 488, 490, 492, + 0, 0, 0, 0, 0, 0, 491, 192, 0, 493, + 193, 494, 0, 195, 495, 196, 197, 198, 199, 200, + 3528, 0, 201, 0, 0, 0, 202, 0, 0, 146, + 0, 203, 205, 204, 206, 207, 147, 0, 148, 0, + 0, 0, 208, 0, 0, 0, 209, 0, 0, 210, + 212, 211, 0, 213, 0, 149, 150, 0, 0, 214, + 0, 0, 215, 216, 0, 217, 151, 0, 152, 0, + 218, 220, 219, 153, 221, 222, 0, 223, 226, 0, + 225, 224, 154, 227, 155, 228, 229, 230, 231, 0, + 232, 233, 0, 234, 236, 235, 156, 237, 0, 0, + 0, 238, 0, 0, 239, 0, 240, 0, 0, 241, + 0, 0, 0, 243, 242, 244, 0, 0, 245, 0, + 0, 0, 0, 246, 157, 0, 0, 0, 0, 247, + 248, 0, 249, 0, 0, 0, 250, 0, 251, 252, + 253, 254, 255, 0, 0, 0, 158, 0, 0, 256, + 257, 258, 0, 0, 0, 278, 0, 159, 259, 0, + 262, 261, 260, 0, 0, 263, 264, 0, 265, 267, + 266, 268, 269, 160, 0, 0, 270, 271, 272, 273, + 274, 0, 0, 276, 275, 0, 280, 281, 282, 0, + 0, 161, 0, 0, 0, 162, 277, 0, 279, 0, + 476, 0, 283, 285, 284, 286, 0, 288, 0, 287, + 0, 0, 0, 163, 289, 0, 164, 0, 0, 165, + 290, 0, 0, 0, 291, 143, 292, 144, 0, 0, + 293, 295, 296, 0, 0, 297, 0, 0, 0, 0, + 302, 166, 0, 0, 0, 294, 0, 0, 0, 298, + 299, 0, 300, 301, 0, 0, 0, 303, 0, 0, + 167, 304, 0, 0, 305, 0, 0, 306, 307, 0, + 0, 0, 0, 0, 308, 309, 0, 310, 0, 311, + 0, 312, 313, 0, 0, 0, 0, 0, 0, 0, + 335, 0, 324, 326, 317, 319, 320, 322, 318, 325, + 323, 329, 328, 330, 331, 332, 333, 334, 327, 0, + 315, 321, 316, 0, 336, 337, 314, 338, 0, 339, + 340, 0, 0, 0, 0, 341, 342, 343, 344, 345, + 346, 0, 0, 347, 348, 0, 350, 0, 349, 0, + 351, 352, 353, 354, 355, 356, 358, 357, 359, 0, + 0, 360, 361, 0, 0, 363, 362, 365, 366, 0, + 0, 0, 168, 364, 0, 0, 0, 367, 0, 368, + 369, 370, 0, 371, 372, 169, 0, 170, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 171, 373, 374, + 0, 172, 375, 0, 377, 376, 378, 379, 380, 381, + 382, 383, 384, 173, 0, 0, 174, 385, 386, 0, + 387, 0, 388, 389, 390, 391, 392, 0, 393, 394, + 395, 0, 0, 396, 0, 0, 0, 397, 398, 400, + 399, 401, 0, 0, 402, 403, 404, 405, 406, 0, + 407, 175, 0, 408, 176, 409, 0, 0, 410, 0, + 177, 0, 411, 178, 0, 412, 413, 414, 0, 415, + 0, 0, 179, 416, 417, 418, 420, 421, 419, 422, + 180, 423, 424, 0, 425, 181, 0, 0, 0, 427, + 426, 428, 182, 0, 0, 0, 430, 0, 0, 0, + 431, 0, 183, 429, 185, 432, 0, 433, 184, 186, + 434, 435, 0, 0, 0, 0, 0, 436, 437, 438, + 0, 440, 439, 0, 441, 0, 0, 442, 0, 0, + 443, 187, 444, 445, 446, 447, 0, 0, 188, 448, + 0, 449, 450, 451, 452, 454, 453, 0, 0, 455, + 456, 457, 458, 0, 460, 462, 0, 0, 461, 459, + 463, 464, 0, 0, 465, 466, 0, 469, 470, 471, + 472, 0, 0, 0, 0, 0, 467, 468, 0, 0, + 0, 189, 473, 474, 475, 0, 477, 478, 0, 480, + 479, 0, 190, 191, 0, 0, 481, 0, 0, 482, + 0, 194, 0, 483, 484, 0, 0, 0, 0, 0, + 0, 487, 0, 0, 485, 0, 0, 0, 486, 489, + 488, 490, 492, 0, 0, 0, 0, 0, 0, 491, + 192, 0, 493, 193, 494, 0, 195, 495, 196, 197, + 198, 199, 200, 2017, 0, 201, 0, 0, 0, 202, + 0, 0, 146, 0, 203, 205, 204, 206, 207, 147, + 0, 148, 0, 0, 0, 208, 0, 0, 0, 209, + 0, 0, 210, 212, 211, 0, 213, 0, 149, 150, + 0, 0, 214, 0, 0, 215, 216, 0, 217, 151, + 0, 152, 0, 218, 220, 219, 153, 221, 222, 0, + 223, 226, 0, 225, 224, 154, 227, 155, 228, 229, + 230, 231, 0, 232, 233, 0, 234, 236, 235, 156, + 237, 0, 0, 0, 238, 0, 0, 239, 0, 240, + 0, 0, 241, 0, 0, 0, 243, 242, 244, 0, + 0, 245, 0, 0, 0, 0, 246, 157, 0, 0, + 0, 0, 247, 248, 0, 249, 0, 0, 0, 250, + 0, 251, 252, 253, 254, 255, 0, 0, 0, 158, + 0, 0, 256, 257, 258, 0, 0, 0, 278, 0, + 159, 259, 0, 262, 261, 260, 0, 0, 263, 264, + 0, 265, 267, 266, 268, 269, 160, 0, 0, 270, + 271, 272, 273, 274, 0, 0, 276, 275, 0, 280, + 281, 282, 0, 0, 161, 0, 0, 0, 162, 277, + 0, 279, 0, 476, 0, 283, 285, 284, 286, 0, + 288, 0, 287, 0, 0, 0, 163, 289, 0, 164, + 0, 0, 165, 290, 0, 0, 0, 291, 143, 292, + 144, 0, 0, 293, 295, 296, 0, 0, 297, 0, + 0, 0, 0, 302, 166, 0, 0, 0, 294, 0, + 0, 0, 298, 299, 0, 300, 301, 0, 0, 0, + 303, 0, 0, 167, 304, 0, 0, 305, 0, 0, + 306, 307, 0, 0, 0, 0, 0, 308, 309, 0, + 310, 0, 311, 0, 312, 313, 0, 0, 0, 0, + 0, 0, 0, 335, 0, 324, 326, 317, 319, 320, + 322, 318, 325, 323, 329, 328, 330, 331, 332, 333, + 334, 327, 0, 315, 321, 316, 0, 336, 337, 314, + 338, 0, 339, 340, 0, 0, 0, 0, 341, 342, + 343, 344, 345, 346, 0, 0, 347, 348, 0, 350, + 0, 349, 0, 351, 352, 353, 354, 355, 356, 358, + 357, 359, 0, 0, 360, 361, 0, 0, 363, 362, + 365, 366, 0, 0, 0, 168, 364, 0, 0, 0, + 367, 0, 368, 369, 370, 0, 371, 372, 169, 0, + 170, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 171, 373, 374, 0, 172, 375, 0, 377, 376, 378, + 379, 380, 381, 382, 383, 384, 173, 0, 0, 174, + 385, 386, 0, 387, 0, 388, 389, 390, 391, 392, + 0, 393, 394, 395, 0, 0, 396, 0, 0, 0, + 397, 398, 400, 399, 401, 0, 0, 402, 403, 404, + 405, 406, 0, 407, 175, 0, 408, 176, 409, 0, + 0, 410, 0, 177, 0, 411, 178, 0, 412, 413, + 414, 0, 415, 0, 0, 179, 416, 417, 418, 420, + 421, 419, 422, 180, 423, 424, 0, 425, 181, 0, + 0, 0, 427, 426, 428, 182, 0, 0, 0, 430, + 0, 0, 0, 431, 0, 183, 429, 185, 432, 0, + 433, 184, 186, 434, 435, 0, 0, 0, 0, 0, + 436, 437, 438, 0, 440, 439, 0, 441, 0, 0, + 442, 0, 0, 443, 187, 444, 445, 446, 447, 0, + 0, 188, 448, 0, 449, 450, 451, 452, 454, 453, + 0, 0, 455, 456, 457, 458, 0, 460, 462, 0, + 0, 461, 459, 463, 464, 0, 0, 465, 466, 0, + 469, 470, 471, 472, 0, 0, 0, 0, 0, 467, + 468, 0, 0, 0, 189, 473, 474, 475, 0, 477, + 478, 0, 480, 479, 0, 190, 191, 0, 0, 481, + 0, 0, 482, 0, 194, 0, 483, 484, 0, 0, + 0, 0, 0, 0, 487, 0, 0, 485, 0, 0, + 0, 486, 489, 488, 490, 492, 0, 0, 0, 0, + 0, 0, 491, 192, 0, 493, 193, 494, 0, 195, + 495, 196, 197, 198, 199, 200, 2841, 0, 201, 0, + 0, 0, 202, 0, 0, 146, 0, 203, 205, 204, + 206, 207, 147, 0, 148, 0, 0, 1207, 208, 0, + 0, 0, 209, 0, 0, 210, 212, 211, 0, 213, + 0, 149, 150, 0, 0, 214, 0, 0, 215, 216, + 0, 217, 151, 0, 152, 0, 218, 220, 219, 153, + 221, 222, 0, 223, 226, 0, 225, 224, 154, 227, + 155, 228, 229, 230, 231, 0, 232, 233, 0, 234, + 236, 235, 156, 237, 0, 0, 0, 238, 0, 0, + 239, 0, 240, 0, 0, 241, 0, 0, 0, 243, + 242, 244, 0, 0, 245, 0, 0, 0, 0, 246, + 157, 0, 0, 0, 1205, 247, 248, 0, 249, 0, + 0, 0, 250, 0, 251, 252, 253, 254, 255, 0, + 0, 0, 158, 0, 0, 256, 257, 258, 0, 0, + 0, 278, 0, 159, 259, 0, 262, 261, 260, 1193, + 0, 263, 264, 0, 265, 267, 266, 268, 269, 160, + 0, 0, 270, 271, 272, 273, 274, 0, 0, 276, + 275, 0, 280, 281, 282, 0, 0, 161, 0, 0, + 0, 162, 277, 0, 279, 0, 476, 0, 283, 285, + 284, 286, 0, 288, 0, 287, 0, 0, 0, 163, + 289, 0, 164, 0, 0, 165, 290, 0, 0, 0, + 291, 143, 292, 144, 0, 0, 293, 295, 296, 0, + 0, 297, 0, 0, 0, 0, 302, 166, 0, 0, + 0, 294, 0, 0, 0, 298, 299, 0, 300, 301, + 0, 0, 0, 303, 0, 0, 167, 304, 0, 0, + 305, 0, 0, 306, 307, 693, 0, 0, 0, 0, + 308, 309, 0, 310, 0, 311, 0, 312, 313, 0, + 0, 0, 0, 0, 0, 0, 335, 0, 324, 326, + 317, 319, 320, 322, 318, 325, 323, 329, 328, 330, + 331, 332, 333, 334, 327, 0, 315, 321, 316, 0, + 336, 337, 314, 338, 0, 339, 340, 0, 0, 0, + 0, 341, 342, 343, 344, 345, 346, 0, 0, 347, + 348, 0, 350, 0, 349, 0, 351, 352, 353, 354, + 355, 356, 358, 357, 359, 0, 0, 360, 361, 0, + 0, 363, 362, 365, 366, 0, 0, 0, 168, 364, + 0, 0, 0, 367, 0, 368, 369, 370, 0, 371, + 372, 169, 0, 170, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 171, 373, 374, 0, 172, 375, 0, + 377, 376, 378, 379, 380, 381, 382, 383, 384, 173, + 0, 0, 174, 385, 386, 0, 387, 0, 388, 389, + 390, 391, 392, 0, 393, 394, 395, 0, 0, 396, + 0, 0, 0, 397, 398, 400, 399, 401, 0, 0, + 402, 403, 404, 405, 406, 0, 407, 175, 0, 408, + 176, 409, 0, 0, 410, 0, 177, 0, 411, 178, + 0, 412, 413, 414, 0, 415, 0, 0, 179, 416, + 417, 418, 420, 421, 419, 422, 180, 423, 424, 0, + 425, 181, 0, 0, 0, 427, 426, 428, 182, 0, + 0, 1194, 430, 0, 0, 0, 431, 0, 183, 429, + 185, 432, 0, 433, 184, 186, 434, 435, 0, 0, + 0, 0, 0, 436, 437, 438, 0, 440, 439, 0, + 441, 0, 0, 442, 0, 0, 443, 187, 444, 445, + 446, 447, 0, 0, 188, 448, 0, 449, 450, 451, + 452, 454, 453, 0, 0, 455, 456, 457, 458, 0, + 460, 462, 0, 0, 461, 459, 463, 464, 0, 138, + 465, 466, 0, 469, 470, 471, 472, 0, 0, 0, + 0, 0, 467, 468, 0, 0, 0, 189, 473, 474, + 475, 0, 477, 478, 0, 480, 479, 0, 190, 191, + 0, 0, 481, 0, 0, 482, 0, 194, 0, 483, + 484, 0, 0, 0, 0, 0, 0, 487, 0, 0, + 485, 0, 0, 0, 486, 489, 488, 490, 492, 0, + 0, 0, 0, 0, 0, 491, 192, 0, 493, 193, + 494, 0, 195, 495, 196, 197, 198, 199, 200, 0, + 0, 201, 0, 0, 0, 202, 0, 0, 146, 0, + 203, 205, 204, 206, 207, 147, 0, 148, 0, 0, + 0, 208, 0, 0, 0, 209, 0, 0, 210, 212, + 211, 0, 213, 0, 149, 150, 0, 0, 214, 0, + 0, 215, 216, 0, 217, 151, 0, 152, 0, 218, + 220, 219, 153, 221, 222, 0, 223, 226, 0, 225, + 224, 154, 227, 155, 228, 229, 230, 231, 0, 232, + 233, 0, 234, 236, 235, 156, 237, 0, 0, 0, + 238, 0, 0, 239, 0, 240, 0, 0, 241, 0, + 0, 0, 243, 242, 244, 0, 0, 245, 0, 0, + 0, 0, 246, 157, 0, 0, 0, 0, 247, 248, + 0, 249, 0, 0, 0, 250, 0, 251, 252, 253, + 254, 255, 0, 0, 0, 158, 0, 0, 256, 257, + 258, 0, 0, 0, 278, 0, 159, 259, 0, 262, + 261, 260, 0, 0, 263, 264, 0, 265, 267, 266, + 268, 269, 160, 0, 0, 270, 271, 272, 273, 274, + 0, 0, 276, 275, 0, 280, 281, 282, 0, 0, + 161, 0, 0, 0, 162, 277, 0, 279, 0, 476, + 0, 283, 285, 284, 286, 0, 288, 0, 287, 0, + 0, 0, 163, 289, 0, 164, 0, 0, 165, 290, + 0, 0, 0, 291, 143, 292, 144, 0, 0, 293, + 295, 296, 0, 0, 297, 0, 0, 0, 0, 302, + 166, 0, 0, 0, 294, 0, 0, 0, 298, 299, + 0, 300, 301, 0, 0, 0, 303, 0, 0, 167, + 304, 0, 0, 305, 0, 0, 306, 307, 0, 0, + 0, 0, 0, 308, 309, 0, 310, 0, 311, 0, + 312, 313, 0, 0, 1793, 0, 0, 0, 0, 335, + 0, 324, 326, 317, 319, 320, 322, 318, 325, 323, + 329, 328, 330, 331, 332, 333, 334, 327, 0, 315, + 321, 316, 0, 336, 337, 314, 338, 0, 339, 340, + 0, 0, 0, 0, 341, 342, 343, 344, 345, 346, + 0, 0, 347, 348, 0, 350, 0, 349, 0, 351, + 352, 353, 354, 355, 356, 358, 357, 359, 0, 0, + 360, 361, 0, 0, 363, 362, 365, 366, 0, 0, + 0, 168, 364, 0, 0, 1794, 367, 0, 368, 369, + 370, 0, 371, 372, 169, 0, 170, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 171, 373, 374, 635, + 172, 375, 0, 377, 376, 378, 379, 380, 381, 382, + 383, 384, 173, 0, 0, 174, 385, 386, 0, 387, + 0, 388, 389, 390, 391, 392, 0, 393, 394, 395, + 0, 0, 396, 0, 0, 0, 397, 398, 400, 399, + 401, 0, 0, 402, 403, 404, 405, 406, 0, 407, + 175, 0, 408, 176, 409, 0, 0, 410, 0, 177, + 0, 411, 178, 0, 412, 413, 414, 0, 415, 0, + 0, 179, 416, 417, 418, 420, 421, 419, 422, 180, + 423, 424, 0, 425, 181, 0, 0, 0, 427, 426, + 428, 182, 0, 0, 0, 430, 0, 0, 0, 431, + 0, 183, 429, 185, 432, 0, 433, 184, 186, 434, + 435, 0, 0, 0, 0, 0, 436, 437, 438, 0, + 440, 439, 0, 441, 0, 0, 442, 0, 0, 443, + 187, 444, 445, 446, 447, 0, 0, 188, 448, 0, + 449, 450, 451, 452, 454, 453, 0, 0, 455, 456, + 457, 458, 0, 460, 462, 0, 0, 461, 459, 463, + 464, 0, 0, 465, 466, 0, 469, 470, 471, 472, + 0, 0, 0, 0, 0, 467, 468, 0, 0, 0, + 189, 473, 474, 475, 1792, 477, 478, 0, 480, 479, + 0, 190, 191, 0, 0, 481, 0, 0, 482, 0, + 194, 0, 483, 484, 0, 0, 0, 0, 0, 0, + 487, 0, 0, 485, 0, 0, 0, 486, 489, 488, + 490, 492, 0, 0, 0, 0, 0, 0, 491, 192, + 0, 493, 193, 494, 0, 195, 495, 196, 197, 198, + 199, 200, 0, 0, 201, 0, 0, 0, 202, 0, + 0, 146, 0, 203, 205, 204, 206, 207, 147, 0, + 148, 0, 0, 1207, 208, 0, 0, 0, 209, 0, + 0, 210, 212, 211, 0, 213, 0, 149, 150, 0, + 0, 214, 0, 0, 215, 216, 0, 217, 151, 0, + 152, 0, 218, 220, 219, 153, 221, 222, 0, 223, + 226, 0, 225, 224, 154, 227, 155, 228, 229, 230, + 231, 0, 232, 233, 0, 234, 236, 235, 156, 237, + 0, 0, 0, 238, 0, 0, 239, 0, 240, 0, + 0, 241, 0, 0, 0, 243, 242, 244, 0, 0, + 245, 0, 0, 0, 0, 246, 157, 0, 0, 0, + 1205, 247, 248, 0, 249, 0, 0, 0, 250, 0, + 251, 252, 253, 254, 255, 0, 0, 0, 158, 0, + 0, 256, 257, 258, 0, 0, 0, 278, 0, 159, + 259, 0, 262, 261, 260, 0, 0, 263, 264, 0, + 265, 267, 266, 268, 269, 160, 0, 0, 270, 271, + 272, 273, 274, 0, 0, 276, 275, 0, 280, 281, + 282, 0, 0, 161, 0, 0, 0, 162, 277, 0, + 279, 0, 476, 0, 283, 285, 284, 286, 0, 288, + 0, 287, 0, 0, 0, 163, 289, 0, 164, 0, + 0, 165, 290, 0, 0, 0, 291, 143, 292, 144, + 0, 0, 293, 295, 296, 0, 0, 297, 0, 0, + 0, 0, 302, 166, 0, 0, 0, 294, 0, 0, + 0, 298, 299, 0, 300, 301, 0, 0, 0, 303, + 0, 0, 167, 304, 0, 0, 305, 0, 0, 306, + 307, 693, 0, 0, 0, 0, 308, 309, 0, 310, + 0, 311, 0, 312, 313, 0, 0, 0, 0, 0, + 0, 0, 335, 0, 324, 326, 317, 319, 320, 322, + 318, 325, 323, 329, 328, 330, 331, 332, 333, 334, + 327, 0, 315, 321, 316, 0, 336, 337, 314, 338, + 0, 339, 340, 0, 0, 0, 0, 341, 342, 343, + 344, 345, 346, 0, 0, 347, 348, 0, 350, 0, + 349, 0, 351, 352, 353, 354, 355, 356, 358, 357, + 359, 0, 0, 360, 361, 0, 0, 363, 362, 365, + 366, 0, 0, 0, 168, 364, 0, 0, 0, 367, + 0, 368, 369, 370, 0, 371, 372, 169, 0, 170, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 171, + 373, 374, 0, 172, 375, 0, 377, 376, 378, 379, + 380, 381, 382, 383, 384, 173, 0, 0, 174, 385, + 386, 0, 387, 0, 388, 389, 390, 391, 392, 0, + 393, 394, 395, 0, 0, 396, 0, 0, 0, 397, + 398, 400, 399, 401, 0, 0, 402, 403, 404, 405, + 406, 0, 407, 175, 0, 408, 176, 409, 0, 0, + 410, 0, 177, 0, 411, 178, 0, 412, 413, 414, + 0, 415, 0, 0, 179, 416, 417, 418, 420, 421, + 419, 422, 180, 423, 424, 0, 425, 181, 0, 0, + 0, 427, 426, 428, 182, 0, 0, 0, 430, 0, + 0, 0, 431, 0, 183, 429, 185, 432, 0, 433, + 184, 186, 434, 435, 0, 0, 0, 0, 0, 436, + 437, 438, 0, 440, 439, 0, 441, 0, 0, 442, + 0, 0, 443, 187, 444, 445, 446, 447, 0, 0, + 188, 448, 0, 449, 450, 451, 452, 454, 453, 0, + 0, 455, 456, 457, 458, 0, 460, 462, 0, 0, + 461, 459, 463, 464, 0, 138, 465, 466, 0, 469, + 470, 471, 472, 0, 0, 0, 0, 0, 467, 468, + 0, 0, 0, 189, 473, 474, 475, 0, 477, 478, + 0, 480, 479, 0, 190, 191, 0, 0, 481, 0, + 0, 482, 0, 194, 0, 483, 484, 0, 0, 0, + 0, 0, 0, 487, 0, 0, 485, 0, 0, 0, + 486, 489, 488, 490, 492, 0, 0, 0, 0, 0, + 0, 491, 192, 0, 493, 193, 494, 0, 195, 495, + 196, 197, 198, 199, 200, 0, 0, 201, 0, 0, + 0, 202, 0, 0, 146, 0, 203, 205, 204, 206, + 207, 147, 0, 148, 0, 0, 1201, 208, 0, 0, + 0, 209, 0, 0, 210, 212, 211, 0, 213, 0, + 149, 150, 0, 0, 214, 0, 0, 215, 216, 0, + 217, 151, 0, 152, 0, 218, 220, 219, 153, 221, + 222, 0, 223, 226, 0, 225, 224, 154, 227, 155, + 228, 229, 230, 231, 0, 232, 233, 0, 234, 236, + 235, 156, 237, 0, 0, 0, 238, 0, 0, 239, + 0, 240, 0, 0, 241, 0, 0, 0, 243, 242, + 244, 0, 0, 245, 0, 0, 0, 0, 246, 157, + 0, 0, 0, 1199, 247, 248, 0, 249, 0, 0, + 0, 250, 0, 251, 252, 253, 254, 255, 0, 0, + 0, 158, 0, 0, 256, 257, 258, 0, 0, 0, + 278, 0, 159, 259, 0, 262, 261, 260, 0, 0, + 263, 264, 0, 265, 267, 266, 268, 269, 160, 0, + 0, 270, 271, 272, 273, 274, 0, 0, 276, 275, + 0, 280, 281, 282, 0, 0, 161, 0, 0, 0, + 162, 277, 0, 279, 0, 476, 0, 283, 285, 284, + 286, 0, 288, 0, 287, 0, 0, 0, 163, 289, + 0, 164, 0, 0, 165, 290, 0, 0, 0, 291, + 143, 292, 144, 0, 0, 293, 295, 296, 0, 0, + 297, 0, 0, 0, 0, 302, 166, 0, 0, 0, + 294, 0, 0, 0, 298, 299, 0, 300, 301, 0, + 0, 0, 303, 0, 0, 167, 304, 0, 0, 305, + 0, 0, 306, 307, 693, 0, 0, 0, 0, 308, + 309, 0, 310, 0, 311, 0, 312, 313, 0, 0, + 0, 0, 0, 0, 0, 335, 0, 324, 326, 317, + 319, 320, 322, 318, 325, 323, 329, 328, 330, 331, + 332, 333, 334, 327, 0, 315, 321, 316, 0, 336, + 337, 314, 338, 0, 339, 340, 0, 0, 0, 0, + 341, 342, 343, 344, 345, 346, 0, 0, 347, 348, + 0, 350, 0, 349, 0, 351, 352, 353, 354, 355, + 356, 358, 357, 359, 0, 0, 360, 361, 0, 0, + 363, 362, 365, 366, 0, 0, 0, 168, 364, 0, + 0, 0, 367, 0, 368, 369, 370, 0, 371, 372, + 169, 0, 170, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 171, 373, 374, 0, 172, 375, 0, 377, + 376, 378, 379, 380, 381, 382, 383, 384, 173, 0, + 0, 174, 385, 386, 0, 387, 0, 388, 389, 390, + 391, 392, 0, 393, 394, 395, 0, 0, 396, 0, + 0, 0, 397, 398, 400, 399, 401, 0, 0, 402, + 403, 404, 405, 406, 0, 407, 175, 0, 408, 176, + 409, 0, 0, 410, 0, 177, 0, 411, 178, 0, + 412, 413, 414, 0, 415, 0, 0, 179, 416, 417, + 418, 420, 421, 419, 422, 180, 423, 424, 0, 425, + 181, 0, 0, 0, 427, 426, 428, 182, 0, 0, + 0, 430, 0, 0, 0, 431, 0, 183, 429, 185, + 432, 0, 433, 184, 186, 434, 435, 0, 0, 0, + 0, 0, 436, 437, 438, 0, 440, 439, 0, 441, + 0, 0, 442, 0, 0, 443, 187, 444, 445, 446, + 447, 0, 0, 188, 448, 0, 449, 450, 451, 452, + 454, 453, 0, 0, 455, 456, 457, 458, 0, 460, + 462, 0, 0, 461, 459, 463, 464, 0, 138, 465, + 466, 0, 469, 470, 471, 472, 0, 0, 0, 0, + 0, 467, 468, 0, 0, 0, 189, 473, 474, 475, + 0, 477, 478, 0, 480, 479, 0, 190, 191, 0, + 0, 481, 0, 0, 482, 0, 194, 0, 483, 484, + 0, 0, 0, 0, 0, 0, 487, 0, 0, 485, + 0, 0, 0, 486, 489, 488, 490, 492, 0, 0, + 0, 0, 0, 0, 491, 192, 0, 493, 193, 494, + 0, 195, 495, 196, 197, 198, 199, 200, 0, 0, + 201, 0, 0, 0, 202, 0, 0, 146, 0, 203, + 205, 204, 206, 207, 147, 0, 148, 0, 0, 1207, + 208, 0, 0, 0, 209, 0, 0, 210, 212, 211, + 0, 213, 0, 149, 150, 0, 0, 214, 0, 0, + 215, 216, 0, 217, 151, 0, 152, 0, 218, 220, + 219, 153, 221, 222, 0, 223, 226, 0, 225, 224, + 154, 227, 155, 228, 229, 230, 231, 0, 232, 233, + 0, 234, 236, 235, 156, 237, 0, 0, 0, 238, + 0, 0, 239, 0, 240, 0, 0, 241, 0, 0, + 0, 243, 242, 244, 0, 0, 245, 0, 0, 0, + 0, 246, 157, 0, 0, 0, 0, 247, 248, 0, + 249, 0, 0, 0, 250, 0, 251, 252, 253, 254, + 255, 0, 0, 0, 158, 0, 0, 256, 257, 258, + 0, 0, 0, 278, 0, 159, 259, 0, 262, 261, + 260, 0, 0, 263, 264, 0, 265, 267, 266, 268, + 269, 160, 0, 0, 270, 271, 272, 273, 274, 0, + 0, 276, 275, 0, 280, 281, 282, 0, 0, 161, + 0, 0, 0, 162, 277, 0, 279, 0, 476, 0, + 283, 285, 284, 286, 0, 288, 0, 287, 0, 0, + 0, 163, 289, 0, 164, 0, 0, 165, 290, 0, + 0, 0, 291, 143, 292, 144, 0, 0, 293, 295, + 296, 0, 0, 297, 0, 0, 0, 0, 302, 166, + 0, 0, 0, 294, 0, 0, 0, 298, 299, 0, + 300, 301, 0, 0, 0, 303, 0, 0, 167, 304, + 0, 0, 305, 0, 0, 306, 307, 693, 0, 0, + 0, 0, 308, 309, 0, 310, 0, 311, 0, 312, + 313, 0, 0, 0, 0, 0, 0, 0, 335, 0, + 324, 326, 317, 319, 320, 322, 318, 325, 323, 329, + 328, 330, 331, 332, 333, 334, 327, 0, 315, 321, + 316, 0, 336, 337, 314, 338, 0, 339, 340, 0, + 0, 0, 0, 341, 342, 343, 344, 345, 346, 0, + 0, 347, 348, 0, 350, 0, 349, 0, 351, 352, + 353, 354, 355, 356, 358, 357, 359, 0, 0, 360, + 361, 0, 0, 363, 362, 365, 366, 0, 0, 0, + 168, 364, 0, 0, 0, 367, 0, 368, 369, 370, + 0, 371, 372, 169, 0, 170, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 171, 373, 374, 0, 172, + 375, 0, 377, 376, 378, 379, 380, 381, 382, 383, + 384, 173, 0, 0, 174, 385, 386, 0, 387, 0, + 388, 389, 390, 391, 392, 0, 393, 394, 395, 0, + 0, 396, 0, 0, 0, 397, 398, 400, 399, 401, + 0, 0, 402, 403, 404, 405, 406, 0, 407, 175, + 0, 408, 176, 409, 0, 0, 410, 0, 177, 0, + 411, 178, 0, 412, 413, 414, 0, 415, 0, 0, + 179, 416, 417, 418, 420, 421, 419, 422, 180, 423, + 424, 0, 425, 181, 0, 0, 0, 427, 426, 428, + 182, 0, 0, 0, 430, 0, 0, 0, 431, 0, + 183, 429, 185, 432, 0, 433, 184, 186, 434, 435, + 0, 0, 0, 0, 0, 436, 437, 438, 0, 440, + 439, 0, 441, 0, 0, 442, 0, 0, 443, 187, + 444, 445, 446, 447, 0, 0, 188, 448, 0, 449, + 450, 451, 452, 454, 453, 0, 0, 455, 456, 457, + 458, 0, 460, 462, 0, 0, 461, 459, 463, 464, + 0, 138, 465, 466, 0, 469, 470, 471, 472, 0, + 0, 0, 0, 0, 467, 468, 0, 0, 0, 189, + 473, 474, 475, 0, 477, 478, 0, 480, 479, 0, + 190, 191, 0, 0, 481, 0, 0, 482, 0, 194, + 0, 483, 484, 0, 0, 0, 0, 0, 0, 487, + 0, 0, 485, 0, 0, 0, 486, 489, 488, 490, + 492, 0, 0, 0, 0, 0, 0, 491, 192, 0, + 493, 193, 494, 0, 195, 495, 196, 197, 198, 199, + 200, 0, 0, 201, 0, 0, 0, 202, 0, 0, + 146, 0, 203, 205, 204, 206, 207, 147, 0, 148, + 0, 0, 0, 208, 0, 0, 0, 209, 0, 0, + 210, 212, 211, 0, 213, 0, 149, 150, 0, 0, + 214, 0, 0, 215, 216, 0, 217, 151, 0, 152, + 0, 218, 220, 219, 153, 221, 222, 0, 223, 226, + 0, 225, 224, 154, 227, 155, 228, 229, 230, 231, + 0, 232, 233, 0, 234, 236, 235, 156, 237, 0, + 0, 0, 238, 0, 0, 239, 0, 240, 1330, 0, + 241, 0, 0, 0, 243, 242, 244, 0, 0, 245, + 0, 0, 0, 0, 246, 157, 0, 0, 0, 0, + 247, 248, 0, 249, 0, 0, 0, 250, 0, 251, + 252, 253, 254, 255, 0, 0, 0, 158, 0, 0, + 256, 257, 258, 0, 0, 0, 278, 0, 159, 259, + 0, 262, 261, 260, 0, 0, 263, 264, 0, 265, + 267, 266, 268, 269, 160, 0, 0, 270, 271, 272, + 273, 274, 0, 0, 276, 275, 0, 280, 281, 282, + 0, 0, 161, 0, 0, 0, 162, 277, 0, 279, + 0, 476, 0, 283, 285, 284, 286, 0, 288, 0, + 287, 0, 0, 0, 163, 289, 0, 164, 0, 0, + 165, 290, 0, 0, 0, 291, 143, 292, 144, 0, + 0, 293, 295, 296, 0, 0, 297, 0, 0, 0, + 0, 302, 166, 0, 0, 0, 294, 0, 0, 0, + 298, 299, 0, 300, 301, 0, 0, 0, 303, 0, + 0, 167, 304, 0, 0, 305, 0, 0, 306, 307, + 693, 0, 0, 0, 0, 308, 309, 0, 310, 0, + 311, 0, 312, 313, 0, 0, 0, 0, 0, 0, + 0, 335, 0, 324, 326, 317, 319, 320, 322, 318, + 325, 323, 329, 328, 330, 331, 332, 333, 334, 327, + 0, 315, 321, 316, 0, 336, 337, 314, 338, 0, + 339, 340, 0, 0, 0, 0, 341, 342, 343, 344, + 345, 346, 0, 0, 347, 348, 0, 350, 0, 349, + 0, 351, 352, 353, 354, 355, 356, 358, 357, 359, + 0, 0, 360, 361, 0, 0, 363, 362, 365, 366, + 0, 0, 0, 168, 364, 0, 0, 0, 367, 0, + 368, 369, 370, 0, 371, 372, 169, 0, 170, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 171, 373, + 374, 0, 172, 375, 0, 377, 376, 378, 379, 380, + 381, 382, 383, 384, 173, 0, 0, 174, 385, 386, + 0, 387, 0, 388, 389, 390, 391, 392, 0, 393, + 394, 395, 0, 0, 396, 0, 0, 0, 397, 398, + 400, 399, 401, 0, 0, 402, 403, 404, 405, 406, + 0, 407, 175, 0, 408, 176, 409, 0, 0, 410, + 0, 177, 0, 411, 178, 0, 412, 413, 414, 0, + 415, 0, 0, 179, 416, 417, 418, 420, 421, 419, + 422, 180, 423, 424, 0, 425, 181, 0, 0, 0, + 427, 426, 428, 182, 0, 0, 0, 430, 0, 0, + 0, 431, 0, 183, 429, 185, 432, 0, 433, 184, + 186, 434, 435, 0, 0, 0, 0, 0, 436, 437, + 438, 0, 440, 439, 0, 441, 0, 0, 442, 0, + 0, 443, 187, 444, 445, 446, 447, 0, 0, 188, + 448, 0, 449, 450, 451, 452, 454, 453, 0, 0, + 455, 456, 457, 458, 0, 460, 462, 0, 0, 461, + 459, 463, 464, 0, 138, 465, 466, 0, 469, 470, + 471, 472, 0, 0, 0, 0, 0, 467, 468, 0, + 0, 0, 189, 473, 474, 475, 0, 477, 478, 0, + 480, 479, 0, 190, 191, 0, 0, 481, 0, 0, + 482, 0, 194, 0, 483, 484, 0, 0, 0, 0, + 0, 0, 487, 0, 0, 485, 0, 0, 0, 486, + 489, 488, 490, 492, 0, 0, 0, 0, 0, 0, + 491, 192, 0, 493, 193, 494, 0, 195, 495, 196, + 197, 198, 199, 200, 0, 0, 201, 0, 0, 0, + 202, 0, 0, 146, 0, 203, 205, 204, 206, 207, + 147, 0, 148, 0, 0, 0, 208, 0, 0, 0, + 209, 0, 0, 210, 212, 211, 0, 213, 0, 149, + 150, 0, 0, 214, 0, 0, 215, 216, 0, 217, + 151, 0, 152, 0, 218, 220, 219, 153, 221, 222, + 0, 223, 226, 0, 225, 224, 154, 227, 155, 228, + 229, 230, 231, 0, 232, 233, 0, 234, 236, 235, + 156, 237, 0, 0, 0, 238, 0, 0, 239, 0, + 240, 0, 0, 241, 0, 0, 0, 243, 242, 244, + 0, 0, 245, 0, 0, 0, 0, 246, 157, 0, + 0, 0, 2301, 247, 248, 0, 249, 0, 0, 0, + 250, 0, 251, 252, 253, 254, 255, 0, 0, 0, + 158, 0, 0, 256, 257, 258, 0, 0, 0, 278, + 0, 159, 259, 0, 262, 261, 260, 0, 0, 263, + 264, 0, 265, 267, 266, 268, 269, 160, 0, 0, + 270, 271, 272, 273, 274, 0, 0, 276, 275, 0, + 280, 281, 282, 0, 0, 161, 0, 0, 0, 162, + 277, 0, 279, 0, 476, 0, 283, 285, 284, 286, + 0, 288, 0, 287, 0, 0, 0, 163, 289, 0, + 164, 0, 0, 165, 290, 0, 0, 0, 291, 143, + 292, 144, 0, 0, 293, 295, 296, 0, 0, 297, + 0, 0, 0, 0, 302, 166, 0, 0, 0, 294, + 0, 0, 0, 298, 299, 0, 300, 301, 0, 0, + 0, 303, 0, 0, 167, 304, 0, 0, 305, 0, + 0, 306, 307, 693, 0, 0, 0, 0, 308, 309, + 0, 310, 0, 311, 0, 312, 313, 0, 0, 0, + 0, 0, 0, 0, 335, 0, 324, 326, 317, 319, + 320, 322, 318, 325, 323, 329, 328, 330, 331, 332, + 333, 334, 327, 0, 315, 321, 316, 0, 336, 337, + 314, 338, 0, 339, 340, 0, 0, 0, 0, 341, + 342, 343, 344, 345, 346, 0, 0, 347, 348, 0, + 350, 0, 349, 0, 351, 352, 353, 354, 355, 356, + 358, 357, 359, 0, 0, 360, 361, 0, 0, 363, + 362, 365, 366, 0, 0, 0, 168, 364, 0, 0, + 0, 367, 0, 368, 369, 370, 0, 371, 372, 169, + 0, 170, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 171, 373, 374, 0, 172, 375, 0, 377, 376, + 378, 379, 380, 381, 382, 383, 384, 173, 0, 0, + 174, 385, 386, 0, 387, 0, 388, 389, 390, 391, + 392, 0, 393, 394, 395, 0, 0, 396, 0, 0, + 0, 397, 398, 400, 399, 401, 0, 0, 402, 403, + 404, 405, 406, 0, 407, 175, 0, 408, 176, 409, + 0, 0, 410, 0, 177, 0, 411, 178, 0, 412, + 413, 414, 0, 415, 0, 0, 179, 416, 417, 418, + 420, 421, 419, 422, 180, 423, 424, 0, 425, 181, + 0, 0, 0, 427, 426, 428, 182, 0, 0, 0, + 430, 0, 0, 0, 431, 0, 183, 429, 185, 432, + 0, 433, 184, 186, 434, 435, 0, 0, 0, 0, + 0, 436, 437, 438, 0, 440, 439, 0, 441, 0, + 0, 442, 0, 0, 443, 187, 444, 445, 446, 447, + 0, 0, 188, 448, 0, 449, 450, 451, 452, 454, + 453, 0, 0, 455, 456, 457, 458, 0, 460, 462, + 0, 0, 461, 459, 463, 464, 0, 138, 465, 466, + 0, 469, 470, 471, 472, 0, 0, 0, 0, 0, + 467, 468, 0, 0, 0, 189, 473, 474, 475, 0, + 477, 478, 0, 480, 479, 0, 190, 191, 0, 0, + 481, 0, 0, 482, 0, 194, 0, 483, 484, 0, + 0, 0, 0, 0, 0, 487, 0, 0, 485, 0, + 0, 0, 486, 489, 488, 490, 492, 0, 0, 0, + 0, 0, 0, 491, 192, 0, 493, 193, 494, 0, + 195, 495, 196, 197, 198, 199, 200, 1228, 0, 201, + 0, 0, 0, 202, 0, 0, 146, 0, 203, 205, + 204, 206, 207, 147, 0, 148, 0, 0, 0, 208, + 0, 0, 0, 209, 0, 0, 210, 212, 211, 0, + 213, 0, 149, 150, 0, 0, 214, 0, 0, 215, + 216, 0, 217, 151, 0, 152, 0, 218, 220, 219, + 153, 221, 222, 0, 223, 226, 0, 225, 224, 154, + 227, 155, 228, 229, 230, 231, 0, 232, 233, 0, + 234, 236, 235, 156, 237, 0, 0, 0, 238, 0, + 0, 239, 0, 240, 0, 0, 241, 0, 0, 0, + 243, 242, 244, 0, 0, 245, 0, 0, 0, 0, + 246, 157, 0, 0, 0, 0, 247, 248, 0, 249, + 0, 0, 0, 250, 0, 251, 252, 253, 254, 255, + 0, 0, 0, 158, 0, 0, 256, 257, 258, 0, + 0, 0, 278, 0, 159, 259, 0, 262, 261, 260, + 0, 0, 263, 264, 0, 265, 267, 266, 268, 269, + 160, 0, 0, 270, 271, 272, 273, 274, 0, 0, + 276, 275, 0, 280, 281, 282, 0, 0, 161, 0, + 0, 0, 162, 277, 0, 279, 0, 476, 0, 283, + 285, 284, 286, 0, 288, 0, 287, 0, 0, 0, + 163, 289, 0, 164, 0, 0, 165, 290, 0, 0, + 0, 291, 143, 292, 144, 0, 0, 293, 295, 296, + 0, 0, 297, 0, 0, 0, 0, 302, 166, 0, + 0, 0, 294, 0, 0, 0, 298, 299, 0, 300, + 301, 0, 0, 0, 303, 0, 0, 167, 304, 0, + 0, 305, 0, 0, 306, 307, 693, 0, 0, 0, + 0, 308, 309, 0, 310, 0, 311, 0, 312, 313, + 0, 0, 0, 0, 0, 0, 0, 335, 0, 324, + 326, 317, 319, 320, 322, 318, 325, 323, 329, 328, + 330, 331, 332, 333, 334, 327, 0, 315, 321, 316, + 0, 336, 337, 314, 338, 0, 339, 340, 0, 0, + 0, 0, 341, 342, 343, 344, 345, 346, 0, 0, + 347, 348, 0, 350, 0, 349, 0, 351, 352, 353, + 354, 355, 356, 358, 357, 359, 0, 0, 360, 361, + 0, 0, 363, 362, 365, 366, 0, 0, 0, 168, + 364, 0, 0, 0, 367, 0, 368, 369, 370, 0, + 371, 372, 169, 0, 170, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 171, 373, 374, 0, 172, 375, + 0, 377, 376, 378, 379, 380, 381, 382, 383, 384, + 173, 0, 0, 174, 385, 386, 0, 387, 0, 388, + 389, 390, 391, 392, 0, 393, 394, 395, 0, 0, + 396, 0, 0, 0, 397, 398, 400, 399, 401, 0, + 0, 402, 403, 404, 405, 406, 0, 407, 175, 0, + 408, 176, 409, 0, 0, 410, 0, 177, 0, 411, + 178, 0, 412, 413, 414, 0, 415, 0, 0, 179, + 416, 417, 418, 420, 421, 419, 422, 180, 423, 424, + 0, 425, 181, 0, 0, 0, 427, 426, 428, 182, + 0, 0, 0, 430, 0, 0, 0, 431, 0, 183, + 429, 185, 432, 0, 433, 184, 186, 434, 435, 0, + 0, 0, 0, 0, 436, 437, 438, 0, 440, 439, + 0, 441, 0, 0, 442, 0, 0, 443, 187, 444, + 445, 446, 447, 0, 0, 188, 448, 0, 449, 450, + 451, 452, 454, 453, 0, 0, 455, 456, 457, 458, + 0, 460, 462, 0, 0, 461, 459, 463, 464, 0, + 138, 465, 466, 0, 469, 470, 471, 472, 0, 0, + 0, 0, 0, 467, 468, 0, 0, 0, 189, 473, + 474, 475, 0, 477, 478, 0, 480, 479, 0, 190, + 191, 0, 0, 481, 0, 0, 482, 0, 194, 0, + 483, 484, 0, 0, 0, 0, 0, 0, 487, 0, + 0, 485, 0, 0, 0, 486, 489, 488, 490, 492, + 0, 0, 0, 0, 0, 0, 491, 192, 0, 493, + 193, 494, 0, 195, 495, 196, 197, 198, 199, 200, + 0, 0, 201, 0, 0, 0, 202, 0, 0, 146, + 0, 203, 205, 204, 206, 207, 147, 0, 148, 0, + 0, 0, 208, 905, 0, 0, 209, 0, 0, 210, + 212, 211, 0, 213, 0, 149, 150, 0, 0, 214, + 0, 0, 215, 216, 0, 217, 151, 0, 152, 0, + 218, 220, 219, 153, 221, 222, 0, 223, 226, 0, + 225, 224, 154, 227, 155, 228, 229, 230, 231, 0, + 232, 233, 0, 234, 236, 235, 156, 237, 0, 0, + 0, 238, 0, 0, 239, 0, 240, 0, 0, 241, + 0, 0, 0, 243, 242, 244, 0, 0, 245, 0, + 0, 0, 0, 246, 157, 0, 0, 0, 0, 247, + 248, 0, 249, 0, 0, 0, 250, 0, 251, 252, + 253, 254, 255, 0, 0, 0, 158, 0, 0, 256, + 257, 258, 0, 0, 0, 278, 0, 159, 259, 0, + 262, 261, 260, 0, 0, 263, 264, 0, 265, 267, + 266, 268, 269, 160, 0, 0, 270, 271, 272, 273, + 274, 0, 0, 276, 275, 0, 280, 281, 282, 0, + 0, 161, 0, 0, 0, 162, 277, 0, 279, 0, + 476, 0, 283, 285, 284, 286, 0, 288, 0, 287, + 0, 0, 0, 163, 289, 0, 164, 904, 0, 165, + 290, 0, 0, 0, 291, 143, 292, 144, 0, 0, + 293, 295, 296, 0, 0, 297, 0, 0, 0, 0, + 302, 166, 0, 0, 0, 294, 0, 0, 0, 298, + 299, 0, 300, 301, 0, 0, 0, 303, 0, 0, + 167, 304, 0, 0, 305, 0, 0, 306, 307, 0, + 0, 0, 0, 0, 308, 309, 0, 310, 0, 311, + 0, 312, 313, 0, 0, 0, 0, 0, 0, 0, + 335, 0, 324, 326, 317, 319, 320, 322, 318, 325, + 323, 329, 328, 330, 331, 332, 333, 334, 327, 0, + 315, 321, 316, 0, 336, 337, 314, 338, 0, 339, + 340, 0, 0, 0, 0, 341, 342, 343, 344, 345, + 346, 0, 0, 347, 348, 0, 350, 0, 349, 0, + 351, 352, 353, 354, 355, 356, 358, 357, 359, 0, + 0, 360, 361, 0, 0, 363, 362, 365, 366, 0, + 0, 0, 168, 364, 0, 0, 0, 367, 0, 368, + 369, 370, 0, 371, 372, 169, 0, 170, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 171, 373, 374, + 0, 172, 375, 0, 377, 376, 378, 379, 380, 381, + 382, 383, 384, 173, 0, 0, 174, 385, 386, 0, + 387, 0, 388, 389, 390, 391, 392, 0, 393, 394, + 395, 0, 0, 396, 0, 0, 0, 397, 398, 400, + 399, 401, 0, 0, 402, 403, 404, 405, 406, 0, + 407, 175, 0, 408, 176, 409, 0, 0, 410, 0, + 177, 0, 411, 178, 0, 412, 413, 414, 0, 415, + 0, 0, 179, 416, 417, 418, 420, 421, 419, 422, + 180, 423, 424, 0, 425, 181, 0, 0, 0, 427, + 426, 428, 182, 0, 0, 0, 430, 0, 0, 0, + 431, 0, 183, 429, 185, 432, 0, 433, 184, 186, + 434, 435, 0, 0, 0, 0, 0, 436, 437, 438, + 0, 440, 439, 0, 441, 0, 0, 442, 0, 0, + 443, 187, 444, 445, 446, 447, 0, 0, 188, 448, + 0, 449, 450, 451, 452, 454, 453, 0, 0, 455, + 456, 457, 458, 0, 460, 462, 0, 0, 461, 459, + 463, 464, 0, 906, 465, 466, 0, 469, 470, 471, + 472, 0, 0, 0, 0, 0, 467, 468, 0, 0, + 0, 189, 473, 474, 475, 0, 477, 478, 0, 480, + 479, 0, 190, 191, 0, 0, 481, 0, 0, 482, + 0, 194, 0, 483, 484, 0, 0, 0, 0, 0, + 0, 487, 0, 0, 485, 0, 0, 0, 486, 489, + 488, 490, 492, 0, 0, 0, 0, 0, 0, 491, + 192, 0, 493, 193, 494, 0, 195, 495, 196, 197, + 198, 199, 200, 0, 0, 201, 0, 0, 0, 202, + 0, 0, 146, 0, 203, 205, 204, 206, 207, 147, + 0, 148, 0, 0, 0, 208, 0, 0, 0, 209, + 0, 0, 210, 212, 211, 0, 213, 0, 149, 150, + 0, 0, 214, 0, 0, 215, 216, 0, 217, 151, + 0, 152, 0, 218, 220, 219, 153, 221, 222, 0, + 223, 226, 0, 225, 224, 154, 227, 155, 228, 229, + 230, 231, 0, 232, 233, 0, 234, 236, 235, 156, + 237, 0, 0, 0, 238, 0, 0, 239, 0, 240, + 0, 0, 241, 0, 0, 0, 243, 242, 244, 0, + 0, 245, 0, 0, 0, 0, 246, 157, 0, 0, + 0, 0, 247, 248, 0, 249, 0, 0, 0, 250, + 0, 251, 252, 253, 254, 255, 0, 0, 0, 158, + 0, 0, 256, 257, 258, 0, 0, 0, 278, 0, + 159, 259, 0, 262, 261, 260, 0, 0, 263, 264, + 0, 265, 267, 266, 268, 269, 160, 0, 0, 270, + 271, 272, 273, 274, 0, 0, 276, 275, 0, 280, + 281, 282, 0, 0, 161, 0, 0, 0, 162, 277, + 0, 279, 0, 476, 0, 283, 285, 284, 286, 0, + 288, 0, 287, 0, 0, 0, 163, 289, 0, 164, + 0, 0, 165, 290, 0, 0, 0, 291, 143, 292, + 144, 0, 0, 293, 295, 296, 0, 0, 297, 0, + 0, 0, 0, 302, 166, 0, 0, 0, 294, 0, + 0, 0, 298, 299, 0, 300, 301, 0, 0, 0, + 303, 0, 0, 167, 304, 0, 0, 305, 0, 0, + 306, 307, 693, 0, 0, 0, 0, 308, 309, 0, + 310, 0, 311, 0, 312, 313, 0, 0, 0, 0, + 0, 0, 0, 335, 0, 324, 326, 317, 319, 320, + 322, 318, 325, 323, 329, 328, 330, 331, 332, 333, + 334, 327, 0, 315, 321, 316, 0, 336, 337, 314, + 338, 0, 339, 340, 0, 0, 0, 0, 341, 342, + 343, 344, 345, 346, 0, 0, 347, 348, 0, 350, + 0, 349, 0, 351, 352, 353, 354, 355, 356, 358, + 357, 359, 0, 0, 360, 361, 0, 0, 363, 362, + 365, 366, 0, 0, 0, 168, 364, 0, 0, 0, + 367, 0, 368, 369, 370, 0, 371, 372, 169, 0, + 170, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 171, 373, 374, 0, 172, 375, 0, 377, 376, 378, + 379, 380, 381, 382, 383, 384, 173, 0, 0, 174, + 385, 386, 0, 387, 0, 388, 389, 390, 391, 392, + 0, 393, 394, 395, 0, 0, 396, 0, 0, 0, + 397, 398, 400, 399, 401, 0, 0, 402, 403, 404, + 405, 406, 0, 407, 175, 0, 408, 176, 409, 0, + 0, 410, 0, 177, 0, 411, 178, 0, 412, 413, + 414, 0, 415, 0, 0, 179, 416, 417, 418, 420, + 421, 419, 422, 180, 423, 424, 0, 425, 181, 0, + 0, 0, 427, 426, 428, 182, 0, 0, 0, 430, + 0, 0, 0, 431, 0, 183, 429, 185, 432, 0, + 433, 184, 186, 434, 435, 0, 0, 0, 0, 0, + 436, 437, 438, 0, 440, 439, 0, 441, 0, 0, + 442, 0, 0, 443, 187, 444, 445, 446, 447, 0, + 0, 188, 448, 0, 449, 450, 451, 452, 454, 453, + 0, 0, 455, 456, 457, 458, 0, 460, 462, 0, + 0, 461, 459, 463, 464, 0, 138, 465, 466, 0, + 469, 470, 471, 472, 0, 0, 0, 0, 0, 467, + 468, 0, 0, 0, 189, 473, 474, 475, 0, 477, + 478, 0, 480, 479, 0, 190, 191, 0, 0, 481, + 0, 0, 482, 0, 194, 0, 483, 484, 0, 0, + 0, 0, 0, 0, 487, 0, 0, 485, 0, 0, + 0, 486, 489, 488, 490, 492, 0, 0, 0, 0, + 0, 0, 491, 192, 0, 493, 193, 494, 0, 195, + 495, 196, 197, 198, 199, 200, 0, 0, 201, 0, + 0, 0, 202, 0, 0, 146, 0, 203, 205, 204, + 206, 207, 147, 0, 148, 0, 0, 0, 208, 0, + 0, 0, 209, 0, 0, 210, 212, 211, 0, 213, + 0, 149, 150, 0, 0, 214, 0, 0, 215, 216, + 0, 217, 151, 0, 152, 0, 218, 220, 219, 153, + 221, 222, 0, 223, 226, 0, 225, 224, 154, 227, + 155, 228, 229, 230, 231, 0, 232, 233, 0, 234, + 236, 235, 156, 237, 4194, 0, 0, 238, 0, 0, + 239, 0, 240, 0, 0, 241, 0, 0, 0, 243, + 242, 244, 0, 0, 245, 0, 0, 0, 0, 246, + 157, 0, 0, 0, 0, 247, 248, 0, 249, 0, + 0, 0, 250, 0, 251, 252, 253, 254, 255, 0, + 0, 0, 158, 0, 0, 256, 257, 258, 0, 0, + 0, 278, 0, 159, 259, 0, 262, 261, 260, 0, + 0, 263, 264, 0, 265, 267, 266, 268, 269, 160, + 0, 4193, 270, 271, 272, 273, 274, 0, 0, 276, + 275, 0, 280, 281, 282, 0, 0, 161, 0, 0, + 0, 162, 277, 0, 279, 0, 476, 0, 283, 285, + 284, 286, 0, 288, 0, 287, 0, 0, 0, 163, + 289, 0, 164, 0, 0, 165, 290, 0, 0, 0, + 291, 143, 292, 144, 0, 0, 293, 295, 296, 0, + 0, 297, 0, 0, 0, 0, 302, 166, 0, 0, + 0, 294, 0, 0, 0, 298, 299, 0, 300, 301, + 0, 0, 0, 303, 0, 0, 167, 304, 0, 0, + 305, 0, 0, 306, 307, 0, 0, 0, 0, 0, + 308, 309, 0, 310, 0, 311, 0, 312, 313, 0, + 0, 0, 0, 0, 0, 0, 335, 0, 324, 326, + 317, 319, 320, 322, 318, 325, 323, 329, 328, 330, + 331, 332, 333, 334, 327, 0, 315, 321, 316, 0, + 336, 337, 314, 338, 0, 339, 340, 0, 0, 0, + 0, 341, 342, 343, 344, 345, 346, 0, 0, 347, + 348, 0, 350, 0, 349, 0, 351, 352, 353, 354, + 355, 356, 358, 357, 359, 0, 0, 360, 361, 0, + 0, 363, 362, 365, 366, 0, 0, 0, 168, 364, + 0, 0, 0, 367, 0, 368, 369, 370, 0, 371, + 372, 169, 0, 170, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 171, 373, 374, 0, 172, 375, 0, + 377, 376, 378, 379, 380, 381, 382, 383, 384, 173, + 0, 0, 174, 385, 386, 0, 387, 0, 388, 389, + 390, 391, 392, 0, 393, 394, 395, 0, 0, 396, + 0, 0, 0, 397, 398, 400, 399, 401, 0, 0, + 402, 403, 404, 405, 406, 0, 407, 175, 0, 408, + 176, 409, 0, 0, 410, 0, 177, 0, 411, 178, + 0, 412, 413, 414, 0, 415, 0, 0, 179, 416, + 417, 418, 420, 421, 419, 422, 180, 423, 424, 0, + 425, 181, 0, 0, 0, 427, 426, 428, 182, 0, + 0, 0, 430, 0, 0, 0, 431, 0, 183, 429, + 185, 432, 0, 433, 184, 186, 434, 435, 0, 0, + 0, 0, 0, 436, 437, 438, 0, 440, 439, 0, + 441, 0, 0, 442, 0, 0, 443, 187, 444, 445, + 446, 447, 0, 0, 188, 448, 0, 449, 450, 451, + 452, 454, 453, 0, 0, 455, 456, 457, 458, 0, + 460, 462, 0, 0, 461, 459, 463, 464, 0, 0, + 465, 466, 0, 469, 470, 471, 472, 0, 0, 0, + 0, 0, 467, 468, 0, 0, 0, 189, 473, 474, + 475, 0, 477, 478, 0, 480, 479, 0, 190, 191, + 0, 0, 481, 0, 0, 482, 0, 194, 0, 483, + 484, 0, 0, 0, 0, 0, 0, 487, 0, 0, + 485, 0, 0, 0, 486, 489, 488, 490, 492, 0, + 0, 0, 0, 0, 0, 491, 192, 0, 493, 193, + 494, 0, 195, 495, 196, 197, 198, 199, 200, 0, + 0, 201, 0, 0, 0, 202, 2837, 0, 146, 0, + 203, 205, 204, 206, 207, 147, 0, 148, 0, 0, + 0, 208, 0, 0, 0, 209, 0, 0, 210, 212, + 211, 0, 213, 0, 149, 150, 0, 0, 214, 0, + 0, 215, 216, 0, 217, 151, 0, 152, 0, 218, + 220, 219, 153, 221, 222, 0, 223, 226, 0, 225, + 224, 154, 227, 155, 228, 229, 230, 231, 0, 232, + 233, 0, 234, 236, 235, 156, 237, 0, 0, 0, + 238, 0, 0, 239, 0, 240, 0, 0, 241, 0, + 0, 0, 243, 242, 244, 0, 0, 245, 0, 0, + 0, 0, 246, 157, 0, 0, 0, 0, 247, 248, + 0, 249, 0, 0, 0, 250, 0, 251, 252, 253, + 254, 255, 0, 0, 0, 158, 0, 0, 256, 257, + 258, 0, 0, 0, 278, 0, 159, 259, 0, 262, + 261, 260, 0, 0, 263, 264, 0, 265, 267, 266, + 268, 269, 160, 0, 0, 270, 271, 272, 273, 274, + 0, 0, 276, 275, 0, 280, 281, 282, 0, 0, + 161, 0, 0, 0, 162, 277, 0, 279, 0, 476, + 0, 283, 285, 284, 286, 0, 288, 0, 287, 0, + 0, 0, 163, 289, 0, 164, 0, 0, 165, 290, + 0, 0, 0, 291, 143, 292, 144, 0, 0, 293, + 295, 296, 0, 0, 297, 0, 0, 0, 0, 302, + 166, 0, 0, 0, 294, 0, 0, 0, 298, 299, + 0, 300, 301, 0, 0, 0, 303, 0, 0, 167, + 304, 0, 0, 305, 0, 0, 306, 307, 0, 0, + 0, 0, 0, 308, 309, 0, 310, 0, 311, 0, + 312, 313, 0, 0, 0, 0, 0, 0, 0, 335, + 0, 324, 326, 317, 319, 320, 322, 318, 325, 323, + 329, 328, 330, 331, 332, 333, 334, 327, 0, 315, + 321, 316, 0, 336, 337, 314, 338, 0, 339, 340, + 0, 0, 0, 0, 341, 342, 343, 344, 345, 346, + 0, 0, 347, 348, 0, 350, 0, 349, 0, 351, + 352, 353, 354, 355, 356, 358, 357, 359, 0, 0, + 360, 361, 0, 0, 363, 362, 365, 366, 0, 0, + 0, 168, 364, 0, 0, 0, 367, 0, 368, 369, + 370, 0, 371, 372, 169, 0, 170, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 171, 373, 374, 0, + 172, 375, 0, 377, 376, 378, 379, 380, 381, 382, + 383, 384, 173, 0, 0, 174, 385, 386, 0, 387, + 0, 388, 389, 390, 391, 392, 0, 393, 394, 395, + 0, 0, 396, 0, 0, 0, 397, 398, 400, 399, + 401, 0, 0, 402, 403, 404, 405, 406, 0, 407, + 175, 0, 408, 176, 409, 0, 0, 410, 0, 177, + 0, 411, 178, 0, 412, 413, 414, 0, 415, 0, + 0, 179, 416, 417, 418, 420, 421, 419, 422, 180, + 423, 424, 0, 425, 181, 0, 0, 0, 427, 426, + 428, 182, 0, 0, 0, 430, 0, 0, 0, 431, + 0, 183, 429, 185, 432, 0, 433, 184, 186, 434, + 435, 0, 0, 0, 0, 0, 436, 437, 438, 0, + 440, 439, 0, 441, 0, 0, 442, 0, 0, 443, + 187, 444, 445, 446, 447, 0, 0, 188, 448, 0, + 449, 450, 451, 452, 454, 453, 0, 0, 455, 456, + 457, 458, 0, 460, 462, 0, 0, 461, 459, 463, + 464, 0, 138, 465, 466, 0, 469, 470, 471, 472, + 0, 0, 0, 0, 0, 467, 468, 0, 0, 0, + 189, 473, 474, 475, 0, 477, 478, 0, 480, 479, + 0, 190, 191, 0, 0, 481, 0, 0, 482, 0, + 194, 0, 483, 484, 0, 0, 0, 0, 0, 0, + 487, 0, 0, 485, 0, 0, 0, 486, 489, 488, + 490, 492, 0, 0, 0, 0, 0, 0, 491, 192, + 0, 493, 193, 494, 0, 195, 495, 196, 197, 198, + 199, 200, 0, 0, 201, 0, 0, 0, 202, 0, + 0, 146, 0, 203, 205, 204, 206, 207, 147, 0, + 148, 0, 0, 0, 208, 0, 0, 0, 209, 0, + 0, 210, 212, 211, 0, 213, 0, 149, 150, 0, + 0, 214, 0, 0, 215, 216, 0, 217, 151, 0, + 152, 0, 218, 220, 219, 153, 221, 222, 0, 223, + 226, 0, 225, 224, 154, 227, 155, 228, 229, 230, + 231, 0, 232, 233, 0, 234, 236, 235, 156, 237, + 0, 0, 0, 238, 0, 0, 239, 0, 240, 0, + 0, 241, 0, 0, 0, 243, 242, 244, 0, 0, + 245, 0, 0, 0, 0, 246, 157, 0, 0, 0, + 0, 247, 248, 0, 249, 0, 0, 0, 250, 0, + 251, 252, 253, 254, 255, 0, 0, 0, 158, 0, + 0, 256, 257, 258, 0, 0, 0, 278, 0, 159, + 259, 0, 262, 261, 260, 0, 0, 263, 264, 0, + 265, 267, 266, 268, 269, 160, 0, 0, 270, 271, + 272, 273, 274, 0, 0, 276, 275, 0, 280, 281, + 282, 0, 0, 161, 0, 0, 0, 162, 277, 0, + 279, 0, 476, 0, 283, 285, 284, 286, 0, 288, + 0, 287, 0, 0, 0, 163, 289, 0, 164, 0, + 0, 165, 290, 0, 0, 0, 291, 143, 292, 144, + 0, 0, 293, 295, 296, 0, 0, 297, 0, 0, + 0, 0, 302, 166, 0, 0, 0, 294, 0, 0, + 0, 298, 299, 0, 300, 301, 0, 0, 0, 303, + 0, 0, 167, 304, 0, 0, 305, 0, 0, 306, + 307, 0, 0, 0, 0, 0, 308, 309, 0, 310, + 0, 311, 0, 312, 313, 0, 0, 0, 0, 0, + 0, 0, 335, 0, 324, 326, 317, 319, 320, 322, + 318, 325, 323, 329, 328, 330, 331, 332, 333, 334, + 327, 0, 315, 321, 316, 0, 336, 337, 314, 338, + 0, 339, 340, 0, 0, 0, 0, 341, 342, 343, + 344, 345, 346, 0, 0, 347, 348, 0, 350, 0, + 349, 0, 351, 352, 353, 354, 355, 356, 358, 357, + 359, 0, 0, 360, 361, 0, 0, 363, 362, 365, + 366, 0, 0, 0, 168, 364, 0, 0, 0, 367, + 0, 368, 369, 370, 0, 371, 372, 169, 0, 170, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 171, + 373, 374, 0, 172, 375, 0, 377, 376, 378, 379, + 380, 381, 382, 383, 384, 173, 0, 0, 174, 385, + 386, 2739, 387, 0, 388, 389, 390, 391, 392, 0, + 393, 394, 395, 0, 0, 396, 0, 0, 0, 397, + 398, 400, 399, 401, 0, 0, 402, 403, 404, 405, + 406, 0, 407, 175, 0, 408, 176, 409, 0, 0, + 410, 0, 177, 0, 411, 178, 0, 412, 413, 414, + 0, 415, 0, 0, 179, 416, 417, 418, 420, 421, + 419, 422, 180, 423, 424, 0, 425, 181, 0, 0, + 0, 427, 426, 428, 182, 0, 0, 0, 430, 0, + 0, 0, 431, 0, 183, 429, 185, 432, 0, 433, + 184, 186, 434, 435, 0, 0, 0, 0, 0, 436, + 437, 438, 0, 440, 439, 0, 441, 0, 0, 442, + 0, 0, 443, 187, 444, 445, 446, 447, 0, 0, + 188, 448, 0, 449, 450, 451, 452, 454, 453, 0, + 0, 455, 456, 457, 458, 0, 460, 462, 0, 0, + 461, 459, 463, 464, 0, 0, 465, 466, 0, 469, + 470, 471, 472, 0, 0, 0, 0, 0, 467, 468, + 0, 0, 0, 189, 473, 474, 475, 0, 477, 478, + 0, 480, 479, 0, 190, 191, 0, 0, 481, 0, + 0, 482, 0, 194, 0, 483, 484, 0, 0, 0, + 0, 0, 0, 487, 0, 0, 485, 0, 0, 0, + 486, 489, 488, 490, 492, 0, 0, 0, 0, 0, + 0, 491, 192, 0, 493, 193, 494, 0, 195, 495, + 196, 197, 198, 199, 200, 2856, 0, 201, 0, 0, + 0, 202, 0, 0, 146, 0, 203, 205, 204, 206, + 207, 147, 0, 148, 0, 0, 0, 208, 0, 0, + 0, 209, 0, 0, 210, 212, 211, 0, 213, 0, + 149, 150, 0, 0, 214, 0, 0, 215, 216, 0, + 217, 151, 0, 152, 0, 218, 220, 219, 153, 221, + 222, 0, 223, 226, 0, 225, 224, 154, 227, 155, + 228, 229, 230, 231, 0, 232, 233, 0, 234, 236, + 235, 156, 237, 0, 0, 0, 238, 0, 0, 239, + 0, 240, 0, 0, 241, 0, 0, 0, 243, 242, + 244, 0, 0, 245, 0, 0, 0, 0, 246, 157, + 0, 0, 0, 0, 247, 248, 0, 249, 0, 0, + 0, 250, 0, 251, 252, 253, 254, 255, 0, 0, + 0, 158, 0, 0, 256, 257, 258, 0, 0, 0, + 278, 0, 159, 259, 0, 262, 261, 260, 0, 0, + 263, 264, 0, 265, 267, 266, 268, 269, 160, 0, + 0, 270, 271, 272, 273, 274, 0, 0, 276, 275, + 0, 280, 281, 282, 0, 0, 161, 0, 0, 0, + 162, 277, 0, 279, 0, 476, 0, 283, 285, 284, + 286, 0, 288, 0, 287, 0, 0, 0, 163, 289, + 0, 164, 0, 0, 165, 290, 0, 0, 0, 291, + 143, 292, 144, 0, 0, 293, 295, 296, 0, 0, + 297, 0, 0, 0, 0, 302, 166, 0, 0, 0, + 294, 0, 0, 0, 298, 299, 0, 300, 301, 0, + 0, 0, 303, 0, 0, 167, 304, 0, 0, 305, + 0, 0, 306, 307, 0, 0, 0, 0, 0, 308, + 309, 0, 310, 0, 311, 0, 312, 313, 0, 0, + 0, 0, 0, 0, 0, 335, 0, 324, 326, 317, + 319, 320, 322, 318, 325, 323, 329, 328, 330, 331, + 332, 333, 334, 327, 0, 315, 321, 316, 0, 336, + 337, 314, 338, 0, 339, 340, 0, 0, 0, 0, + 341, 342, 343, 344, 345, 346, 0, 0, 347, 348, + 0, 350, 0, 349, 0, 351, 352, 353, 354, 355, + 356, 358, 357, 359, 0, 0, 360, 361, 0, 0, + 363, 362, 365, 366, 0, 0, 0, 168, 364, 0, + 0, 0, 367, 0, 368, 369, 370, 0, 371, 372, + 169, 0, 170, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 171, 373, 374, 0, 172, 375, 0, 377, + 376, 378, 379, 380, 381, 382, 383, 384, 173, 0, + 0, 174, 385, 386, 0, 387, 0, 388, 389, 390, + 391, 392, 0, 393, 394, 395, 0, 0, 396, 0, + 0, 0, 397, 398, 400, 399, 401, 0, 0, 402, + 403, 404, 405, 406, 0, 407, 175, 0, 408, 176, + 409, 0, 0, 410, 0, 177, 0, 411, 178, 0, + 412, 413, 414, 0, 415, 0, 0, 179, 416, 417, + 418, 420, 421, 419, 422, 180, 423, 424, 0, 425, + 181, 0, 0, 0, 427, 426, 428, 182, 0, 0, + 0, 430, 0, 0, 0, 431, 0, 183, 429, 185, + 432, 0, 433, 184, 186, 434, 435, 0, 0, 0, + 0, 0, 436, 437, 438, 0, 440, 439, 0, 441, + 0, 0, 442, 0, 0, 443, 187, 444, 445, 446, + 447, 0, 0, 188, 448, 0, 449, 450, 451, 452, + 454, 453, 0, 0, 455, 456, 457, 458, 0, 460, + 462, 0, 0, 461, 459, 463, 464, 0, 0, 465, + 466, 0, 469, 470, 471, 472, 0, 0, 0, 0, + 0, 467, 468, 0, 0, 0, 189, 473, 474, 475, + 0, 477, 478, 0, 480, 479, 0, 190, 191, 0, + 0, 481, 0, 0, 482, 0, 194, 0, 483, 484, + 0, 0, 0, 0, 0, 0, 487, 0, 0, 485, + 0, 0, 0, 486, 489, 488, 490, 492, 0, 0, + 0, 0, 0, 0, 491, 192, 0, 493, 193, 494, + 0, 195, 495, 196, 197, 198, 199, 200, 0, 0, + 201, 0, 0, 0, 202, 0, 0, 146, 0, 203, + 205, 204, 206, 207, 147, 0, 148, 0, 0, 0, + 208, 0, 0, 0, 209, 0, 0, 210, 212, 211, + 0, 213, 0, 149, 150, 0, 0, 214, 0, 0, + 215, 216, 0, 217, 151, 0, 152, 0, 218, 220, + 219, 153, 221, 222, 0, 223, 226, 0, 225, 224, + 154, 227, 155, 228, 229, 230, 231, 0, 232, 233, + 0, 234, 236, 235, 156, 237, 0, 0, 0, 238, + 0, 0, 239, 0, 240, 0, 0, 241, 0, 0, + 0, 243, 242, 244, 0, 0, 245, 0, 0, 0, + 0, 246, 157, 0, 0, 0, 0, 247, 248, 0, + 249, 0, 0, 0, 250, 0, 251, 252, 253, 254, + 255, 0, 0, 0, 158, 0, 0, 256, 257, 258, + 0, 0, 0, 278, 0, 159, 259, 0, 262, 261, + 260, 0, 0, 263, 264, 0, 265, 267, 266, 268, + 269, 160, 0, 0, 270, 271, 272, 273, 274, 0, + 0, 276, 275, 0, 280, 281, 282, 0, 0, 161, + 0, 0, 0, 162, 277, 0, 279, 0, 476, 0, + 283, 285, 284, 286, 0, 288, 0, 287, 0, 0, + 0, 163, 289, 0, 164, 0, 0, 165, 290, 0, + 0, 0, 291, 143, 292, 144, 0, 0, 293, 295, + 296, 0, 0, 297, 0, 0, 0, 0, 302, 166, + 0, 0, 0, 294, 0, 0, 0, 298, 299, 0, + 300, 301, 0, 0, 0, 303, 0, 0, 167, 304, + 0, 0, 305, 0, 0, 306, 307, 0, 0, 0, + 0, 0, 308, 309, 0, 310, 0, 311, 0, 312, + 313, 0, 0, 0, 0, 0, 0, 0, 335, 0, + 324, 326, 317, 319, 320, 322, 318, 325, 323, 329, + 328, 330, 331, 332, 333, 334, 327, 0, 315, 321, + 316, 0, 336, 337, 314, 338, 0, 339, 340, 0, + 0, 0, 0, 341, 342, 343, 344, 345, 346, 0, + 0, 347, 348, 0, 350, 0, 349, 0, 351, 352, + 353, 354, 355, 356, 358, 357, 359, 0, 0, 360, + 361, 0, 0, 363, 362, 365, 366, 0, 0, 0, + 168, 364, 0, 0, 0, 367, 0, 368, 369, 370, + 0, 371, 372, 169, 0, 170, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 171, 373, 374, 0, 172, + 375, 0, 377, 376, 378, 379, 380, 381, 382, 383, + 384, 173, 0, 0, 174, 385, 386, 0, 387, 0, + 388, 389, 390, 391, 392, 0, 393, 394, 395, 0, + 0, 396, 0, 0, 0, 397, 398, 400, 399, 401, + 0, 0, 402, 403, 404, 405, 406, 0, 407, 175, + 0, 408, 176, 409, 0, 0, 410, 0, 177, 0, + 411, 178, 0, 412, 413, 414, 0, 415, 0, 0, + 179, 416, 417, 418, 420, 421, 419, 422, 180, 423, + 424, 0, 425, 181, 0, 0, 0, 427, 426, 428, + 182, 0, 0, 0, 430, 0, 0, 0, 431, 0, + 183, 429, 185, 432, 0, 433, 184, 186, 434, 435, + 0, 0, 0, 0, 0, 436, 437, 438, 0, 440, + 439, 0, 441, 0, 0, 442, 0, 0, 443, 187, + 444, 445, 446, 447, 0, 0, 188, 448, 0, 449, + 450, 451, 452, 454, 453, 0, 0, 455, 456, 457, + 458, 0, 460, 462, 0, 0, 461, 459, 463, 464, + 0, 138, 465, 466, 0, 469, 470, 471, 472, 0, + 0, 0, 0, 0, 467, 468, 0, 0, 0, 189, + 473, 474, 475, 0, 477, 478, 0, 480, 479, 0, + 190, 191, 0, 0, 481, 0, 0, 482, 0, 194, + 0, 483, 484, 0, 0, 0, 0, 0, 0, 487, + 0, 0, 485, 0, 0, 0, 486, 489, 488, 490, + 492, 0, 0, 0, 0, 0, 0, 491, 192, 0, + 493, 193, 494, 0, 195, 495, 196, 197, 198, 199, + 200, 0, 0, 201, 0, 0, 0, 202, 0, 0, + 146, 0, 203, 205, 204, 206, 207, 147, 0, 148, + 0, 0, 0, 208, 0, 0, 0, 209, 0, 0, + 210, 212, 211, 0, 213, 0, 149, 150, 0, 0, + 214, 0, 0, 215, 216, 0, 217, 151, 0, 152, + 0, 218, 220, 219, 153, 221, 222, 0, 223, 226, + 0, 225, 224, 154, 227, 155, 228, 229, 230, 231, + 0, 232, 233, 0, 234, 236, 235, 156, 237, 0, + 0, 0, 238, 0, 0, 239, 0, 240, 0, 0, + 241, 0, 0, 0, 243, 242, 244, 0, 0, 245, + 0, 0, 0, 0, 246, 157, 0, 0, 0, 2956, + 247, 248, 0, 249, 0, 0, 0, 250, 0, 251, + 252, 253, 254, 255, 0, 0, 0, 158, 0, 0, + 256, 257, 258, 0, 0, 0, 278, 0, 159, 259, + 0, 262, 261, 260, 0, 0, 263, 264, 0, 265, + 267, 266, 268, 269, 160, 0, 0, 270, 271, 272, + 273, 274, 0, 0, 276, 275, 0, 280, 281, 282, + 0, 0, 161, 0, 0, 0, 162, 277, 0, 279, + 0, 476, 0, 283, 285, 284, 286, 0, 288, 0, + 287, 0, 0, 0, 163, 289, 0, 164, 0, 0, + 165, 290, 0, 0, 0, 291, 143, 292, 144, 0, + 0, 293, 295, 296, 0, 0, 297, 0, 0, 0, + 0, 302, 166, 0, 0, 0, 294, 0, 0, 0, + 298, 299, 0, 300, 301, 0, 0, 0, 303, 0, + 0, 167, 304, 0, 0, 305, 0, 0, 306, 307, + 0, 0, 0, 0, 0, 308, 309, 0, 310, 0, + 311, 0, 312, 313, 0, 0, 0, 0, 0, 0, + 0, 335, 0, 324, 326, 317, 319, 320, 322, 318, + 325, 323, 329, 328, 330, 331, 332, 333, 334, 327, + 0, 315, 321, 316, 0, 336, 337, 314, 338, 0, + 339, 340, 0, 0, 0, 0, 341, 342, 343, 344, + 345, 346, 0, 0, 347, 348, 0, 350, 0, 349, + 0, 351, 352, 353, 354, 355, 356, 358, 357, 359, + 0, 0, 360, 361, 0, 0, 363, 362, 365, 366, + 0, 0, 0, 168, 364, 0, 0, 0, 367, 0, + 368, 369, 370, 0, 371, 372, 169, 0, 170, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 171, 373, + 374, 0, 172, 375, 0, 377, 376, 378, 379, 380, + 381, 382, 383, 384, 173, 0, 0, 174, 385, 386, + 0, 387, 0, 388, 389, 390, 391, 392, 0, 393, + 394, 395, 0, 0, 396, 0, 0, 0, 397, 398, + 400, 399, 401, 0, 0, 402, 403, 404, 405, 406, + 0, 407, 175, 0, 408, 176, 409, 0, 0, 410, + 0, 177, 0, 411, 178, 0, 412, 413, 414, 0, + 415, 0, 0, 179, 416, 417, 418, 420, 421, 419, + 422, 180, 423, 424, 0, 425, 181, 0, 0, 0, + 427, 426, 428, 182, 0, 0, 0, 430, 0, 0, + 0, 431, 0, 183, 429, 185, 432, 0, 433, 184, + 186, 434, 435, 0, 0, 0, 0, 0, 436, 437, + 438, 0, 440, 439, 0, 441, 0, 0, 442, 0, + 0, 443, 187, 444, 445, 446, 447, 0, 0, 188, + 448, 0, 449, 450, 451, 452, 454, 453, 0, 0, + 455, 456, 457, 458, 0, 460, 462, 0, 0, 461, + 459, 463, 464, 0, 0, 465, 466, 0, 469, 470, + 471, 472, 0, 0, 0, 0, 0, 467, 468, 0, + 0, 0, 189, 473, 474, 475, 0, 477, 478, 0, + 480, 479, 0, 190, 191, 0, 0, 481, 0, 0, + 482, 0, 194, 0, 483, 484, 0, 0, 0, 0, + 0, 0, 487, 0, 0, 485, 0, 0, 0, 486, + 489, 488, 490, 492, 0, 0, 0, 0, 0, 0, + 491, 192, 0, 493, 193, 494, 0, 195, 495, 196, + 197, 198, 199, 200, 0, 0, 201, 0, 0, 0, + 202, 0, 0, 146, 0, 203, 205, 204, 206, 207, + 147, 0, 148, 0, 0, 0, 208, 0, 0, 0, + 209, 0, 0, 210, 212, 211, 0, 213, 0, 149, + 150, 0, 0, 214, 0, 0, 215, 216, 0, 217, + 151, 0, 152, 0, 218, 220, 219, 153, 221, 222, + 0, 223, 226, 0, 225, 224, 154, 227, 155, 228, + 229, 230, 231, 0, 232, 233, 0, 234, 236, 235, + 156, 237, 0, 0, 0, 238, 0, 0, 239, 0, + 240, 0, 0, 241, 0, 0, 0, 243, 242, 244, + 0, 0, 245, 0, 0, 0, 0, 246, 157, 0, + 0, 0, 2954, 247, 248, 0, 249, 0, 0, 0, + 250, 0, 251, 252, 253, 254, 255, 0, 0, 0, + 158, 0, 0, 256, 257, 258, 0, 0, 0, 278, + 0, 159, 259, 0, 262, 261, 260, 0, 0, 263, + 264, 0, 265, 267, 266, 268, 269, 160, 0, 0, + 270, 271, 272, 273, 274, 0, 0, 276, 275, 0, + 280, 281, 282, 0, 0, 161, 0, 0, 0, 162, + 277, 0, 279, 0, 476, 0, 283, 285, 284, 286, + 0, 288, 0, 287, 0, 0, 0, 163, 289, 0, + 164, 0, 0, 165, 290, 0, 0, 0, 291, 143, + 292, 144, 0, 0, 293, 295, 296, 0, 0, 297, + 0, 0, 0, 0, 302, 166, 0, 0, 0, 294, + 0, 0, 0, 298, 299, 0, 300, 301, 0, 0, + 0, 303, 0, 0, 167, 304, 0, 0, 305, 0, + 0, 306, 307, 0, 0, 0, 0, 0, 308, 309, + 0, 310, 0, 311, 0, 312, 313, 0, 0, 0, + 0, 0, 0, 0, 335, 0, 324, 326, 317, 319, + 320, 322, 318, 325, 323, 329, 328, 330, 331, 332, + 333, 334, 327, 0, 315, 321, 316, 0, 336, 337, + 314, 338, 0, 339, 340, 0, 0, 0, 0, 341, + 342, 343, 344, 345, 346, 0, 0, 347, 348, 0, + 350, 0, 349, 0, 351, 352, 353, 354, 355, 356, + 358, 357, 359, 0, 0, 360, 361, 0, 0, 363, + 362, 365, 366, 0, 0, 0, 168, 364, 0, 0, + 0, 367, 0, 368, 369, 370, 0, 371, 372, 169, + 0, 170, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 171, 373, 374, 0, 172, 375, 0, 377, 376, + 378, 379, 380, 381, 382, 383, 384, 173, 0, 0, + 174, 385, 386, 0, 387, 0, 388, 389, 390, 391, + 392, 0, 393, 394, 395, 0, 0, 396, 0, 0, + 0, 397, 398, 400, 399, 401, 0, 0, 402, 403, + 404, 405, 406, 0, 407, 175, 0, 408, 176, 409, + 0, 0, 410, 0, 177, 0, 411, 178, 0, 412, + 413, 414, 0, 415, 0, 0, 179, 416, 417, 418, + 420, 421, 419, 422, 180, 423, 424, 0, 425, 181, + 0, 0, 0, 427, 426, 428, 182, 0, 0, 0, + 430, 0, 0, 0, 431, 0, 183, 429, 185, 432, + 0, 433, 184, 186, 434, 435, 0, 0, 0, 0, + 0, 436, 437, 438, 0, 440, 439, 0, 441, 0, + 0, 442, 0, 0, 443, 187, 444, 445, 446, 447, + 0, 0, 188, 448, 0, 449, 450, 451, 452, 454, + 453, 0, 0, 455, 456, 457, 458, 0, 460, 462, + 0, 0, 461, 459, 463, 464, 0, 0, 465, 466, + 0, 469, 470, 471, 472, 0, 0, 0, 0, 0, + 467, 468, 0, 0, 0, 189, 473, 474, 475, 0, + 477, 478, 0, 480, 479, 0, 190, 191, 0, 0, + 481, 0, 0, 482, 0, 194, 0, 483, 484, 0, + 0, 0, 0, 0, 0, 487, 0, 0, 485, 0, + 0, 0, 486, 489, 488, 490, 492, 0, 0, 0, + 0, 0, 0, 491, 192, 0, 493, 193, 494, 0, + 195, 495, 196, 197, 198, 199, 200, 0, 0, 201, + 0, 0, 0, 202, 0, 0, 146, 0, 203, 205, + 204, 206, 207, 147, 0, 148, 0, 0, 0, 208, + 0, 0, 0, 209, 0, 0, 210, 212, 211, 0, + 213, 0, 149, 150, 0, 0, 214, 0, 0, 215, + 216, 0, 217, 151, 0, 152, 0, 218, 220, 219, + 153, 221, 222, 0, 223, 226, 0, 225, 224, 154, + 227, 155, 228, 229, 230, 231, 0, 232, 233, 0, + 234, 236, 235, 156, 237, 0, 0, 0, 238, 0, + 0, 239, 0, 240, 0, 0, 241, 0, 0, 0, + 243, 242, 244, 0, 0, 245, 0, 0, 0, 0, + 246, 157, 0, 0, 0, 750, 247, 248, 0, 249, + 0, 0, 0, 250, 0, 251, 252, 253, 254, 255, + 0, 0, 0, 158, 0, 0, 256, 257, 258, 0, + 0, 0, 278, 0, 159, 259, 0, 262, 261, 260, + 0, 0, 263, 264, 0, 265, 267, 266, 268, 269, + 160, 0, 0, 270, 271, 272, 273, 274, 0, 0, + 276, 275, 0, 280, 281, 282, 0, 0, 161, 0, + 0, 0, 162, 277, 0, 279, 0, 476, 0, 283, + 285, 284, 286, 0, 288, 0, 287, 0, 0, 0, + 163, 289, 0, 164, 0, 0, 165, 290, 0, 0, + 0, 291, 143, 292, 144, 0, 0, 293, 295, 296, + 0, 0, 297, 0, 0, 0, 0, 302, 166, 0, + 0, 0, 294, 0, 0, 0, 298, 299, 0, 300, + 301, 0, 0, 0, 303, 0, 0, 167, 304, 0, + 0, 305, 0, 0, 306, 307, 0, 0, 0, 0, + 0, 308, 309, 0, 310, 0, 311, 0, 312, 313, + 0, 0, 0, 0, 0, 0, 0, 335, 0, 324, + 326, 317, 319, 320, 322, 318, 325, 323, 329, 328, + 330, 331, 332, 333, 334, 327, 0, 315, 321, 316, + 0, 336, 337, 314, 338, 0, 339, 340, 0, 0, + 0, 0, 341, 342, 343, 344, 345, 346, 0, 0, + 347, 348, 0, 350, 0, 349, 0, 351, 352, 353, + 354, 355, 356, 358, 357, 359, 0, 0, 360, 361, + 0, 0, 363, 362, 365, 366, 0, 0, 0, 168, + 364, 0, 0, 0, 367, 0, 368, 369, 370, 0, + 371, 372, 169, 0, 170, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 171, 373, 374, 0, 172, 375, + 0, 377, 376, 378, 379, 380, 381, 382, 383, 384, + 173, 0, 0, 174, 385, 386, 0, 387, 0, 388, + 389, 390, 391, 392, 0, 393, 394, 395, 0, 0, + 396, 0, 0, 0, 397, 398, 400, 399, 401, 0, + 0, 402, 403, 404, 405, 406, 0, 407, 175, 0, + 408, 176, 409, 0, 0, 410, 0, 177, 0, 411, + 178, 0, 412, 413, 414, 0, 415, 0, 0, 179, + 416, 417, 418, 420, 421, 419, 422, 180, 423, 424, + 0, 425, 181, 0, 0, 0, 427, 426, 428, 182, + 0, 0, 0, 430, 0, 0, 0, 431, 0, 183, + 429, 185, 432, 0, 433, 184, 186, 434, 435, 0, + 0, 0, 0, 0, 436, 437, 438, 0, 440, 439, + 0, 441, 0, 0, 442, 0, 0, 443, 187, 444, + 445, 446, 447, 0, 0, 188, 448, 0, 449, 450, + 451, 452, 454, 453, 0, 0, 455, 456, 457, 458, + 0, 460, 462, 0, 0, 461, 459, 463, 464, 0, + 0, 465, 466, 0, 469, 470, 471, 472, 0, 0, + 0, 0, 0, 467, 468, 0, 0, 0, 189, 473, + 474, 475, 0, 477, 478, 0, 480, 479, 0, 190, + 191, 0, 0, 481, 0, 0, 482, 0, 194, 0, + 483, 484, 0, 0, 0, 0, 0, 0, 487, 0, + 0, 485, 0, 0, 0, 486, 489, 488, 490, 492, + 0, 0, 0, 0, 0, 0, 491, 192, 0, 493, + 193, 494, 0, 195, 495, 196, 197, 198, 199, 200, + 0, 0, 201, 0, 0, 0, 202, 0, 0, 146, + 0, 203, 205, 204, 206, 207, 147, 0, 148, 0, + 0, 0, 208, 0, 0, 0, 209, 0, 0, 210, + 212, 211, 0, 213, 0, 149, 150, 0, 0, 214, + 0, 0, 215, 216, 0, 217, 151, 0, 152, 0, + 218, 220, 219, 153, 221, 222, 0, 223, 226, 0, + 225, 224, 154, 227, 155, 228, 229, 230, 231, 0, + 232, 233, 0, 234, 236, 235, 156, 237, 0, 0, + 0, 238, 0, 0, 239, 0, 240, 0, 0, 241, + 0, 0, 0, 243, 242, 244, 0, 0, 245, 0, + 0, 0, 0, 246, 157, 0, 0, 0, 2228, 247, + 248, 0, 249, 0, 0, 0, 250, 0, 251, 252, + 253, 254, 255, 0, 0, 0, 158, 0, 0, 256, + 257, 258, 0, 0, 0, 278, 0, 159, 259, 0, + 262, 261, 260, 0, 0, 263, 264, 0, 265, 267, + 266, 268, 269, 160, 0, 0, 270, 271, 272, 273, + 274, 0, 0, 276, 275, 0, 280, 281, 282, 0, + 0, 161, 0, 0, 0, 162, 277, 0, 279, 0, + 476, 0, 283, 285, 284, 286, 0, 288, 0, 287, + 0, 0, 0, 163, 289, 0, 164, 0, 0, 165, + 290, 0, 0, 0, 291, 143, 292, 144, 0, 0, + 293, 295, 296, 0, 0, 297, 0, 0, 0, 0, + 302, 166, 0, 0, 0, 294, 0, 0, 0, 298, + 299, 0, 300, 301, 0, 0, 0, 303, 0, 0, + 167, 304, 0, 0, 305, 0, 0, 306, 307, 0, + 0, 0, 0, 0, 308, 309, 0, 310, 0, 311, + 0, 312, 313, 0, 0, 0, 0, 0, 0, 0, + 335, 0, 324, 326, 317, 319, 320, 322, 318, 325, + 323, 329, 328, 330, 331, 332, 333, 334, 327, 0, + 315, 321, 316, 0, 336, 337, 314, 338, 0, 339, + 340, 0, 0, 0, 0, 341, 342, 343, 344, 345, + 346, 0, 0, 347, 348, 0, 350, 0, 349, 0, + 351, 352, 353, 354, 355, 356, 358, 357, 359, 0, + 0, 360, 361, 0, 0, 363, 362, 365, 366, 0, + 0, 0, 168, 364, 0, 0, 0, 367, 0, 368, + 369, 370, 0, 371, 372, 169, 0, 170, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 171, 373, 374, + 0, 172, 375, 0, 377, 376, 378, 379, 380, 381, + 382, 383, 384, 173, 0, 0, 174, 385, 386, 0, + 387, 0, 388, 389, 390, 391, 392, 0, 393, 394, + 395, 0, 0, 396, 0, 0, 0, 397, 398, 400, + 399, 401, 0, 0, 402, 403, 404, 405, 406, 0, + 407, 175, 0, 408, 176, 409, 0, 0, 410, 0, + 177, 0, 411, 178, 0, 412, 413, 414, 0, 415, + 0, 0, 179, 416, 417, 418, 420, 421, 419, 422, + 180, 423, 424, 0, 425, 181, 0, 0, 0, 427, + 426, 428, 182, 0, 0, 0, 430, 0, 0, 0, + 431, 0, 183, 429, 185, 432, 0, 433, 184, 186, + 434, 435, 0, 0, 0, 0, 0, 436, 437, 438, + 0, 440, 439, 0, 441, 0, 0, 442, 0, 0, + 443, 187, 444, 445, 446, 447, 0, 0, 188, 448, + 0, 449, 450, 451, 452, 454, 453, 0, 0, 455, + 456, 457, 458, 0, 460, 462, 0, 0, 461, 459, + 463, 464, 0, 0, 465, 466, 0, 469, 470, 471, + 472, 0, 0, 0, 0, 0, 467, 468, 0, 0, + 0, 189, 473, 474, 475, 0, 477, 478, 0, 480, + 479, 0, 190, 191, 0, 0, 481, 0, 0, 482, + 0, 194, 0, 483, 484, 0, 0, 0, 0, 0, + 0, 487, 0, 0, 485, 0, 0, 0, 486, 489, + 488, 490, 492, 0, 0, 0, 0, 0, 0, 491, + 192, 0, 493, 193, 494, 0, 195, 495, 196, 197, + 198, 199, 200, 0, 0, 201, 0, 0, 0, 202, + 0, 0, 146, 0, 203, 205, 204, 206, 207, 147, + 0, 148, 0, 0, 0, 208, 0, 0, 0, 209, + 0, 0, 210, 212, 211, 0, 213, 0, 149, 150, + 0, 0, 214, 0, 0, 215, 216, 0, 217, 151, + 0, 152, 0, 218, 220, 219, 153, 221, 222, 0, + 223, 226, 0, 225, 224, 154, 227, 155, 228, 229, + 230, 231, 0, 232, 233, 0, 234, 236, 235, 156, + 237, 0, 0, 0, 238, 0, 0, 239, 0, 240, + 0, 0, 241, 0, 0, 0, 243, 242, 244, 0, + 0, 245, 0, 0, 0, 0, 246, 157, 0, 0, + 0, 750, 247, 248, 0, 249, 0, 0, 0, 250, + 0, 251, 252, 253, 254, 255, 0, 0, 0, 158, + 0, 0, 256, 257, 258, 0, 0, 0, 278, 0, + 159, 259, 0, 262, 261, 260, 0, 0, 263, 264, + 0, 265, 267, 266, 268, 269, 160, 0, 0, 270, + 271, 272, 273, 274, 0, 0, 276, 275, 0, 280, + 281, 282, 0, 0, 161, 0, 0, 0, 162, 277, + 0, 279, 0, 476, 0, 283, 285, 284, 286, 0, + 288, 0, 287, 0, 0, 0, 163, 289, 0, 164, + 0, 0, 165, 290, 0, 0, 0, 291, 143, 292, + 144, 0, 0, 293, 295, 296, 0, 0, 297, 0, + 0, 0, 0, 302, 166, 0, 0, 0, 294, 0, + 0, 0, 298, 299, 0, 300, 301, 0, 0, 0, + 303, 0, 0, 167, 304, 0, 0, 305, 0, 0, + 306, 307, 0, 0, 0, 0, 0, 308, 309, 0, + 310, 0, 311, 0, 312, 313, 0, 0, 0, 0, + 0, 0, 0, 335, 0, 324, 326, 317, 319, 320, + 322, 318, 325, 323, 329, 328, 330, 331, 332, 333, + 334, 327, 0, 315, 321, 316, 0, 336, 337, 314, + 338, 0, 339, 340, 0, 0, 0, 0, 341, 342, + 343, 344, 345, 346, 0, 0, 347, 348, 0, 350, + 0, 349, 0, 351, 352, 353, 354, 355, 356, 358, + 357, 359, 0, 0, 360, 361, 0, 0, 363, 362, + 365, 366, 0, 0, 0, 168, 364, 0, 0, 0, + 367, 0, 368, 369, 370, 0, 371, 372, 169, 0, + 170, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 171, 373, 374, 0, 172, 375, 0, 377, 376, 378, + 379, 380, 381, 382, 383, 384, 173, 0, 0, 174, + 385, 386, 0, 387, 0, 388, 389, 390, 391, 392, + 0, 393, 394, 395, 0, 0, 396, 0, 0, 0, + 397, 398, 400, 399, 401, 0, 0, 402, 403, 404, + 405, 406, 0, 407, 175, 0, 408, 176, 409, 0, + 0, 410, 0, 177, 0, 411, 178, 0, 412, 413, + 414, 0, 415, 0, 0, 179, 416, 417, 418, 420, + 421, 419, 422, 180, 423, 424, 0, 425, 181, 0, + 0, 0, 427, 426, 428, 182, 0, 0, 0, 430, + 0, 0, 0, 431, 0, 183, 429, 185, 432, 0, + 433, 184, 186, 434, 435, 0, 0, 0, 0, 0, + 436, 437, 438, 0, 440, 439, 0, 441, 0, 0, + 442, 0, 0, 443, 187, 444, 445, 446, 447, 0, + 0, 188, 448, 0, 449, 450, 451, 452, 454, 453, + 0, 0, 455, 456, 457, 458, 0, 460, 462, 0, + 0, 461, 459, 463, 464, 0, 0, 465, 466, 0, + 469, 470, 471, 472, 0, 0, 0, 0, 0, 1190, + 468, 0, 0, 0, 189, 473, 474, 475, 0, 477, + 478, 0, 480, 479, 0, 190, 191, 0, 0, 481, + 0, 0, 482, 0, 194, 0, 483, 484, 0, 0, + 0, 0, 0, 0, 487, 0, 0, 485, 0, 0, + 0, 486, 489, 488, 490, 492, 0, 0, 0, 0, + 0, 0, 491, 192, 0, 493, 193, 494, 0, 195, + 495, 196, 197, 198, 199, 200, 0, 0, 201, 0, + 0, 0, 202, 0, 0, 146, 0, 203, 205, 204, + 206, 207, 147, 0, 148, 0, 0, 0, 208, 0, + 0, 0, 209, 0, 0, 210, 212, 211, 0, 213, + 0, 149, 150, 0, 0, 214, 0, 0, 215, 216, + 0, 217, 151, 0, 152, 0, 218, 220, 219, 153, + 221, 222, 0, 223, 226, 0, 225, 224, 154, 227, + 155, 228, 229, 230, 231, 0, 232, 233, 0, 234, + 236, 235, 156, 237, 0, 0, 0, 238, 0, 0, + 239, 0, 240, 0, 0, 241, 0, 0, 0, 243, + 242, 244, 0, 0, 245, 0, 0, 0, 0, 246, + 157, 0, 0, 0, 0, 247, 248, 0, 249, 0, + 0, 0, 250, 0, 251, 252, 253, 254, 255, 0, + 0, 0, 158, 0, 0, 256, 257, 258, 0, 0, + 0, 278, 0, 159, 259, 0, 262, 261, 260, 0, + 0, 263, 264, 0, 265, 267, 266, 268, 269, 160, + 0, 0, 270, 271, 272, 273, 274, 0, 0, 276, + 275, 0, 280, 281, 282, 0, 0, 161, 0, 0, + 0, 162, 277, 895, 279, 0, 476, 0, 283, 285, + 284, 286, 0, 288, 0, 287, 0, 0, 0, 163, + 289, 0, 164, 0, 0, 165, 290, 0, 0, 0, + 291, 143, 292, 144, 0, 0, 293, 295, 296, 0, + 0, 297, 0, 0, 0, 0, 302, 166, 0, 0, + 0, 294, 0, 0, 0, 298, 299, 0, 300, 301, + 0, 0, 0, 303, 0, 0, 167, 304, 0, 0, + 305, 0, 0, 306, 307, 0, 0, 0, 0, 0, + 308, 309, 0, 310, 0, 311, 0, 312, 313, 0, + 0, 0, 0, 0, 0, 0, 335, 0, 324, 326, + 317, 319, 320, 322, 318, 325, 323, 329, 328, 330, + 331, 332, 333, 334, 327, 0, 315, 321, 316, 0, + 336, 337, 314, 338, 0, 339, 340, 0, 0, 0, + 0, 341, 342, 343, 344, 345, 346, 0, 0, 347, + 348, 0, 350, 0, 349, 0, 351, 352, 353, 354, + 355, 356, 358, 357, 359, 0, 0, 360, 361, 0, + 0, 363, 362, 365, 366, 0, 0, 0, 168, 364, + 0, 0, 0, 367, 0, 368, 369, 370, 0, 371, + 372, 169, 0, 170, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 171, 373, 374, 0, 172, 375, 0, + 377, 376, 378, 379, 380, 381, 382, 383, 384, 173, + 0, 0, 174, 385, 386, 0, 387, 0, 388, 389, + 390, 391, 392, 0, 393, 394, 395, 0, 0, 396, + 0, 0, 0, 397, 398, 400, 399, 401, 0, 0, + 402, 403, 404, 405, 406, 0, 407, 175, 0, 408, + 176, 409, 0, 0, 410, 0, 177, 0, 411, 178, + 0, 412, 413, 414, 0, 415, 0, 0, 179, 416, + 417, 418, 420, 421, 419, 422, 180, 423, 424, 0, + 425, 181, 0, 0, 0, 427, 426, 428, 182, 0, + 0, 0, 430, 0, 0, 0, 431, 0, 183, 429, + 185, 432, 0, 433, 184, 186, 434, 435, 0, 0, + 0, 0, 0, 436, 437, 438, 0, 440, 439, 0, + 441, 0, 0, 442, 0, 0, 443, 187, 444, 445, + 446, 447, 0, 0, 188, 448, 0, 449, 450, 451, + 452, 454, 453, 0, 0, 455, 456, 457, 458, 0, + 460, 462, 0, 0, 461, 459, 463, 464, 0, 0, + 465, 466, 0, 469, 470, 471, 472, 0, 0, 0, + 0, 0, 467, 468, 0, 0, 0, 189, 473, 474, + 475, 0, 477, 478, 0, 480, 479, 0, 190, 191, + 0, 0, 481, 0, 0, 482, 0, 194, 0, 483, + 484, 0, 0, 0, 0, 0, 0, 487, 0, 0, + 485, 0, 0, 0, 486, 489, 488, 490, 492, 0, + 0, 0, 0, 0, 0, 491, 192, 0, 493, 193, + 494, 0, 195, 495, 196, 197, 198, 199, 200, 0, + 0, 201, 0, 0, 0, 202, 0, 0, 146, 0, + 203, 205, 204, 206, 207, 147, 0, 148, 0, 0, + 0, 208, 0, 0, 0, 209, 0, 0, 210, 212, + 211, 0, 213, 0, 149, 150, 0, 0, 214, 0, + 0, 215, 216, 0, 217, 151, 0, 152, 0, 218, + 220, 219, 153, 221, 222, 0, 223, 226, 0, 225, + 224, 154, 227, 155, 228, 229, 230, 231, 0, 232, + 233, 0, 234, 236, 235, 156, 237, 0, 0, 0, + 238, 0, 0, 239, 0, 240, 0, 0, 241, 0, + 0, 0, 243, 242, 244, 0, 0, 245, 0, 0, + 0, 0, 246, 157, 0, 0, 0, 0, 247, 248, + 0, 249, 0, 0, 0, 250, 0, 251, 252, 253, + 254, 255, 0, 0, 0, 158, 0, 0, 256, 257, + 258, 0, 0, 0, 278, 0, 159, 259, 0, 262, + 261, 260, 0, 0, 263, 264, 0, 265, 267, 266, + 268, 269, 160, 0, 0, 270, 271, 272, 273, 274, + 0, 0, 276, 275, 0, 280, 281, 282, 0, 0, + 161, 0, 0, 0, 162, 277, 0, 279, 0, 476, + 0, 283, 285, 284, 286, 0, 288, 0, 287, 0, + 0, 0, 163, 289, 0, 164, 0, 0, 165, 290, + 0, 0, 0, 291, 143, 292, 144, 0, 0, 293, + 295, 296, 0, 0, 297, 0, 0, 0, 0, 302, + 166, 0, 0, 0, 294, 0, 0, 0, 298, 299, + 0, 300, 301, 0, 0, 0, 303, 0, 0, 167, + 304, 0, 0, 305, 0, 0, 306, 307, 0, 0, + 0, 0, 0, 308, 309, 0, 310, 0, 311, 0, + 312, 313, 0, 0, 0, 0, 0, 0, 0, 335, + 0, 324, 326, 317, 319, 320, 322, 318, 325, 323, + 329, 328, 330, 331, 332, 333, 334, 327, 0, 315, + 321, 316, 0, 336, 337, 314, 338, 0, 339, 340, + 0, 0, 0, 0, 341, 342, 343, 344, 345, 346, + 0, 0, 347, 348, 0, 350, 0, 349, 0, 351, + 352, 353, 354, 355, 356, 358, 357, 359, 0, 0, + 360, 361, 0, 0, 363, 362, 365, 366, 0, 0, + 0, 168, 364, 0, 0, 0, 367, 0, 368, 369, + 370, 0, 371, 372, 169, 0, 170, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 171, 373, 374, 0, + 172, 375, 0, 377, 376, 378, 379, 380, 381, 382, + 383, 384, 173, 0, 0, 174, 385, 386, 0, 387, + 0, 388, 389, 390, 391, 392, 0, 393, 394, 395, + 0, 0, 396, 0, 0, 0, 397, 398, 400, 399, + 401, 0, 0, 402, 403, 404, 405, 406, 0, 407, + 175, 0, 408, 176, 409, 0, 0, 410, 0, 177, + 0, 411, 178, 0, 412, 413, 414, 0, 415, 0, + 0, 179, 416, 417, 418, 420, 421, 419, 422, 180, + 423, 424, 0, 425, 181, 0, 0, 0, 427, 426, + 428, 182, 0, 0, 0, 430, 0, 0, 0, 431, + 0, 183, 429, 185, 432, 0, 433, 184, 186, 434, + 435, 0, 0, 0, 733, 0, 436, 437, 438, 0, + 440, 439, 0, 441, 0, 0, 442, 0, 0, 443, + 187, 444, 445, 446, 447, 0, 0, 188, 448, 0, + 449, 450, 451, 452, 454, 453, 0, 0, 455, 456, + 457, 458, 0, 460, 462, 0, 0, 461, 459, 463, + 464, 0, 0, 465, 466, 0, 469, 470, 471, 472, + 0, 0, 0, 0, 0, 467, 468, 0, 0, 0, + 189, 473, 474, 475, 0, 477, 478, 0, 480, 479, + 0, 190, 191, 0, 0, 481, 0, 0, 482, 0, + 194, 0, 483, 484, 0, 0, 0, 0, 0, 0, + 487, 0, 0, 485, 0, 0, 0, 486, 489, 488, + 490, 492, 0, 0, 0, 0, 0, 0, 491, 192, + 0, 493, 193, 494, 0, 195, 495, 196, 197, 198, + 199, 200, 0, 0, 201, 0, 0, 0, 202, 0, + 0, 146, 0, 203, 205, 204, 206, 207, 147, 0, + 148, 0, 0, 0, 208, 0, 0, 0, 209, 0, + 0, 210, 212, 211, 0, 213, 0, 149, 150, 0, + 0, 214, 0, 0, 215, 216, 0, 217, 151, 0, + 152, 0, 218, 220, 219, 153, 221, 222, 0, 223, + 226, 0, 225, 224, 154, 227, 155, 228, 229, 230, + 231, 0, 232, 233, 0, 234, 236, 235, 156, 237, + 0, 0, 0, 238, 0, 0, 239, 0, 240, 0, + 0, 241, 0, 0, 0, 243, 242, 244, 0, 0, + 245, 0, 0, 0, 0, 246, 157, 0, 0, 0, + 0, 247, 248, 0, 249, 0, 0, 0, 250, 0, + 251, 252, 253, 254, 255, 0, 0, 0, 158, 0, + 0, 256, 257, 258, 0, 0, 0, 278, 0, 159, + 259, 0, 262, 261, 260, 0, 0, 263, 264, 0, + 265, 267, 266, 268, 269, 160, 0, 0, 270, 271, + 272, 273, 274, 0, 0, 276, 275, 0, 280, 281, + 282, 0, 0, 161, 0, 0, 0, 162, 277, 0, + 279, 0, 476, 0, 283, 285, 284, 286, 0, 288, + 0, 287, 0, 0, 0, 163, 289, 0, 164, 0, + 0, 165, 290, 0, 0, 0, 291, 143, 292, 144, + 0, 0, 293, 295, 296, 0, 0, 297, 0, 0, + 0, 0, 302, 166, 0, 0, 0, 294, 0, 0, + 0, 298, 299, 0, 300, 301, 0, 0, 0, 303, + 0, 0, 167, 304, 0, 0, 305, 0, 0, 306, + 307, 0, 0, 0, 0, 0, 308, 309, 0, 310, + 0, 311, 0, 312, 313, 0, 0, 0, 0, 0, + 0, 0, 335, 0, 324, 326, 317, 319, 320, 322, + 318, 325, 323, 329, 328, 330, 331, 332, 333, 334, + 327, 0, 315, 321, 316, 0, 336, 337, 314, 338, + 0, 339, 340, 0, 0, 0, 0, 341, 342, 343, + 344, 345, 346, 0, 0, 347, 348, 0, 350, 0, + 349, 0, 351, 352, 353, 354, 355, 356, 358, 357, + 359, 0, 0, 360, 361, 0, 0, 363, 362, 365, + 366, 0, 0, 0, 168, 364, 0, 0, 0, 367, + 0, 368, 369, 370, 0, 371, 372, 169, 0, 170, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 171, + 373, 374, 0, 172, 375, 0, 377, 376, 378, 379, + 380, 381, 382, 383, 384, 173, 0, 0, 174, 385, + 386, 0, 387, 0, 388, 389, 390, 391, 392, 0, + 393, 394, 395, 0, 0, 396, 0, 0, 0, 397, + 398, 400, 399, 401, 0, 0, 402, 403, 404, 405, + 406, 0, 407, 175, 0, 408, 176, 409, 0, 0, + 410, 0, 177, 0, 411, 178, 0, 412, 413, 414, + 0, 415, 0, 0, 179, 416, 417, 418, 420, 421, + 419, 422, 180, 423, 424, 0, 425, 181, 0, 0, + 0, 427, 426, 428, 182, 0, 0, 0, 430, 0, + 0, 0, 431, 0, 183, 429, 185, 432, 0, 433, + 184, 186, 434, 435, 0, 0, 0, 0, 0, 436, + 437, 438, 0, 440, 439, 0, 441, 0, 0, 442, + 0, 0, 443, 187, 444, 445, 446, 447, 0, 0, + 188, 448, 0, 449, 450, 451, 452, 454, 453, 0, + 0, 455, 456, 457, 458, 0, 460, 462, 0, 0, + 461, 459, 463, 464, 0, 0, 465, 466, 0, 469, + 470, 471, 472, 0, 0, 0, 0, 0, 467, 468, + 0, 0, 0, 189, 473, 474, 475, 0, 477, 478, + 0, 480, 479, 0, 190, 191, 0, 0, 481, 0, + 0, 482, 0, 194, 0, 483, 484, 0, 0, 0, + 0, 0, 0, 487, 0, 0, 485, 0, 0, 0, + 486, 489, 488, 490, 492, 0, 0, 0, 0, 0, + 0, 491, 192, 0, 493, 193, 494, 0, 195, 495, + 196, 197, 198, 199, 200, 0, 0, 201, 0, 0, + 0, 202, 0, 0, 146, 0, 203, 205, 204, 206, + 207, 147, 0, 148, 0, 0, 0, 208, 0, 0, + 0, 209, 0, 0, 210, 212, 211, 0, 213, 0, + 149, 150, 0, 0, 214, 0, 0, 215, 216, 0, + 217, 151, 0, 152, 0, 218, 220, 219, 153, 221, + 222, 0, 223, 226, 0, 225, 224, 154, 227, 155, + 228, 229, 230, 231, 0, 232, 233, 0, 234, 236, + 235, 156, 237, 0, 0, 0, 238, 0, 0, 239, + 0, 240, 0, 0, 241, 0, 0, 0, 243, 242, + 244, 0, 0, 245, 0, 0, 0, 0, 246, 157, + 0, 0, 0, 0, 247, 248, 0, 249, 0, 0, + 0, 250, 0, 251, 252, 253, 254, 255, 0, 0, + 0, 158, 0, 0, 256, 257, 258, 0, 0, 0, + 278, 0, 159, 259, 0, 262, 261, 260, 0, 0, + 263, 264, 0, 265, 267, 266, 268, 269, 160, 0, + 0, 270, 271, 272, 273, 274, 0, 0, 276, 275, + 0, 280, 1665, 282, 0, 0, 161, 0, 0, 0, + 162, 277, 0, 279, 0, 476, 0, 283, 285, 284, + 286, 0, 288, 0, 287, 0, 0, 0, 163, 289, + 0, 164, 0, 0, 165, 290, 0, 0, 0, 291, + 143, 292, 144, 0, 0, 293, 295, 296, 0, 0, + 297, 0, 0, 0, 0, 302, 166, 0, 0, 0, + 294, 0, 0, 0, 298, 299, 0, 300, 301, 0, + 0, 0, 303, 0, 0, 167, 304, 0, 0, 305, + 0, 0, 306, 307, 0, 0, 0, 0, 0, 308, + 309, 0, 310, 0, 311, 0, 312, 313, 0, 0, + 0, 0, 0, 0, 0, 335, 0, 324, 326, 317, + 319, 320, 322, 318, 325, 323, 329, 328, 330, 331, + 332, 333, 334, 327, 0, 315, 321, 316, 0, 336, + 337, 314, 338, 0, 339, 340, 0, 0, 0, 0, + 341, 342, 343, 344, 345, 346, 0, 0, 347, 348, + 0, 350, 0, 349, 0, 351, 352, 353, 354, 355, + 356, 358, 357, 359, 0, 0, 360, 361, 0, 0, + 363, 1666, 365, 366, 0, 0, 0, 168, 364, 0, + 0, 0, 367, 0, 368, 369, 370, 0, 371, 372, + 169, 0, 170, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 171, 373, 374, 0, 172, 375, 0, 377, + 376, 378, 379, 380, 381, 382, 383, 384, 173, 0, + 0, 174, 385, 386, 0, 387, 0, 388, 389, 390, + 391, 392, 0, 393, 394, 395, 0, 0, 396, 0, + 0, 0, 397, 398, 400, 399, 401, 0, 0, 402, + 403, 404, 405, 406, 0, 407, 175, 0, 408, 176, + 409, 0, 0, 410, 0, 177, 0, 411, 178, 0, + 412, 413, 414, 0, 415, 0, 0, 179, 416, 417, + 418, 420, 421, 419, 422, 180, 423, 424, 0, 425, + 181, 0, 0, 0, 427, 426, 428, 182, 0, 0, + 0, 430, 0, 0, 0, 431, 0, 183, 429, 185, + 432, 0, 433, 184, 186, 434, 435, 0, 0, 0, + 0, 0, 436, 437, 438, 0, 440, 439, 0, 441, + 0, 0, 442, 0, 0, 443, 187, 444, 445, 446, + 447, 0, 0, 188, 448, 0, 449, 450, 451, 452, + 454, 453, 0, 0, 455, 456, 457, 458, 0, 460, + 462, 0, 0, 461, 459, 463, 464, 0, 0, 465, + 466, 0, 469, 470, 471, 472, 0, 0, 0, 0, + 0, 467, 468, 0, 0, 0, 189, 473, 474, 475, + 0, 477, 478, 0, 480, 479, 0, 190, 191, 0, + 0, 481, 0, 0, 482, 0, 194, 0, 483, 484, + 0, 0, 0, 0, 0, 0, 487, 0, 0, 485, + 0, 0, 0, 486, 489, 488, 490, 492, 0, 0, + 0, 0, 0, 0, 491, 192, 0, 493, 193, 494, + 0, 195, 495, 196, 197, 198, 199, 200, 0, 0, + 201, 0, 0, 0, 202, 0, 0, 0, 0, 203, + 205, 204, 206, 207, 0, 0, 0, 0, 0, 0, + 208, 0, 0, 0, 209, 0, 0, 210, 212, 211, + 0, 213, 0, 0, 0, 0, 0, 214, 0, 0, + 215, 216, 0, 217, 0, 0, 0, 0, 218, 220, + 219, 0, 221, 222, 0, 223, 226, 0, 225, 224, + 0, 227, 0, 228, 229, 230, 231, 0, 232, 233, + 0, 234, 236, 235, 0, 237, 0, 0, 0, 238, + 0, 0, 239, 0, 240, 0, 0, 241, 0, 0, + 0, 243, 242, 244, 0, 0, 245, 0, 0, 0, + 0, 246, 0, 0, 0, 0, 0, 247, 248, 0, + 249, 0, 0, 0, 250, 0, 251, 252, 253, 254, + 255, 0, 0, 0, 0, 0, 0, 256, 257, 258, + 0, 0, 0, 278, 0, 0, 259, 0, 262, 261, + 260, 0, 0, 263, 264, 0, 265, 267, 266, 268, + 269, 0, 0, 0, 270, 271, 272, 273, 274, 0, + 0, 276, 275, 0, 280, 281, 282, 0, 0, 0, + 0, 0, 0, 0, 277, 0, 279, 0, 476, 0, + 283, 285, 284, 286, 0, 288, 0, 287, 0, 0, + 0, 0, 289, 0, 0, 0, 0, 0, 290, 0, + 0, 0, 291, 143, 292, 144, 0, 0, 293, 295, + 296, 0, 0, 297, 0, 0, 0, 0, 302, 0, + 0, 0, 0, 294, 0, 0, 0, 298, 299, 0, + 300, 301, 0, 0, 0, 303, 0, 0, 0, 304, + 0, 0, 305, 0, 0, 306, 307, 0, 0, 0, + 0, 0, 308, 309, 0, 310, 0, 311, 0, 312, + 313, 0, 0, 0, 0, 0, 0, 0, 335, 0, + 324, 326, 317, 319, 320, 322, 318, 325, 323, 329, + 328, 330, 331, 332, 333, 334, 327, 0, 315, 321, + 316, 0, 336, 337, 314, 338, 0, 339, 340, 0, + 0, 0, 0, 341, 342, 343, 344, 345, 346, 0, + 0, 347, 348, 0, 350, 0, 349, 0, 351, 352, + 353, 354, 355, 356, 358, 357, 359, 0, 0, 360, + 361, 0, 0, 363, 362, 365, 366, 0, 0, 0, + 0, 364, 0, 0, 0, 367, 0, 368, 369, 370, + 0, 371, 372, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 373, 374, 0, 0, + 375, 0, 377, 376, 378, 379, 380, 381, 382, 383, + 384, 0, 0, 0, 0, 385, 386, 0, 387, 0, + 388, 389, 390, 391, 392, 0, 393, 394, 395, 0, + 0, 396, 0, 0, 0, 397, 398, 400, 399, 401, + 0, 0, 402, 403, 404, 405, 406, 0, 407, 0, + 0, 408, 0, 409, 0, 0, 410, 0, 0, 0, + 411, 0, 0, 412, 413, 414, 0, 415, 0, 0, + 0, 416, 417, 418, 420, 421, 419, 422, 0, 423, + 424, 0, 425, 0, 0, 0, 0, 427, 426, 428, + 0, 0, 0, 0, 430, 0, 0, 0, 431, 0, + 0, 429, 0, 432, 0, 433, 0, 0, 434, 435, + 0, 0, 0, 0, 0, 436, 437, 438, 0, 440, + 439, 0, 441, 0, 0, 442, 0, 0, 443, 0, + 444, 445, 446, 447, 0, 0, 0, 448, 0, 449, + 450, 451, 452, 454, 453, 0, 0, 455, 456, 457, + 458, 0, 460, 462, 0, 0, 461, 459, 463, 464, + 0, 0, 465, 466, 0, 469, 470, 471, 472, 0, + 0, 0, 0, 0, 467, 468, 0, 0, 0, 0, + 473, 474, 475, 0, 477, 478, 0, 480, 479, 0, + 0, 0, 0, 0, 481, 0, 0, 482, 0, 0, + 0, 483, 484, 0, 0, 0, 0, 0, 0, 487, + 0, 0, 485, 0, 0, 0, 486, 489, 488, 490, + 492, 0, 0, 0, 0, 0, 0, 491, 0, 0, + 493, 0, 494, 0, 0, 495, +} +var MySQLPact = []int{ + + 5992, -1000, -1000, 953, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 844, 4526, + 2544, 1208, 56799, 2553, 1326, 1326, 844, 4282, 1973, 2395, + 39635, 13661, 4314, 56799, 2544, 3671, -1000, 38409, 48830, 2761, + 2018, 2248, 1402, 1326, 2544, 2952, 3867, 56799, 2824, 1740, + 1071, 2544, 2760, 1892, 56186, -1000, 844, 56799, -1000, 34118, + 56186, 5199, 1212, 1606, 1288, 2002, 1326, 2582, 56799, 4530, + -1000, -1000, -1000, 4264, 222, 3450, -1000, -1000, -1000, 1286, + 56799, 56799, 56799, 3592, 1801, 56799, 3061, 48830, -1000, -1000, + 3412, -1000, -1000, 3398, 1326, -1000, -1000, -1000, -1000, 617, + 813, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, 1195, 38409, -1000, -1000, + 38409, 3951, 1282, 2938, 2929, 2911, 2970, -1000, -1000, 3060, + 56799, -1000, -1000, -1000, -1000, -1000, 1349, 1660, 3592, 48830, + 1248, 3986, -1000, -1000, 1823, 56799, 55573, 2395, -1000, -1000, + -1000, 48217, 354, 811, 56799, -1000, -1000, 3396, 684, 1739, + 13661, 3654, -1000, 664, 2545, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, 18099, 18099, 18099, 18099, 13661, 616, + 614, 56799, 31051, 18099, 612, 13661, 600, 211, 594, 15563, + 812, -1000, 592, 285, 225, 587, 583, 578, 574, 568, + 567, 566, 564, 217, 194, 560, 559, 555, 546, 285, + 347, 544, 537, 533, 532, -1000, 531, 527, 516, 347, + 511, 507, 285, 347, 347, 504, 502, 501, 499, 496, + 495, 493, 489, 488, 486, 485, 483, 479, 473, 471, + 467, 465, 456, 453, 452, -1000, 1260, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, 1729, -1000, 33505, 431, 430, 405, + 404, 383, 380, 377, 371, 369, 365, 359, 358, 350, + -1000, -1000, 56799, 347, 345, 332, 329, 324, 319, 315, + 314, 312, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 1326, + 56799, 2984, 2984, 2984, -1000, 2984, 2984, 2984, 56799, 3056, + 2984, -1000, 988, 5218, 3574, -1000, 5865, 2336, 2260, 811, + -1000, -1000, -1000, -1000, 2959, -1000, -1000, -1000, 56799, 13661, + -1000, -1000, 2872, 2785, -1000, -1000, 38409, 1326, 38409, -1000, + 2333, 3121, -1000, 2617, -1000, -1000, 56799, 38409, -1000, 1326, + 37183, -1000, -1000, -1000, 748, -1000, 3971, -1000, 3813, 1656, + -1000, -1000, -1000, 956, 5528, 1682, -1000, -1000, 733, 2168, + 54960, 1968, 32892, 45152, 43313, 2019, -1000, -1000, -1000, 809, + 808, 1650, -1000, 1656, -1000, 1252, 1670, 2877, 1371, 1311, + -1000, 47604, 2614, 1671, 3223, 3221, 2877, 3448, -1000, 310, + 2677, 2677, -1000, 4440, 1019, 1252, 1252, 3160, 3938, 1365, + 1830, 1826, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, 1590, 1096, 1590, 38409, -1000, 56799, -1000, 2959, -1000, + 1722, 1722, 1722, 1722, 1722, -1000, -1000, -1000, -1000, 1068, + 821, 4264, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, 120, 4264, 222, -1000, -1000, 38409, + 3618, 1038, -1000, -1000, 1527, -1000, 56799, 922, 1703, -1000, + -1000, -1000, 2815, -1000, 56799, 2329, 46378, 1352, 46378, 38409, + -1000, 13661, 56799, 5565, 470, -1000, -1000, 585, 1977, 2764, + 2970, 56799, 56799, 56799, 56799, 2484, 46378, 56799, -1000, 4007, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 3115, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, 3112, -1000, 1527, 3163, + -1000, -1000, -1000, -1000, -1000, 38409, 491, -1000, 807, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, 56799, -1000, 48830, 13661, 13661, 13661, 13661, + -1000, -1000, -1000, -1000, -1000, 2171, 18099, 17465, -1000, -1000, + -1000, -1000, -1000, -1000, 309, 2555, 18099, 2685, 18099, 18099, + 18099, 18099, 18099, 18099, 19367, 18733, 18099, 18099, 18099, 18099, + 18099, 18099, -1000, -1000, 48830, 18099, 3761, 3761, 3761, 3761, + 119, 923, 55, 13661, -1000, 13661, 3966, 744, 37796, -1000, + 789, 3761, 13661, 913, 1739, 13661, 37796, 37796, 444, 13661, + 56799, 13661, -1000, 116, 13661, -1000, 13661, 13661, 13661, 13661, + 13661, 13661, 13661, 13661, 13661, -1000, 13661, -1000, 7955, 115, + 13661, 13661, -1000, -1000, 29, 13661, 13661, 4276, 1675, 18099, + 13661, 13661, -1000, 1463, 1463, -1000, -1000, -1000, -1000, 13661, + 13661, 13661, 13661, 102, 13661, 13661, 13661, 13661, 13661, 13661, + 13661, 13661, 13661, 13661, 100, 13661, 13661, 13661, -1000, -1000, + -1000, -1000, -1000, 1621, 2045, 3690, 3964, 3964, 3964, 3686, + 3673, 3669, 3964, 3964, 3964, 3964, 3666, 3539, 805, -1000, + 13661, 13661, 13661, 13661, 13661, 13661, 13661, 13661, 2984, 2433, + 56799, 3212, 56799, 56799, 46378, 38409, 56799, 56799, 1197, 56799, + 48830, -1000, 257, -1000, 38409, 742, -1000, 2612, 2608, 2607, + 2604, 2602, 2587, 3809, -1000, -1000, -1000, -1000, -1000, -1000, + 35344, -1000, 2428, 2425, 741, 1939, -1000, 303, 303, 303, + 303, -1000, -1000, -1000, 1781, 1088, -1000, -1000, -1000, -1000, + -1000, -1000, 2326, 1428, -1000, 1309, 2023, -1000, -1000, 3366, + -1000, 57412, 37183, 1568, 1739, 3802, 2657, -1000, -1000, 739, + -1000, 3366, 38409, 2836, 738, -1000, -1000, 2443, 2063, 2866, + 671, 671, -1000, 833, 1684, -1000, 737, -1000, 1192, 46378, + 38409, -91, 38409, -1000, -1000, 2106, 1892, -1000, -1000, -1000, + -1000, 4963, 1260, -1000, -1000, 2424, 1939, 2423, 1977, 1689, + -1000, 32279, -1000, 736, 734, -1000, 2689, 1134, -1000, 733, + 2168, 1968, 8589, -1000, -1000, 1968, 2045, -1000, -1000, -1000, + -1000, -1000, 13661, 3759, -1000, -1000, -1000, -1000, 1399, 46378, + 56799, 56799, -1000, -1000, -1000, 1208, 13661, 2877, 2877, 2877, + -1000, 1252, 56799, -1000, -1000, 2877, 2877, 1782, 1782, -1000, + -1000, -1000, -1000, 2830, 2830, 38409, -1000, 824, -1000, -1000, + 43926, -1000, 3158, 732, -1000, -1000, -1000, 2813, 1312, 3179, + -1000, -1000, -1000, -1000, 1252, 1252, -1000, -1000, 46378, 2970, + 38409, 38409, 56799, 56799, 56799, 56799, -1000, 1252, 56799, 1252, + 56799, 1062, 731, -1000, -1000, -1000, -1000, 730, -1000, 3702, + 1097, -1000, -1000, -1000, 26138, 2028, 727, 1317, -1000, 2346, + -1000, -1000, -1000, 3642, 433, -1000, -1000, 13661, -1000, 1451, + -1000, 99, 6990, 3618, -1000, -1000, -1000, 3756, -1000, 3658, + 2531, 2531, -1000, 2416, 38409, 2973, -1000, 3662, 3662, 3662, + -1000, -1000, 4016, -1000, 4002, -1000, 296, 726, 2086, 378, + 285, -1000, -1000, -1000, -1000, 710, 93, 725, 1739, -1000, + 724, -1000, 3394, 3384, 3381, 3375, 3372, 3365, 3363, 3356, + 3353, 3336, 3334, 3332, 3331, 3330, 3314, 3307, 3303, 3301, + 3298, 3297, -1000, 3285, 3279, 3271, 3270, -1000, 38409, -1000, + 3573, -1000, -1000, -1000, -1000, -1000, 1030, -1000, -1000, -1000, + -1000, -1000, 1873, 3777, -1000, 38409, -1000, -1000, -1000, 3618, + 3207, 591, -1000, 3011, -1000, 4002, 3662, 56799, 56799, 2970, + 56799, 56799, 3086, -1000, 3656, 2106, 337, 804, -1000, -1000, + 26138, 56799, -1000, 42087, -1000, -1000, 1739, 1435, 3950, -1000, + -1000, 1576, -1000, -1000, -1000, -1000, -1000, 284, -1000, -1000, + 13661, 282, 18099, 18099, 18099, 3544, 18099, 2596, 3723, 3737, + 3810, 947, 947, 1250, 15563, 1250, 15563, 817, 817, 817, + 817, 817, -1000, -1000, 3761, -1000, -1000, 13661, 1069, 2379, + 2828, 206, 3786, 89, 355, 280, 37796, -34, 56799, 2728, + 1419, 13661, 762, 80, 79, 789, -1000, 826, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 716, + 91, -221, -1000, 2469, 2407, 2322, 3778, 3776, 2295, 2215, + 3416, 2155, 2078, 706, 402, 12393, 11759, 11125, -1000, 2056, + 3311, -1000, 78, 3304, 3278, 3120, 723, -1000, -1000, -1000, + -1000, 3043, 3267, 1159, 722, 721, 74, 720, -1000, 13661, + 2027, 2015, -40, 2013, -1000, 3259, 3254, 1898, 3015, 1891, + 1875, 1870, 2995, 2939, 1853, -1000, 2810, 610, 426, 13661, + 48830, 788, 787, 786, 72, 3964, 13661, -1000, 69, 68, + 62, 10491, 61, 13661, 59, 3964, 58, 3964, 56, 52, + 49, 48, 46, 3964, 13661, -1000, 56799, 2655, -41, -51, + -54, -55, -66, 2515, -69, 38409, 38409, -1000, -1000, 784, + -1000, 714, -1000, 650, -1000, -1000, 697, 1197, -1000, -1000, + -1000, 3443, -1000, -1000, 1197, -1000, 713, -1000, 48830, 1290, + 710, 5192, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + 711, 24907, -1000, 3263, -1000, 48830, 1886, 46378, 4600, -1000, + -1000, -1000, 56799, -1000, -1000, -1000, -1000, 1304, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 56799, + -1000, -1000, 910, -1000, 4718, -1000, -1000, -91, 1208, 38409, + 2875, -1000, 38409, 1206, 710, 54347, 38409, -1000, 2766, -1000, + -1000, 278, -1000, -1000, 1327, 2625, 3982, 277, -1000, -1000, + -1000, 274, -1000, -1000, -1000, -1000, 48830, -1000, 1208, 13661, + 38409, 38409, 707, 1183, 317, -1000, -1000, 27982, 37796, 219, + 219, 1068, 4264, -1000, -1000, -1000, 273, -1000, 705, 3262, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, 1807, 702, 46378, -1000, 56799, -1000, 701, + -1000, 53734, -1000, 2803, 1912, 1827, -1000, -1000, -1000, -1000, + 8589, -1000, 1739, 211, -1000, -1000, 18099, 13661, 53734, 1739, + -1000, 46991, -1000, -1000, 262, 259, 1968, -1000, -1000, -1000, + 1739, 1252, 1252, 38409, -1000, -1000, 1252, 1252, -1000, -1000, + -1000, -1000, -1000, 3119, 1208, 3119, 2877, 42, -1000, 530, + -1000, -1000, -1000, -1000, -1000, 2677, 1938, 4440, -1000, -1000, + -1000, -1000, -1000, -1000, 56799, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, 1007, 4090, 1590, 1096, 1597, + -1000, -1000, 1652, 626, -1000, 3689, 56799, -1000, -1000, 2106, + -1000, -1000, -1000, -1000, -1000, -1000, 1722, -1000, 3157, -1000, + 2043, 4, -1000, -1000, 2710, -1000, 2677, 3117, 2867, -1000, + 30438, 25520, 3876, -1000, 1739, 782, -1000, -1000, -1000, -1000, + 2677, -1000, -1000, -1000, 1302, 1298, 255, -1000, -1000, -1000, + 3660, 2214, 2211, 2210, 2184, 2177, 2164, 2154, -1000, 2150, + -1000, 2051, -1000, 3572, 2140, 29823, 3735, 3735, 2775, 2730, + 3735, 1667, 1177, -1000, -1000, -1000, -1000, -1000, 6383, 3869, + 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, + 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, -1000, -1000, + 1968, 3579, 3576, 56799, 2717, 1968, 1968, -1000, 1968, 1968, + 3570, -1000, 1208, 1515, 1506, 1456, 1440, 1398, -1000, 1690, + 1867, 2061, -1000, 256, -1000, -1000, 2840, 1208, 2089, 2089, + -1000, 1390, 1245, 2946, 46378, 3195, 48830, -1000, -1000, 13661, + 5565, 1208, 1208, 1208, 1208, 2427, 2427, 2427, 2427, 2427, + 1208, 1208, 1208, 1208, 1208, 2427, 1208, 1208, 1663, 249, + 2427, 1208, 2400, 1208, 2427, -1000, -1000, -1000, -1000, -1000, + 384, 2414, 1028, 2412, 2387, -1000, 3618, -1000, 46378, 1452, + 2294, 990, 3930, 245, 56799, 240, 939, 56799, 842, 910, + 56799, 26138, 42087, -1000, 910, -1000, 759, -1000, -1000, -1000, + -1000, -1000, -1000, 41, 603, 13661, 2455, 2596, 3723, 18099, + 3723, -1000, 18099, 444, 444, -81, 3642, -1000, -1000, -1000, + -1000, -1000, 821, 2828, -1000, 40, 2828, 206, 13661, -1000, + -1000, 18099, -1000, -1000, 779, 4416, 3464, 13661, 13661, 3999, + 4416, 45765, -1000, -1000, 13661, 13661, 13661, 56799, -1000, 45765, + -1000, -1000, -1000, 13661, 13661, -1000, -1000, 13661, -1000, -1000, + -1000, 13661, -1000, 13661, 3803, 13661, 3035, 13661, 2907, 13661, + -1000, 16831, -1000, 2899, 2896, 13661, 13661, 13661, 16197, 13661, + 13661, 13661, 13661, -1000, -1000, 1739, -1000, -1000, -1000, -1000, + 13661, 13661, -1000, 13661, -1000, -1000, -1000, 13661, 13661, -1000, + 13661, -1000, 13661, 38, 3805, 2427, 2625, 1739, 774, -1000, + -1000, -1000, -1000, 37, 1739, -1000, -1000, -1000, 36, -1000, + -85, -1000, 32, -1000, 28, -1000, -1000, -1000, -1000, -1000, + 27, 514, -1000, 13661, -1000, -1000, -1000, -1000, -1000, 13661, + -1000, 650, 2886, 56799, 46378, -1000, -1000, -1000, 1197, -1000, + 1968, 697, 257, -1000, -1000, 1911, 3188, -1000, 35957, 35957, + -1000, -1000, -1000, -1000, 1241, 1230, 1227, 1793, -1000, 36570, + 36570, 36570, -1000, 1175, -1000, -93, -1000, -1000, -1000, -1000, + 2677, 13661, -1000, -1000, -1000, -1000, -1000, 236, -1000, -1000, + -1000, -1000, -1000, 2374, -1000, -1000, -1000, 696, 2443, -1000, + 1246, -1000, -1000, 2653, -1000, 840, -1000, -1000, -1000, -1000, + 2766, -1000, 235, 50669, 234, 3868, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, 231, 3261, -1000, 18099, 56799, + -1000, -1000, 1739, -1000, -1000, 46378, 46378, -1000, -1000, 1491, + -1000, -1000, -1000, -57, -111, 26, -1000, -1000, -1000, 773, + 695, -1000, 1968, 692, -1000, 13027, 692, -1000, 821, 56799, + 4963, 24907, 36570, 36570, 36570, 3064, 3116, -1000, 32279, -1000, + -1000, -1000, -1000, 1588, 1899, -1000, -1000, 1739, 1968, -1000, + -1000, -1000, -1000, 1256, 1255, 1399, -1000, -1000, 2877, -1000, + -1000, 2677, 2400, -1000, 2677, 910, 1392, 43926, 43926, -1000, + 2451, -1000, -1000, -1000, 2085, 3258, 691, -1000, 3257, 3256, + -1000, -1000, -1000, -1000, 37796, 26138, 28595, 28595, 2014, 2216, + 2216, -1000, 2799, 2796, 28595, 3366, 4264, -1000, 689, -1000, + 2524, -1000, -1000, -1000, 1059, 2817, -1000, -1000, -1000, -1000, + -1000, -1000, 1246, 1246, -1000, 686, -1000, 48830, -1000, 910, + 910, 13661, -1000, 50056, 42700, -1000, -1000, -1000, -1000, -1000, + 5281, -1000, 56799, 39022, 2758, 2755, 39022, -1000, 2544, 2544, + 2544, 51282, 2544, 2544, 51282, 56799, -1000, 3867, 2544, -1000, + -1000, 39022, 2766, 2766, 1596, -1000, -1000, 39022, 2544, 3346, + 29210, 2259, 6552, 772, 56799, 39022, 39022, -1000, -1000, 39022, + 38409, -1000, -1000, -1000, 3796, -1000, 37796, 53121, -1000, 52508, + 48830, 2400, 2400, 2427, 1208, 1208, 2400, 4301, 4288, 4263, + 4259, 2427, 2427, 2427, 2581, 226, 2639, 1968, 1968, -1000, + -1000, -1000, 1208, 2427, 44539, 46991, 2499, -1000, -1000, -1000, + -1000, 3651, 3648, 2963, 3543, 1172, 2099, 3369, 3942, 56799, + -1000, 376, -1000, -1000, -1000, -1000, 1968, 1968, 1968, -1000, + -1000, 831, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + 198, -1000, -1000, -1000, -1000, -1000, -1000, 1208, 1208, -117, + -1000, 1208, 1208, 1208, 1208, 1208, 1208, 2427, 2076, -1000, + -1000, 1739, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 2427, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + 27369, 2131, 38409, -1000, 4901, 38409, -1000, 2163, 2163, 38409, + 38409, -1000, 1381, 48830, -1000, 363, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, 1968, 1968, 1968, 1968, 4260, 2630, + 1507, -1000, -1000, 2485, 2371, 56799, 2059, 1805, 48830, 2241, + -1000, 769, 910, 759, -1000, -1000, 823, 20, -1000, -1000, + 13661, 19, 590, 18099, -1000, -1000, 2545, -1000, -1000, -1000, + 55, 436, -1000, -1000, -1000, 18, -121, 1591, 16, 192, + 192, 192, 2854, 2852, -1000, 203, 203, 191, -1000, 3963, + 1739, 13661, 15, 12, -1000, 580, 9, 684, -1000, 8, + 2364, 1786, 1762, 1634, 1587, 13661, 1545, 13661, 1530, 13661, + 1466, 1462, 15563, 13661, 13661, 1445, 1391, 1315, 1310, 15563, + 475, 385, 1709, 1320, -1000, 50056, 1132, 373, 1293, 1283, + 1099, 1277, 1264, -1000, 223, 223, 683, -1000, 682, -1000, + -1000, 1453, -1000, -1000, 56799, -1000, -1000, -1000, -1000, -1000, + -1000, 1665, 3866, 1239, 1237, -1000, -1000, 3985, 2632, -1000, + -1000, -1000, 48830, -1000, 2626, -1000, -1000, 680, -1000, 3251, + -1000, -1000, -1000, 1161, 764, 763, -1000, 1147, 1137, 46378, + -1000, 56799, -1000, 1739, 13027, -1000, 3498, 38409, 2943, 2766, + 2050, -1000, -1000, -1000, 51282, 7, 679, -1000, -1000, -1000, + -1000, 2109, 2667, 56799, 2625, -1000, 3723, 2, 678, -1000, + -1000, 1118, -1000, -1000, -1000, 1672, -57, 37796, 1451, 42700, + 37796, 13027, 219, -1, 673, -1000, 1739, 211, 436, -126, + -1000, 3247, -1000, 3113, 3111, 3107, 2318, 46378, -1000, -1000, + -1000, -1000, 8589, -3, -6, -1000, 1252, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, 3599, 3241, 1208, 2226, + 1208, 1208, 252, -1000, 1968, -1000, 1218, 2366, 28595, 2216, + 2216, 2789, -1000, 2779, -1000, -1000, 283, 1470, -1000, 821, + -120, 2379, 26138, 2427, -1000, -1000, 1610, 3796, -1000, 31666, + -1000, 3053, 2677, 663, 3713, 1739, -1000, 51895, -1000, -1000, + 5, -1000, -1000, 3715, 2752, 649, -1000, -1000, 2207, 39022, + -1000, -1000, 51282, 51282, 51282, 3573, -1000, 649, 51282, 2625, + -1000, 902, -1000, -1000, 244, -1000, -1000, 39022, -1000, 39022, + 39022, 2750, -1000, 2735, 2766, 205, -1000, 56799, -1000, 56799, + -1000, -7, 646, -1000, -1000, -1000, -1000, -1000, -1000, 38409, + 4601, 192, 204, 191, 192, -1000, -1000, 349, 598, 192, + 192, 192, 192, 192, -1000, 203, 203, 203, -1000, 192, + -1000, -1000, -1000, 3148, 2134, 192, 2134, 2134, 191, 191, + 191, 190, 189, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + 1979, -1000, 928, 1479, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, 56799, -1000, 39022, 6552, 1980, -1000, + 44539, 643, -1000, 3713, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, 38409, -1000, -1000, -1000, -1000, 1208, + 1208, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + 3726, -1000, 2358, 56799, -1000, 1965, 2354, 13661, 13661, 146, + -139, -1000, -1000, 2840, 2699, 2699, 2699, -1000, 2089, -1000, + 1390, -1000, -1000, 2946, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, 3191, -148, -1000, -1000, -1000, 38409, -12, 1672, + -1000, 2050, -1000, -1000, 6383, 187, -1000, -1000, -1000, -1000, + -1000, 186, 183, -1000, 1244, 3935, -1000, 2294, 2699, 2699, + 2625, 1208, -1000, 356, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, 1968, 3033, 2356, -1000, -1000, -1000, -14, + 636, -1000, -1000, -1000, -1000, -1000, 1679, -17, 633, -1000, + -1000, 1549, -1000, -1000, -1000, -1000, 2059, 2323, 2679, 42087, + -1000, -1000, -1000, -149, -1000, -1000, 13661, -1000, 2379, 2710, + -1000, 2710, -1000, -1000, -18, 895, 2783, -1000, -1000, -1000, + 1602, 2134, -1000, -1000, -1000, -1000, 2446, -1000, -1000, -1000, + -1000, 1566, 13661, 1739, -1000, -1000, -1000, 13661, -1000, -1000, + 13661, -1000, -1000, -1000, -1000, 1225, -1000, 1213, -1000, 1179, + -1000, -1000, 444, 444, 444, -1000, -1000, -1000, -1000, 444, + 13661, -1000, 13661, -1000, 13661, 13661, -1000, 13661, -1000, 13661, + -1000, -1000, 13661, -1000, -1000, 2688, 2625, -20, 2427, 2625, + -1000, 2625, 1788, -1000, -1000, -1000, -1000, -1000, -22, 1722, + 13661, -1000, -1000, -1000, -1000, -1000, -1000, 35957, 4629, 46378, + 767, 41474, 46378, 46378, 210, -1000, -152, 2722, -1000, 2766, + -1000, 2697, 2943, 2862, -1000, -1000, -24, -1000, 50669, -155, + -1000, 56799, 2842, -25, -1000, -27, -1000, 56799, 46378, -1000, + -1000, -1000, 761, -1000, -1000, -1000, -1000, 13027, -1000, -1000, + 56799, 24907, 46378, 46378, 46378, 3103, 591, -1000, -1000, -1000, + -1000, 2016, 3234, 1208, -1000, -1000, -1000, -1000, 2241, 37796, + 13027, 13661, 178, 13661, -1000, 2778, 2767, 28595, 28595, -1000, + -1000, -1000, 1470, -1000, 2766, 2766, -1000, -1000, 436, 3366, + 3642, -1000, 626, -1000, 2517, 3743, 44539, -1000, 3006, 3861, + -1000, 13661, -1000, -1000, -1000, -1000, -1000, 40861, 56799, -1000, + -1000, -1000, 2544, -1000, -1000, 1491, -1000, 1273, -1000, 2109, + 2625, 177, -1000, -1000, -1000, 39022, -1000, -1000, 13661, -1000, + 573, -1000, -1000, 29210, 170, -1000, 4601, -1000, -1000, 2454, + 1266, 1058, -1000, 3617, 2719, 2718, 1208, 48830, 3229, 2971, + -1000, 1000, 1000, -1000, 2445, 1000, -1000, 2134, -1000, -1000, + -1000, -1000, -1000, 45765, 1685, 3899, 3898, 3896, -1000, -1000, + -1000, 2134, 3896, -1000, 1000, -1000, -1000, -1000, -1000, -1000, + 2134, -1000, 937, 1650, -1000, 2134, -1000, -1000, 1000, 1000, + 1000, 1722, 1722, -1000, -1000, -1000, 932, -1000, 760, 3346, + 4601, 3616, 3615, 3759, 37796, -1000, -30, -1000, -1000, 3513, + 1208, 1605, -1000, -1000, -1000, 3694, 444, 1739, -1000, 894, + 1068, 45, 4264, -1000, 56799, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + 2427, -31, 6383, -33, -1000, 3922, -1000, 56799, 56799, 56799, + -1000, 1208, -1000, -1000, -1000, -1000, -1000, -1000, 4260, 2699, + 56799, -1000, -1000, 2485, 56799, 3369, 1799, 56799, 6552, 1208, + 1524, 169, -1000, 43926, 759, -1000, -160, -1000, -1000, -1000, + -1000, -1000, 1929, 2514, 2708, -35, -59, -60, -63, -1000, + -67, -164, 1739, -165, 438, -1000, -1000, -1000, -159, -75, + -84, -161, 1095, 970, 798, 685, 632, 570, 557, -103, + -106, -1000, 624, -1000, 2369, -1000, -1000, -1000, -1000, 619, + 3713, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, 368, -1000, -1000, 368, + 368, -1000, 3047, -1000, 1056, -1000, -1000, 1258, -1000, -1000, + -1000, 2109, 961, -1000, 168, 3982, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, 591, 591, 591, 46378, -1000, 3233, + 1208, -1000, 2679, -1000, -1000, 1739, 56799, 1739, 28595, 28595, + 4654, 980, 4367, 978, -1000, 3152, 3152, -1000, -1000, 55, + -1000, 2664, 2165, -1000, 2241, 13661, 13661, 3713, -1000, -1000, + -1000, -1000, 38409, -176, -1000, 56799, 163, 161, 158, 157, + 529, 152, -1000, 2543, 56799, -1000, -1000, -1000, -1000, -1000, + -1000, 1663, 1663, 1241, 1230, 1227, 2471, 949, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 1000, + -1000, -1000, -1000, -1000, -1000, 604, -1000, -1000, 3896, -1000, + -1000, 45765, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -182, -1000, -183, -1000, 56799, -1000, 3346, + 389, -1000, -1000, -1000, -1000, -1000, 23679, -1000, -1000, 1389, + -1000, 2901, -1000, -118, -1000, 45, -1000, -1000, -1000, -1000, + 2131, 1451, 35, -1000, -186, 3713, 150, -187, -194, -1000, + -1000, -1000, -1000, 38409, 20001, -1000, 6552, 2354, 6552, -1000, + -1000, 3759, -1000, 1208, 2946, -1000, -1000, 3200, -1000, 2511, + -1000, -1000, -1000, -1000, -1000, 2444, -1000, 13661, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, 2427, 13661, -1000, 879, 1586, 879, 879, 2312, 37796, + 38409, -1000, 3655, 2720, 1334, -1000, 149, 591, 1208, -1000, + -1000, -197, -1000, -1000, 13661, 148, 13661, 147, 141, 2526, + 139, 2379, -1000, 1249, 2165, -1000, 3858, 3479, 3857, 3850, + 2677, 1739, -21, 3713, -1000, -1000, -1000, -201, 56799, 56799, + 56799, 56799, -1000, 2109, 2353, 2021, -202, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, 2134, 1722, 2134, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, 13661, 13661, -1000, + -1000, -268, -1000, -1000, 58025, 58025, 56799, 2644, 56799, 9857, + -1000, -1000, -1000, 23679, 13661, 23679, 1208, 3452, 13661, 2309, + 3770, 3769, 1451, -137, 2050, -1000, 1068, 1672, 1528, 56799, + -1000, 2442, 1411, 2927, 3143, -1000, -1000, -1000, -1000, 3583, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, 3543, -1000, -1000, -1000, -1000, -206, + -1000, -1000, -142, 522, -158, 3713, -1000, 3045, -1000, -1000, + -1000, -1000, 3947, 1226, 1223, 1209, -1000, -1000, -1000, 581, + -1000, 1968, 2106, 137, 3655, -1000, 1968, 3269, 1968, 1968, + 1968, 3557, 3551, 1968, 1106, 132, -1000, 2625, 18099, 56799, + -1000, -1000, 1739, 56799, 1739, 56799, 50669, -1000, 3845, 3843, + 50669, -1000, 1249, -1000, 3842, 3837, -1000, 1722, 3835, 1722, + 1722, 1947, -1000, 13661, -1000, -1000, -1000, -1000, 1528, -207, + -212, -213, -220, -229, -1000, 1476, -1000, -1000, -1000, -1000, + 56799, -1000, -1000, -1000, 1739, 3458, 2814, 1430, -1000, -1000, + -1000, 56799, 3098, -1000, -1000, 2179, 1396, -1000, 13661, 3622, + 23066, 756, 2561, 24292, -1000, 13661, 1739, -1000, 2304, 2275, + -1000, -1000, -1000, -1000, -195, 2886, 1528, -1000, -1000, -1000, + 1968, 1208, 3713, -200, 2886, 1411, -1000, -1000, 2136, 2886, + 2927, -1000, -1000, -1000, -1000, 3726, 20001, -1000, -1000, -1000, + -1000, -1000, 3045, -1000, 2261, 2427, 2427, 2427, 2427, 1896, + -1000, -1000, -1000, -1000, 37796, 13027, 3796, -1000, 1325, -1000, + 48830, 1968, 2625, 1642, 1642, 1968, 1968, 1208, 104, -1000, + -1000, 14929, -1000, -1000, -230, -1000, -1000, -238, -241, -242, + -1000, -1000, -219, -1000, 1722, 1722, -1000, 1722, -1000, -1000, + -1000, 3955, 3713, -1000, 1411, 2927, 1528, 1883, -1000, 2279, + 2279, -1000, 2967, 23679, 58025, 58025, 2858, -1000, 1382, -1000, + 13661, 3457, -1000, 23679, 2635, 753, 22453, 49443, 751, 2593, + -1000, 23679, 13661, 1739, -1000, -1000, 1451, -1000, -1000, 2427, + -1000, -1000, -1000, -1000, -1000, 2974, -1000, -1000, 3494, 3511, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + 1764, -249, -1000, 48830, -1000, 48830, -1000, -1000, -1000, 1208, + 1208, -1000, -1000, -1000, -1000, 14295, -254, -259, -1000, -1000, + 9223, -1000, 3723, -236, 1334, 56799, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, 125, -1000, -1000, -1000, -1000, -1000, 2351, + -1000, -1000, 2671, 4014, 2348, -1000, 20614, -1000, -1000, -1000, + 56799, 3456, -1000, 1930, 3791, 23679, 23679, -1000, 286, -1000, + 4905, 3717, 3026, -1000, -1000, -1000, -1000, 21840, 1661, -1000, + -1000, -1000, 1748, 23679, 3743, 3005, -1000, 1325, 3655, -1000, + -1000, -1000, -1000, -1000, 124, -1000, 14295, 664, -1000, -1000, + -1000, 2441, 3578, -1000, -1000, -1000, 1051, -1000, 13661, 23679, + 571, -1000, 3788, 23679, -1000, 23679, -1000, 3614, 56799, 3140, + 3136, 3127, 904, 1855, 23679, -1000, 2664, 3816, -1000, -1000, + -1000, -1000, -252, 476, -1000, 2279, 2279, -1000, 23679, 56799, + -1000, 23679, -1000, 13661, -1000, 2878, 4, 40248, -1000, -1000, + -1000, 2931, 1722, -1000, 2441, -1000, -1000, -1000, 1739, -1000, + -1000, -1000, -1000, 21227, -1000, -1000, -1000, -1000, -1000, 3124, + -1000, 92, 2406, -1000, -1000, -1000, 40248, -1000, 1624, 26756, + 1961, -1000, -1000, 37796, -271, -1000, -1000, -1000, 48830, -1000, + -1000, -1000, 253, -1000, 1968, -1000, 34731, -1000, 37796, -1000, + -1000, -1000, 13027, -1000, -1000, +} +var MySQLPgo = []int{ + + 0, 4958, 4957, 4029, 4956, 4955, 4952, 4947, 4945, 1931, + 1914, 1868, 1864, 4943, 4942, 4941, 4940, 4936, 12, 308, + 4935, 359, 146, 4933, 170, 130, 4932, 277, 274, 4931, + 92, 4925, 4924, 211, 112, 4922, 37, 102, 4921, 97, + 275, 4918, 4917, 4916, 4914, 4911, 4910, 4909, 4908, 4907, + 4906, 4905, 4904, 4903, 4899, 4897, 4894, 4893, 4892, 4891, + 4889, 4888, 4887, 4886, 4885, 4882, 4881, 4877, 4876, 4872, + 4871, 4870, 4867, 4866, 4865, 4864, 4863, 4861, 4859, 4841, + 4839, 4836, 4835, 0, 2554, 4834, 11, 4817, 144, 162, + 263, 2484, 46, 165, 348, 341, 4815, 4799, 163, 114, + 319, 234, 4798, 4796, 4795, 4794, 4792, 3983, 345, 344, + 4791, 323, 4788, 334, 284, 316, 330, 4786, 200, 259, + 193, 156, 4785, 4784, 297, 279, 222, 4780, 4776, 313, + 4775, 320, 4774, 4773, 239, 4765, 4764, 4762, 4761, 231, + 4758, 192, 356, 2051, 2017, 1962, 4755, 1867, 270, 310, + 4754, 3783, 314, 260, 340, 4753, 3766, 337, 3817, 233, + 210, 4752, 256, 85, 278, 201, 136, 140, 178, 4751, + 4749, 139, 14, 4747, 4746, 4745, 4744, 4741, 4739, 267, + 4738, 286, 389, 468, 4733, 223, 164, 249, 4730, 324, + 4729, 4728, 154, 171, 58, 68, 3853, 202, 43, 3849, + 62, 4727, 367, 137, 4725, 4724, 4723, 107, 199, 4, + 138, 4721, 84, 59, 39, 4720, 4713, 108, 4712, 57, + 55, 53, 51, 49, 47, 45, 42, 40, 31, 30, + 26, 23, 355, 82, 86, 4711, 4710, 6, 4707, 4706, + 4705, 4702, 4700, 141, 195, 32, 4699, 4698, 135, 4697, + 4696, 22, 18, 4694, 4691, 4689, 4688, 17, 4686, 4685, + 2, 4682, 3824, 4681, 3774, 361, 4679, 4678, 258, 180, + 4671, 4667, 4664, 4663, 4662, 264, 179, 4661, 189, 4659, + 13, 72, 44, 4648, 4645, 4643, 4641, 4639, 4637, 36, + 4635, 34, 76, 38, 70, 4634, 4633, 4631, 366, 4625, + 4624, 328, 4623, 4611, 4608, 4605, 292, 352, 325, 4604, + 4599, 4597, 4595, 4594, 4593, 198, 236, 185, 175, 4589, + 149, 4586, 188, 197, 176, 187, 4585, 208, 4583, 204, + 4582, 4577, 4576, 196, 64, 150, 61, 29, 27, 48, + 4575, 145, 110, 90, 244, 235, 4574, 300, 332, 103, + 250, 4573, 4572, 4571, 4569, 232, 127, 230, 318, 346, + 4568, 177, 83, 5, 4567, 35, 4565, 33, 94, 132, + 4564, 4563, 19, 4562, 4560, 4559, 25, 4558, 4557, 20, + 4555, 24, 4554, 4553, 91, 283, 226, 326, 296, 295, + 291, 1872, 4552, 213, 287, 255, 4551, 4550, 4549, 66, + 245, 4547, 96, 194, 4546, 153, 301, 220, 205, 4545, + 54, 4544, 191, 215, 4543, 4542, 252, 4536, 160, 203, + 147, 4533, 253, 280, 4532, 4531, 227, 241, 212, 104, + 4529, 120, 209, 4528, 268, 4526, 152, 206, 370, 4525, + 118, 4523, 158, 4522, 116, 4521, 151, 117, 115, 52, + 4518, 4516, 242, 4515, 183, 4513, 182, 190, 4510, 4509, + 4508, 184, 4506, 4505, 4504, 4503, 7, 155, 4502, 285, + 4501, 4500, 4489, 69, 65, 73, 240, 41, 93, 60, + 4487, 16, 360, 4486, 2185, 1942, 4485, 4480, 4479, 247, + 4472, 293, 4471, 207, 214, 217, 218, 159, 4467, 161, + 4465, 4464, 257, 4460, 219, 124, 216, 4454, 4452, 246, + 243, 358, 4451, 4444, 4443, 4442, 304, 4440, 4431, 4430, + 4429, 4428, 303, 4427, 399, 4426, 261, 4425, 327, 4424, + 4423, 4416, 186, 266, 181, 4415, 80, 143, 302, 251, + 4414, 4413, 4411, 4408, 357, 276, 298, 329, 248, 331, + 4407, 4403, 4402, 281, 4401, 4399, 4398, 4397, 4395, 4393, + 4385, 4382, 272, 4374, 4373, 4371, 21, 4370, 4369, 4368, + 4367, 4359, 4357, 4356, 271, 374, 347, 4354, 4353, 4344, + 4343, 4341, 75, 350, 4337, 89, 224, 87, 4334, 4330, + 4328, 254, 111, 167, 4326, 119, 4322, 172, 81, 4316, + 4315, 173, 4313, 4310, 4308, 4307, 134, 142, 4301, 269, + 157, 4298, 148, 129, 113, 4296, 4293, 3, 4292, 4288, + 221, 4287, 265, 28, 15, 4286, 376, 4282, 321, 4280, + 273, 4276, 4275, 4272, 3753, 4271, 4266, 229, 312, 225, + 228, 8, 9, 4265, 237, 4250, 4229, 169, 50, 1935, + 4226, 4225, 4222, 4221, 307, 4219, 4216, 335, 336, 3769, + 333, 305, 4214, 4213, 4211, 4207, 4206, 4202, 322, 4201, + 343, 4196, 4195, 4194, 4192, 4191, 4187, 4186, 4185, 4184, + 4178, 4175, 4174, 99, 4165, 77, 4164, 4161, 10, 4160, + 1, 338, 262, 309, 311, 4155, 4150, 4148, 4147, 4146, + 4145, 4141, 4140, 364, 315, 290, 339, 4127, 133, 105, + 4122, 4115, 317, 349, 4109, 56, 4107, 288, 4100, 238, + 4091, 67, 3790, 362, 342, 4083, 106, 4080, 4068, 4060, + 4058, 3838, 3835, 4057, 4051, 4048, 4044, 4043, 4037, 4036, + 351, 4033, 4032, 4027, 4022, +} +var MySQLR1 = []int{ + + 0, 1, 1, 1, 173, 173, 2, 2, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 73, 175, 175, 75, 176, 176, 74, 177, 177, 178, + 178, 179, 80, 70, 180, 180, 181, 181, 181, 181, + 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, + 181, 181, 181, 181, 181, 181, 181, 184, 184, 184, + 186, 185, 185, 185, 185, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 206, 207, 207, 208, 208, + 208, 208, 208, 208, 208, 147, 210, 210, 212, 212, + 212, 212, 215, 215, 216, 216, 211, 211, 217, 217, + 213, 213, 214, 218, 218, 218, 218, 218, 218, 218, + 218, 218, 218, 218, 218, 218, 202, 139, 139, 232, + 232, 234, 234, 233, 233, 233, 233, 233, 233, 233, + 235, 235, 235, 236, 236, 13, 238, 238, 239, 239, + 240, 240, 241, 241, 242, 242, 244, 243, 246, 246, + 247, 247, 248, 249, 249, 249, 249, 250, 250, 252, + 252, 253, 253, 254, 254, 254, 254, 258, 258, 259, + 259, 260, 257, 257, 262, 263, 263, 261, 261, 261, + 261, 261, 78, 264, 264, 266, 266, 265, 265, 267, + 267, 269, 269, 269, 268, 268, 268, 268, 268, 268, + 268, 268, 268, 268, 268, 268, 77, 76, 270, 270, + 271, 271, 272, 272, 275, 276, 276, 277, 277, 273, + 274, 274, 278, 279, 279, 279, 279, 279, 279, 279, + 279, 279, 279, 279, 279, 279, 255, 255, 256, 256, + 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, + 251, 251, 251, 221, 219, 220, 226, 227, 228, 229, + 230, 231, 283, 283, 283, 284, 284, 280, 285, 285, + 285, 222, 222, 286, 287, 288, 288, 290, 290, 291, + 292, 289, 289, 225, 293, 293, 223, 224, 294, 281, + 281, 281, 295, 295, 296, 296, 296, 297, 300, 205, + 303, 303, 305, 305, 204, 310, 308, 308, 302, 314, + 314, 314, 315, 315, 315, 304, 304, 319, 319, 319, + 320, 320, 320, 320, 320, 320, 320, 320, 306, 306, + 326, 326, 326, 327, 327, 327, 327, 327, 309, 309, + 328, 328, 328, 329, 329, 329, 329, 329, 329, 329, + 311, 311, 332, 332, 332, 333, 333, 333, 301, 312, + 313, 298, 307, 299, 299, 299, 316, 317, 318, 321, + 330, 331, 322, 325, 323, 324, 324, 335, 335, 190, + 190, 190, 190, 340, 340, 343, 343, 343, 342, 347, + 347, 348, 349, 61, 350, 351, 351, 351, 351, 351, + 351, 355, 355, 356, 356, 357, 357, 360, 360, 361, + 359, 358, 364, 352, 352, 353, 353, 353, 366, 366, + 367, 362, 365, 365, 354, 354, 368, 368, 369, 370, + 371, 371, 371, 374, 374, 375, 375, 377, 377, 376, + 378, 378, 379, 379, 373, 373, 380, 380, 381, 382, + 372, 372, 383, 383, 384, 384, 384, 384, 384, 384, + 384, 384, 30, 346, 346, 201, 201, 387, 387, 388, + 388, 188, 188, 391, 391, 392, 189, 189, 341, 341, + 394, 394, 393, 393, 393, 395, 395, 395, 395, 395, + 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, + 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, + 395, 395, 395, 395, 395, 390, 389, 338, 401, 396, + 396, 396, 396, 396, 396, 397, 397, 397, 24, 24, + 403, 403, 403, 403, 344, 404, 404, 405, 405, 406, + 406, 407, 407, 407, 407, 407, 407, 409, 409, 416, + 414, 414, 417, 408, 419, 419, 419, 419, 419, 419, + 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, + 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, + 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, + 419, 419, 419, 435, 435, 435, 435, 435, 435, 435, + 435, 428, 430, 430, 432, 432, 433, 433, 433, 433, + 433, 421, 421, 421, 421, 421, 424, 424, 424, 426, + 426, 426, 437, 434, 434, 438, 438, 438, 423, 423, + 439, 439, 440, 440, 440, 427, 427, 427, 427, 422, + 422, 425, 425, 420, 420, 441, 441, 442, 442, 442, + 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, + 442, 442, 442, 442, 245, 444, 443, 443, 399, 399, + 99, 99, 98, 98, 449, 449, 96, 96, 97, 97, + 446, 447, 447, 400, 400, 398, 398, 450, 450, 450, + 451, 451, 451, 429, 429, 429, 429, 429, 429, 429, + 431, 431, 452, 453, 453, 454, 455, 455, 455, 455, + 456, 457, 458, 458, 459, 460, 460, 461, 461, 445, + 445, 410, 462, 462, 465, 465, 463, 463, 463, 463, + 464, 464, 464, 464, 464, 466, 466, 466, 466, 466, + 411, 415, 415, 467, 467, 413, 413, 468, 468, 468, + 191, 191, 196, 199, 197, 192, 192, 194, 194, 198, + 198, 200, 200, 470, 470, 472, 472, 471, 471, 469, + 469, 477, 477, 473, 473, 474, 475, 475, 476, 476, + 476, 193, 193, 478, 478, 412, 412, 480, 480, 436, + 436, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 488, 488, 486, 486, 486, + 486, 140, 140, 487, 487, 87, 87, 483, 483, 483, + 483, 483, 483, 483, 483, 483, 483, 483, 483, 483, + 483, 483, 483, 483, 483, 491, 495, 495, 492, 500, + 500, 500, 498, 501, 501, 493, 493, 499, 490, 490, + 503, 502, 502, 502, 502, 502, 502, 502, 502, 502, + 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, + 502, 195, 195, 195, 195, 195, 509, 509, 510, 510, + 504, 504, 482, 482, 506, 506, 506, 505, 505, 505, + 507, 507, 507, 507, 72, 72, 46, 514, 514, 515, + 515, 516, 516, 516, 513, 517, 517, 518, 518, 519, + 519, 520, 520, 511, 511, 521, 521, 522, 522, 512, + 512, 523, 523, 523, 523, 523, 52, 525, 525, 525, + 54, 497, 497, 526, 526, 527, 527, 527, 49, 50, + 51, 496, 496, 528, 528, 529, 529, 529, 529, 529, + 529, 53, 494, 494, 494, 7, 7, 530, 530, 130, + 130, 129, 60, 135, 135, 136, 136, 131, 132, 531, + 531, 62, 137, 137, 138, 138, 134, 133, 533, 532, + 535, 535, 534, 534, 18, 19, 19, 21, 21, 28, + 28, 20, 22, 123, 123, 123, 123, 123, 124, 124, + 385, 385, 543, 543, 544, 544, 544, 141, 141, 141, + 386, 386, 386, 546, 546, 209, 363, 548, 548, 548, + 548, 548, 549, 549, 158, 158, 158, 158, 158, 158, + 158, 158, 158, 158, 158, 161, 161, 161, 161, 161, + 161, 162, 162, 162, 162, 162, 162, 162, 162, 162, + 162, 162, 162, 162, 162, 163, 163, 163, 163, 163, + 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, + 550, 550, 551, 551, 237, 237, 554, 554, 150, 150, + 150, 150, 150, 150, 552, 552, 164, 164, 164, 164, + 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, + 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, + 164, 164, 164, 164, 164, 164, 555, 555, 555, 555, + 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, + 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, + 555, 555, 555, 556, 556, 556, 556, 556, 556, 556, + 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, + 556, 556, 556, 556, 556, 558, 558, 558, 558, 558, + 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, + 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, + 568, 568, 568, 568, 568, 568, 568, 568, 557, 557, + 561, 561, 571, 571, 572, 572, 569, 569, 573, 573, + 574, 559, 559, 559, 559, 559, 559, 559, 559, 559, + 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, + 168, 580, 580, 580, 577, 577, 579, 579, 578, 578, + 581, 581, 575, 562, 562, 562, 562, 562, 562, 562, + 562, 562, 562, 562, 570, 570, 160, 160, 560, 560, + 583, 583, 563, 563, 565, 565, 564, 564, 120, 120, + 125, 119, 119, 126, 126, 122, 122, 122, 122, 122, + 122, 122, 122, 122, 122, 122, 122, 584, 584, 584, + 587, 587, 588, 121, 121, 121, 38, 38, 26, 27, + 29, 23, 591, 590, 586, 586, 595, 595, 595, 595, + 596, 596, 597, 597, 599, 599, 600, 600, 589, 536, + 536, 601, 601, 598, 598, 585, 585, 93, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 567, 567, + 567, 567, 602, 602, 602, 89, 89, 576, 576, 539, + 539, 541, 541, 553, 553, 540, 540, 603, 603, 604, + 604, 604, 508, 605, 605, 606, 537, 537, 607, 608, + 608, 479, 479, 479, 609, 609, 402, 402, 610, 611, + 611, 611, 612, 612, 612, 612, 612, 613, 613, 183, + 183, 183, 183, 183, 183, 336, 336, 336, 336, 336, + 187, 187, 187, 187, 187, 339, 339, 339, 339, 614, + 615, 615, 542, 542, 616, 616, 616, 617, 618, 619, + 619, 620, 620, 538, 621, 621, 621, 14, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 116, 116, 113, 106, 127, 127, 114, 626, 626, + 625, 625, 628, 628, 629, 629, 629, 630, 630, 9, + 12, 631, 631, 631, 631, 633, 633, 108, 108, 109, + 100, 100, 100, 100, 635, 635, 101, 101, 101, 101, + 638, 638, 636, 636, 640, 641, 641, 334, 334, 639, + 643, 643, 644, 644, 642, 642, 632, 632, 10, 646, + 646, 647, 645, 645, 648, 634, 634, 11, 17, 17, + 17, 128, 128, 111, 111, 88, 88, 649, 649, 650, + 650, 650, 8, 651, 651, 652, 652, 653, 653, 654, + 654, 654, 654, 654, 654, 654, 654, 654, 655, 655, + 66, 68, 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 657, 657, 657, 659, 659, 337, + 337, 90, 90, 656, 656, 658, 658, 660, 660, 661, + 661, 148, 148, 148, 79, 79, 82, 82, 82, 82, + 82, 663, 663, 665, 665, 665, 665, 664, 664, 664, + 55, 67, 67, 666, 666, 666, 667, 667, 668, 668, + 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, + 668, 118, 118, 63, 669, 669, 670, 670, 670, 671, + 671, 71, 672, 673, 673, 59, 674, 674, 674, 81, + 16, 675, 675, 677, 677, 676, 676, 676, 345, 345, + 345, 623, 623, 682, 682, 683, 683, 683, 683, 624, + 624, 684, 684, 685, 685, 678, 678, 679, 679, 686, + 686, 680, 680, 680, 687, 687, 688, 688, 681, 681, + 689, 689, 690, 169, 169, 169, 169, 481, 481, 481, + 167, 448, 448, 448, 166, 166, 166, 166, 166, 166, + 166, 166, 166, 166, 171, 171, 171, 171, 171, 170, + 170, 170, 637, 637, 547, 547, 582, 165, 165, 566, + 566, 172, 172, 172, 418, 418, 418, 418, 107, 107, + 107, 112, 112, 110, 84, 84, 182, 91, 95, 622, + 83, 83, 282, 282, 92, 92, 92, 489, 489, 489, + 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, + 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, + 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, + 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, + 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, + 86, 65, 69, 69, 69, 105, 105, 154, 154, 155, + 155, 153, 153, 156, 156, 156, 662, 662, 662, 662, + 157, 157, 157, 157, 152, 151, 151, 151, 151, 151, + 151, 151, 151, 149, 149, 149, 691, 691, 691, 691, + 693, 694, 695, 695, 696, 696, 696, 696, 692, 692, + 692, 159, 159, 159, 159, 159, 42, 524, 524, 117, + 117, 115, 697, 697, 697, 697, 47, 15, 15, 15, + 698, 698, 699, 699, 700, 700, 700, 700, 700, 701, + 701, 701, 701, 701, 64, 702, 702, 702, 702, 702, + 56, 707, 707, 707, 707, 704, 704, 703, 703, 706, + 706, 711, 711, 712, 712, 712, 712, 712, 712, 712, + 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, + 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, + 712, 712, 712, 714, 714, 715, 715, 716, 716, 716, + 705, 705, 705, 705, 627, 627, 203, 203, 717, 717, + 717, 717, 717, 713, 713, 718, 718, 719, 708, 708, + 708, 708, 708, 709, 709, 710, 710, 720, 720, 721, + 721, 721, 721, 721, 174, 722, 722, 723, 723, 723, + 724, 724, 724, 725, 725, 41, 44, 44, 45, 43, + 37, 37, 39, 36, 36, 36, 592, 592, 726, 727, + 727, 593, 593, 593, 25, 25, 35, 35, 40, 728, + 729, 594, 594, 730, 730, 545, 545, 545, 545, 545, + 545, 545, 545, 102, 102, 102, 103, 103, 103, 103, + 103, 104, 104, 104, 104, 104, 104, 485, 485, 732, + 731, 733, 733, 733, 734, 484, 484, 484, 735, 735, + 735, 142, 736, 736, 737, 737, 31, 32, 32, 34, + 34, 33, 738, 738, 738, 738, 143, 146, 146, 145, + 144, 48, 48, 48, 48, 48, 48, 740, 740, 740, + 739, 739, 741, 741, 741, 743, 743, 742, 742, 744, + 744, 57, 58, +} +var MySQLR2 = []int{ + + 0, 1, 3, 2, 0, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 3, 1, 1, 4, 1, 2, 3, 0, 2, 3, + 1, 2, 2, 4, 1, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 5, 3, 1, 0, 1, 3, + 1, 3, 3, 3, 3, 6, 12, 12, 12, 5, + 2, 4, 4, 3, 2, 10, 1, 3, 2, 2, + 2, 2, 2, 2, 2, 12, 5, 2, 0, 1, + 3, 1, 0, 2, 0, 2, 0, 1, 3, 4, + 0, 2, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 0, 3, 1, 0, + 2, 0, 2, 2, 2, 2, 2, 3, 3, 1, + 1, 1, 2, 3, 3, 3, 0, 3, 0, 1, + 3, 1, 0, 1, 3, 1, 0, 3, 0, 1, + 3, 1, 4, 0, 1, 1, 1, 0, 3, 2, + 3, 0, 3, 4, 5, 6, 5, 1, 1, 1, + 3, 1, 1, 1, 3, 0, 1, 1, 1, 1, + 2, 1, 3, 1, 1, 0, 1, 0, 2, 3, + 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 3, 4, 0, 1, + 1, 3, 1, 3, 3, 1, 2, 1, 1, 1, + 1, 3, 3, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 3, 0, 2, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 4, 1, 2, 1, 2, 2, 2, + 5, 2, 0, 2, 1, 1, 3, 4, 0, 2, + 2, 1, 1, 6, 5, 1, 2, 1, 2, 4, + 4, 0, 2, 4, 0, 1, 4, 1, 4, 4, + 6, 6, 1, 1, 1, 1, 1, 2, 4, 5, + 0, 4, 4, 4, 3, 3, 2, 2, 1, 1, + 2, 3, 1, 1, 1, 0, 1, 1, 2, 3, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, + 1, 2, 3, 1, 1, 1, 1, 1, 0, 1, + 1, 2, 3, 1, 1, 1, 1, 1, 1, 1, + 0, 1, 1, 2, 3, 1, 1, 1, 2, 2, + 2, 1, 1, 1, 1, 2, 3, 3, 3, 3, + 3, 3, 3, 3, 4, 1, 1, 1, 1, 2, + 3, 2, 4, 5, 4, 0, 4, 6, 1, 0, + 1, 3, 0, 2, 5, 6, 3, 2, 2, 2, + 2, 0, 1, 0, 3, 0, 1, 1, 3, 1, + 4, 5, 5, 0, 2, 0, 6, 9, 1, 3, + 1, 1, 0, 2, 0, 3, 1, 3, 5, 1, + 0, 4, 3, 1, 1, 1, 3, 1, 3, 3, + 1, 3, 1, 1, 0, 3, 1, 3, 3, 1, + 0, 1, 2, 1, 3, 4, 3, 3, 3, 4, + 4, 3, 4, 0, 1, 0, 1, 1, 2, 1, + 1, 0, 1, 1, 2, 1, 0, 3, 0, 1, + 1, 2, 1, 2, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 5, 1, 1, 3, 4, 4, + 2, 2, 2, 3, 3, 4, 4, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, + 1, 1, 1, 1, 1, 1, 3, 1, 1, 2, + 2, 7, 8, 8, 8, 8, 2, 0, 1, 4, + 0, 1, 2, 3, 3, 3, 3, 1, 2, 1, + 1, 3, 2, 3, 2, 2, 1, 3, 3, 2, + 3, 1, 2, 2, 2, 1, 2, 1, 1, 1, + 2, 3, 2, 3, 2, 2, 3, 3, 3, 5, + 5, 2, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 2, 2, 1, 2, 1, 2, 3, + 2, 1, 1, 1, 1, 1, 1, 1, 2, 0, + 1, 1, 5, 0, 3, 0, 2, 3, 0, 1, + 2, 1, 1, 1, 1, 3, 3, 3, 3, 0, + 1, 0, 1, 0, 1, 2, 1, 1, 2, 2, + 3, 1, 3, 2, 1, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 1, 1, 2, 1, + 1, 1, 1, 1, 0, 2, 1, 1, 1, 1, + 1, 0, 2, 1, 1, 0, 1, 1, 2, 2, + 1, 2, 2, 0, 1, 1, 1, 3, 1, 3, + 0, 1, 3, 1, 1, 1, 0, 1, 2, 1, + 1, 2, 1, 3, 3, 1, 1, 0, 2, 0, + 1, 5, 0, 3, 3, 1, 0, 2, 2, 2, + 0, 3, 3, 6, 6, 1, 1, 2, 2, 2, + 1, 2, 2, 1, 1, 0, 1, 1, 1, 1, + 0, 1, 1, 1, 0, 1, 2, 0, 1, 0, + 1, 0, 1, 1, 2, 1, 2, 1, 2, 2, + 2, 3, 2, 1, 1, 1, 1, 3, 1, 1, + 1, 4, 2, 1, 4, 0, 1, 0, 2, 1, + 3, 5, 4, 7, 4, 4, 4, 3, 9, 3, + 4, 3, 3, 7, 4, 3, 5, 0, 3, 1, + 4, 0, 3, 0, 2, 0, 1, 0, 2, 2, + 2, 2, 1, 1, 1, 3, 4, 5, 4, 4, + 5, 4, 3, 1, 7, 3, 1, 1, 4, 0, + 3, 2, 4, 0, 5, 1, 3, 1, 1, 3, + 2, 3, 2, 4, 5, 6, 4, 4, 3, 3, + 2, 2, 6, 5, 3, 5, 1, 1, 1, 1, + 1, 0, 1, 1, 2, 2, 3, 3, 3, 3, + 0, 1, 0, 1, 0, 1, 1, 0, 2, 1, + 0, 1, 1, 1, 5, 3, 3, 0, 1, 1, + 3, 3, 2, 2, 4, 0, 3, 0, 3, 0, + 3, 0, 3, 0, 1, 1, 3, 1, 1, 0, + 2, 1, 3, 3, 3, 1, 4, 0, 1, 1, + 5, 0, 1, 1, 2, 1, 1, 1, 4, 2, + 4, 0, 1, 1, 2, 1, 1, 1, 1, 1, + 2, 4, 0, 1, 1, 3, 4, 3, 5, 1, + 3, 3, 5, 1, 1, 1, 3, 2, 3, 1, + 1, 5, 1, 1, 1, 3, 3, 4, 5, 1, + 0, 4, 0, 2, 1, 2, 4, 2, 3, 2, + 3, 2, 4, 2, 1, 1, 2, 2, 8, 4, + 0, 1, 2, 1, 1, 1, 1, 0, 2, 4, + 3, 1, 1, 3, 4, 0, 0, 0, 2, 2, + 1, 1, 0, 2, 3, 3, 3, 2, 3, 4, + 3, 4, 3, 4, 1, 3, 4, 3, 3, 6, + 1, 5, 6, 5, 7, 6, 8, 5, 6, 4, + 4, 5, 3, 4, 1, 3, 3, 3, 3, 3, + 3, 5, 5, 3, 3, 3, 3, 3, 3, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 3, 1, 1, 1, 1, 3, 2, 2, 2, + 2, 3, 3, 5, 6, 4, 4, 7, 2, 6, + 5, 6, 6, 4, 4, 5, 4, 6, 2, 4, + 4, 4, 10, 6, 8, 6, 4, 4, 6, 4, + 4, 4, 6, 4, 7, 7, 7, 6, 6, 6, + 6, 3, 4, 6, 8, 2, 2, 8, 8, 6, + 6, 1, 6, 6, 8, 8, 6, 8, 6, 2, + 8, 8, 2, 2, 2, 4, 4, 4, 4, 3, + 8, 6, 8, 4, 6, 4, 4, 4, 6, 8, + 4, 3, 6, 4, 6, 5, 8, 7, 10, 1, + 6, 4, 4, 4, 4, 4, 6, 4, 4, 6, + 2, 3, 0, 4, 0, 3, 0, 1, 1, 3, + 4, 4, 5, 4, 4, 4, 5, 4, 5, 4, + 5, 4, 5, 4, 4, 4, 4, 4, 5, 7, + 2, 3, 1, 4, 0, 1, 0, 2, 0, 3, + 4, 2, 2, 2, 3, 2, 1, 2, 1, 2, + 1, 2, 2, 2, 0, 1, 1, 3, 1, 3, + 1, 3, 0, 1, 0, 2, 4, 5, 1, 1, + 1, 1, 4, 1, 3, 3, 3, 5, 5, 7, + 4, 7, 9, 6, 7, 9, 6, 1, 2, 2, + 0, 1, 5, 4, 3, 5, 2, 5, 1, 4, + 2, 3, 0, 1, 0, 1, 0, 2, 3, 3, + 1, 1, 6, 6, 1, 2, 0, 1, 1, 0, + 1, 1, 1, 1, 3, 1, 3, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 0, 1, 1, 0, 2, 0, 1, 0, + 2, 0, 2, 2, 0, 0, 4, 4, 2, 0, + 1, 1, 3, 3, 1, 2, 0, 1, 3, 4, + 2, 0, 1, 1, 0, 1, 0, 1, 2, 1, + 3, 3, 1, 1, 1, 1, 1, 0, 2, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 0, 5, 0, 1, 3, 1, 1, 3, + 1, 2, 1, 2, 5, 2, 1, 2, 6, 6, + 4, 6, 4, 4, 4, 5, 4, 4, 4, 5, + 4, 1, 3, 1, 2, 1, 3, 1, 0, 2, + 0, 1, 0, 1, 1, 2, 3, 1, 1, 6, + 4, 0, 1, 1, 1, 1, 1, 2, 1, 1, + 1, 3, 4, 2, 3, 1, 2, 2, 2, 4, + 3, 1, 3, 1, 3, 1, 1, 0, 1, 3, + 0, 1, 3, 1, 1, 1, 0, 5, 9, 3, + 1, 3, 3, 1, 3, 0, 1, 3, 6, 4, + 5, 1, 3, 2, 4, 0, 2, 0, 2, 1, + 1, 1, 3, 0, 1, 0, 1, 1, 3, 1, + 1, 2, 2, 2, 1, 1, 1, 1, 0, 3, + 2, 2, 4, 4, 3, 4, 4, 1, 3, 3, + 6, 2, 2, 5, 5, 5, 2, 1, 5, 5, + 2, 2, 1, 4, 3, 2, 3, 2, 2, 1, + 3, 4, 3, 3, 2, 2, 3, 3, 3, 3, + 3, 3, 3, 3, 1, 1, 1, 1, 1, 0, + 1, 0, 2, 0, 1, 1, 1, 0, 2, 0, + 2, 0, 2, 2, 3, 3, 1, 1, 1, 1, + 1, 1, 1, 0, 1, 1, 3, 0, 1, 1, + 3, 3, 1, 0, 3, 2, 3, 1, 2, 2, + 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, + 1, 0, 1, 2, 3, 1, 2, 1, 2, 0, + 1, 2, 3, 2, 2, 3, 0, 1, 1, 2, + 18, 1, 1, 0, 1, 0, 1, 1, 0, 1, + 1, 0, 2, 2, 1, 3, 4, 3, 3, 0, + 2, 2, 1, 3, 3, 0, 4, 0, 3, 1, + 1, 0, 3, 2, 3, 1, 1, 2, 0, 2, + 3, 1, 5, 1, 1, 2, 2, 1, 1, 1, + 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, + 1, 1, 2, 2, 1, 1, 1, 1, 1, 2, + 2, 2, 1, 1, 3, 5, 1, 1, 1, 1, + 1, 3, 4, 5, 1, 5, 3, 2, 1, 3, + 2, 2, 4, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 3, 2, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 2, 2, 2, 2, 2, 2, 0, 2, 1, + 3, 2, 1, 1, 1, 1, 0, 1, 1, 1, + 0, 2, 2, 2, 3, 3, 4, 6, 2, 3, + 3, 3, 5, 1, 3, 3, 1, 1, 3, 3, + 1, 3, 2, 2, 2, 2, 2, 1, 1, 4, + 4, 1, 1, 1, 1, 1, 3, 1, 1, 1, + 3, 3, 1, 1, 2, 2, 2, 4, 3, 6, + 1, 2, 1, 1, 1, 1, 1, 1, 4, 1, + 1, 1, 1, 1, 3, 6, 6, 6, 7, 5, + 3, 8, 8, 8, 6, 0, 1, 1, 2, 0, + 1, 1, 3, 2, 2, 2, 2, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, + 1, 3, 2, 2, 2, 2, 2, 2, 2, 2, + 1, 1, 2, 0, 1, 3, 1, 2, 2, 2, + 1, 3, 3, 1, 1, 3, 1, 3, 4, 5, + 4, 6, 1, 0, 3, 3, 1, 1, 0, 2, + 2, 2, 2, 0, 2, 0, 3, 2, 1, 2, + 2, 2, 2, 2, 2, 0, 1, 0, 3, 2, + 0, 1, 2, 0, 1, 4, 4, 5, 2, 3, + 0, 1, 3, 0, 1, 1, 0, 1, 1, 2, + 1, 0, 1, 1, 2, 3, 2, 5, 3, 0, + 0, 0, 1, 2, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 2, 2, 3, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, + 3, 1, 2, 1, 2, 3, 3, 3, 0, 3, + 3, 6, 0, 3, 1, 3, 2, 2, 4, 1, + 3, 2, 0, 3, 4, 4, 13, 8, 7, 10, + 8, 4, 4, 3, 4, 3, 2, 1, 3, 5, + 1, 1, 0, 1, 1, 0, 2, 0, 2, 0, + 2, 5, 3, +} +var MySQLChk = []int{ + + -1000, -1, 152, -2, -3, -174, -4, -49, -50, -13, + -70, -51, -52, -41, -5, -73, -11, -79, -14, -6, + -74, -55, -76, -56, -15, -80, -9, -57, -59, -16, + -42, -53, -60, -61, -62, -75, -71, -43, -7, -54, + -12, -63, -77, -64, -44, -45, -18, -65, -78, -66, + -72, -46, -8, -58, -47, -10, -81, -48, 31, 14, + 16, 35, 50, 57, 62, 61, 77, 95, -175, 126, + -663, 139, 140, 166, 184, 199, 201, 206, 209, 232, + 234, 252, 269, 273, 369, 49, 386, 399, 410, 432, + 435, 437, 440, 443, 444, 453, 455, 463, -19, 477, + 484, 482, 514, 521, 564, 576, 580, 583, 588, 616, + 117, 127, 128, 469, 635, 632, 152, -722, 612, -482, + 104, 404, 193, -484, -485, 538, 274, 475, 586, 222, + 12, -732, -731, 123, -494, 357, 270, -91, 546, -139, + -83, -84, -85, 218, 220, -86, 22, 29, 31, 48, + 49, 59, 61, 66, 75, 77, 89, 117, 139, 150, + 166, 184, 188, 206, 209, 212, 234, 253, 355, 368, + 370, 380, 384, 396, 399, 434, 437, 443, 446, 455, + 463, 468, 475, 485, 491, 487, 492, 514, 521, 564, + 575, 576, 613, 616, 584, 6, 8, 9, 10, 11, + 12, 15, 19, 24, 26, 25, 27, 28, 35, 39, + 42, 44, 43, 46, 52, 55, 56, 58, 63, 65, + 64, 67, 68, 70, 74, 73, 71, 76, 78, 79, + 80, 81, 83, 84, 86, 88, 87, 90, 94, 97, + 99, 102, 107, 106, 108, 111, 116, 122, 123, 125, + 129, 131, 132, 133, 134, 135, 142, 143, 144, 151, + 155, 154, 153, 158, 159, 161, 163, 162, 164, 165, + 169, 170, 171, 172, 173, 177, 176, 189, 148, 191, + 179, 180, 181, 195, 197, 196, 198, 202, 200, 207, + 213, 217, 219, 223, 238, 224, 225, 228, 242, 243, + 245, 246, 233, 250, 254, 257, 260, 261, 267, 268, + 270, 272, 274, 275, 309, 303, 305, 287, 291, 288, + 289, 304, 290, 293, 285, 292, 286, 301, 295, 294, + 296, 297, 298, 299, 300, 283, 307, 308, 310, 312, + 313, 318, 319, 320, 321, 322, 323, 326, 327, 331, + 329, 333, 334, 335, 336, 337, 338, 340, 339, 341, + 344, 345, 349, 348, 356, 350, 351, 360, 362, 363, + 364, 366, 367, 381, 382, 385, 388, 387, 389, 390, + 391, 392, 393, 394, 395, 400, 401, 403, 405, 406, + 407, 408, 409, 411, 412, 413, 416, 420, 421, 423, + 422, 424, 427, 428, 429, 430, 431, 433, 436, 438, + 441, 445, 448, 449, 450, 452, 456, 457, 458, 461, + 459, 460, 462, 464, 465, 467, 473, 472, 474, 486, + 479, 483, 488, 490, 493, 494, 500, 501, 502, 505, + 504, 507, 510, 513, 515, 516, 517, 518, 522, 524, + 525, 526, 527, 529, 528, 532, 533, 534, 535, 542, + 537, 541, 538, 543, 544, 547, 548, 559, 560, 550, + 551, 552, 553, 565, 566, 567, 193, 569, 570, 573, + 572, 579, 582, 586, 587, 597, 601, 594, 603, 602, + 604, 612, 605, 615, 617, 620, 303, -524, 540, 537, + -524, -722, -188, -191, -196, -199, 104, -102, 586, 274, + 538, -206, -391, 578, 192, 495, -731, -732, -733, 475, + -392, -734, -484, 543, 376, 399, -649, -650, 413, 281, + 222, -107, -665, -83, 631, 172, 387, 188, -160, -158, + 353, -161, -162, -163, -164, -165, -555, -556, -557, -558, + -166, -167, -168, -559, 625, 624, 630, -554, 635, 460, + 167, 639, 306, 34, 54, 53, 92, 121, 593, 235, + -83, -172, 60, 100, 111, 116, 217, 232, 259, 326, + 333, 454, 467, 553, 550, 562, 586, 620, 8, 98, + 103, 109, 110, 174, 198, -444, 397, 526, 530, 536, + 551, 552, 590, 592, 591, -84, 22, 59, 67, 70, + 104, 221, 188, 322, 332, 364, 389, 411, 439, 440, + 452, 461, 564, 604, 605, -568, -169, -171, -170, 358, + 175, 563, 210, 36, 571, 383, 633, 28, 37, 38, + 40, 93, 328, 311, 520, 598, 519, 600, 531, 204, + 638, 352, 631, 354, 89, 196, 267, 334, 335, 336, + 394, 395, 546, 343, 359, 278, 568, 118, 182, -625, + 226, 104, 193, 404, 586, 601, 163, 561, 538, 274, + 475, 543, -83, -494, -270, 99, -202, -107, -110, -83, + -92, -83, -91, 262, -631, 281, 124, 211, 392, -674, + 83, 412, 226, -675, 107, 617, -524, -494, 226, -350, + 47, -83, -672, -659, 303, 34, 463, -524, 586, -494, + -633, -634, 124, 281, -669, -670, 487, 303, 412, -266, + -264, -83, -262, 498, -202, -722, -83, -69, -151, 559, + -156, -149, 633, -399, 339, 389, 200, 270, 474, -83, + 121, 60, 59, -264, -68, 105, -656, 162, 540, 368, + 393, 154, -659, 487, 35, 428, -468, -337, 403, 93, + 603, 159, 408, 407, -662, -399, 70, 202, 95, 303, + 404, 193, 191, 249, 226, 225, 522, 200, 270, 474, + 59, 487, 559, 487, -651, 540, 392, -524, -634, -83, + -739, 150, 399, 77, 455, 421, 31, 514, -20, -22, + -385, -543, -544, -545, 507, 505, 523, 211, 136, 508, + 503, 504, 506, 13, -21, 469, 635, -173, 152, 540, + -87, -83, -139, -139, -485, -142, 163, -735, 509, -305, + -300, -297, -298, -83, 203, -92, -202, 156, 156, -524, + -238, 635, 631, 557, -116, -113, -107, -116, -723, 18, + 540, 226, 226, 226, -189, 221, -202, 203, -205, -298, + -103, -142, -143, -144, -145, -147, 561, 404, -209, -104, + -142, -143, -144, -145, -146, -147, -209, 11, -485, -92, + -391, -484, 440, -83, -17, 190, -128, -111, -83, -649, + -664, -481, -83, -95, 210, 36, 546, -82, -18, -9, + -12, -10, -11, 631, -83, 156, 634, -550, 618, -551, + 376, 373, 18, 17, -158, 244, 157, -150, 156, 194, + 205, 255, 282, 346, 239, -237, 32, 493, 263, 426, + 622, 623, 480, 481, 625, 624, 626, 627, 628, 137, + 332, 629, 353, 352, 69, 375, -164, -164, -164, -164, + -40, -158, -728, 635, 635, -83, -560, -583, 635, -165, + -83, -164, 635, -563, -158, 635, 635, 635, -158, 635, + 631, 635, -549, 635, 635, 546, 635, 635, 635, 635, + 635, 635, 635, 635, 635, 546, 635, 546, 635, 635, + 635, 635, -549, -438, 635, 635, 635, 635, 635, 635, + 635, 635, -438, 635, 635, -549, -438, -438, 635, 635, + 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, + 635, 635, 635, 635, 635, 635, 635, 635, -95, 546, + 210, 36, -580, -92, 633, 635, 635, 635, 635, 635, + 635, 635, 635, 635, 635, 635, 635, 635, -83, -438, + 635, 635, 635, 635, 635, 635, 635, 635, -524, -83, + -626, 221, -626, -626, -202, -626, -626, -626, -298, 203, + -626, -177, 589, -67, -524, -667, -668, 158, 154, 195, + 488, 34, 427, 412, 213, 403, 275, 518, 129, 445, + 131, -707, -703, 409, -711, 13, -712, 469, 232, 583, + 425, 126, 585, 226, 14, 95, 140, 166, 433, 483, + 405, 179, 201, 482, 532, 273, 441, 163, 561, 368, + 66, 417, -482, -83, -158, 236, -676, 81, 281, -117, + -115, -107, -524, -135, -136, -132, -131, -107, -351, -355, + 414, 268, 265, 190, 275, -83, -130, -129, -107, -202, + -524, -108, 236, -109, -106, -107, 634, -671, 13, 49, + -265, 477, -263, 594, -702, -703, 13, 409, -723, 557, + -154, 634, -691, -693, -694, -695, 245, 417, -105, -152, + 559, -149, -641, 156, 478, -92, 633, -97, -96, 121, + -92, 34, -641, -98, -99, 121, -92, 34, -641, 187, + 631, 631, 477, -265, -148, 263, 607, 537, 560, 71, + 406, -90, -658, 190, 239, 518, 537, -401, 13, -92, + 275, 213, 518, 162, 162, -658, 153, 635, -609, -610, + 264, -609, -652, -653, -654, 94, 319, 42, 90, 382, + 243, 534, 494, 13, 518, 597, -148, -148, 187, 104, + 540, 601, 404, 193, 561, 163, 518, 518, 68, 518, + 68, -511, -521, -522, 510, 431, -514, -515, -516, 609, + 417, -511, -113, -83, -482, -740, -481, -740, -740, -740, + -740, -37, -39, 577, -386, -546, 626, -209, -544, 636, + -22, -21, -107, -387, -388, -389, -390, -398, 121, 584, + -232, -232, -142, -139, 601, 468, -299, 57, 7, 140, + 416, 418, 353, -310, -307, -83, 370, -488, -489, -92, + 100, 570, 320, 544, -489, -116, -239, -240, -158, -83, + -180, -181, 287, 284, 304, 290, 291, 285, 292, 286, + 301, 295, 294, 296, 297, 300, 302, 298, 299, 305, + 223, 283, -185, 288, 289, 429, 430, -496, 634, -528, + -529, 413, 176, 318, 172, 58, 187, -525, 413, 172, + -724, 432, 355, 355, 56, -189, -83, -83, -83, -83, + -237, -203, -717, -489, -204, -307, 7, -209, -209, 163, + 193, 193, -209, -142, 186, -107, -127, -83, -114, -112, + 190, 634, -88, 631, -83, -92, -158, -158, -158, -158, + 563, -237, 175, 579, 358, -162, -162, -552, 13, 19, + 635, 239, 32, 263, 426, -163, 263, -164, -163, -163, + -163, -163, -163, -163, 235, -163, 235, -163, -163, -163, + -163, -163, -163, -92, -164, 636, 636, 634, -35, -25, + 469, 635, -158, -40, -158, 10, 634, -583, 631, -158, + -564, 606, -158, -165, -566, -83, -172, -93, -94, 112, + 113, 114, 115, 214, 215, 216, 324, 325, 466, 619, + 116, 604, 217, 326, 333, 411, 467, 322, 620, -158, + -83, -160, 636, -158, -158, -158, -158, -158, -158, -158, + -158, -158, -158, -158, -158, 256, 558, 45, 636, -158, + -158, 636, 359, -158, -158, -93, -567, 111, 553, 550, + 108, -163, -158, -158, -94, -94, -569, -573, -574, -209, + -158, -158, -160, -158, 636, -158, -158, -158, -158, -158, + -158, -158, -158, -158, -158, 636, -158, -158, -158, 478, + -157, 200, 270, 474, -575, 136, -576, 13, -575, -575, + -575, -576, -575, 136, -575, 136, -575, 136, -575, -575, + -575, -575, -575, 136, -577, 136, 631, -158, -160, -160, + -160, -160, -160, -158, -160, -626, 365, -83, 167, -83, + -139, -627, -489, -116, -139, -139, -628, -629, -630, -323, + -324, -337, 602, 356, -307, -92, -178, -179, 633, -118, + -116, 634, 275, 275, 275, 275, 275, 275, 49, -271, + -272, 82, -275, -276, -83, 633, 365, 365, 634, -706, + 403, -713, 635, -713, -713, -713, 457, 543, 601, 457, + 586, 538, 371, 105, 601, 537, 487, 65, -89, -602, + 20, 156, -698, -699, -83, 180, 349, -108, 492, 49, + -677, 270, 634, -89, -116, 239, 634, -532, -533, -535, + 386, -467, 251, 226, -352, 387, 251, 207, -358, -359, + 635, 71, -358, -359, -176, -91, 633, -673, 557, 30, + 634, 557, -530, -489, -116, -100, -101, 635, 477, 593, + 594, -30, 469, -109, -587, -588, 386, -670, -267, -268, + 64, 525, 86, 88, 87, 55, 465, 542, 74, 102, + 321, 338, -95, 365, -706, 365, -724, -725, 463, -155, + -153, -156, -151, 634, 634, 261, 367, 614, -154, -691, + -641, -159, -158, 121, 365, 13, 34, -641, -157, -158, + -447, 69, -692, 546, 389, 364, -489, -83, -83, -91, + -158, -90, -90, -658, -148, -83, -90, -90, -657, 518, + 337, 275, -657, -660, 239, -660, -107, 626, -611, -612, + -83, -167, 568, 278, 359, -655, 187, 634, 242, 535, + 177, -148, -148, -489, -189, -107, -107, -139, -139, -139, + -139, -148, -139, -148, -139, -512, 582, 634, 634, 84, + 367, 614, -125, -126, -119, -120, 639, -121, -122, -107, + -590, 635, 469, -741, 248, 448, 634, -742, 533, -743, + 366, -593, 136, 13, -123, 634, -537, -538, -124, -607, + 236, 190, 374, -547, -158, -83, -36, -39, -726, -727, + -607, -610, 636, -483, 134, 224, -490, -491, -348, -492, + 140, 420, 369, 16, 62, 437, 67, 564, -498, 165, + -502, 434, 386, 7, 436, -503, 57, 331, 133, 148, + 14, 435, 92, -394, 185, -508, -509, -510, -395, 374, + 12, 273, 154, 309, 327, 27, 389, 75, 26, 381, + 515, 516, 517, 61, 541, 125, 459, 577, -390, -389, + 233, 107, 226, 538, 522, 83, 250, -388, -399, 69, + 107, -233, 75, 253, 355, 89, 415, 330, -236, 509, + -486, 365, -217, -107, 123, 238, -301, 106, -301, -301, + 5, -308, 7, 635, 634, 389, 633, -549, 636, 634, + 634, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, -113, -528, 584, 432, 56, + -107, -192, -197, -197, -197, -201, -387, 167, 634, 219, + -308, -301, -139, -139, -189, -139, -83, 193, 107, -587, + 634, 589, 631, -88, -125, -111, -83, 626, 563, 175, + 579, 358, 635, -40, -158, 635, -163, -164, -163, 18, + -163, -553, 161, -158, -158, -160, 577, -729, -592, -726, + -26, -27, -594, -730, -545, -28, 469, 635, 634, 636, + 640, 635, -165, 636, -83, 20, -565, 606, 146, -158, + 634, 589, 636, 636, 625, 634, 635, 631, 636, 589, + 636, 636, 636, 634, 634, 636, 636, 634, 636, 636, + 636, 634, 636, 190, -158, 190, -158, 190, -158, 190, + 636, 634, 636, 634, 634, 190, 634, 239, 634, 634, + 190, 634, 634, 636, 634, -158, 636, 636, 636, 636, + 634, 634, 636, 634, 636, 636, 636, 634, 634, 636, + 634, 636, 634, -461, 20, 634, 261, -158, -92, 631, + 631, 631, 636, -575, -158, 636, 636, 636, 626, 636, + -160, 636, -575, 636, -575, 636, 636, 636, 636, 636, + -575, -160, -83, 634, 636, 636, 636, 636, 636, 634, + 636, -116, -107, 631, 634, -506, 447, 51, 634, -630, + 154, -628, 634, -92, -666, 609, 187, -668, 634, -273, + -269, -166, -168, -165, 111, 553, 550, 156, -92, -704, + 193, 404, 540, -489, -712, -718, -719, -83, 537, -83, + -539, 607, -700, 180, 349, 401, 254, -701, 156, 194, + 255, 205, 282, -100, -91, -137, -133, -138, -107, -134, + 227, -115, -697, 417, 614, 281, -531, -83, 121, -131, + -107, -532, -349, 635, -353, 529, -336, 359, 210, 278, + 568, -614, -615, 118, 182, -356, 12, -358, -209, 635, + -92, -91, -158, -129, -107, 634, 557, -497, -526, -527, + 413, 172, 587, 636, -635, -30, -637, -566, -547, -83, + -636, -640, -566, -638, -639, 635, -638, -37, -385, 635, + 634, 156, -704, 193, 404, 634, -489, -83, 634, -152, + -694, -693, -696, 417, 438, 472, -159, -158, -149, -400, + -446, 121, -92, 635, 635, -641, -148, -148, -107, -148, + -148, -661, 190, -91, -661, -90, 636, 634, 363, -609, + 412, -654, -83, -513, -517, 586, -523, -185, 502, 500, + 501, -522, -516, 490, 477, 634, -584, 523, 342, 259, + 454, 248, 229, 96, -83, -587, -591, -591, -481, -744, + 187, 390, -19, -141, 187, 273, -546, -402, -610, -124, + -538, -621, 378, 142, -618, -619, -620, 633, -92, -125, + 141, 47, -363, -363, 631, -609, 538, 538, -347, -491, + 634, -348, 386, -504, 186, 402, -467, 72, 386, 386, + 386, 386, 386, 386, 386, 386, 388, -349, 386, -504, + -407, -411, -196, -199, -414, -467, -417, 85, 386, -406, + 635, -408, -418, -83, 631, -504, -504, 249, 249, -504, + -507, 557, 156, 20, 557, -394, 47, -334, -641, -334, + -334, -334, -334, -334, -334, -334, -334, -334, -334, -334, + -334, -334, -334, -334, -334, -334, -334, 132, 132, -83, + 135, 319, -334, -334, -334, -334, 132, -91, 509, 509, + 509, 509, 509, 468, -140, 435, 79, 464, -736, 635, + -302, -314, -315, -316, -317, -318, 228, 25, 310, -91, + -306, -326, -327, -316, -317, -318, -323, -324, -306, -311, + -332, -333, -316, -323, -324, -312, -313, 572, 422, -207, + -208, 586, 212, 104, 380, 389, 491, 396, -489, 170, + -92, -158, -181, -182, -91, -182, -182, -182, -183, 359, + 210, 278, 568, 118, 182, -183, -183, -183, -183, -182, + -182, -182, -182, -182, -183, -182, -182, -171, 635, -183, + -182, -187, 359, 568, 278, 118, 182, -182, -183, -190, + 635, -341, 263, -393, -395, 365, -469, 589, 566, 365, + 365, -717, 47, 609, -309, -328, -329, -316, -330, -331, + -322, -323, -324, -325, 573, 423, 350, 75, -303, 588, + -295, 30, 9, 635, -139, 635, 450, -83, 613, -539, + -114, -83, -125, -83, -539, -88, 631, -40, 636, 636, + 634, -40, -158, 18, -553, -162, -164, -93, -93, 636, + -593, -386, -545, 636, -27, -28, -160, -163, -562, 34, + 60, 344, 485, 581, 111, 553, 108, 119, 150, -158, + -158, 549, -562, -99, -158, -158, -570, -160, -83, -99, + -158, -158, -158, -158, -158, 190, -158, 190, -158, 190, + -158, -158, 235, 235, 235, -158, -158, -158, -158, 235, + -158, -158, -158, -158, -574, -363, -158, -158, -158, -158, + -158, -158, -158, 636, 60, 34, -183, -460, -458, -459, + -457, -456, -336, -480, 631, 636, 636, 636, 636, 636, + 636, -578, 374, -158, -158, -506, -195, -510, -509, -83, + -489, -630, -334, -179, 417, 171, -275, -274, -278, -276, + -277, 360, 461, -705, 626, -83, -107, -705, -705, 557, + 636, 634, -402, -158, 635, -632, 365, 634, -532, -533, + -622, 546, 270, 614, 635, -536, -598, -601, -83, 402, + -354, 635, 47, 635, 156, -362, -163, -357, -360, -361, + -83, -489, -489, -526, -101, 635, 636, 634, 636, 631, + 634, -641, 634, -643, -644, -642, -158, 121, -386, -585, + -83, -268, -269, -705, -705, -705, 201, 190, -153, 569, + 76, 417, -641, 546, 546, -692, -90, -609, -187, -609, + -539, 603, 159, -612, -612, 359, -518, 389, 156, 634, + 156, 156, -646, -647, -566, -119, -120, -121, 248, 259, + 454, -586, 377, -586, 248, 248, -120, -89, -23, -385, + -38, -29, -591, 634, 323, 583, 239, -622, -622, 634, + -92, -539, -539, -608, -582, -158, -548, 20, -83, -91, + -83, 626, -502, 7, 140, -493, -499, -83, -418, 251, + 251, -418, -494, -494, -494, -495, 13, -493, -494, -494, + -495, -499, -349, -350, -494, -412, -418, -413, -467, -413, + -415, 186, -416, 402, 578, 62, -412, -494, -505, 9, + 180, -344, -404, -405, -406, -407, -409, -410, -416, 425, + -419, -421, -424, 183, 39, 44, 43, -428, -430, 34, + -432, -433, 595, 620, 111, 553, 550, 108, 554, 41, + -435, 315, 276, 279, 556, 547, 317, 277, 119, 361, + 181, 155, 477, 473, 237, 555, 489, 316, 33, 419, + 138, 60, 344, 341, 596, 362, 197, 196, 394, 335, + 267, 334, 395, 336, 631, -83, -418, -418, -418, -107, + -399, -605, -606, -566, 121, -83, 121, -83, -338, -92, + -187, -187, -183, -91, -91, -187, -183, 121, -183, 121, + -183, 121, -183, 121, -183, -183, -183, -396, 121, 181, + 144, 80, 424, 78, 635, -397, 355, 180, 254, -334, + -334, -91, -183, -98, -400, 340, 107, 107, 123, 238, + -212, 148, 133, 557, 400, 353, -210, 164, 24, 20, + -737, -83, -315, 634, -334, -334, -334, -327, 634, -333, + 634, -91, -91, 634, 636, -91, -91, -91, -91, -91, + -91, -183, 389, -184, -186, -183, -340, 263, -344, -342, + -347, -342, -107, -393, 634, -107, -476, 46, 462, 207, + -476, -107, -107, 546, 389, -92, -329, 634, -334, -334, + -334, -334, -304, -319, -320, -316, -317, -318, -321, -322, + -323, -324, -325, 173, 274, -296, 232, 583, 126, -246, + -247, -248, -249, 239, 379, 230, 365, -241, -242, -243, + -83, -403, 524, 419, 119, 237, 450, -92, -537, 631, + -539, -88, 636, -160, 636, 636, 634, -162, -25, -24, + -402, -124, 636, 636, -561, -571, 239, 636, -422, -427, + 635, -422, -422, 237, 237, -434, 635, -434, -426, -427, + -437, 635, 549, -158, 636, 636, 636, 634, 636, 636, + 634, 636, 636, 636, 636, -158, 636, -158, 636, -158, + 636, 636, -158, -158, -158, 636, 636, 636, 636, -158, + 634, 636, 187, 636, 634, 634, -548, 634, 636, 634, + 636, 636, 634, 636, 636, -452, 635, -452, 634, 634, + -455, 624, -453, -454, 21, 127, 452, -83, -579, 471, + 47, 636, 636, -509, -510, -338, 273, 634, 156, 557, + 631, 631, 557, 557, -203, -719, -644, 143, -134, -107, + -534, 222, -532, -345, 440, 222, -495, 636, 634, -368, + -369, 386, -355, -357, -336, -363, 636, 634, 557, -101, + -637, -36, -83, -640, -642, -639, 636, 634, -24, 636, + 634, 156, 190, 190, 190, 371, -203, -159, 636, 636, + -148, -519, 122, 156, -91, -185, -91, -91, -539, 634, + -641, 365, 589, 365, -121, -586, -586, 248, 248, 640, + -589, -600, -599, -597, -596, 588, 185, 222, -386, 636, + 577, -592, -126, -183, 479, -449, -399, -620, -540, 203, + -402, 634, -479, 21, 127, -83, -91, 631, 634, -506, + -418, -495, -495, -495, -496, -495, -336, 609, -500, 635, + 387, -192, -412, -412, -412, 251, 251, -413, 635, -501, + -493, -83, 636, 634, -107, -420, -441, -442, 358, -237, + 121, 365, 26, 473, -445, 578, 75, 69, 73, 522, + 402, -422, -425, -437, 635, -426, -427, -427, -429, 599, + -450, -451, 48, -399, 34, 22, 575, -427, -431, 34, + -427, -427, -427, -427, -422, -434, -434, -434, -422, 595, + -432, -429, -428, 60, -429, -422, -429, -429, -426, -426, + -426, 635, 635, 398, 596, 599, 60, 596, -83, -408, + -419, 477, 140, -98, 634, -479, -118, -91, -91, -213, + 75, 365, -139, 400, -217, 365, -158, -158, -31, -32, + -33, 635, 469, 636, 634, -315, -335, -339, -84, 359, + 568, 278, -614, -335, -335, -327, -333, -208, 170, 636, + 634, -107, 636, -30, -343, -345, -393, 635, 635, 635, + 546, 20, -329, -335, -335, -336, -91, -320, 634, -334, + 203, 365, 636, 634, -244, 464, 636, 634, -244, 492, + -403, 370, -613, 264, -83, 636, -160, -592, -141, -141, + 636, -572, 609, 43, 342, 278, 568, 118, 359, -429, + 359, 359, -158, -160, -158, 636, 636, 636, -93, -93, + -93, -93, -158, -158, -158, -158, -158, -158, -158, -461, + -336, 636, -183, -457, -456, -456, -454, 636, -481, -581, + -582, -278, -279, 64, 525, 86, 88, 87, 55, 465, + 542, 74, 102, 321, 338, 449, -203, 626, 626, -203, + -203, -710, 609, 636, 251, 257, -534, 236, 636, -601, + 636, 634, -370, -83, 207, 251, 636, 636, -361, -489, + -642, -349, -83, -269, -203, -203, -203, 190, -520, 391, + 156, -91, -537, -647, -642, -158, 635, -158, 248, 248, + -120, -121, -120, -121, -597, -467, -467, -24, -89, -593, + 329, -623, 71, -98, -541, 208, 47, -582, 626, -499, + -494, -497, 540, -368, -336, 635, -197, -197, -192, -412, + -158, 236, -405, -462, 635, -442, 358, -443, -444, -448, + -166, 625, 624, 111, 553, 550, 583, 121, 251, 251, + -91, -446, 121, 181, 144, 121, 135, 319, -423, -439, + -440, 485, 581, 621, -423, 359, -423, -429, -99, 22, + 575, -399, 34, 34, -431, -429, -431, -423, -429, -429, + -423, -423, -423, -436, -481, -436, 599, 631, -505, -420, + 121, 121, -447, -606, 636, -487, 139, -91, 487, -93, + -738, 609, -37, -34, -33, 635, -22, -83, -186, 636, + -341, 636, -346, 20, -193, -478, -83, -193, -193, -91, + -320, -335, -83, -209, -234, -248, -83, -210, 450, -243, + -245, -419, -91, 492, 635, -612, 636, 412, 329, 253, + 636, 636, 636, 636, 636, 634, 636, 634, 636, 636, + 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, + 636, 634, 634, -479, -708, 442, -708, -708, 201, 583, + 540, -369, -371, 593, -364, 635, -356, -203, 156, -91, + -613, -585, -121, -121, 365, 589, 365, 589, -595, 187, + -595, -25, -624, 266, -682, -683, 545, 372, 149, 160, + -537, -158, -603, -582, -479, -107, 636, -193, 635, 635, + 635, 635, 636, 635, -463, 306, -465, -83, -171, -171, + -444, 594, -440, -431, -99, 636, 634, 636, -83, -505, + -448, -214, -218, -219, -220, -221, -222, -223, -224, -225, + -226, -227, -228, -229, -230, -231, -3, 451, 221, -286, + -287, -282, -294, -281, 258, 247, 368, 178, 66, 53, + -84, -86, 31, 280, 608, 439, 35, -215, 513, 62, + 52, 270, 636, -34, -342, -36, -30, 635, 636, 634, + -479, 635, 636, 636, -107, -235, -251, -233, 130, -237, + -219, -220, -221, -222, -223, -224, -225, -226, -227, -228, + -229, -230, -231, -245, -211, -217, -245, -447, -91, -207, + 169, 329, 359, -158, -183, -582, -709, 609, -715, 511, + 615, 351, -716, 527, 246, 63, -709, -709, 371, -645, + -648, -566, -107, -372, -383, -384, 538, -337, 350, 309, + 327, 107, 226, 75, 260, 239, -365, 528, -209, 635, + -91, 636, -158, 635, -158, 635, 635, 248, 374, 203, + 635, -592, -684, -685, 545, 512, -683, 47, 149, 47, + 47, -402, -604, 634, 610, 611, -479, -349, 636, -193, + -193, -193, -193, -368, -464, 365, 191, 385, 486, 636, + 634, -429, -481, -429, -158, -280, -158, 637, -282, -282, + -83, -283, 349, 190, -83, -158, -290, -292, 606, -253, + -252, -251, -158, -252, -216, 151, -158, 371, 62, 62, + -36, 636, -343, -37, -30, -194, -470, -473, -477, -469, + 250, 75, -478, 359, -198, -471, -475, -477, 609, -200, + -472, -474, -477, 187, 130, -212, -234, 636, 636, 636, + 636, -479, -720, -721, 201, 308, 312, 307, 313, -714, + 18, 546, 546, 546, 634, -641, -587, -373, 635, -384, + -334, 154, -334, -334, -334, 132, 132, -334, 548, -375, + -376, 635, -336, -362, -366, -367, -83, -585, -585, -598, + 47, 47, -536, -685, 47, 47, -481, 47, -481, -481, + -542, 404, -582, -194, 636, 636, 636, 636, 636, 583, + 126, -83, 150, 549, -281, -294, -83, 190, -288, -291, + 606, -289, -292, 146, -158, -254, -250, 120, -251, 150, + 632, 139, 582, -158, 371, 371, 636, -195, -473, -334, + -91, -479, 636, -195, -475, 384, -195, -474, -209, -213, + -251, -721, 371, -183, -183, -183, -183, -715, -648, -642, + -449, -380, -381, 529, -92, -334, -336, -339, -339, -334, + -334, -91, -374, 314, -376, 635, -377, -378, -376, -379, + 635, 314, -163, -363, 636, 634, 636, 636, 636, 636, + -481, -481, -481, 15, -479, -198, -200, -194, -410, -466, + 447, 51, 477, 355, -466, 221, -252, -293, -282, -293, + 236, -289, -291, -158, 150, -252, 549, 632, -251, 150, + -255, -83, -258, 168, 91, 632, 280, -252, -158, -36, + -183, -84, 145, 139, -678, 458, 636, 634, -382, -92, + -338, -91, -91, 636, 634, 636, 634, -163, 636, -365, + -367, 635, 365, 358, 121, 6, 365, -285, 147, 146, + -284, -83, 150, 549, 53, -252, 632, -245, 634, 82, + 101, 206, 150, 150, 460, -214, -623, 219, -381, -372, + -376, -379, -616, -617, 359, 126, 583, -280, -252, 634, + 53, -252, -256, 121, -83, 187, 187, 187, 608, 439, + -251, -624, 47, 636, 634, -466, -466, -83, -158, -257, + -183, -262, -18, -259, -260, -261, -257, -83, 499, -237, + 497, -679, 222, -481, -617, -251, 634, 189, -680, 635, + 359, -260, -681, 477, -687, 636, -688, -566, 633, -686, + 266, 458, -689, -690, -566, 636, 634, -92, 634, -641, + -688, -690, -209, -642, -363, +} +var MySQLDef = []int{ + + 0, -2, 1, 0, 6, 7, 8, 9, 10, 11, + 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, + 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, + 52, 53, 54, 55, 56, 57, 58, 59, 2345, -2, + 992, 0, 0, 0, 0, 0, 2345, -2, 0, 1567, + 1663, 0, -2, 0, 992, 248, 156, 0, 0, 1511, + 0, 1706, 0, 0, 992, 0, 0, 0, 0, 0, + 0, 992, 1555, 0, 225, 156, 2345, 0, 1024, 0, + 0, -2, 0, 0, 1573, 0, 0, 1555, 0, 0, + 61, 1661, 1662, 1040, 0, 4, 3, 2344, 2346, 0, + 855, 0, 0, 2409, 2418, 0, 0, 0, 156, 923, + 0, 2407, 2408, 0, 0, 993, 994, 979, 1807, 176, + 158, 1810, 1811, 1804, 1805, 1820, 1821, 1822, 1823, 1824, + 1825, 1826, 1827, 1828, 1829, 1830, 1831, 1832, 1833, 1834, + 1835, 1836, 1837, 1838, 1839, 1840, 1841, 1842, 1843, 1844, + 1845, 1846, 1847, 1848, 1849, 1850, 1851, 1852, 1853, 1854, + 1855, 1856, 1857, 1858, 1859, 1860, 1861, 1862, 1863, 1864, + 1865, 1866, 1867, 1868, 1869, 1870, 1871, 1872, 1873, 1874, + 1875, 1876, 1877, 1878, 1879, 1880, 1881, 1882, 1883, 1884, + 1885, 1886, 1887, 1888, 1889, 1890, 1891, 1892, 1893, 1894, + 1895, 1896, 1897, 1898, 1899, 1900, 1901, 1902, 1903, 1904, + 1905, 1906, 1907, 1908, 1909, 1910, 1911, 1912, 1913, 1914, + 1915, 1916, 1917, 1918, 1919, 1920, 1921, 1922, 1923, 1924, + 1925, 1926, 1927, 1928, 1929, 1930, 1931, 1932, 1933, 1934, + 1935, 1936, 1937, 1938, 1939, 1940, 1941, 1942, 1943, 1944, + 1945, 1946, 1947, 1948, 1949, 1950, 1951, 1952, 1953, 1954, + 1955, 1956, 1957, 1958, 1959, 1960, 1961, 1962, 1963, 1964, + 1965, 1966, 1967, 1968, 1969, 1970, 1971, 1972, 1973, 1974, + 1975, 1976, 1977, 1978, 1979, 1980, 1981, 1982, 1983, 1984, + 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, + 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, + 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, + 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024, + 2025, 2026, 2027, 2028, 2029, 2030, 2031, 2032, 2033, 2034, + 2035, 2036, 2037, 2038, 2039, 2040, 2041, 2042, 2043, 2044, + 2045, 2046, 2047, 2048, 2049, 2050, 2051, 2052, 2053, 2054, + 2055, 2056, 2057, 2058, 2059, 2060, 2061, 2062, 2063, 2064, + 2065, 2066, 2067, 2068, 2069, 2070, 2071, 2072, 2073, 2074, + 2075, 2076, 2077, 2078, 2079, 2080, 2081, 2082, 2083, 2084, + 2085, 2086, 2087, 2088, 2089, 2090, 2091, 2092, 2093, 2094, + 2095, 2096, 2097, 2098, 2099, 2100, 2101, 2102, 2103, 2104, + 2105, 2106, 2107, 2108, 2109, 2110, 2111, 2112, 2113, 2114, + 2115, 2116, 2117, 2118, 2119, 2120, 2121, 2122, 2123, 2124, + 2125, 2126, 2127, 2128, 2129, 2130, 2131, 2132, 2133, 2134, + 2135, 2136, 2137, 2138, 2139, 2140, 2141, 2142, 2143, 2144, + 2145, 2146, 2147, 2148, 2149, 2150, 2151, 2152, 2153, 2154, + 2155, 2156, 2157, 2158, 2159, 2160, 2161, 2162, 2163, 2164, + 2165, 2166, 2167, 2168, 2169, 2170, 0, 0, 2227, 2228, + 0, 2347, 0, 0, 0, 0, 516, 110, 156, 0, + 0, 114, 512, 791, 792, 793, -2, -2, 2409, 0, + 513, 2411, 2413, 515, 0, 0, 0, 1567, 1569, 1570, + 1571, 1667, 0, 1798, 0, -2, -2, 1837, 1477, 1296, + 0, 1074, 1080, 1094, 1109, 1126, 1127, 1128, 1129, 1130, + 1132, 1133, 1134, 1135, 0, 0, 0, 0, 2379, 2096, + 0, 0, 0, 0, 0, 1302, 0, 0, 0, 0, + 1787, 1788, 0, 1062, 1920, 1921, 1966, 0, 0, 2022, + 2026, 0, 2100, 2147, 2144, 0, 2158, 2170, 1871, 1062, + 665, 0, 0, 0, 1961, 1191, 0, 2126, 0, 665, + 2145, 2146, 1062, 665, 665, 1810, 1821, 1826, 1896, 1898, + 0, 0, 1837, 2020, 0, 2045, 2053, 2068, 0, 0, + 2090, 2094, 1864, 2165, 2167, 1229, 1764, 1765, 1766, 1767, + 1768, 1769, 1770, 1771, 0, 1760, 0, 1882, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1116, 1117, 0, 665, 1831, 1960, 1983, 2027, 2028, 2029, + 2058, 2059, 1753, 1754, 1774, 1775, 1776, 1777, 1778, 0, + 0, 1498, 1498, 1498, 156, 1498, 1498, 1498, 0, 0, + 1498, 1501, 67, 0, 0, 249, 0, 0, 0, -2, + 72, 1814, 1815, 1816, 922, 1512, 1513, 1514, 0, 0, + 1707, 1708, 0, 1715, 1711, 1712, 0, 0, 0, 433, + 441, 0, 1701, 0, 1637, 1638, 0, 0, 156, 0, + 0, 1515, 1516, 1556, 1693, 1695, 1699, 1697, 0, 227, + 226, 223, 224, 215, 0, 2347, 2358, 2171, 2177, 2142, + 0, 0, 0, 0, 2033, 2053, -2, -2, -2, 2203, + 0, 0, -2, 227, 1590, 1651, 0, 1641, 0, 0, + 1597, 0, 0, 0, 0, 0, 0, 0, 1607, 0, + 1424, 1424, 1612, 1575, 0, 1651, 1651, 1619, 0, 1637, + 0, 0, 1644, 787, 788, 789, 1640, 2187, 2188, 2189, + 709, 953, 937, 953, 0, 1574, 0, 2236, 922, 1709, + 0, 0, 0, 0, 0, 2446, 2450, 2451, 1025, 2360, + 1055, 1041, 1043, 1044, 1045, 1046, 2385, 2386, 2387, 2388, + 2389, 2390, 2391, 2392, 0, 1040, 0, 2, 5, 0, + 725, 856, 159, 159, 2418, 837, 0, 0, 0, 839, + 841, 842, 0, 401, 0, 0, 0, 0, 0, 0, + 175, 178, 0, 0, 981, 1491, 1493, 967, 2350, 0, + 516, 0, 0, 0, 0, 0, 0, 0, 113, 0, + 2393, 2396, 2397, 2398, 2399, 2400, 1055, 1055, 0, 2394, + 2401, 2402, 2403, 2404, 2405, 2406, 0, 1055, 2418, 0, + 514, 2412, 2414, 60, 1557, 0, 0, 1561, 1565, 1568, + 1654, 1668, 1669, 1757, 1758, 1759, 1808, 1655, 1656, 1657, + 1658, 1659, 1660, 0, 1800, 0, 0, 0, 0, 0, + 1110, 1111, 1112, 1113, 1067, 0, 0, 0, 1118, 1119, + 1120, 1121, 1122, 1123, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1114, 1115, 0, 0, 1137, 1138, 1139, 1140, + 0, 0, 0, 0, 2379, 0, 0, 1298, 0, 1300, + 1787, 1148, 0, 0, 1303, 0, 0, 0, 0, 2379, + 0, 0, 1158, 0, 0, 1779, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1780, 0, 1781, 0, 0, + 0, 0, 1185, 1186, 0, 0, 0, 0, 0, 0, + 0, 0, 1199, 0, 0, 1202, 1203, 1204, -2, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1756, 1755, + 1772, 1773, 1270, 1272, 2190, 1397, 1397, 1397, 1397, 1397, + 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1274, 0, 705, + 0, 0, 0, 0, 0, 0, 0, 0, 1498, 0, + 0, 0, 0, 0, 0, 0, 0, 0, -2, 0, + 0, 66, 0, 1670, 1691, 1672, 1677, 0, 0, 0, + 0, 0, 0, 0, 1685, 1686, 1687, 1688, 1689, 1690, + 0, 2260, 0, 0, 2267, 2269, 2271, 2323, 2323, 2323, + 2323, 2277, 2278, 2279, 2280, 2281, 2282, 2283, 2284, 2285, + 2286, 2287, 0, 0, 2290, 0, 0, 2300, 2301, -2, + 2238, 0, 0, 0, 1705, 0, 1713, 1716, 1717, 2226, + 2229, -2, 0, 0, 1003, 1004, 1005, 1020, 453, 0, + 0, 0, 442, 0, 0, 2359, 995, 999, 0, 0, + 0, 0, 0, 1518, 1519, 1330, 0, 1696, 1700, 1698, + 246, 0, 0, 216, 2254, 0, 2269, 0, 2350, 2353, + 2172, 0, 2173, 2206, 2207, 2210, 0, 0, 2174, 2177, + 2142, 0, 0, 1535, 1536, 0, 2190, 2198, 718, 719, + 716, 717, 0, 721, 712, 713, 710, 711, 0, 0, + 0, 0, 708, 222, 1591, 0, 0, 1641, 1641, 0, + 1615, 1651, 0, 1645, 1646, 1641, 1641, 0, 0, 558, + 1601, 1602, 1625, 1647, 1647, 0, 1606, 0, 1610, 1425, + 0, 1611, 1588, 1576, 1577, 1579, 1580, 0, 0, 0, + 1584, 1585, 1586, 1587, 1651, 1651, 1617, 1618, 0, 516, + 0, 0, 0, 0, 0, 0, 1624, 1651, 0, 1651, + 0, 959, 954, 955, 957, 958, 936, 938, 939, 0, + 0, 935, 1572, 2462, 0, 2452, 2447, 2457, 2443, 2455, + 2445, 1031, 2361, 2371, 1416, 1051, 1052, 0, 1042, 2363, + 1027, 0, -2, -2, 507, 509, 510, 0, 726, 0, + 834, 835, 836, 847, 0, 0, 337, 0, 0, 0, + 403, 404, 0, 840, 0, 402, 0, 844, 0, 1817, + 1062, 2415, 2416, 2417, 2410, 978, 0, 179, 181, 157, + 73, 74, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 96, 0, 0, 0, 0, 980, 0, 982, + 983, 985, 986, 987, 988, 989, 0, 966, 968, 969, + 2355, 2351, 0, 0, 2349, 0, 794, 794, 794, -2, + 0, 111, 2316, 2322, 112, 0, 0, 0, 0, 516, + 0, 0, 0, 2395, 0, 1330, 0, -2, 1495, 1497, + 0, 0, 1563, 0, 1799, 1666, 1297, 1064, 1065, 1066, + 1068, 0, 1070, 1072, 1075, 1077, 1078, 0, 1124, -2, + 2379, 0, 0, 0, 0, 0, 0, 1404, 1092, 1095, + 1096, 1097, 1098, 1099, 0, 1100, 0, 1103, 1104, 1105, + 1106, 1107, 1108, 1131, 1136, 1141, 1142, 0, 2380, 2366, + 2381, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1304, 0, 0, 0, 0, 1789, 1790, 0, 1367, 1368, + 1369, 1370, 1371, 1372, 1373, 1374, 1375, 1376, 1377, 1378, + 1379, 1380, 1381, 1382, 1383, 1384, 1385, 1386, 1387, 0, + 1791, 0, 1063, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1181, 0, + 0, 666, 0, 0, 0, 0, 0, 1388, 1389, 1390, + 1391, 0, 0, 0, 0, 0, 0, 1247, 1248, 0, + 0, 0, 0, 0, 1209, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1221, 0, 0, 757, 0, + 0, 0, 0, 0, 0, 1397, 0, 1398, 0, 0, + 0, 0, 0, 0, 0, 1397, 0, 1397, 0, 0, + 0, 0, 0, 1397, 0, 1275, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1480, 1499, 1482, + 1483, 1484, 2314, 924, 1486, 1487, 1488, -2, 1504, 1507, + 1508, 0, 415, 416, -2, 1490, 68, 70, 0, 1673, + 1692, 0, 1678, 1679, 1680, 1681, 1682, 1683, 1684, 247, + 250, 0, 252, 0, 255, 0, 2265, 0, 0, 2268, + 2270, 2273, 0, 2274, 2275, 2276, 2298, 0, 2295, 2297, + 2299, 2302, 2288, 2289, 2296, 2292, 2293, 2294, 2237, 0, + 1393, 1394, 1399, 2240, 0, -2, -2, 0, 0, 0, + 0, 1714, 0, 0, 991, 0, 0, 1007, 1020, 1019, + 432, 0, 783, 784, 455, 0, 443, 0, 437, 438, + 1055, 0, 439, 440, 63, 64, 0, 1702, 0, 0, + 0, 0, 996, 0, 971, 1510, 1520, 0, 0, 0, + 0, 2360, 1040, 1517, 1494, 1331, 0, 1694, 228, 0, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 214, 2265, 2268, 0, 2356, 0, 2354, 2178, + 2179, 0, 2182, 0, 0, 0, 2212, 2213, 2175, 2176, + 0, 2195, 2221, 2222, 2223, 2224, 2225, 0, 0, 2199, + 2200, 0, 2201, 2218, 0, 0, 0, 2204, 2205, 1652, + 1653, 1651, 1651, 0, 1594, 1642, 1651, 1651, 1598, 1634, + 1635, 1636, 1599, 1649, 0, 1649, 1641, 0, 1428, 1429, + 1432, 1433, 1434, 1435, 1436, 1424, 0, 0, 1581, 1582, + 1583, 1614, 1616, 1620, 0, 1622, 1623, 1626, 1627, 1628, + 1633, 1629, 1631, 1630, 1632, 945, 0, 0, 0, 0, + 942, 943, 0, 1310, 1313, 1311, 0, 1308, 1309, 1330, + 1342, 1342, 1343, 2441, 2453, 2454, 0, 2442, 2459, 2444, + 0, 0, 2372, 2373, 1047, 1055, 1426, 1034, 1035, 1417, + 0, 0, 0, 1056, 1056, 1787, 1026, 2364, 2365, 2368, + 1424, 2370, 1028, 831, 0, 0, 429, 862, 863, 864, + 920, 0, 0, 0, 0, 0, 0, 0, 873, 0, + 888, 0, 432, -2, 0, 0, 920, 920, 0, 0, + 920, 930, 0, 906, 907, 908, 909, 910, -2, 0, + 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, + 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 545, 546, + 1537, 0, 0, 0, 0, 1537, 1537, 508, 1537, 1537, + 0, 160, 0, 0, 0, 0, 0, 0, 169, 0, + 851, 0, 849, 2422, 2419, 2420, 0, 0, -2, -2, + 405, -2, 0, 0, 0, 0, 0, 1819, 177, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1492, 984, 990, 2352, 2348, + -2, 0, 795, 0, 0, 109, -2, 517, 0, 0, + -2, 340, 0, 0, 0, 0, 158, 0, 0, 1399, + 0, 0, 0, 1801, 1399, 1562, 1565, 1566, 1069, 1071, + 1073, 1076, 2379, 0, 0, 2379, 0, 1404, 1093, 0, + 1089, 1090, 0, 0, 0, 0, 2371, 2378, 2376, 2367, + 2374, 1338, 1055, 2382, 2384, 0, 2381, 0, 0, 1145, + 1146, 0, 1301, 1299, 1791, 0, 0, 0, 0, 0, + 0, 0, 1153, 1154, 0, 0, 1294, 0, 1156, 0, + 1159, 1160, 1161, 0, 0, 1166, 1167, 0, 1169, 1170, + 1171, 0, 1173, 0, 0, 0, 0, 0, 0, 0, + 1182, 0, 667, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1238, 1055, 1056, 1205, 1206, 1207, 1208, + 0, 0, 1213, 0, 1215, 1216, 1217, 0, 0, 1220, + 0, 1223, 0, 0, 0, 0, 0, 1271, 827, 2191, + 2192, 2193, 1251, 0, 1282, 1253, 1254, 1255, 0, 1257, + 0, 1259, 0, 1261, 0, 1263, 1264, 1265, 1266, 1267, + 0, 1278, 1792, 0, 1231, 1232, 1233, 1234, 1235, 0, + 1237, 924, 911, 0, 0, 1485, 925, 926, 1639, 1505, + 1537, 1489, 0, 71, 1671, 0, 0, 1676, 0, 0, + 259, 231, 232, 233, 1920, 2147, 2144, 0, 256, 0, + 0, 0, 2266, 0, 2272, 0, 2326, 2327, 2291, 1396, + 1426, 0, 2241, 2244, 2245, 2246, 2247, 0, 2249, 2250, + 2251, 2252, 2253, 1546, 2461, 1011, 1012, 1013, 1020, 1014, + 0, 2230, 2231, 2232, 2233, 0, 1002, 1009, 1010, 1006, + 1020, 1008, 0, 1359, 464, 0, 454, 1445, 1446, 1447, + 1448, 1449, 1459, 1460, 1461, 0, 0, 436, 0, 445, + 65, 1703, 1704, 1000, 1001, 0, 0, 970, 972, 973, + 975, 976, 977, 0, 0, 0, 1525, 1782, 1783, 1789, + 1523, 1533, 0, 1526, 1531, 1540, 1527, 1528, 1055, 0, + 0, 0, 0, 0, 0, 0, 0, 2357, 0, 2181, + 2208, 2209, 2211, 0, 0, 2217, 2194, 2196, 0, 722, + 723, 724, 720, 0, 0, 0, 1592, 1593, 1641, 1595, + 1596, 1424, 0, 1648, 1424, 1399, 0, 0, 0, 1613, + 0, 1578, 1621, 934, 947, 0, 960, 961, 0, 0, + 965, 956, 940, 941, 0, 0, 0, 0, 0, 1344, + 1344, 1327, 0, 0, 0, -2, 1040, 1342, 2448, 2458, + 0, 2456, 2362, 1032, 0, 0, 1050, 1033, 1427, 1036, + 1037, 1473, 0, 1931, 1476, 1468, 1470, 0, 1472, 1399, + 1399, 0, 1053, 1057, 0, 2369, 858, 859, 860, 861, + 725, 430, 0, 0, 0, 0, 0, 921, 992, 992, + 992, 0, 992, 992, 0, 0, 432, 0, 992, 890, + 892, 825, 785, 785, 0, 780, 591, 825, 992, 927, + 590, 587, 0, 1794, 0, 0, 0, 900, 901, 0, + 0, 931, 932, 933, 0, 521, 0, 0, 1538, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1537, 1537, 550, + 551, 552, 0, 0, 0, 0, 0, 163, 164, 165, + 166, 0, 0, 0, 128, 0, 0, 0, 0, 0, + 338, 348, 349, 352, 353, 354, 1537, 1537, 1537, 398, + 342, -2, 370, 373, 374, 375, 376, 377, 343, 345, + -2, 392, 395, 396, 397, 346, 347, 0, 0, 0, + 116, 0, 0, 0, 0, 0, 0, 0, 0, 845, + 1818, 180, 75, 76, 1806, 77, 78, 79, 80, 1439, + 1440, 1441, 1442, 1443, 1444, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 97, 95, + 101, 102, 1450, 1451, 1452, 1453, 1454, 103, 104, 105, + -2, 429, 0, 519, -2, 0, 796, 0, 0, 0, + 0, 2317, 0, 0, 344, -2, 380, 383, 384, 385, + 386, 387, 388, 389, 1537, 1537, 1537, 1537, -2, 0, + 0, 332, 333, -2, 0, 182, 0, 0, 0, 1416, + 1496, 1565, 1399, -2, 1559, 1564, 0, 0, 1081, 1083, + 0, 0, 0, 0, 1091, 1087, 1403, 1101, 1102, 1143, + 0, 1426, 2383, 2375, 1029, 0, 0, 1242, 0, 679, + 679, 679, 1286, 1288, 1290, 663, 663, 659, 1150, 0, + 1305, 0, 0, 0, 1155, 0, 0, 1295, 1793, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1249, 1057, 0, 0, 0, 0, + 0, 0, 0, 1225, 0, 0, 0, 758, 755, 756, + 752, 746, 750, 1273, 0, 1252, 1256, 1258, 1260, 1262, + 1268, 1276, 0, 0, 0, 1478, 1479, 912, 913, 1481, + 2315, 1506, 0, 69, 0, 1675, 253, 251, 260, 0, + 254, 257, 258, 0, 2310, 1798, 2313, 0, 0, 0, + 2324, 0, 2239, 1400, 0, 1509, 0, 0, 1022, 1020, + 1718, 1809, 2235, 2234, 0, 0, 1360, 1363, 1361, 1362, + 434, 0, 441, 445, 0, 1056, 461, 0, 446, 447, + 449, 0, 997, 974, 1521, 0, 0, 0, 2363, 0, + 0, 0, 0, 0, 1541, 1543, 1544, 1545, 1426, 0, + 1365, 0, 229, 0, 0, 0, 0, 0, 2180, 2214, + 2215, 2216, 0, 0, 0, 2202, 1651, 1603, 1650, 1604, + 1605, 1608, 1609, 1430, 1431, 1589, 949, 0, 0, 0, + 0, 0, 1399, 1550, 0, 1314, 1315, 1316, 0, 1344, + 1344, 0, 1345, 0, 1328, 1329, 0, 1356, 1334, 1055, + 0, 2366, 0, 0, 2460, 1048, 0, 714, 1475, 0, + 1471, 1405, 1426, 1418, 1421, 1786, 1054, 0, 1060, 1061, + 1791, 1784, 889, -2, 920, 865, 885, 887, 924, 0, + 898, 899, 0, 0, 0, 981, 876, 877, 0, 0, + 872, 0, 875, 431, 879, 794, 826, 825, 786, 825, + 825, 0, 586, 0, 785, 0, 592, 883, 891, 0, + 929, 0, 574, 575, 577, 578, 579, 580, 588, 0, + -2, 679, 681, 659, 597, 599, 600, 733, 740, 606, + 0, 0, 0, 679, 611, 663, 663, 663, 615, 679, + 617, 618, 619, 733, 733, 679, 733, 733, 659, 659, + 659, 0, 0, 632, 651, 652, 653, 654, 655, 656, + 657, 641, 642, 0, 645, 647, 633, 634, 635, 636, + 637, 638, 639, 640, 0, 1797, 0, 0, 0, 904, + 0, 1412, 1414, 1421, 916, 917, 918, 919, 525, 557, + 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, + 536, 537, 538, 539, 540, 541, 542, 543, 559, 560, + 561, 562, 563, 564, 1691, 547, 565, 566, 567, 0, + 0, 553, 554, 555, 556, 833, 167, 168, 173, 174, + 140, 129, 131, 0, 138, 0, 848, 0, 0, 0, + 0, 2424, 350, 0, 0, 0, 0, 371, 1639, 393, + 1639, 399, 400, 0, 843, 118, 119, 120, 121, 122, + 123, 124, 0, 0, 98, 100, 419, 0, 0, 0, + 428, -2, 421, 523, 725, 0, 809, 818, 819, 820, + 810, 0, 0, 2318, 0, 2320, 381, 1639, 0, 0, + 0, 0, 339, -2, 357, 360, 361, 362, 363, 364, + 365, 366, 367, 1537, 0, 0, 334, 335, 336, 0, + 189, 191, 186, 194, 195, 196, 0, 0, 183, 185, + 186, 0, 570, 571, 572, 573, 0, 0, 1437, 0, + 1560, 1802, 1079, 0, 1082, 1085, 0, 1088, 2366, 1047, + 568, 1047, 1030, 1144, 0, 1244, 0, 1149, 1283, 680, + 0, 733, 1285, 1287, 1289, 1291, 0, 1292, 1293, 660, + 661, 0, 0, 1306, 1151, 1152, 1163, 0, 1239, 1157, + 0, 1165, 1168, 1172, 1180, 0, 1177, 0, 1178, 0, + 1179, 1183, 0, 0, 0, 1189, 1190, 1192, 1193, 0, + 0, 1196, 0, 1198, 0, 0, 1250, 0, 1211, 0, + 1214, 1218, 0, 1222, 1224, 757, 0, 0, 0, 0, + 751, 0, 747, 749, 743, 744, 745, 828, 0, 0, + 0, 1230, 1236, 914, 915, 414, 1674, 0, 0, 0, + 0, 0, 0, 0, 2335, 2325, 0, 0, 1015, 1020, + 1016, 0, 1022, 0, 1719, 1720, 0, 1021, 0, 0, + 466, 0, 0, 0, 444, 0, 450, 0, 0, 1522, + 1524, 1529, 1791, 1532, 1534, 1530, 1539, 0, 502, 432, + 0, 0, 0, 0, 0, 0, 2259, 2197, 2219, 2220, + 1600, 951, 0, 0, 946, 962, 963, 964, 1416, 0, + 0, 0, 0, 0, 1320, 0, 0, 0, 0, 1312, + 1333, 1358, 1357, 1354, 0, 0, 1350, 1351, 1426, -2, + 2371, 1336, 1340, 2449, 0, 1721, 0, 1469, 1401, 0, + 1039, 0, 1420, 1422, 1423, 1058, 1059, 0, 0, 896, + 897, 866, 992, 868, 869, 971, 871, 0, 878, 0, + 0, 0, 794, 794, 794, 825, 781, 782, 0, 882, + 0, 928, 893, 590, 762, 593, -2, 686, 687, 0, + 0, 0, 691, 0, 0, 694, 0, 0, 0, 0, + 760, 668, 668, 682, 0, 668, 598, 733, 602, 644, + 734, 735, 736, 0, 738, 727, 730, 740, 604, 741, + 605, 733, 740, 609, 668, 612, 613, 614, 616, 620, + 733, 631, 0, 641, 622, 733, 624, 625, 668, 668, + 668, 0, 0, 658, 648, 650, 643, 646, 1796, 927, + -2, 0, 0, 721, 0, 1415, 0, 548, 549, 853, + 0, 0, 852, 139, 850, 0, 0, 127, 2421, 2432, + 2360, 0, 1040, 2423, 0, 351, 406, 417, 418, 1455, + 1456, 1457, 1458, 407, 408, 372, 394, 117, 846, 94, + 0, 0, -2, 0, 420, 503, 524, 0, 0, 0, + 2319, 0, 382, 410, 411, 412, 413, 358, 1639, 0, + 0, 1055, 161, 193, 0, 0, 0, 0, 0, 0, + 0, 0, 1558, 0, 1565, 1084, 0, 2377, 1339, 569, + 1147, 1240, 0, 0, 0, 0, 0, 0, 0, 1284, + 0, 0, 1307, 0, 0, 1174, 1175, 1176, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1227, 0, 753, 746, 754, 748, 1269, 1277, 1279, + 1421, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 2328, 2312, 2311, 2328, + 2328, 2264, 0, 2248, 0, 1023, 1017, 0, 1018, 1364, + 465, 0, 470, 469, 0, 443, 435, 451, 448, 998, + 1542, 1332, 1366, 230, 2255, 2256, 2257, 0, 944, 0, + 0, 948, 1437, 1549, 1551, 1317, 0, 1318, 0, 0, + 0, 1308, 0, 1308, 1355, 1346, 1346, 1341, 1335, 0, + 1049, 1729, 0, 715, 1416, 0, 0, 1421, 1785, 886, + 867, 870, 0, 0, 881, 0, 0, 0, 0, 0, + 0, 0, 576, 766, 0, 685, 688, 689, 706, 707, + 1761, 0, 0, 0, 0, 0, 0, 0, 693, 695, + 696, 697, 698, 699, 700, 701, 702, 703, 594, 669, + 671, 672, 673, 674, 595, 0, 596, 601, 740, 728, + 732, 0, 729, 731, 603, 607, 608, 610, 621, 623, + 626, 627, 628, 0, 829, 0, 649, 0, 894, 927, + 0, 903, 905, 1413, 544, 838, 0, 141, 130, 132, + 2426, 0, 2427, 0, 2429, 0, 2431, 2425, 99, 422, + 429, 2363, 0, 504, 0, 1421, 823, 0, 0, 2321, + 359, 409, 341, 0, 0, 190, 0, 136, 0, 184, + 187, 721, 2438, 0, 0, 1438, 1086, 0, 1241, 0, + 675, 676, 677, 678, 664, 0, 1164, 0, 1184, 1187, + 1188, 1194, 1195, 1197, 1200, 1201, 1210, 1212, 1219, 1226, + 742, 0, 0, 1281, 2333, 0, 2333, 2333, 0, 0, + 0, 467, -2, 0, 462, 1055, 0, 2258, 0, 950, + 1548, 0, 1323, 1326, 0, 0, 0, 0, 0, 0, + 0, 2366, 1474, 0, 1722, 1724, 0, 0, 0, 0, + 1426, 1402, 1409, 1421, 1419, 432, 880, 0, 0, 0, + 0, 0, 589, 0, 770, 0, 0, 765, 1762, 1763, + 690, 692, 670, 737, 739, 733, 0, 733, 1795, 895, + 902, 854, 142, 143, 144, 145, 146, 147, 148, 149, + 150, 151, 152, 153, 154, 155, 294, 0, 0, 311, + 312, 0, 327, 296, 0, 0, 0, 302, 0, 0, + 1812, 1813, 201, 0, 0, 0, 1883, 134, 0, 0, + 0, 0, 2363, 0, -2, 424, 2360, 0, 797, 0, + 822, 0, 799, 801, 0, 162, 2440, 170, 171, 0, + 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, + 290, 291, 292, 192, 128, 137, 161, 704, 2437, 0, + 1245, 1243, 0, 0, 0, 1421, 2261, 0, 2329, 2330, + 2331, 2332, -2, 0, 0, 0, 2262, 2263, 2336, 1547, + 1553, 0, 1330, 484, -2, 493, 1537, 0, 1537, 1537, + 1537, 0, 0, 1537, 0, 0, 456, 0, 0, 0, + 952, 1319, 1321, 0, 1324, 0, 0, 1347, 0, 0, + 1359, 1337, 1730, 1732, 0, 0, 1723, 0, 0, 0, + 0, 1462, 1406, 0, 1410, 1411, 1408, 874, 797, 0, + 0, 0, 0, 0, 761, 0, 767, 768, 769, 763, + 0, 629, 830, 630, 295, 0, 0, 0, 297, 298, + 299, 0, 0, 304, 301, 0, 321, 317, 0, 197, + 0, 0, 0, 0, 126, 0, 133, 2433, 0, 0, + 2428, 2430, 423, 426, 0, 911, 798, 803, 813, 814, + 1537, 0, 1421, 0, 911, 800, 807, 816, 0, 911, + 802, 805, 815, 1055, 172, 140, 0, 115, 662, 1162, + 1228, 1280, 2334, 2338, 0, 0, 0, 0, 0, 0, + 2304, 2307, 2308, 2309, 0, 0, 714, 468, 0, 492, + 0, 1537, 0, 0, 0, 1537, 1537, 0, 0, 472, + 475, 0, 463, 1056, 0, 458, 460, 0, 0, 0, + 1348, 1349, 0, 1731, 0, 0, 1725, 0, 1727, 1728, + 1038, 0, 1421, 581, 799, 801, 797, 0, 884, 0, + 0, 764, 0, 0, 324, 324, 0, 303, 321, 315, + 0, 0, 318, 0, 0, 0, 0, 0, 0, 0, + 199, 0, 2157, 135, 2434, 2435, 2363, 106, 804, 0, + 812, 821, 824, 107, 808, 0, 108, 806, 0, 0, + 2439, 2337, 2339, 2340, 2341, 2342, 2343, 2305, 1552, 1554, + 1735, 0, 486, 0, 494, 0, 496, 497, 498, 0, + 0, 501, 471, 473, 474, 0, 0, 0, 477, 480, + 2379, 482, 483, 0, 462, 0, 1322, 1325, 1352, 1353, + 1733, 1734, 1726, 0, 1407, 582, 583, 584, 585, 771, + 775, 776, 0, 0, 772, 293, 308, 323, 325, 326, + 0, 0, 316, 0, 0, 322, 0, 202, 0, 328, + 0, 276, 0, 207, 208, 200, 329, 0, 0, 427, + 811, 817, 0, 0, 1721, 0, 485, 0, -2, 489, + 495, 499, 500, 476, 0, 479, 0, -2, 452, 457, + 459, 1464, 0, 777, 779, 778, 0, 307, 0, 0, + 300, 305, 0, 0, 314, 320, 198, 278, 0, 0, + 0, 0, 0, 0, 0, 125, 1729, 0, 487, 488, + 478, 481, 0, 1465, 1467, 0, 0, 309, 310, 0, + 313, 319, 203, 0, 277, 0, 0, 0, 330, 331, + 2436, 1737, 0, 1463, 0, 773, 774, 306, 279, 204, + 212, 213, 206, 0, 209, 211, 217, 218, 219, 0, + 221, 1741, 0, 1736, 1466, 205, 0, 220, 1748, 0, + 0, 210, 1710, 0, 0, 1743, 1745, 1746, 0, 1738, + 1739, 1740, 1749, 1751, 0, 1742, 0, 1747, 0, 1055, + 1744, 1750, 0, 1056, 1752, +} +var MySQLTok1 = []int{ + + 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 638, 3, 3, 3, 628, 623, 3, + 635, 636, 626, 625, 634, 624, 631, 627, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 637, 632, + 3, 3, 3, 3, 633, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 629, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 639, 622, 640, 630, +} +var MySQLTok2 = []int{ + + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, + 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, + 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, + 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, + 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, + 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, + 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, + 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, + 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, + 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, + 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, + 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, + 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, + 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, +} +var MySQLTok3 = []int{ + 57600, 258, 57601, 259, 57602, 260, 57603, 261, 57604, 262, + 57605, 263, 57606, 264, 57607, 265, 57608, 266, 57609, 267, + 57610, 268, 57611, 269, 57612, 270, 57613, 271, 57614, 272, + 57615, 273, 57616, 274, 57617, 275, 57618, 276, 57619, 277, + 57620, 278, 57621, 279, 57622, 280, 57623, 281, 57624, 282, + 57625, 283, 57626, 284, 57627, 285, 57628, 286, 57629, 287, + 57630, 288, 57631, 289, 57632, 290, 57633, 291, 57634, 292, + 57635, 293, 57636, 294, 57637, 295, 57638, 296, 57639, 297, + 57640, 298, 57641, 299, 57642, 300, 57643, 301, 57644, 302, + 57645, 303, 57646, 304, 57647, 305, 57648, 306, 57649, 307, + 57650, 308, 57651, 309, 57652, 310, 57653, 311, 57654, 312, + 57655, 313, 57656, 314, 57657, 315, 57658, 316, 57659, 317, + 57660, 318, 57661, 319, 57662, 320, 57663, 321, 57664, 322, + 57665, 323, 57666, 324, 57667, 325, 57668, 326, 57669, 327, + 57670, 328, 57671, 329, 57672, 330, 57673, 331, 57674, 332, + 57675, 333, 57676, 334, 57677, 335, 57678, 336, 57679, 337, + 57680, 338, 57681, 339, 57682, 340, 57683, 341, 57684, 342, + 57685, 343, 57686, 344, 57687, 345, 57688, 346, 57689, 347, + 57690, 348, 57691, 349, 57692, 350, 57693, 351, 57694, 352, + 57695, 353, 57696, 354, 57697, 355, 57698, 356, 57699, 357, + 57700, 358, 57701, 359, 57702, 360, 57703, 361, 57704, 362, + 57705, 363, 57706, 364, 57707, 365, 57708, 366, 57709, 367, + 57710, 368, 57711, 369, 57712, 370, 57713, 371, 57714, 372, + 57715, 373, 57716, 374, 57717, 375, 57718, 376, 57719, 377, + 57720, 378, 57721, 379, 57722, 380, 57723, 381, 57724, 382, + 57725, 383, 57726, 384, 57727, 385, 57728, 386, 57729, 387, + 57730, 388, 57731, 389, 57732, 390, 57733, 391, 57734, 392, + 57735, 393, 57736, 394, 57737, 395, 57738, 396, 57739, 397, + 57740, 398, 57741, 399, 57742, 400, 57743, 401, 57744, 402, + 57745, 403, 57746, 404, 57747, 405, 57748, 406, 57749, 407, + 57750, 408, 57751, 409, 57752, 410, 57753, 411, 57754, 412, + 57755, 413, 57756, 414, 57757, 415, 57758, 416, 57759, 417, + 57760, 418, 57761, 419, 57762, 420, 57763, 421, 57764, 422, + 57765, 423, 57766, 424, 57767, 425, 57768, 426, 57769, 427, + 57770, 428, 57771, 429, 57772, 430, 57773, 431, 57774, 432, + 57775, 433, 57776, 434, 57777, 435, 57778, 436, 57779, 437, + 57780, 438, 57781, 439, 57782, 440, 57783, 441, 57784, 442, + 57785, 443, 57786, 444, 57787, 445, 57788, 446, 57789, 447, + 57790, 448, 57791, 449, 57792, 450, 57793, 451, 57794, 452, + 57795, 453, 57796, 454, 57797, 455, 57798, 456, 57799, 457, + 57800, 458, 57801, 459, 57802, 460, 57803, 461, 57804, 462, + 57805, 463, 57806, 464, 57807, 465, 57808, 466, 57809, 467, + 57810, 468, 57811, 469, 57812, 470, 57813, 471, 57814, 472, + 57815, 473, 57816, 474, 57817, 475, 57818, 476, 57819, 477, + 57820, 478, 57821, 479, 57822, 480, 57823, 481, 57824, 482, + 57825, 483, 57826, 484, 57827, 485, 57828, 486, 57829, 487, + 57830, 488, 57831, 489, 57832, 490, 57833, 491, 57834, 492, + 57835, 493, 57836, 494, 57837, 495, 57838, 496, 57839, 497, + 57840, 498, 57841, 499, 57842, 500, 57843, 501, 57844, 502, + 57845, 503, 57846, 504, 57847, 505, 57848, 506, 57849, 507, + 57850, 508, 57851, 509, 57852, 510, 57853, 511, 57854, 512, + 57855, 513, 57856, 514, 57857, 515, 57858, 516, 57859, 517, + 57860, 518, 57861, 519, 57862, 520, 57863, 521, 57864, 522, + 57865, 523, 57866, 524, 57867, 525, 57868, 526, 57869, 527, + 57870, 528, 57871, 529, 57872, 530, 57873, 531, 57874, 532, + 57875, 533, 57876, 534, 57877, 535, 57878, 536, 57879, 537, + 57880, 538, 57881, 539, 57882, 540, 57883, 541, 57884, 542, + 57885, 543, 57886, 544, 57887, 545, 57888, 546, 57889, 547, + 57890, 548, 57891, 549, 57892, 550, 57893, 551, 57894, 552, + 57895, 553, 57896, 554, 57897, 555, 57898, 556, 57899, 557, + 57900, 558, 57901, 559, 57902, 560, 57903, 561, 57904, 562, + 57905, 563, 57906, 564, 57907, 565, 57908, 566, 57909, 567, + 57910, 568, 57911, 569, 57912, 570, 57913, 571, 57914, 572, + 57915, 573, 57916, 574, 57917, 575, 57918, 576, 57919, 577, + 57920, 578, 57921, 579, 57922, 580, 57923, 581, 57924, 582, + 57925, 583, 57926, 584, 57927, 585, 57928, 586, 57929, 587, + 57930, 588, 57931, 589, 57932, 590, 57933, 591, 57934, 592, + 57935, 593, 57936, 594, 57937, 595, 57938, 596, 57939, 597, + 57940, 598, 57941, 599, 57942, 600, 57943, 601, 57944, 602, + 57945, 603, 57946, 604, 57947, 605, 57948, 606, 57949, 607, + 57950, 608, 57951, 609, 57952, 610, 57953, 611, 57954, 612, + 57955, 613, 57956, 614, 57957, 615, 57958, 616, 57959, 617, + 57960, 618, 57961, 619, 57962, 620, 57963, 621, 0, +} + +//line yaccpar:1 + +/* parser for yacc output */ + +var MySQLDebug = 0 + +type MySQLLexer interface { + Lex(lval *MySQLSymType) int + Error(s string) +} + +const MySQLFlag = -1000 + +func MySQLTokname(c int) string { + // 4 is TOKSTART above + if c >= 4 && c-4 < len(MySQLToknames) { + if MySQLToknames[c-4] != "" { + return MySQLToknames[c-4] + } + } + return __yyfmt__.Sprintf("tok-%v", c) +} + +func MySQLStatname(s int) string { + if s >= 0 && s < len(MySQLStatenames) { + if MySQLStatenames[s] != "" { + return MySQLStatenames[s] + } + } + return __yyfmt__.Sprintf("state-%v", s) +} + +func MySQLlex1(lex MySQLLexer, lval *MySQLSymType) int { + c := 0 + char := lex.Lex(lval) + if char <= 0 { + c = MySQLTok1[0] + goto out + } + if char < len(MySQLTok1) { + c = MySQLTok1[char] + goto out + } + if char >= MySQLPrivate { + if char < MySQLPrivate+len(MySQLTok2) { + c = MySQLTok2[char-MySQLPrivate] + goto out + } + } + for i := 0; i < len(MySQLTok3); i += 2 { + c = MySQLTok3[i+0] + if c == char { + c = MySQLTok3[i+1] + goto out + } + } + +out: + if c == 0 { + c = MySQLTok2[1] /* unknown char */ + } + if MySQLDebug >= 3 { + __yyfmt__.Printf("lex %s(%d)\n", MySQLTokname(c), uint(char)) + } + return c +} + +func MySQLParse(MySQLlex MySQLLexer) int { + var MySQLn int + var MySQLlval MySQLSymType + var MySQLVAL MySQLSymType + MySQLS := make([]MySQLSymType, MySQLMaxDepth) + + Nerrs := 0 /* number of errors */ + Errflag := 0 /* error recovery flag */ + MySQLstate := 0 + MySQLchar := -1 + MySQLp := -1 + goto MySQLstack + +ret0: + return 0 + +ret1: + return 1 + +MySQLstack: + /* put a state and value onto the stack */ + if MySQLDebug >= 4 { + __yyfmt__.Printf("char %v in %v\n", MySQLTokname(MySQLchar), MySQLStatname(MySQLstate)) + } + + MySQLp++ + if MySQLp >= len(MySQLS) { + nyys := make([]MySQLSymType, len(MySQLS)*2) + copy(nyys, MySQLS) + MySQLS = nyys + } + MySQLS[MySQLp] = MySQLVAL + MySQLS[MySQLp].yys = MySQLstate + +MySQLnewstate: + MySQLn = MySQLPact[MySQLstate] + if MySQLn <= MySQLFlag { + goto MySQLdefault /* simple state */ + } + if MySQLchar < 0 { + MySQLchar = MySQLlex1(MySQLlex, &MySQLlval) + } + MySQLn += MySQLchar + if MySQLn < 0 || MySQLn >= MySQLLast { + goto MySQLdefault + } + MySQLn = MySQLAct[MySQLn] + if MySQLChk[MySQLn] == MySQLchar { /* valid shift */ + MySQLchar = -1 + MySQLVAL = MySQLlval + MySQLstate = MySQLn + if Errflag > 0 { + Errflag-- + } + goto MySQLstack + } + +MySQLdefault: + /* default state action */ + MySQLn = MySQLDef[MySQLstate] + if MySQLn == -2 { + if MySQLchar < 0 { + MySQLchar = MySQLlex1(MySQLlex, &MySQLlval) + } + + /* look through exception table */ + xi := 0 + for { + if MySQLExca[xi+0] == -1 && MySQLExca[xi+1] == MySQLstate { + break + } + xi += 2 + } + for xi += 2; ; xi += 2 { + MySQLn = MySQLExca[xi+0] + if MySQLn < 0 || MySQLn == MySQLchar { + break + } + } + MySQLn = MySQLExca[xi+1] + if MySQLn < 0 { + goto ret0 + } + } + if MySQLn == 0 { + /* error ... attempt to resume parsing */ + switch Errflag { + case 0: /* brand new error */ + MySQLlex.Error("syntax error") + Nerrs++ + if MySQLDebug >= 1 { + __yyfmt__.Printf("%s", MySQLStatname(MySQLstate)) + __yyfmt__.Printf(" saw %s\n", MySQLTokname(MySQLchar)) + } + fallthrough + + case 1, 2: /* incompletely recovered error ... try again */ + Errflag = 3 + + /* find a state where "error" is a legal shift action */ + for MySQLp >= 0 { + MySQLn = MySQLPact[MySQLS[MySQLp].yys] + MySQLErrCode + if MySQLn >= 0 && MySQLn < MySQLLast { + MySQLstate = MySQLAct[MySQLn] /* simulate a shift of "error" */ + if MySQLChk[MySQLstate] == MySQLErrCode { + goto MySQLstack + } + } + + /* the current p has no shift on "error", pop stack */ + if MySQLDebug >= 2 { + __yyfmt__.Printf("error recovery pops state %d\n", MySQLS[MySQLp].yys) + } + MySQLp-- + } + /* there is no state on the stack with an error shift ... abort */ + goto ret1 + + case 3: /* no shift yet; clobber input char */ + if MySQLDebug >= 2 { + __yyfmt__.Printf("error recovery discards %s\n", MySQLTokname(MySQLchar)) + } + if MySQLchar == MySQLEofCode { + goto ret1 + } + MySQLchar = -1 + goto MySQLnewstate /* try again in the same state */ + } + } + + /* reduction by production MySQLn */ + if MySQLDebug >= 2 { + __yyfmt__.Printf("reduce %v in:\n\t%v\n", MySQLn, MySQLStatname(MySQLstate)) + } + + MySQLnt := MySQLn + MySQLpt := MySQLp + _ = MySQLpt // guard against "declared and not used" + + MySQLp -= MySQLR2[MySQLn] + MySQLVAL = MySQLS[MySQLp+1] + + /* consult goto table to find next state */ + MySQLn = MySQLR1[MySQLn] + MySQLg := MySQLPgo[MySQLn] + MySQLj := MySQLg + MySQLS[MySQLp].yys + 1 + + if MySQLj >= MySQLLast { + MySQLstate = MySQLAct[MySQLg] + } else { + MySQLstate = MySQLAct[MySQLj] + if MySQLChk[MySQLstate] != -MySQLn { + MySQLstate = MySQLAct[MySQLg] + } + } + // dummy call; replaced with literal code + switch MySQLnt { + + case 1: + //line sql_yacc.yy:809 + { + SetParseTree(MySQLlex, nil) + } + case 2: + //line sql_yacc.yy:810 + { + SetParseTree(MySQLlex, MySQLS[MySQLpt-2].statement) + } + case 3: + //line sql_yacc.yy:811 + { + SetParseTree(MySQLlex, MySQLS[MySQLpt-1].statement) + } + case 6: + //line sql_yacc.yy:819 + { + MySQLVAL.statement = MySQLS[MySQLpt-0].statement + } + case 7: + //line sql_yacc.yy:820 + { + MySQLVAL.statement = &Begin{} + } + case 8: + //line sql_yacc.yy:823 + { + MySQLVAL.statement = MySQLS[MySQLpt-0].statement + } + case 9: + //line sql_yacc.yy:824 + { + MySQLVAL.statement = MySQLS[MySQLpt-0].statement + } + case 10: + //line sql_yacc.yy:825 + { + MySQLVAL.statement = MySQLS[MySQLpt-0].statement + } + case 11: + //line sql_yacc.yy:826 + { + MySQLVAL.statement = MySQLS[MySQLpt-0].statement + } + case 12: + //line sql_yacc.yy:827 + { + MySQLVAL.statement = MySQLS[MySQLpt-0].statement + } + case 13: + //line sql_yacc.yy:828 + { + MySQLVAL.statement = MySQLS[MySQLpt-0].statement + } + case 14: + //line sql_yacc.yy:829 + { + MySQLVAL.statement = MySQLS[MySQLpt-0].statement + } + case 15: + //line sql_yacc.yy:830 + { + MySQLVAL.statement = MySQLS[MySQLpt-0].statement + } + case 16: + //line sql_yacc.yy:831 + { + MySQLVAL.statement = MySQLS[MySQLpt-0].statement + } + case 17: + //line sql_yacc.yy:832 + { + MySQLVAL.statement = MySQLS[MySQLpt-0].statement + } + case 18: + //line sql_yacc.yy:833 + { + MySQLVAL.statement = MySQLS[MySQLpt-0].statement + } + case 19: + //line sql_yacc.yy:834 + { + MySQLVAL.statement = MySQLS[MySQLpt-0].statement + } + case 20: + //line sql_yacc.yy:835 + { + MySQLVAL.statement = MySQLS[MySQLpt-0].statement + } + case 21: + //line sql_yacc.yy:836 + { + MySQLVAL.statement = MySQLS[MySQLpt-0].statement + } + case 22: + //line sql_yacc.yy:837 + { + MySQLVAL.statement = MySQLS[MySQLpt-0].statement + } + case 23: + //line sql_yacc.yy:838 + { + MySQLVAL.statement = MySQLS[MySQLpt-0].statement + } + case 24: + //line sql_yacc.yy:839 + { + MySQLVAL.statement = MySQLS[MySQLpt-0].statement + } + case 25: + //line sql_yacc.yy:840 + { + MySQLVAL.statement = MySQLS[MySQLpt-0].statement + } + case 26: + //line sql_yacc.yy:841 + { + MySQLVAL.statement = MySQLS[MySQLpt-0].statement + } + case 27: + //line sql_yacc.yy:842 + { + MySQLVAL.statement = MySQLS[MySQLpt-0].statement + } + case 28: + //line sql_yacc.yy:843 + { + MySQLVAL.statement = MySQLS[MySQLpt-0].statement + } + case 29: + //line sql_yacc.yy:844 + { + MySQLVAL.statement = MySQLS[MySQLpt-0].statement + } + case 30: + //line sql_yacc.yy:845 + { + MySQLVAL.statement = MySQLS[MySQLpt-0].statement + } + case 31: + //line sql_yacc.yy:846 + { + MySQLVAL.statement = MySQLS[MySQLpt-0].statement + } + case 32: + //line sql_yacc.yy:847 + { + MySQLVAL.statement = MySQLS[MySQLpt-0].statement + } + case 33: + //line sql_yacc.yy:848 + { + MySQLVAL.statement = MySQLS[MySQLpt-0].statement + } + case 34: + //line sql_yacc.yy:849 + { + MySQLVAL.statement = MySQLS[MySQLpt-0].statement + } + case 35: + //line sql_yacc.yy:850 + { + MySQLVAL.statement = MySQLS[MySQLpt-0].statement + } + case 36: + //line sql_yacc.yy:851 + { + MySQLVAL.statement = MySQLS[MySQLpt-0].statement + } + case 37: + //line sql_yacc.yy:852 + { + MySQLVAL.statement = MySQLS[MySQLpt-0].statement + } + case 38: + //line sql_yacc.yy:853 + { + MySQLVAL.statement = MySQLS[MySQLpt-0].statement + } + case 39: + //line sql_yacc.yy:854 + { + MySQLVAL.statement = MySQLS[MySQLpt-0].statement + } + case 40: + //line sql_yacc.yy:855 + { + MySQLVAL.statement = MySQLS[MySQLpt-0].statement + } + case 41: + //line sql_yacc.yy:856 + { + MySQLVAL.statement = MySQLS[MySQLpt-0].statement + } + case 42: + //line sql_yacc.yy:857 + { + MySQLVAL.statement = MySQLS[MySQLpt-0].statement + } + case 43: + //line sql_yacc.yy:858 + { + MySQLVAL.statement = MySQLS[MySQLpt-0].statement + } + case 44: + //line sql_yacc.yy:859 + { + MySQLVAL.statement = MySQLS[MySQLpt-0].statement + } + case 45: + //line sql_yacc.yy:860 + { + MySQLVAL.statement = MySQLS[MySQLpt-0].statement + } + case 46: + //line sql_yacc.yy:861 + { + MySQLVAL.statement = MySQLS[MySQLpt-0].statement + } + case 47: + //line sql_yacc.yy:862 + { + MySQLVAL.statement = MySQLS[MySQLpt-0].statement + } + case 48: + //line sql_yacc.yy:863 + { + MySQLVAL.statement = MySQLS[MySQLpt-0].select_statement + } + case 49: + //line sql_yacc.yy:864 + { + MySQLVAL.statement = MySQLS[MySQLpt-0].statement + } + case 50: + //line sql_yacc.yy:865 + { + MySQLVAL.statement = MySQLS[MySQLpt-0].statement + } + case 51: + //line sql_yacc.yy:866 + { + MySQLVAL.statement = MySQLS[MySQLpt-0].statement + } + case 52: + //line sql_yacc.yy:867 + { + MySQLVAL.statement = MySQLS[MySQLpt-0].statement + } + case 53: + //line sql_yacc.yy:868 + { + MySQLVAL.statement = MySQLS[MySQLpt-0].statement + } + case 54: + //line sql_yacc.yy:869 + { + MySQLVAL.statement = MySQLS[MySQLpt-0].statement + } + case 55: + //line sql_yacc.yy:870 + { + MySQLVAL.statement = MySQLS[MySQLpt-0].statement + } + case 56: + //line sql_yacc.yy:871 + { + MySQLVAL.statement = MySQLS[MySQLpt-0].statement + } + case 57: + //line sql_yacc.yy:872 + { + MySQLVAL.statement = MySQLS[MySQLpt-0].statement + } + case 58: + //line sql_yacc.yy:873 + { + MySQLVAL.statement = MySQLS[MySQLpt-0].statement + } + case 59: + //line sql_yacc.yy:874 + { + MySQLVAL.statement = MySQLS[MySQLpt-0].statement + } + case 60: + //line sql_yacc.yy:878 + { + MySQLVAL.statement = &Deallocate{} + } + case 63: + //line sql_yacc.yy:885 + { + MySQLVAL.statement = &Prepare{} + } + case 66: + //line sql_yacc.yy:892 + { + MySQLVAL.statement = &Execute{} + } + case 72: + //line sql_yacc.yy:906 + { + MySQLVAL.statement = &Help{} + } + case 73: + //line sql_yacc.yy:909 + { + MySQLVAL.statement = &Change{} + } + case 105: + //line sql_yacc.yy:953 + { + MySQLVAL.statement = &CreateTable{Table: MySQLS[MySQLpt-1].table} + } + case 106: + //line sql_yacc.yy:954 + { + MySQLVAL.statement = &CreateIndex{} + } + case 107: + //line sql_yacc.yy:955 + { + MySQLVAL.statement = &CreateIndex{} + } + case 108: + //line sql_yacc.yy:956 + { + MySQLVAL.statement = &CreateIndex{} + } + case 109: + //line sql_yacc.yy:957 + { + MySQLVAL.statement = &CreateDatabase{} + } + case 110: + //line sql_yacc.yy:959 + { + switch st := MySQLS[MySQLpt-0].interf.(type) { + case *viewTail: + MySQLVAL.statement = &CreateView{View: st.View} + case *triggerTail: + MySQLVAL.statement = &CreateTrigger{Trigger: st.Trigger} + case *spTail: + MySQLVAL.statement = &CreateProcedure{Procedure: st.Procedure} + case *sfTail: + MySQLVAL.statement = &CreateFunction{Function: st.Function} + case *udfTail: + MySQLVAL.statement = &CreateUDF{Function: st.Function} + case *eventTail: + MySQLVAL.statement = &CreateEvent{Event: st.Event} + default: + panic(__yyfmt__.Sprintf("unknow create statement:%T", st)) + } + } + case 111: + //line sql_yacc.yy:977 + { + MySQLVAL.statement = &CreateUser{} + } + case 112: + //line sql_yacc.yy:978 + { + MySQLVAL.statement = &CreateLog{} + } + case 113: + //line sql_yacc.yy:979 + { + MySQLVAL.statement = &CreateTablespace{} + } + case 114: + //line sql_yacc.yy:980 + { + MySQLVAL.statement = &CreateServer{} + } + case 125: + //line sql_yacc.yy:1001 + { + MySQLVAL.event_tail = &eventTail{Event: MySQLS[MySQLpt-8].spname} + } + case 157: + //line sql_yacc.yy:1056 + { + MySQLVAL.spname = &Spname{Qualifier: MySQLS[MySQLpt-2].bytes, Name: MySQLS[MySQLpt-0].bytes} + } + case 158: + //line sql_yacc.yy:1057 + { + MySQLVAL.spname = &Spname{Name: MySQLS[MySQLpt-0].bytes} + } + case 175: + //line sql_yacc.yy:1086 + { + MySQLVAL.statement = &Call{Spname: MySQLS[MySQLpt-1].spname} + } + case 222: + //line sql_yacc.yy:1179 + { + MySQLVAL.statement = &Signal{} + } + case 246: + //line sql_yacc.yy:1217 + { + MySQLVAL.statement = &Resignal{} + } + case 247: + //line sql_yacc.yy:1220 + { + MySQLVAL.statement = &Diagnostics{} + } + case 433: + //line sql_yacc.yy:1586 + { + MySQLVAL.statement = &Partition{} + } + case 502: + //line sql_yacc.yy:1726 + { + if MySQLS[MySQLpt-0].select_statement == nil { + MySQLVAL.select_statement = &Select{From: nil, LockType: LockType_NoLock} + } else { + MySQLVAL.select_statement = &Select{From: MySQLS[MySQLpt-0].select_statement.(*Select).From, LockType: MySQLS[MySQLpt-0].select_statement.(*Select).LockType} + } + } + case 568: + //line sql_yacc.yy:1837 + { + MySQLVAL.select_statement = nil + } + case 569: + //line sql_yacc.yy:1838 + { + MySQLVAL.select_statement = &Select{From: MySQLS[MySQLpt-1].table_ref_list, LockType: MySQLS[MySQLpt-0].lock_type} + } + case 710: + //line sql_yacc.yy:2054 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 711: + //line sql_yacc.yy:2055 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 712: + //line sql_yacc.yy:2058 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 713: + //line sql_yacc.yy:2059 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 716: + //line sql_yacc.yy:2066 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 717: + //line sql_yacc.yy:2067 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 718: + //line sql_yacc.yy:2070 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 719: + //line sql_yacc.yy:2071 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 831: + //line sql_yacc.yy:2290 + { + MySQLVAL.statement = &AlterTable{Table: MySQLS[MySQLpt-1].table} + } + case 832: + //line sql_yacc.yy:2292 + { + MySQLVAL.statement = &AlterDatabase{Schema: MySQLS[MySQLpt-1].bytes} + } + case 833: + //line sql_yacc.yy:2294 + { + MySQLVAL.statement = &AlterDatabase{Schema: MySQLS[MySQLpt-4].bytes} + } + case 834: + //line sql_yacc.yy:2295 + { + MySQLVAL.statement = &AlterProcedure{Procedure: MySQLS[MySQLpt-1].spname} + } + case 835: + //line sql_yacc.yy:2296 + { + MySQLVAL.statement = &AlterFunction{Function: MySQLS[MySQLpt-1].spname} + } + case 836: + //line sql_yacc.yy:2297 + { + MySQLVAL.statement = &AlterView{View: MySQLS[MySQLpt-0].view_tail.View, As: MySQLS[MySQLpt-0].view_tail.As} + } + case 837: + //line sql_yacc.yy:2298 + { + MySQLVAL.statement = &AlterView{View: MySQLS[MySQLpt-0].view_tail.View, As: MySQLS[MySQLpt-0].view_tail.As} + } + case 838: + //line sql_yacc.yy:2299 + { + MySQLVAL.statement = &AlterEvent{Event: MySQLS[MySQLpt-5].spname, Rename: MySQLS[MySQLpt-3].spname} + } + case 839: + //line sql_yacc.yy:2300 + { + MySQLVAL.statement = &AlterTablespace{} + } + case 840: + //line sql_yacc.yy:2301 + { + MySQLVAL.statement = &AlterLogfile{} + } + case 841: + //line sql_yacc.yy:2302 + { + MySQLVAL.statement = &AlterTablespace{} + } + case 842: + //line sql_yacc.yy:2303 + { + MySQLVAL.statement = &AlterTablespace{} + } + case 843: + //line sql_yacc.yy:2304 + { + MySQLVAL.statement = &AlterServer{} + } + case 844: + //line sql_yacc.yy:2305 + { + MySQLVAL.statement = &AlterUser{} + } + case 851: + //line sql_yacc.yy:2319 + { + MySQLVAL.spname = nil + } + case 852: + //line sql_yacc.yy:2320 + { + MySQLVAL.spname = MySQLS[MySQLpt-0].spname + } + case 855: + //line sql_yacc.yy:2327 + { + MySQLVAL.bytes = nil + } + case 856: + //line sql_yacc.yy:2328 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 934: + //line sql_yacc.yy:2448 + { + MySQLVAL.statement = &StartSlave{} + } + case 935: + //line sql_yacc.yy:2449 + { + MySQLVAL.statement = &StopSlave{} + } + case 936: + //line sql_yacc.yy:2453 + { + MySQLVAL.statement = &StartTrans{} + } + case 966: + //line sql_yacc.yy:2511 + { + MySQLVAL.statement = &CheckSum{Tables: MySQLS[MySQLpt-1].table_list} + } + case 970: + //line sql_yacc.yy:2519 + { + MySQLVAL.statement = &Repair{Tables: MySQLS[MySQLpt-1].table_list} + } + case 978: + //line sql_yacc.yy:2535 + { + MySQLVAL.statement = &Analyze{Tables: MySQLS[MySQLpt-0].table_list} + } + case 979: + //line sql_yacc.yy:2538 + { + MySQLVAL.statement = &Binlog{} + } + case 980: + //line sql_yacc.yy:2541 + { + MySQLVAL.statement = &Check{Tables: MySQLS[MySQLpt-1].table_list} + } + case 991: + //line sql_yacc.yy:2560 + { + MySQLVAL.statement = &Optimize{Tables: MySQLS[MySQLpt-0].table_list} + } + case 995: + //line sql_yacc.yy:2568 + { + MySQLVAL.statement = &RenameTable{ToList: MySQLS[MySQLpt-0].table_to_table_list} + } + case 996: + //line sql_yacc.yy:2569 + { + MySQLVAL.statement = &RenameUser{} + } + case 999: + //line sql_yacc.yy:2577 + { + MySQLVAL.table_to_table_list = []*TableToTable{MySQLS[MySQLpt-0].table_to_table} + } + case 1000: + //line sql_yacc.yy:2578 + { + MySQLVAL.table_to_table_list = append(MySQLS[MySQLpt-2].table_to_table_list, MySQLS[MySQLpt-0].table_to_table) + } + case 1001: + //line sql_yacc.yy:2581 + { + MySQLVAL.table_to_table = &TableToTable{From: MySQLS[MySQLpt-2].table, To: MySQLS[MySQLpt-0].table} + } + case 1002: + //line sql_yacc.yy:2585 + { + MySQLVAL.statement = &CacheIndex{TableIndexList: MySQLS[MySQLpt-2].table_index_list} + } + case 1003: + //line sql_yacc.yy:2588 + { + MySQLVAL.table_index_list = MySQLS[MySQLpt-0].table_index_list + } + case 1004: + //line sql_yacc.yy:2589 + { + MySQLVAL.table_index_list = []*TableIndex{MySQLS[MySQLpt-0].table_index} + } + case 1005: + //line sql_yacc.yy:2593 + { + MySQLVAL.table_index_list = []*TableIndex{MySQLS[MySQLpt-0].table_index} + } + case 1006: + //line sql_yacc.yy:2594 + { + MySQLVAL.table_index_list = append(MySQLS[MySQLpt-2].table_index_list, MySQLS[MySQLpt-0].table_index) + } + case 1007: + //line sql_yacc.yy:2597 + { + MySQLVAL.table_index = &TableIndex{Table: MySQLS[MySQLpt-1].table} + } + case 1008: + //line sql_yacc.yy:2600 + { + MySQLVAL.table_index = &TableIndex{Table: MySQLS[MySQLpt-2].table} + } + case 1011: + //line sql_yacc.yy:2607 + { + MySQLVAL.statement = &LoadIndex{TableIndexList: MySQLS[MySQLpt-0].table_index_list} + } + case 1012: + //line sql_yacc.yy:2611 + { + MySQLVAL.table_index_list = TableIndexes{MySQLS[MySQLpt-0].table_index} + } + case 1013: + //line sql_yacc.yy:2612 + { + MySQLVAL.table_index_list = MySQLS[MySQLpt-0].table_index_list + } + case 1014: + //line sql_yacc.yy:2615 + { + MySQLVAL.table_index_list = TableIndexes{MySQLS[MySQLpt-0].table_index} + } + case 1015: + //line sql_yacc.yy:2616 + { + MySQLVAL.table_index_list = append(MySQLS[MySQLpt-2].table_index_list, MySQLS[MySQLpt-0].table_index) + } + case 1016: + //line sql_yacc.yy:2619 + { + MySQLVAL.table_index = &TableIndex{Table: MySQLS[MySQLpt-2].table} + } + case 1017: + //line sql_yacc.yy:2622 + { + MySQLVAL.table_index = &TableIndex{Table: MySQLS[MySQLpt-3].table} + } + case 1024: + //line sql_yacc.yy:2639 + { + MySQLVAL.select_statement = MySQLS[MySQLpt-0].select_statement + } + case 1025: + //line sql_yacc.yy:2642 + { + MySQLVAL.select_statement = MySQLS[MySQLpt-0].select_statement + } + case 1026: + //line sql_yacc.yy:2644 + { + if MySQLS[MySQLpt-0].select_statement == nil { + MySQLVAL.select_statement = &SubQuery{SelectStatement: MySQLS[MySQLpt-2].select_statement} // subquery? + } else { + MySQLVAL.select_statement = &Union{Left: MySQLS[MySQLpt-2].select_statement, Right: MySQLS[MySQLpt-0].select_statement} + } + } + case 1027: + //line sql_yacc.yy:2655 + { + MySQLVAL.select_statement = MySQLS[MySQLpt-0].select_statement + } + case 1028: + //line sql_yacc.yy:2657 + { + MySQLVAL.select_statement = &SubQuery{SelectStatement: MySQLS[MySQLpt-1].select_statement} + } + case 1029: + //line sql_yacc.yy:2661 + { + MySQLVAL.select_statement = MySQLS[MySQLpt-0].select_statement + } + case 1030: + //line sql_yacc.yy:2662 + { + MySQLVAL.select_statement = MySQLS[MySQLpt-1].select_statement + } + case 1031: + //line sql_yacc.yy:2667 + { + if MySQLS[MySQLpt-0].select_statement == nil { + MySQLVAL.select_statement = MySQLS[MySQLpt-1].select_statement + } else { // we got a right-recuse union clause + MySQLVAL.select_statement = &Union{Left: MySQLS[MySQLpt-1].select_statement, Right: MySQLS[MySQLpt-0].select_statement} + } + } + case 1032: + //line sql_yacc.yy:2678 + { + MySQLVAL.select_statement = &Select{From: MySQLS[MySQLpt-1].table_ref_list, LockType: MySQLS[MySQLpt-0].lock_type} + } + case 1033: + //line sql_yacc.yy:2682 + { + MySQLVAL.table_ref_list = nil + } + case 1034: + //line sql_yacc.yy:2683 + { + MySQLVAL.table_ref_list = nil + } + case 1035: + //line sql_yacc.yy:2684 + { + MySQLVAL.table_ref_list = MySQLS[MySQLpt-0].table_ref_list + } + case 1036: + //line sql_yacc.yy:2685 + { + MySQLVAL.table_ref_list = MySQLS[MySQLpt-0].table_ref_list + } + case 1037: + //line sql_yacc.yy:2686 + { + MySQLVAL.table_ref_list = MySQLS[MySQLpt-1].table_ref_list + } + case 1038: + //line sql_yacc.yy:2691 + { + MySQLVAL.table_ref_list = MySQLS[MySQLpt-6].table_ref_list + } + case 1039: + //line sql_yacc.yy:2692 + { + MySQLVAL.table_ref_list = nil + } + case 1047: + //line sql_yacc.yy:2708 + { + MySQLVAL.lock_type = LockType_NoLock + } + case 1048: + //line sql_yacc.yy:2709 + { + MySQLVAL.lock_type = LockType_ForUpdate + } + case 1049: + //line sql_yacc.yy:2710 + { + MySQLVAL.lock_type = LockType_LockInShareMode + } + case 1064: + //line sql_yacc.yy:2740 + { + MySQLVAL.expr = &OrExpr{Left: MySQLS[MySQLpt-2].expr, Right: MySQLS[MySQLpt-0].expr} + } + case 1065: + //line sql_yacc.yy:2742 + { + MySQLVAL.expr = &XorExpr{Left: MySQLS[MySQLpt-2].expr, Right: MySQLS[MySQLpt-0].expr} + } + case 1066: + //line sql_yacc.yy:2744 + { + MySQLVAL.expr = &AndExpr{Left: MySQLS[MySQLpt-2].expr, Right: MySQLS[MySQLpt-0].expr} + } + case 1067: + //line sql_yacc.yy:2746 + { + MySQLVAL.expr = &NotExpr{Expr: MySQLS[MySQLpt-0].expr} + } + case 1068: + //line sql_yacc.yy:2748 + { + MySQLVAL.expr = &IsCheck{Operator: OP_IS_TRUE, Expr: MySQLS[MySQLpt-2].boolexpr} + } + case 1069: + //line sql_yacc.yy:2750 + { + MySQLVAL.expr = &IsCheck{Operator: OP_IS_NOT_TRUE, Expr: MySQLS[MySQLpt-3].boolexpr} + } + case 1070: + //line sql_yacc.yy:2752 + { + MySQLVAL.expr = &IsCheck{Operator: OP_IS_FALSE, Expr: MySQLS[MySQLpt-2].boolexpr} + } + case 1071: + //line sql_yacc.yy:2754 + { + MySQLVAL.expr = &IsCheck{Operator: OP_IS_NOT_FALSE, Expr: MySQLS[MySQLpt-3].boolexpr} + } + case 1072: + //line sql_yacc.yy:2756 + { + MySQLVAL.expr = &IsCheck{Operator: OP_IS_UNKNOWN, Expr: MySQLS[MySQLpt-2].boolexpr} + } + case 1073: + //line sql_yacc.yy:2758 + { + MySQLVAL.expr = &IsCheck{Operator: OP_IS_NOT_UNKNOWN, Expr: MySQLS[MySQLpt-3].boolexpr} + } + case 1074: + //line sql_yacc.yy:2760 + { + MySQLVAL.expr = MySQLS[MySQLpt-0].boolexpr + } + case 1075: + //line sql_yacc.yy:2765 + { + MySQLVAL.boolexpr = &NullCheck{Operator: OP_IS_NULL, Expr: MySQLS[MySQLpt-2].boolexpr} + } + case 1076: + //line sql_yacc.yy:2767 + { + MySQLVAL.boolexpr = &NullCheck{Operator: OP_IS_NOT_NULL, Expr: MySQLS[MySQLpt-3].boolexpr} + } + case 1077: + //line sql_yacc.yy:2769 + { + MySQLVAL.boolexpr = &CompareExpr{Left: MySQLS[MySQLpt-2].boolexpr, Operator: OP_EQ, Right: MySQLS[MySQLpt-0].valexpr} + } + case 1078: + //line sql_yacc.yy:2771 + { + MySQLVAL.boolexpr = &CompareExpr{Left: MySQLS[MySQLpt-2].boolexpr, Operator: MySQLS[MySQLpt-1].str, Right: MySQLS[MySQLpt-0].valexpr} + } + case 1079: + //line sql_yacc.yy:2773 + { + MySQLVAL.boolexpr = &CompareExpr{Left: MySQLS[MySQLpt-5].boolexpr, Operator: MySQLS[MySQLpt-4].str, Right: MySQLS[MySQLpt-1].subquery} + } + case 1080: + //line sql_yacc.yy:2775 + { + MySQLVAL.boolexpr = &Predicate{Expr: MySQLS[MySQLpt-0].valexpr} + } + case 1081: + //line sql_yacc.yy:2779 + { + MySQLVAL.valexpr = &InCond{Left: MySQLS[MySQLpt-4].valexpr, Operator: OP_IN, Right: IExprs{MySQLS[MySQLpt-1].subquery}} + } + case 1082: + //line sql_yacc.yy:2781 + { + MySQLVAL.valexpr = &InCond{Left: MySQLS[MySQLpt-5].valexpr, Operator: OP_NOT_IN, Right: IExprs{MySQLS[MySQLpt-1].subquery}} + } + case 1083: + //line sql_yacc.yy:2783 + { + MySQLVAL.valexpr = &InCond{Left: MySQLS[MySQLpt-4].valexpr, Operator: OP_IN, Right: IExprs{MySQLS[MySQLpt-1].expr}} + } + case 1084: + //line sql_yacc.yy:2785 + { + MySQLVAL.valexpr = &InCond{Left: MySQLS[MySQLpt-6].valexpr, Operator: OP_IN, Right: append(IExprs{MySQLS[MySQLpt-3].expr}, MySQLS[MySQLpt-1].exprs...)} + } + case 1085: + //line sql_yacc.yy:2787 + { + MySQLVAL.valexpr = &InCond{Left: MySQLS[MySQLpt-5].valexpr, Operator: OP_NOT_IN, Right: IExprs{MySQLS[MySQLpt-1].expr}} + } + case 1086: + //line sql_yacc.yy:2789 + { + MySQLVAL.valexpr = &InCond{Left: MySQLS[MySQLpt-7].valexpr, Operator: OP_NOT_IN, Right: append(IExprs{MySQLS[MySQLpt-3].expr}, MySQLS[MySQLpt-1].exprs...)} + } + case 1087: + //line sql_yacc.yy:2791 + { + MySQLVAL.valexpr = &RangeCond{Left: MySQLS[MySQLpt-4].valexpr, Operator: OP_BETWEEN, From: MySQLS[MySQLpt-2].valexpr, To: MySQLS[MySQLpt-0].valexpr} + } + case 1088: + //line sql_yacc.yy:2793 + { + MySQLVAL.valexpr = &RangeCond{Left: MySQLS[MySQLpt-5].valexpr, Operator: OP_NOT_BETWEEN, From: MySQLS[MySQLpt-2].valexpr, To: MySQLS[MySQLpt-0].valexpr} + } + case 1089: + //line sql_yacc.yy:2795 + { + MySQLVAL.valexpr = &LikeCond{Left: MySQLS[MySQLpt-3].valexpr, Operator: OP_SOUNDS_LIKE, Right: MySQLS[MySQLpt-0].valexpr} + } + case 1090: + //line sql_yacc.yy:2797 + { + MySQLVAL.valexpr = &LikeCond{Left: MySQLS[MySQLpt-3].valexpr, Operator: OP_LIKE, Right: MySQLS[MySQLpt-1].valexpr} + } + case 1091: + //line sql_yacc.yy:2799 + { + MySQLVAL.valexpr = &LikeCond{Left: MySQLS[MySQLpt-4].valexpr, Operator: OP_NOT_LIKE, Right: MySQLS[MySQLpt-1].valexpr} + } + case 1092: + //line sql_yacc.yy:2801 + { + MySQLVAL.valexpr = &LikeCond{Left: MySQLS[MySQLpt-2].valexpr, Operator: OP_REGEXP, Right: MySQLS[MySQLpt-0].valexpr} + } + case 1093: + //line sql_yacc.yy:2803 + { + MySQLVAL.valexpr = &LikeCond{Left: MySQLS[MySQLpt-3].valexpr, Operator: OP_NOT_REGEXP, Right: MySQLS[MySQLpt-0].valexpr} + } + case 1094: + //line sql_yacc.yy:2804 + { + MySQLVAL.valexpr = MySQLS[MySQLpt-0].valexpr + } + case 1095: + //line sql_yacc.yy:2808 + { + MySQLVAL.valexpr = &BinaryExpr{Left: MySQLS[MySQLpt-2].valexpr, Operator: OP_BITOR, Right: MySQLS[MySQLpt-0].valexpr} + } + case 1096: + //line sql_yacc.yy:2810 + { + MySQLVAL.valexpr = &BinaryExpr{Left: MySQLS[MySQLpt-2].valexpr, Operator: OP_BITAND, Right: MySQLS[MySQLpt-0].valexpr} + } + case 1097: + //line sql_yacc.yy:2812 + { + MySQLVAL.valexpr = &BinaryExpr{Left: MySQLS[MySQLpt-2].valexpr, Operator: OP_SHIFTLEFT, Right: MySQLS[MySQLpt-0].valexpr} + } + case 1098: + //line sql_yacc.yy:2814 + { + MySQLVAL.valexpr = &BinaryExpr{Left: MySQLS[MySQLpt-2].valexpr, Operator: OP_SHIFTRIGHT, Right: MySQLS[MySQLpt-0].valexpr} + } + case 1099: + //line sql_yacc.yy:2816 + { + MySQLVAL.valexpr = &BinaryExpr{Left: MySQLS[MySQLpt-2].valexpr, Operator: OP_PLUS, Right: MySQLS[MySQLpt-0].valexpr} + } + case 1100: + //line sql_yacc.yy:2818 + { + MySQLVAL.valexpr = &BinaryExpr{Left: MySQLS[MySQLpt-2].valexpr, Operator: OP_MINUS, Right: MySQLS[MySQLpt-0].valexpr} + } + case 1101: + //line sql_yacc.yy:2820 + { + MySQLVAL.valexpr = &BinaryExpr{Left: MySQLS[MySQLpt-4].valexpr, Operator: OP_PLUS, Right: &IntervalExpr{Expr: MySQLS[MySQLpt-1].expr, Interval: MySQLS[MySQLpt-0].bytes}} + } + case 1102: + //line sql_yacc.yy:2822 + { + MySQLVAL.valexpr = &BinaryExpr{Left: MySQLS[MySQLpt-4].valexpr, Operator: OP_MINUS, Right: &IntervalExpr{Expr: MySQLS[MySQLpt-1].expr, Interval: MySQLS[MySQLpt-0].bytes}} + } + case 1103: + //line sql_yacc.yy:2824 + { + MySQLVAL.valexpr = &BinaryExpr{Left: MySQLS[MySQLpt-2].valexpr, Operator: OP_MULT, Right: MySQLS[MySQLpt-0].valexpr} + } + case 1104: + //line sql_yacc.yy:2826 + { + MySQLVAL.valexpr = &BinaryExpr{Left: MySQLS[MySQLpt-2].valexpr, Operator: OP_DIV, Right: MySQLS[MySQLpt-0].valexpr} + } + case 1105: + //line sql_yacc.yy:2828 + { + MySQLVAL.valexpr = &BinaryExpr{Left: MySQLS[MySQLpt-2].valexpr, Operator: OP_MOD, Right: MySQLS[MySQLpt-0].valexpr} + } + case 1106: + //line sql_yacc.yy:2830 + { + MySQLVAL.valexpr = &BinaryExpr{Left: MySQLS[MySQLpt-2].valexpr, Operator: OP_DIV, Right: MySQLS[MySQLpt-0].valexpr} + } + case 1107: + //line sql_yacc.yy:2832 + { + MySQLVAL.valexpr = &BinaryExpr{Left: MySQLS[MySQLpt-2].valexpr, Operator: OP_MOD, Right: MySQLS[MySQLpt-0].valexpr} + } + case 1108: + //line sql_yacc.yy:2834 + { + MySQLVAL.valexpr = &BinaryExpr{Left: MySQLS[MySQLpt-2].valexpr, Operator: OP_BITXOR, Right: MySQLS[MySQLpt-0].valexpr} + } + case 1109: + //line sql_yacc.yy:2836 + { + MySQLVAL.valexpr = MySQLS[MySQLpt-0].valexpr + } + case 1118: + //line sql_yacc.yy:2856 + { + MySQLVAL.str = OP_EQ + } + case 1119: + //line sql_yacc.yy:2857 + { + MySQLVAL.str = OP_GE + } + case 1120: + //line sql_yacc.yy:2858 + { + MySQLVAL.str = OP_GT + } + case 1121: + //line sql_yacc.yy:2859 + { + MySQLVAL.str = OP_LE + } + case 1122: + //line sql_yacc.yy:2860 + { + MySQLVAL.str = OP_LT + } + case 1123: + //line sql_yacc.yy:2861 + { + MySQLVAL.str = OP_NE + } + case 1126: + //line sql_yacc.yy:2868 + { + MySQLVAL.valexpr = MySQLS[MySQLpt-0].valexpr + } + case 1127: + //line sql_yacc.yy:2869 + { + MySQLVAL.valexpr = &FuncExpr{} + } + case 1128: + //line sql_yacc.yy:2870 + { + MySQLVAL.valexpr = &FuncExpr{} + } + case 1129: + //line sql_yacc.yy:2871 + { + MySQLVAL.valexpr = &FuncExpr{} + } + case 1130: + //line sql_yacc.yy:2872 + { + MySQLVAL.valexpr = &FuncExpr{} + } + case 1131: + //line sql_yacc.yy:2874 + { + MySQLVAL.valexpr = &CollateExpr{Expr: MySQLS[MySQLpt-2].valexpr, Collate: MySQLS[MySQLpt-0].bytes} + } + case 1132: + //line sql_yacc.yy:2875 + { + MySQLVAL.valexpr = MySQLS[MySQLpt-0].valexpr + } + case 1133: + //line sql_yacc.yy:2876 + { + MySQLVAL.valexpr = MySQLS[MySQLpt-0].valexpr + } + case 1134: + //line sql_yacc.yy:2877 + { + MySQLVAL.valexpr = MySQLS[MySQLpt-0].valexpr + } + case 1135: + //line sql_yacc.yy:2878 + { + MySQLVAL.valexpr = &FuncExpr{} + } + case 1136: + //line sql_yacc.yy:2879 + { + MySQLVAL.valexpr = &OrOrExpr{Left: MySQLS[MySQLpt-2].valexpr, Right: MySQLS[MySQLpt-0].valexpr} + } + case 1137: + //line sql_yacc.yy:2880 + { + MySQLVAL.valexpr = &UnaryExpr{Expr: MySQLS[MySQLpt-0].valexpr, Operator: OP_UPLUS} + } + case 1138: + //line sql_yacc.yy:2881 + { + MySQLVAL.valexpr = &UnaryExpr{Expr: MySQLS[MySQLpt-0].valexpr, Operator: OP_UMINUS} + } + case 1139: + //line sql_yacc.yy:2882 + { + MySQLVAL.valexpr = &UnaryExpr{Expr: MySQLS[MySQLpt-0].valexpr, Operator: OP_TILDA} + } + case 1140: + //line sql_yacc.yy:2883 + { + MySQLVAL.valexpr = &UnaryExpr{Expr: MySQLS[MySQLpt-0].valexpr, Operator: OP_NOT2} + } + case 1141: + //line sql_yacc.yy:2884 + { + MySQLVAL.valexpr = &SubQuery{SelectStatement: MySQLS[MySQLpt-1].subquery} + } + case 1142: + //line sql_yacc.yy:2885 + { + MySQLVAL.valexpr = &IExprs{MySQLS[MySQLpt-1].expr} + } + case 1143: + //line sql_yacc.yy:2886 + { + MySQLVAL.valexpr = append(IExprs{MySQLS[MySQLpt-3].expr}, MySQLS[MySQLpt-1].exprs...) + } + case 1144: + //line sql_yacc.yy:2887 + { + MySQLVAL.valexpr = &FuncExpr{} + } + case 1145: + //line sql_yacc.yy:2888 + { + MySQLVAL.valexpr = &ExistsExpr{SubQuery: MySQLS[MySQLpt-1].subquery} + } + case 1146: + //line sql_yacc.yy:2889 + { + MySQLVAL.valexpr = &IdentExpr{Ident: MySQLS[MySQLpt-2].bytes, Expr: MySQLS[MySQLpt-1].expr} + } + case 1147: + //line sql_yacc.yy:2890 + { + MySQLVAL.valexpr = &MatchExpr{} + } + case 1148: + //line sql_yacc.yy:2891 + { + MySQLVAL.valexpr = &UnaryExpr{Expr: MySQLS[MySQLpt-0].valexpr, Operator: OP_UBINARY} + } + case 1149: + //line sql_yacc.yy:2892 + { + MySQLVAL.valexpr = &FuncExpr{} + } + case 1150: + //line sql_yacc.yy:2893 + { + MySQLVAL.valexpr = &FuncExpr{} + } + case 1151: + //line sql_yacc.yy:2894 + { + MySQLVAL.valexpr = &FuncExpr{} + } + case 1152: + //line sql_yacc.yy:2895 + { + MySQLVAL.valexpr = &FuncExpr{} + } + case 1153: + //line sql_yacc.yy:2896 + { + MySQLVAL.valexpr = &FuncExpr{} + } + case 1154: + //line sql_yacc.yy:2897 + { + MySQLVAL.valexpr = &FuncExpr{} + } + case 1155: + //line sql_yacc.yy:2898 + { + MySQLVAL.valexpr = &IntervalExpr{Expr: &BinaryExpr{Left: MySQLS[MySQLpt-3].expr, Right: MySQLS[MySQLpt-0].expr, Operator: OP_PLUS}, Interval: MySQLS[MySQLpt-2].bytes} + } + case 1251: + //line sql_yacc.yy:3018 + { + } + case 1270: + //line sql_yacc.yy:3039 + { + MySQLVAL.valexpr = &Variable{} + } + case 1296: + //line sql_yacc.yy:3083 + { + MySQLVAL.exprs = IExprs{MySQLS[MySQLpt-0].expr} + } + case 1297: + //line sql_yacc.yy:3084 + { + MySQLVAL.exprs = append(MySQLS[MySQLpt-2].exprs, MySQLS[MySQLpt-0].expr) + } + case 1308: + //line sql_yacc.yy:3107 + { + MySQLVAL.table_ref = MySQLS[MySQLpt-0].table_ref + } + case 1309: + //line sql_yacc.yy:3108 + { + MySQLVAL.table_ref = MySQLS[MySQLpt-0].table_ref + } + case 1310: + //line sql_yacc.yy:3111 + { + MySQLVAL.table_ref_list = MySQLS[MySQLpt-0].table_ref_list + } + case 1311: + //line sql_yacc.yy:3114 + { + MySQLVAL.table_ref = MySQLS[MySQLpt-0].table_ref + } + case 1312: + //line sql_yacc.yy:3115 + { + MySQLVAL.table_ref = MySQLS[MySQLpt-1].table_ref + } + case 1313: + //line sql_yacc.yy:3118 + { + MySQLVAL.table_ref_list = []ITable{MySQLS[MySQLpt-0].table_ref} + } + case 1314: + //line sql_yacc.yy:3119 + { + MySQLVAL.table_ref_list = append(MySQLS[MySQLpt-2].table_ref_list, MySQLS[MySQLpt-0].table_ref) + } + case 1315: + //line sql_yacc.yy:3123 + { + MySQLVAL.table_ref = &JoinTable{Left: MySQLS[MySQLpt-2].table_ref, Right: MySQLS[MySQLpt-0].table_ref} + } + case 1316: + //line sql_yacc.yy:3125 + { + MySQLVAL.table_ref = &JoinTable{Left: MySQLS[MySQLpt-2].table_ref, Right: MySQLS[MySQLpt-0].table_ref} + } + case 1317: + //line sql_yacc.yy:3127 + { + MySQLVAL.table_ref = &JoinTable{Left: MySQLS[MySQLpt-4].table_ref, Right: MySQLS[MySQLpt-2].table_ref} + } + case 1318: + //line sql_yacc.yy:3129 + { + MySQLVAL.table_ref = &JoinTable{Left: MySQLS[MySQLpt-4].table_ref, Right: MySQLS[MySQLpt-2].table_ref} + } + case 1319: + //line sql_yacc.yy:3131 + { + MySQLVAL.table_ref = &JoinTable{Left: MySQLS[MySQLpt-6].table_ref, Right: MySQLS[MySQLpt-4].table_ref} + } + case 1320: + //line sql_yacc.yy:3133 + { + MySQLVAL.table_ref = &JoinTable{Left: MySQLS[MySQLpt-3].table_ref, Right: MySQLS[MySQLpt-0].table_ref} + } + case 1321: + //line sql_yacc.yy:3135 + { + MySQLVAL.table_ref = &JoinTable{Left: MySQLS[MySQLpt-6].table_ref, Right: MySQLS[MySQLpt-2].table_ref} + } + case 1322: + //line sql_yacc.yy:3137 + { + MySQLVAL.table_ref = &JoinTable{Left: MySQLS[MySQLpt-8].table_ref, Right: MySQLS[MySQLpt-4].table_ref} + } + case 1323: + //line sql_yacc.yy:3139 + { + MySQLVAL.table_ref = &JoinTable{Left: MySQLS[MySQLpt-5].table_ref, Right: MySQLS[MySQLpt-0].table_ref} + } + case 1324: + //line sql_yacc.yy:3141 + { + MySQLVAL.table_ref = &JoinTable{Left: MySQLS[MySQLpt-6].table_ref, Right: MySQLS[MySQLpt-2].table_ref} + } + case 1325: + //line sql_yacc.yy:3143 + { + MySQLVAL.table_ref = &JoinTable{Left: MySQLS[MySQLpt-8].table_ref, Right: MySQLS[MySQLpt-4].table_ref} + } + case 1326: + //line sql_yacc.yy:3145 + { + MySQLVAL.table_ref = &JoinTable{Left: MySQLS[MySQLpt-5].table_ref, Right: MySQLS[MySQLpt-0].table_ref} + } + case 1333: + //line sql_yacc.yy:3162 + { + MySQLVAL.table_ref = &AliasedTable{TableOrSubQuery: MySQLS[MySQLpt-3].table, As: MySQLS[MySQLpt-1].bytes} + } + case 1334: + //line sql_yacc.yy:3164 + { + MySQLVAL.table_ref = &AliasedTable{TableOrSubQuery: MySQLS[MySQLpt-0].select_statement} + } + case 1335: + //line sql_yacc.yy:3166 + { + MySQLVAL.table_ref = &AliasedTable{TableOrSubQuery: MySQLS[MySQLpt-2].select_statement, As: MySQLS[MySQLpt-0].bytes} + } + case 1336: + //line sql_yacc.yy:3171 + { + MySQLVAL.select_statement = &SubQuery{SelectStatement: MySQLS[MySQLpt-1].select_statement} + } + case 1337: + //line sql_yacc.yy:3172 + { + MySQLVAL.select_statement = &SubQuery{SelectStatement: &Union{Left: MySQLS[MySQLpt-4].select_statement, Right: MySQLS[MySQLpt-1].select_statement}} + } + case 1338: + //line sql_yacc.yy:3176 + { + MySQLVAL.select_statement = MySQLS[MySQLpt-0].select_statement + } + case 1339: + //line sql_yacc.yy:3180 + { + if MySQLS[MySQLpt-1].select_statement == nil { + MySQLVAL.select_statement = &Select{From: nil, LockType: MySQLS[MySQLpt-0].lock_type} + } else { + MySQLVAL.select_statement = &Select{From: MySQLS[MySQLpt-1].select_statement.(*Select).From, LockType: MySQLS[MySQLpt-0].lock_type} + } + } + case 1340: + //line sql_yacc.yy:3190 + { + MySQLVAL.select_statement = &Select{From: MySQLS[MySQLpt-0].table_ref_list} + } + case 1341: + //line sql_yacc.yy:3194 + { + MySQLVAL.select_statement = &SubQuery{SelectStatement: MySQLS[MySQLpt-0].select_statement} + } + case 1367: + //line sql_yacc.yy:3249 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1368: + //line sql_yacc.yy:3250 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1369: + //line sql_yacc.yy:3251 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1370: + //line sql_yacc.yy:3252 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1371: + //line sql_yacc.yy:3253 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1372: + //line sql_yacc.yy:3254 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1373: + //line sql_yacc.yy:3255 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1374: + //line sql_yacc.yy:3256 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1375: + //line sql_yacc.yy:3257 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1376: + //line sql_yacc.yy:3258 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1377: + //line sql_yacc.yy:3259 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1378: + //line sql_yacc.yy:3260 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1379: + //line sql_yacc.yy:3264 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1380: + //line sql_yacc.yy:3265 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1381: + //line sql_yacc.yy:3266 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1382: + //line sql_yacc.yy:3267 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1383: + //line sql_yacc.yy:3268 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1384: + //line sql_yacc.yy:3269 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1385: + //line sql_yacc.yy:3270 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1386: + //line sql_yacc.yy:3271 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1387: + //line sql_yacc.yy:3272 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1395: + //line sql_yacc.yy:3287 + { + MySQLVAL.bytes = nil + } + case 1396: + //line sql_yacc.yy:3289 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1477: + //line sql_yacc.yy:3441 + { + MySQLVAL.statement = &Do{} + } + case 1478: + //line sql_yacc.yy:3444 + { + MySQLVAL.statement = &DropTables{Tables: MySQLS[MySQLpt-1].table_list} + } + case 1479: + //line sql_yacc.yy:3445 + { + MySQLVAL.statement = &DropIndex{On: MySQLS[MySQLpt-1].table} + } + case 1480: + //line sql_yacc.yy:3446 + { + MySQLVAL.statement = &DropDatabase{} + } + case 1481: + //line sql_yacc.yy:3448 + { + MySQLVAL.statement = &DropFunction{Function: &Spname{Qualifier: MySQLS[MySQLpt-2].bytes, Name: MySQLS[MySQLpt-0].bytes}} + } + case 1482: + //line sql_yacc.yy:3450 + { + MySQLVAL.statement = &DropFunction{Function: &Spname{Name: MySQLS[MySQLpt-0].bytes}} + } + case 1483: + //line sql_yacc.yy:3451 + { + MySQLVAL.statement = &DropProcedure{Procedure: MySQLS[MySQLpt-0].spname} + } + case 1484: + //line sql_yacc.yy:3452 + { + MySQLVAL.statement = &DropUser{} + } + case 1485: + //line sql_yacc.yy:3453 + { + MySQLVAL.statement = &DropView{} + } + case 1486: + //line sql_yacc.yy:3454 + { + MySQLVAL.statement = &DropEvent{Event: MySQLS[MySQLpt-0].spname} + } + case 1487: + //line sql_yacc.yy:3455 + { + MySQLVAL.statement = &DropTrigger{Trigger: MySQLS[MySQLpt-0].spname} + } + case 1488: + //line sql_yacc.yy:3456 + { + MySQLVAL.statement = &DropTablespace{} + } + case 1489: + //line sql_yacc.yy:3457 + { + MySQLVAL.statement = &DropLogfile{} + } + case 1490: + //line sql_yacc.yy:3458 + { + MySQLVAL.statement = &DropServer{} + } + case 1491: + //line sql_yacc.yy:3462 + { + MySQLVAL.table_list = ISimpleTables{MySQLS[MySQLpt-0].table} + } + case 1492: + //line sql_yacc.yy:3463 + { + MySQLVAL.table_list = append(MySQLS[MySQLpt-2].table_list, MySQLS[MySQLpt-0].table) + } + case 1493: + //line sql_yacc.yy:3466 + { + MySQLVAL.table = MySQLS[MySQLpt-0].table + } + case 1494: + //line sql_yacc.yy:3469 + { + MySQLVAL.table = MySQLS[MySQLpt-1].table + } + case 1495: + //line sql_yacc.yy:3473 + { + MySQLVAL.table_ref_list = ITables{MySQLS[MySQLpt-0].table} + } + case 1496: + //line sql_yacc.yy:3475 + { + MySQLVAL.table_ref_list = append(MySQLS[MySQLpt-2].table_ref_list, MySQLS[MySQLpt-0].table) + } + case 1497: + //line sql_yacc.yy:3479 + { + MySQLVAL.table = MySQLS[MySQLpt-0].table + } + case 1509: + //line sql_yacc.yy:3504 + { + MySQLVAL.statement = &Insert{Table: MySQLS[MySQLpt-2].table, InsertFields: MySQLS[MySQLpt-1].interf} + } + case 1510: + //line sql_yacc.yy:3511 + { + MySQLVAL.statement = &Replace{Table: MySQLS[MySQLpt-1].table, ReplaceFields: MySQLS[MySQLpt-0].interf} + } + case 1517: + //line sql_yacc.yy:3527 + { + MySQLVAL.table = MySQLS[MySQLpt-0].table + } + case 1518: + //line sql_yacc.yy:3528 + { + MySQLVAL.table = MySQLS[MySQLpt-0].table + } + case 1519: + //line sql_yacc.yy:3531 + { + MySQLVAL.table = MySQLS[MySQLpt-0].table + } + case 1520: + //line sql_yacc.yy:3534 + { + MySQLVAL.interf = MySQLS[MySQLpt-0].interf + } + case 1521: + //line sql_yacc.yy:3535 + { + MySQLVAL.interf = MySQLS[MySQLpt-0].interf + } + case 1522: + //line sql_yacc.yy:3536 + { + MySQLVAL.interf = MySQLS[MySQLpt-0].interf + } + case 1523: + //line sql_yacc.yy:3537 + { + MySQLVAL.interf = struct{}{} + } + case 1526: + //line sql_yacc.yy:3544 + { + MySQLVAL.interf = struct{}{} + } + case 1527: + //line sql_yacc.yy:3545 + { + MySQLVAL.interf = struct{}{} + } + case 1528: + //line sql_yacc.yy:3547 + { + if MySQLS[MySQLpt-0].select_statement == nil { + MySQLVAL.interf = MySQLS[MySQLpt-1].select_statement + } else { + MySQLVAL.interf = &Union{Left: MySQLS[MySQLpt-1].select_statement, Right: MySQLS[MySQLpt-0].select_statement} + } + } + case 1529: + //line sql_yacc.yy:3555 + { + if MySQLS[MySQLpt-0].select_statement == nil { + MySQLVAL.interf = MySQLS[MySQLpt-2].select_statement + } else { + MySQLVAL.interf = &Union{Left: MySQLS[MySQLpt-2].select_statement, Right: MySQLS[MySQLpt-0].select_statement} + } + } + case 1548: + //line sql_yacc.yy:3604 + { + MySQLVAL.statement = &Update{Tables: MySQLS[MySQLpt-5].table_ref_list} + } + case 1557: + //line sql_yacc.yy:3628 + { + MySQLVAL.statement = MySQLS[MySQLpt-0].statement + } + case 1558: + //line sql_yacc.yy:3633 + { + MySQLVAL.statement = &Delete{Tables: ITables{MySQLS[MySQLpt-4].table}} + } + case 1559: + //line sql_yacc.yy:3635 + { + MySQLVAL.statement = &Delete{Tables: append(MySQLS[MySQLpt-3].table_ref_list, MySQLS[MySQLpt-1].table_ref_list...)} + } + case 1560: + //line sql_yacc.yy:3637 + { + MySQLVAL.statement = &Delete{Tables: append(MySQLS[MySQLpt-3].table_ref_list, MySQLS[MySQLpt-1].table_ref_list...)} + } + case 1561: + //line sql_yacc.yy:3641 + { + MySQLVAL.table_ref_list = ITables{MySQLS[MySQLpt-0].table} + } + case 1562: + //line sql_yacc.yy:3642 + { + MySQLVAL.table_ref_list = append(MySQLS[MySQLpt-2].table_ref_list, MySQLS[MySQLpt-0].table) + } + case 1563: + //line sql_yacc.yy:3646 + { + MySQLVAL.table = &SimpleTable{Name: MySQLS[MySQLpt-1].bytes, Column: MySQLS[MySQLpt-0].bytes} + } + case 1564: + //line sql_yacc.yy:3647 + { + MySQLVAL.table = &SimpleTable{Qualifier: MySQLS[MySQLpt-3].bytes, Name: MySQLS[MySQLpt-1].bytes, Column: MySQLS[MySQLpt-0].bytes} + } + case 1565: + //line sql_yacc.yy:3651 + { + MySQLVAL.bytes = nil + } + case 1566: + //line sql_yacc.yy:3652 + { + MySQLVAL.bytes = []byte{'*'} + } + case 1572: + //line sql_yacc.yy:3664 + { + MySQLVAL.statement = &TruncateTable{Table: MySQLS[MySQLpt-0].table} + } + case 1590: + //line sql_yacc.yy:3695 + { + MySQLVAL.statement = MySQLS[MySQLpt-0].statement + } + case 1591: + //line sql_yacc.yy:3698 + { + MySQLVAL.statement = &ShowDatabases{LikeOrWhere: MySQLS[MySQLpt-0].like_or_where} + } + case 1592: + //line sql_yacc.yy:3699 + { + MySQLVAL.statement = &ShowTables{From: MySQLS[MySQLpt-1].bytes} + } + case 1593: + //line sql_yacc.yy:3700 + { + MySQLVAL.statement = &ShowTriggers{From: MySQLS[MySQLpt-1].bytes} + } + case 1594: + //line sql_yacc.yy:3701 + { + MySQLVAL.statement = &ShowEvents{From: MySQLS[MySQLpt-1].bytes} + } + case 1595: + //line sql_yacc.yy:3702 + { + MySQLVAL.statement = &ShowTableStatus{From: MySQLS[MySQLpt-1].bytes} + } + case 1596: + //line sql_yacc.yy:3703 + { + MySQLVAL.statement = &ShowOpenTables{From: MySQLS[MySQLpt-1].bytes} + } + case 1597: + //line sql_yacc.yy:3704 + { + MySQLVAL.statement = &ShowPlugins{} + } + case 1598: + //line sql_yacc.yy:3705 + { + MySQLVAL.statement = &ShowEngines{} + } + case 1599: + //line sql_yacc.yy:3706 + { + MySQLVAL.statement = &ShowEngines{} + } + case 1600: + //line sql_yacc.yy:3707 + { + MySQLVAL.statement = &ShowColumns{Table: MySQLS[MySQLpt-2].table, From: MySQLS[MySQLpt-1].bytes} + } + case 1601: + //line sql_yacc.yy:3708 + { + MySQLVAL.statement = &ShowLogs{} + } + case 1602: + //line sql_yacc.yy:3709 + { + MySQLVAL.statement = &ShowSlaveHosts{} + } + case 1603: + //line sql_yacc.yy:3710 + { + MySQLVAL.statement = &ShowLogEvents{} + } + case 1604: + //line sql_yacc.yy:3711 + { + MySQLVAL.statement = &ShowLogEvents{} + } + case 1605: + //line sql_yacc.yy:3713 + { + MySQLVAL.statement = &ShowIndex{Table: MySQLS[MySQLpt-2].table, From: MySQLS[MySQLpt-1].bytes} + } + case 1606: + //line sql_yacc.yy:3714 + { + MySQLVAL.statement = &ShowEngines{} + } + case 1607: + //line sql_yacc.yy:3715 + { + MySQLVAL.statement = &ShowPrivileges{} + } + case 1608: + //line sql_yacc.yy:3716 + { + MySQLVAL.statement = &ShowWarnings{} + } + case 1609: + //line sql_yacc.yy:3717 + { + MySQLVAL.statement = &ShowErrors{} + } + case 1610: + //line sql_yacc.yy:3718 + { + MySQLVAL.statement = &ShowWarnings{} + } + case 1611: + //line sql_yacc.yy:3719 + { + MySQLVAL.statement = &ShowErrors{} + } + case 1612: + //line sql_yacc.yy:3720 + { + MySQLVAL.statement = &ShowProfiles{} + } + case 1613: + //line sql_yacc.yy:3722 + { + MySQLVAL.statement = &ShowProfiles{} + } + case 1614: + //line sql_yacc.yy:3723 + { + MySQLVAL.statement = &ShowStatus{} + } + case 1615: + //line sql_yacc.yy:3724 + { + MySQLVAL.statement = &ShowProcessList{} + } + case 1616: + //line sql_yacc.yy:3725 + { + MySQLVAL.statement = &ShowVariables{} + } + case 1617: + //line sql_yacc.yy:3726 + { + MySQLVAL.statement = &ShowCharset{} + } + case 1618: + //line sql_yacc.yy:3727 + { + MySQLVAL.statement = &ShowCollation{} + } + case 1619: + //line sql_yacc.yy:3728 + { + MySQLVAL.statement = &ShowGrants{} + } + case 1620: + //line sql_yacc.yy:3729 + { + MySQLVAL.statement = &ShowGrants{} + } + case 1621: + //line sql_yacc.yy:3731 + { + MySQLVAL.statement = &ShowCreateDatabase{Schema: MySQLS[MySQLpt-0].bytes} + } + case 1622: + //line sql_yacc.yy:3733 + { + MySQLVAL.statement = &ShowCreate{Prefix: MySQLS[MySQLpt-1].bytes, Table: MySQLS[MySQLpt-0].table} + } + case 1623: + //line sql_yacc.yy:3735 + { + MySQLVAL.statement = &ShowCreate{Prefix: MySQLS[MySQLpt-1].bytes, Table: MySQLS[MySQLpt-0].table} + } + case 1624: + //line sql_yacc.yy:3736 + { + MySQLVAL.statement = &ShowMasterStatus{} + } + case 1625: + //line sql_yacc.yy:3737 + { + MySQLVAL.statement = &ShowSlaveStatus{} + } + case 1626: + //line sql_yacc.yy:3739 + { + MySQLVAL.statement = &ShowCreate{Prefix: MySQLS[MySQLpt-1].bytes, Table: MySQLS[MySQLpt-0].spname} + } + case 1627: + //line sql_yacc.yy:3741 + { + MySQLVAL.statement = &ShowCreate{Prefix: MySQLS[MySQLpt-1].bytes, Table: MySQLS[MySQLpt-0].spname} + } + case 1628: + //line sql_yacc.yy:3743 + { + MySQLVAL.statement = &ShowCreate{Prefix: MySQLS[MySQLpt-1].bytes, Table: MySQLS[MySQLpt-0].spname} + } + case 1629: + //line sql_yacc.yy:3744 + { + MySQLVAL.statement = &ShowProcedure{} + } + case 1630: + //line sql_yacc.yy:3745 + { + MySQLVAL.statement = &ShowFunction{} + } + case 1631: + //line sql_yacc.yy:3746 + { + MySQLVAL.statement = &ShowProcedure{Procedure: MySQLS[MySQLpt-0].spname} + } + case 1632: + //line sql_yacc.yy:3747 + { + MySQLVAL.statement = &ShowFunction{Function: MySQLS[MySQLpt-0].spname} + } + case 1633: + //line sql_yacc.yy:3749 + { + MySQLVAL.statement = &ShowCreate{Prefix: MySQLS[MySQLpt-1].bytes, Table: MySQLS[MySQLpt-0].spname} + } + case 1641: + //line sql_yacc.yy:3766 + { + MySQLVAL.bytes = nil + } + case 1642: + //line sql_yacc.yy:3767 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1651: + //line sql_yacc.yy:3786 + { + MySQLVAL.like_or_where = nil + } + case 1652: + //line sql_yacc.yy:3787 + { + MySQLVAL.like_or_where = &LikeOrWhere{Like: string(MySQLS[MySQLpt-0].bytes)} + } + case 1653: + //line sql_yacc.yy:3788 + { + MySQLVAL.like_or_where = nil + } + case 1654: + //line sql_yacc.yy:3792 + { + MySQLVAL.statement = &DescribeTable{Table: MySQLS[MySQLpt-1].table} + } + case 1655: + //line sql_yacc.yy:3794 + { + MySQLVAL.statement = &DescribeStmt{Stmt: MySQLS[MySQLpt-0].statement} + } + case 1656: + //line sql_yacc.yy:3798 + { + MySQLVAL.statement = MySQLS[MySQLpt-0].select_statement + } + case 1657: + //line sql_yacc.yy:3799 + { + MySQLVAL.statement = MySQLS[MySQLpt-0].statement + } + case 1658: + //line sql_yacc.yy:3800 + { + MySQLVAL.statement = MySQLS[MySQLpt-0].statement + } + case 1659: + //line sql_yacc.yy:3801 + { + MySQLVAL.statement = MySQLS[MySQLpt-0].statement + } + case 1660: + //line sql_yacc.yy:3802 + { + MySQLVAL.statement = MySQLS[MySQLpt-0].statement + } + case 1670: + //line sql_yacc.yy:3820 + { + MySQLVAL.statement = MySQLS[MySQLpt-0].statement + } + case 1671: + //line sql_yacc.yy:3823 + { + MySQLVAL.statement = &FlushTables{Tables: MySQLS[MySQLpt-1].table_list} + } + case 1672: + //line sql_yacc.yy:3824 + { + MySQLVAL.statement = &Flush{} + } + case 1691: + //line sql_yacc.yy:3851 + { + MySQLVAL.table_list = nil + } + case 1692: + //line sql_yacc.yy:3852 + { + MySQLVAL.table_list = MySQLS[MySQLpt-0].table_list + } + case 1693: + //line sql_yacc.yy:3855 + { + MySQLVAL.statement = &Reset{} + } + case 1701: + //line sql_yacc.yy:3871 + { + MySQLVAL.statement = &Purge{} + } + case 1705: + //line sql_yacc.yy:3881 + { + MySQLVAL.statement = &Kill{} + } + case 1709: + //line sql_yacc.yy:3889 + { + MySQLVAL.statement = &Use{DB: MySQLS[MySQLpt-0].bytes} + } + case 1710: + //line sql_yacc.yy:3893 + { + MySQLVAL.statement = &Load{} + } + case 1753: + //line sql_yacc.yy:3979 + { + MySQLVAL.valexpr = StrVal(MySQLS[MySQLpt-0].bytes) + } + case 1754: + //line sql_yacc.yy:3980 + { + MySQLVAL.valexpr = StrVal(MySQLS[MySQLpt-0].bytes) + } + case 1755: + //line sql_yacc.yy:3981 + { + MySQLVAL.valexpr = StrVal(append(append(MySQLS[MySQLpt-1].bytes, ' '), MySQLS[MySQLpt-0].bytes...)) + } + case 1756: + //line sql_yacc.yy:3982 + { + MySQLVAL.valexpr = StrVal(append(MySQLS[MySQLpt-1].valexpr.(StrVal), MySQLS[MySQLpt-0].bytes...)) + } + case 1760: + //line sql_yacc.yy:3990 + { + MySQLVAL.valexpr = StrVal("?") + } + case 1764: + //line sql_yacc.yy:3998 + { + MySQLVAL.valexpr = MySQLS[MySQLpt-0].valexpr + } + case 1765: + //line sql_yacc.yy:3999 + { + MySQLVAL.valexpr = MySQLS[MySQLpt-0].valexpr + } + case 1766: + //line sql_yacc.yy:4000 + { + MySQLVAL.valexpr = MySQLS[MySQLpt-0].valexpr + } + case 1767: + //line sql_yacc.yy:4001 + { + MySQLVAL.valexpr = &NullVal{} + } + case 1768: + //line sql_yacc.yy:4002 + { + MySQLVAL.valexpr = BoolVal(false) + } + case 1769: + //line sql_yacc.yy:4003 + { + MySQLVAL.valexpr = BoolVal(true) + } + case 1770: + //line sql_yacc.yy:4004 + { + MySQLVAL.valexpr = HexVal(MySQLS[MySQLpt-0].bytes) + } + case 1771: + //line sql_yacc.yy:4005 + { + MySQLVAL.valexpr = BinVal(MySQLS[MySQLpt-0].bytes) + } + case 1772: + //line sql_yacc.yy:4006 + { + MySQLVAL.valexpr = HexVal(append(append(MySQLS[MySQLpt-1].bytes, ' '), MySQLS[MySQLpt-0].bytes...)) + } + case 1773: + //line sql_yacc.yy:4007 + { + MySQLVAL.valexpr = BinVal(append(append(MySQLS[MySQLpt-1].bytes, ' '), MySQLS[MySQLpt-0].bytes...)) + } + case 1774: + //line sql_yacc.yy:4011 + { + MySQLVAL.valexpr = NumVal(MySQLS[MySQLpt-0].bytes) + } + case 1775: + //line sql_yacc.yy:4012 + { + MySQLVAL.valexpr = NumVal(MySQLS[MySQLpt-0].bytes) + } + case 1776: + //line sql_yacc.yy:4013 + { + MySQLVAL.valexpr = NumVal(MySQLS[MySQLpt-0].bytes) + } + case 1777: + //line sql_yacc.yy:4014 + { + MySQLVAL.valexpr = NumVal(MySQLS[MySQLpt-0].bytes) + } + case 1778: + //line sql_yacc.yy:4015 + { + MySQLVAL.valexpr = NumVal(MySQLS[MySQLpt-0].bytes) + } + case 1779: + //line sql_yacc.yy:4018 + { + MySQLVAL.valexpr = StrVal(append(MySQLS[MySQLpt-1].bytes, MySQLS[MySQLpt-0].bytes...)) + } + case 1780: + //line sql_yacc.yy:4019 + { + MySQLVAL.valexpr = StrVal(append(MySQLS[MySQLpt-1].bytes, MySQLS[MySQLpt-0].bytes...)) + } + case 1781: + //line sql_yacc.yy:4020 + { + MySQLVAL.valexpr = StrVal(append(MySQLS[MySQLpt-1].bytes, MySQLS[MySQLpt-0].bytes...)) + } + case 1787: + //line sql_yacc.yy:4035 + { + MySQLVAL.valexpr = &SchemaObject{Column: MySQLS[MySQLpt-0].bytes} + } + case 1788: + //line sql_yacc.yy:4036 + { + MySQLVAL.valexpr = MySQLS[MySQLpt-0].valexpr + } + case 1791: + //line sql_yacc.yy:4043 + { + MySQLVAL.valexpr = &SchemaObject{Table: MySQLS[MySQLpt-2].bytes, Column: MySQLS[MySQLpt-0].bytes} + } + case 1792: + //line sql_yacc.yy:4044 + { + MySQLVAL.valexpr = &SchemaObject{Table: MySQLS[MySQLpt-2].bytes, Column: MySQLS[MySQLpt-0].bytes} + } + case 1793: + //line sql_yacc.yy:4045 + { + MySQLVAL.valexpr = &SchemaObject{Schema: MySQLS[MySQLpt-4].bytes, Table: MySQLS[MySQLpt-2].bytes, Column: MySQLS[MySQLpt-0].bytes} + } + case 1798: + //line sql_yacc.yy:4054 + { + MySQLVAL.table = &SimpleTable{Name: MySQLS[MySQLpt-0].bytes} + } + case 1799: + //line sql_yacc.yy:4055 + { + MySQLVAL.table = &SimpleTable{Qualifier: MySQLS[MySQLpt-2].bytes, Name: MySQLS[MySQLpt-0].bytes} + } + case 1800: + //line sql_yacc.yy:4056 + { + MySQLVAL.table = &SimpleTable{Name: MySQLS[MySQLpt-0].bytes} + } + case 1801: + //line sql_yacc.yy:4059 + { + MySQLVAL.table = &SimpleTable{Name: MySQLS[MySQLpt-1].bytes, Column: MySQLS[MySQLpt-0].bytes} + } + case 1802: + //line sql_yacc.yy:4060 + { + MySQLVAL.table = &SimpleTable{Qualifier: MySQLS[MySQLpt-3].bytes, Name: MySQLS[MySQLpt-1].bytes, Column: MySQLS[MySQLpt-0].bytes} + } + case 1803: + //line sql_yacc.yy:4064 + { + MySQLVAL.table = &SimpleTable{Name: MySQLS[MySQLpt-0].bytes} + } + case 1804: + //line sql_yacc.yy:4067 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1805: + //line sql_yacc.yy:4068 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1807: + //line sql_yacc.yy:4074 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1808: + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + case 1810: + //line sql_yacc.yy:4083 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1811: + //line sql_yacc.yy:4084 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1814: + //line sql_yacc.yy:4091 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1815: + //line sql_yacc.yy:4092 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1816: + //line sql_yacc.yy:4093 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1820: + //line sql_yacc.yy:4101 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1821: + //line sql_yacc.yy:4102 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1822: + //line sql_yacc.yy:4103 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1823: + //line sql_yacc.yy:4104 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1824: + //line sql_yacc.yy:4105 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1825: + //line sql_yacc.yy:4106 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1826: + //line sql_yacc.yy:4107 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1827: + //line sql_yacc.yy:4108 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1828: + //line sql_yacc.yy:4109 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1829: + //line sql_yacc.yy:4110 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1830: + //line sql_yacc.yy:4111 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1831: + //line sql_yacc.yy:4112 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1832: + //line sql_yacc.yy:4113 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1833: + //line sql_yacc.yy:4114 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1834: + //line sql_yacc.yy:4115 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1835: + //line sql_yacc.yy:4116 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1836: + //line sql_yacc.yy:4117 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1837: + //line sql_yacc.yy:4118 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1838: + //line sql_yacc.yy:4119 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1839: + //line sql_yacc.yy:4120 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1840: + //line sql_yacc.yy:4121 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1841: + //line sql_yacc.yy:4122 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1842: + //line sql_yacc.yy:4123 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1843: + //line sql_yacc.yy:4124 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1844: + //line sql_yacc.yy:4125 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1845: + //line sql_yacc.yy:4126 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1846: + //line sql_yacc.yy:4127 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1847: + //line sql_yacc.yy:4128 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1848: + //line sql_yacc.yy:4129 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1849: + //line sql_yacc.yy:4130 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1850: + //line sql_yacc.yy:4131 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1851: + //line sql_yacc.yy:4132 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1852: + //line sql_yacc.yy:4133 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1853: + //line sql_yacc.yy:4134 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1854: + //line sql_yacc.yy:4135 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1855: + //line sql_yacc.yy:4136 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1856: + //line sql_yacc.yy:4137 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1857: + //line sql_yacc.yy:4138 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1858: + //line sql_yacc.yy:4139 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1859: + //line sql_yacc.yy:4140 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1860: + //line sql_yacc.yy:4141 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1861: + //line sql_yacc.yy:4142 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1862: + //line sql_yacc.yy:4143 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1863: + //line sql_yacc.yy:4144 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1864: + //line sql_yacc.yy:4145 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1865: + //line sql_yacc.yy:4146 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1866: + //line sql_yacc.yy:4147 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1867: + //line sql_yacc.yy:4148 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1868: + //line sql_yacc.yy:4149 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1869: + //line sql_yacc.yy:4150 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1870: + //line sql_yacc.yy:4154 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1871: + //line sql_yacc.yy:4155 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1872: + //line sql_yacc.yy:4156 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1873: + //line sql_yacc.yy:4157 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1874: + //line sql_yacc.yy:4158 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1875: + //line sql_yacc.yy:4159 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1876: + //line sql_yacc.yy:4160 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1877: + //line sql_yacc.yy:4161 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1878: + //line sql_yacc.yy:4162 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1879: + //line sql_yacc.yy:4163 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1880: + //line sql_yacc.yy:4164 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1881: + //line sql_yacc.yy:4165 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1882: + //line sql_yacc.yy:4166 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1883: + //line sql_yacc.yy:4167 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1884: + //line sql_yacc.yy:4168 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1885: + //line sql_yacc.yy:4169 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1886: + //line sql_yacc.yy:4170 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1887: + //line sql_yacc.yy:4171 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1888: + //line sql_yacc.yy:4172 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1889: + //line sql_yacc.yy:4173 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1890: + //line sql_yacc.yy:4174 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1891: + //line sql_yacc.yy:4175 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1892: + //line sql_yacc.yy:4176 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1893: + //line sql_yacc.yy:4177 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1894: + //line sql_yacc.yy:4178 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1895: + //line sql_yacc.yy:4179 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1896: + //line sql_yacc.yy:4180 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1897: + //line sql_yacc.yy:4181 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1898: + //line sql_yacc.yy:4182 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1899: + //line sql_yacc.yy:4183 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1900: + //line sql_yacc.yy:4184 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1901: + //line sql_yacc.yy:4185 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1902: + //line sql_yacc.yy:4186 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1903: + //line sql_yacc.yy:4187 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1904: + //line sql_yacc.yy:4188 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1905: + //line sql_yacc.yy:4189 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1906: + //line sql_yacc.yy:4190 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1907: + //line sql_yacc.yy:4191 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1908: + //line sql_yacc.yy:4192 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1909: + //line sql_yacc.yy:4193 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1910: + //line sql_yacc.yy:4194 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1911: + //line sql_yacc.yy:4195 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1912: + //line sql_yacc.yy:4196 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1913: + //line sql_yacc.yy:4197 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1914: + //line sql_yacc.yy:4198 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1915: + //line sql_yacc.yy:4199 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1916: + //line sql_yacc.yy:4200 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1917: + //line sql_yacc.yy:4201 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1918: + //line sql_yacc.yy:4202 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1919: + //line sql_yacc.yy:4203 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1920: + //line sql_yacc.yy:4204 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1921: + //line sql_yacc.yy:4205 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1922: + //line sql_yacc.yy:4206 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1923: + //line sql_yacc.yy:4207 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1924: + //line sql_yacc.yy:4208 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1925: + //line sql_yacc.yy:4209 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1926: + //line sql_yacc.yy:4210 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1927: + //line sql_yacc.yy:4211 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1928: + //line sql_yacc.yy:4212 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1929: + //line sql_yacc.yy:4213 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1930: + //line sql_yacc.yy:4214 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1931: + //line sql_yacc.yy:4215 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1932: + //line sql_yacc.yy:4216 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1933: + //line sql_yacc.yy:4217 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1934: + //line sql_yacc.yy:4218 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1935: + //line sql_yacc.yy:4219 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1936: + //line sql_yacc.yy:4220 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1937: + //line sql_yacc.yy:4221 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1938: + //line sql_yacc.yy:4222 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1939: + //line sql_yacc.yy:4223 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1940: + //line sql_yacc.yy:4224 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1941: + //line sql_yacc.yy:4225 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1942: + //line sql_yacc.yy:4226 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1943: + //line sql_yacc.yy:4227 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1944: + //line sql_yacc.yy:4228 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1945: + //line sql_yacc.yy:4229 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1946: + //line sql_yacc.yy:4230 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1947: + //line sql_yacc.yy:4231 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1948: + //line sql_yacc.yy:4232 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1949: + //line sql_yacc.yy:4233 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1950: + //line sql_yacc.yy:4234 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1951: + //line sql_yacc.yy:4235 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1952: + //line sql_yacc.yy:4236 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1953: + //line sql_yacc.yy:4237 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1954: + //line sql_yacc.yy:4238 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1955: + //line sql_yacc.yy:4239 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1956: + //line sql_yacc.yy:4240 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1957: + //line sql_yacc.yy:4241 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1958: + //line sql_yacc.yy:4242 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1959: + //line sql_yacc.yy:4243 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1960: + //line sql_yacc.yy:4244 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1961: + //line sql_yacc.yy:4245 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1962: + //line sql_yacc.yy:4246 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1963: + //line sql_yacc.yy:4247 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1964: + //line sql_yacc.yy:4248 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1965: + //line sql_yacc.yy:4249 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1966: + //line sql_yacc.yy:4250 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1967: + //line sql_yacc.yy:4251 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1968: + //line sql_yacc.yy:4252 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1969: + //line sql_yacc.yy:4253 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1970: + //line sql_yacc.yy:4254 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1971: + //line sql_yacc.yy:4255 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1972: + //line sql_yacc.yy:4256 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1973: + //line sql_yacc.yy:4257 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1974: + //line sql_yacc.yy:4258 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1975: + //line sql_yacc.yy:4259 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1976: + //line sql_yacc.yy:4260 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1977: + //line sql_yacc.yy:4261 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1978: + //line sql_yacc.yy:4262 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1979: + //line sql_yacc.yy:4263 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1980: + //line sql_yacc.yy:4264 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1981: + //line sql_yacc.yy:4265 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1982: + //line sql_yacc.yy:4266 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1983: + //line sql_yacc.yy:4267 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1984: + //line sql_yacc.yy:4268 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1985: + //line sql_yacc.yy:4269 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1986: + //line sql_yacc.yy:4270 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1987: + //line sql_yacc.yy:4271 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1988: + //line sql_yacc.yy:4272 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1989: + //line sql_yacc.yy:4273 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1990: + //line sql_yacc.yy:4274 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1991: + //line sql_yacc.yy:4275 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1992: + //line sql_yacc.yy:4276 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1993: + //line sql_yacc.yy:4277 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1994: + //line sql_yacc.yy:4278 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1995: + //line sql_yacc.yy:4279 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1996: + //line sql_yacc.yy:4280 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1997: + //line sql_yacc.yy:4281 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1998: + //line sql_yacc.yy:4282 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 1999: + //line sql_yacc.yy:4283 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2000: + //line sql_yacc.yy:4284 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2001: + //line sql_yacc.yy:4285 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2002: + //line sql_yacc.yy:4286 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2003: + //line sql_yacc.yy:4287 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2004: + //line sql_yacc.yy:4288 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2005: + //line sql_yacc.yy:4289 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2006: + //line sql_yacc.yy:4290 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2007: + //line sql_yacc.yy:4291 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2008: + //line sql_yacc.yy:4292 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2009: + //line sql_yacc.yy:4293 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2010: + //line sql_yacc.yy:4294 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2011: + //line sql_yacc.yy:4295 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2012: + //line sql_yacc.yy:4296 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2013: + //line sql_yacc.yy:4297 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2014: + //line sql_yacc.yy:4298 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2015: + //line sql_yacc.yy:4299 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2016: + //line sql_yacc.yy:4300 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2017: + //line sql_yacc.yy:4301 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2018: + //line sql_yacc.yy:4302 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2019: + //line sql_yacc.yy:4303 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2020: + //line sql_yacc.yy:4304 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2021: + //line sql_yacc.yy:4305 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2022: + //line sql_yacc.yy:4306 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2023: + //line sql_yacc.yy:4307 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2024: + //line sql_yacc.yy:4308 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2025: + //line sql_yacc.yy:4309 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2026: + //line sql_yacc.yy:4310 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2027: + //line sql_yacc.yy:4311 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2028: + //line sql_yacc.yy:4312 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2029: + //line sql_yacc.yy:4313 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2030: + //line sql_yacc.yy:4314 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2031: + //line sql_yacc.yy:4315 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2032: + //line sql_yacc.yy:4316 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2033: + //line sql_yacc.yy:4317 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2034: + //line sql_yacc.yy:4318 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2035: + //line sql_yacc.yy:4319 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2036: + //line sql_yacc.yy:4320 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2037: + //line sql_yacc.yy:4321 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2038: + //line sql_yacc.yy:4322 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2039: + //line sql_yacc.yy:4323 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2040: + //line sql_yacc.yy:4324 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2041: + //line sql_yacc.yy:4325 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2042: + //line sql_yacc.yy:4326 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2043: + //line sql_yacc.yy:4327 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2044: + //line sql_yacc.yy:4328 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2045: + //line sql_yacc.yy:4329 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2046: + //line sql_yacc.yy:4330 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2047: + //line sql_yacc.yy:4331 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2048: + //line sql_yacc.yy:4332 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2049: + //line sql_yacc.yy:4333 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2050: + //line sql_yacc.yy:4334 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2051: + //line sql_yacc.yy:4335 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2052: + //line sql_yacc.yy:4336 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2053: + //line sql_yacc.yy:4337 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2054: + //line sql_yacc.yy:4338 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2055: + //line sql_yacc.yy:4339 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2056: + //line sql_yacc.yy:4340 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2057: + //line sql_yacc.yy:4341 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2058: + //line sql_yacc.yy:4342 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2059: + //line sql_yacc.yy:4343 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2060: + //line sql_yacc.yy:4344 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2061: + //line sql_yacc.yy:4345 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2062: + //line sql_yacc.yy:4346 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2063: + //line sql_yacc.yy:4347 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2064: + //line sql_yacc.yy:4348 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2065: + //line sql_yacc.yy:4349 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2066: + //line sql_yacc.yy:4350 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2067: + //line sql_yacc.yy:4351 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2068: + //line sql_yacc.yy:4352 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2069: + //line sql_yacc.yy:4353 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2070: + //line sql_yacc.yy:4354 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2071: + //line sql_yacc.yy:4355 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2072: + //line sql_yacc.yy:4356 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2073: + //line sql_yacc.yy:4357 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2074: + //line sql_yacc.yy:4358 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2075: + //line sql_yacc.yy:4359 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2076: + //line sql_yacc.yy:4360 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2077: + //line sql_yacc.yy:4361 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2078: + //line sql_yacc.yy:4362 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2079: + //line sql_yacc.yy:4363 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2080: + //line sql_yacc.yy:4364 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2081: + //line sql_yacc.yy:4365 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2082: + //line sql_yacc.yy:4366 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2083: + //line sql_yacc.yy:4367 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2084: + //line sql_yacc.yy:4368 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2085: + //line sql_yacc.yy:4369 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2086: + //line sql_yacc.yy:4370 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2087: + //line sql_yacc.yy:4371 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2088: + //line sql_yacc.yy:4372 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2089: + //line sql_yacc.yy:4373 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2090: + //line sql_yacc.yy:4374 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2091: + //line sql_yacc.yy:4375 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2092: + //line sql_yacc.yy:4376 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2093: + //line sql_yacc.yy:4377 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2094: + //line sql_yacc.yy:4378 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2095: + //line sql_yacc.yy:4379 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2096: + //line sql_yacc.yy:4380 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2097: + //line sql_yacc.yy:4381 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2098: + //line sql_yacc.yy:4382 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2099: + //line sql_yacc.yy:4383 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2100: + //line sql_yacc.yy:4384 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2101: + //line sql_yacc.yy:4385 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2102: + //line sql_yacc.yy:4386 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2103: + //line sql_yacc.yy:4387 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2104: + //line sql_yacc.yy:4388 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2105: + //line sql_yacc.yy:4389 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2106: + //line sql_yacc.yy:4390 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2107: + //line sql_yacc.yy:4391 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2108: + //line sql_yacc.yy:4392 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2109: + //line sql_yacc.yy:4393 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2110: + //line sql_yacc.yy:4394 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2111: + //line sql_yacc.yy:4395 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2112: + //line sql_yacc.yy:4396 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2113: + //line sql_yacc.yy:4397 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2114: + //line sql_yacc.yy:4398 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2115: + //line sql_yacc.yy:4399 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2116: + //line sql_yacc.yy:4400 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2117: + //line sql_yacc.yy:4401 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2118: + //line sql_yacc.yy:4402 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2119: + //line sql_yacc.yy:4403 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2120: + //line sql_yacc.yy:4404 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2121: + //line sql_yacc.yy:4405 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2122: + //line sql_yacc.yy:4406 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2123: + //line sql_yacc.yy:4407 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2124: + //line sql_yacc.yy:4408 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2125: + //line sql_yacc.yy:4409 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2126: + //line sql_yacc.yy:4410 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2127: + //line sql_yacc.yy:4411 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2128: + //line sql_yacc.yy:4412 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2129: + //line sql_yacc.yy:4413 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2130: + //line sql_yacc.yy:4414 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2131: + //line sql_yacc.yy:4415 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2132: + //line sql_yacc.yy:4416 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2133: + //line sql_yacc.yy:4417 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2134: + //line sql_yacc.yy:4418 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2135: + //line sql_yacc.yy:4419 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2136: + //line sql_yacc.yy:4420 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2137: + //line sql_yacc.yy:4421 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2138: + //line sql_yacc.yy:4422 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2139: + //line sql_yacc.yy:4423 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2140: + //line sql_yacc.yy:4424 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2141: + //line sql_yacc.yy:4425 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2142: + //line sql_yacc.yy:4426 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2143: + //line sql_yacc.yy:4427 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2144: + //line sql_yacc.yy:4428 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2145: + //line sql_yacc.yy:4429 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2146: + //line sql_yacc.yy:4430 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2147: + //line sql_yacc.yy:4431 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2148: + //line sql_yacc.yy:4432 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2149: + //line sql_yacc.yy:4433 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2150: + //line sql_yacc.yy:4434 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2151: + //line sql_yacc.yy:4435 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2152: + //line sql_yacc.yy:4436 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2153: + //line sql_yacc.yy:4437 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2154: + //line sql_yacc.yy:4438 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2155: + //line sql_yacc.yy:4439 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2156: + //line sql_yacc.yy:4440 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2157: + //line sql_yacc.yy:4441 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2158: + //line sql_yacc.yy:4442 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2159: + //line sql_yacc.yy:4443 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2160: + //line sql_yacc.yy:4444 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2161: + //line sql_yacc.yy:4445 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2162: + //line sql_yacc.yy:4446 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2163: + //line sql_yacc.yy:4447 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2164: + //line sql_yacc.yy:4448 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2165: + //line sql_yacc.yy:4449 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2166: + //line sql_yacc.yy:4450 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2167: + //line sql_yacc.yy:4451 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2168: + //line sql_yacc.yy:4452 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2169: + //line sql_yacc.yy:4453 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2170: + //line sql_yacc.yy:4454 + { + MySQLVAL.bytes = MySQLS[MySQLpt-0].bytes + } + case 2171: + //line sql_yacc.yy:4458 + { + MySQLVAL.statement = MySQLS[MySQLpt-0].statement + } + case 2172: + //line sql_yacc.yy:4462 + { + if MySQLS[MySQLpt-0].vars == nil { + MySQLVAL.statement = &Set{VarList: Vars{MySQLS[MySQLpt-1].variable}} + } else { + MySQLVAL.statement = &Set{VarList: append(MySQLS[MySQLpt-0].vars, MySQLS[MySQLpt-1].variable)} + } + } + case 2173: + //line sql_yacc.yy:4469 + { + MySQLVAL.statement = &SetTrans{} + } + case 2174: + //line sql_yacc.yy:4471 + { + if st, ok := MySQLS[MySQLpt-0].interf.(*SetTrans); ok { + MySQLVAL.statement = st + } else { + tmp := MySQLS[MySQLpt-0].interf.(Vars) + for _, v := range tmp { + v.Life = MySQLS[MySQLpt-1].life_type + } + + MySQLVAL.statement = &Set{VarList: tmp} + } + } + case 2175: + //line sql_yacc.yy:4486 + { + tmp := Vars{MySQLS[MySQLpt-1].variable} + if MySQLS[MySQLpt-0].vars != nil { + MySQLVAL.interf = append(tmp, MySQLS[MySQLpt-0].vars...) + } else { + MySQLVAL.interf = tmp + } + } + case 2176: + //line sql_yacc.yy:4494 + { + MySQLVAL.interf = &SetTrans{} + } + case 2177: + //line sql_yacc.yy:4497 + { + MySQLVAL.vars = nil + } + case 2178: + //line sql_yacc.yy:4498 + { + MySQLVAL.vars = MySQLS[MySQLpt-0].vars + } + case 2179: + //line sql_yacc.yy:4501 + { + MySQLVAL.vars = Vars{MySQLS[MySQLpt-0].variable} + } + case 2180: + //line sql_yacc.yy:4502 + { + MySQLVAL.vars = append(MySQLS[MySQLpt-2].vars, MySQLS[MySQLpt-0].variable) + } + case 2181: + //line sql_yacc.yy:4506 + { + MySQLS[MySQLpt-0].variable.Life = MySQLS[MySQLpt-1].life_type + MySQLVAL.variable = MySQLS[MySQLpt-0].variable + } + case 2182: + //line sql_yacc.yy:4510 + { + MySQLVAL.variable = MySQLS[MySQLpt-0].variable + } + case 2183: + //line sql_yacc.yy:4513 + { + MySQLVAL.life_type = Life_Global + } + case 2184: + //line sql_yacc.yy:4514 + { + MySQLVAL.life_type = Life_Local + } + case 2185: + //line sql_yacc.yy:4515 + { + MySQLVAL.life_type = Life_Session + } + case 2190: + //line sql_yacc.yy:4524 + { + MySQLVAL.life_type = Life_Unknown + } + case 2191: + //line sql_yacc.yy:4525 + { + MySQLVAL.life_type = Life_Global + } + case 2192: + //line sql_yacc.yy:4526 + { + MySQLVAL.life_type = Life_Local + } + case 2193: + //line sql_yacc.yy:4527 + { + MySQLVAL.life_type = Life_Session + } + case 2194: + //line sql_yacc.yy:4531 + { + MySQLVAL.variable = &Variable{Type: Type_Usr, Name: MySQLS[MySQLpt-2].str, Value: MySQLS[MySQLpt-0].expr} + } + case 2195: + //line sql_yacc.yy:4535 + { + MySQLVAL.variable = &Variable{Type: Type_Usr, Name: MySQLS[MySQLpt-2].str, Value: MySQLS[MySQLpt-0].expr} + } + case 2196: + //line sql_yacc.yy:4537 + { + MySQLVAL.variable = &Variable{Type: Type_Usr, Name: string(MySQLS[MySQLpt-2].bytes), Value: MySQLS[MySQLpt-0].expr} + } + case 2197: + //line sql_yacc.yy:4539 + { + MySQLVAL.variable = &Variable{Type: Type_Sys, Life: MySQLS[MySQLpt-3].life_type, Name: MySQLS[MySQLpt-2].str, Value: MySQLS[MySQLpt-0].expr} + } + case 2198: + //line sql_yacc.yy:4541 + { + MySQLVAL.variable = &Variable{Type: Type_Sys, Name: "CHARACTER SET", Value: StrVal(MySQLS[MySQLpt-0].bytes)} + } + case 2199: + //line sql_yacc.yy:4543 + { + MySQLVAL.variable = &Variable{Type: Type_Sys, Name: "NAMES", Value: MySQLS[MySQLpt-0].expr} + } + case 2200: + //line sql_yacc.yy:4545 + { + MySQLVAL.variable = &Variable{Type: Type_Sys, Name: "NAMES", Value: StrVal(MySQLS[MySQLpt-1].bytes)} + } + case 2201: + //line sql_yacc.yy:4547 + { + MySQLVAL.variable = &Variable{Type: Type_Sys, Name: "PASSWORD"} + } + case 2202: + //line sql_yacc.yy:4549 + { + MySQLVAL.variable = &Variable{Type: Type_Sys, Name: "PASSWORD"} + } + case 2203: + //line sql_yacc.yy:4553 + { + MySQLVAL.str = string(MySQLS[MySQLpt-0].bytes) + } + case 2204: + //line sql_yacc.yy:4554 + { + MySQLVAL.str = string(MySQLS[MySQLpt-2].bytes) + "." + string(MySQLS[MySQLpt-0].bytes) + } + case 2205: + //line sql_yacc.yy:4555 + { + MySQLVAL.str = "DEFAULT." + string(MySQLS[MySQLpt-0].bytes) + } + case 2221: + //line sql_yacc.yy:4585 + { + MySQLVAL.expr = MySQLS[MySQLpt-0].expr + } + case 2222: + //line sql_yacc.yy:4586 + { + MySQLVAL.expr = StrVal(MySQLS[MySQLpt-0].bytes) + } + case 2223: + //line sql_yacc.yy:4587 + { + MySQLVAL.expr = StrVal(MySQLS[MySQLpt-0].bytes) + } + case 2224: + //line sql_yacc.yy:4588 + { + MySQLVAL.expr = StrVal(MySQLS[MySQLpt-0].bytes) + } + case 2225: + //line sql_yacc.yy:4589 + { + MySQLVAL.expr = StrVal(MySQLS[MySQLpt-0].bytes) + } + case 2226: + //line sql_yacc.yy:4593 + { + MySQLVAL.statement = &Lock{Tables: MySQLS[MySQLpt-0].table_list} + } + case 2229: + //line sql_yacc.yy:4600 + { + MySQLVAL.table_list = ISimpleTables{MySQLS[MySQLpt-0].table} + } + case 2230: + //line sql_yacc.yy:4601 + { + MySQLVAL.table_list = append(MySQLS[MySQLpt-2].table_list, MySQLS[MySQLpt-0].table) + } + case 2231: + //line sql_yacc.yy:4604 + { + MySQLVAL.table = MySQLS[MySQLpt-2].table + } + case 2236: + //line sql_yacc.yy:4613 + { + MySQLVAL.statement = &Unlock{} + } + case 2237: + //line sql_yacc.yy:4616 + { + MySQLVAL.statement = &Handler{} + } + case 2238: + //line sql_yacc.yy:4617 + { + MySQLVAL.statement = &Handler{} + } + case 2239: + //line sql_yacc.yy:4618 + { + MySQLVAL.statement = &Handler{} + } + case 2254: + //line sql_yacc.yy:4645 + { + MySQLVAL.statement = &Revoke{} + } + case 2260: + //line sql_yacc.yy:4655 + { + MySQLVAL.statement = &Grant{} + } + case 2355: + //line sql_yacc.yy:4804 + { + MySQLVAL.statement = &Commit{} + } + case 2356: + //line sql_yacc.yy:4807 + { + MySQLVAL.statement = &Rollback{} + } + case 2357: + //line sql_yacc.yy:4808 + { + MySQLVAL.statement = &Rollback{Point: MySQLS[MySQLpt-0].bytes} + } + case 2358: + //line sql_yacc.yy:4812 + { + MySQLVAL.statement = &SavePoint{Point: MySQLS[MySQLpt-0].bytes} + } + case 2359: + //line sql_yacc.yy:4816 + { + MySQLVAL.statement = &Release{Point: MySQLS[MySQLpt-0].bytes} + } + case 2360: + //line sql_yacc.yy:4819 + { + MySQLVAL.select_statement = nil + } + case 2361: + //line sql_yacc.yy:4820 + { + MySQLVAL.select_statement = MySQLS[MySQLpt-0].select_statement + } + case 2362: + //line sql_yacc.yy:4823 + { + MySQLVAL.select_statement = MySQLS[MySQLpt-0].select_statement + } + case 2363: + //line sql_yacc.yy:4827 + { + MySQLVAL.select_statement = nil + } + case 2364: + //line sql_yacc.yy:4828 + { + MySQLVAL.select_statement = MySQLS[MySQLpt-0].select_statement + } + case 2365: + //line sql_yacc.yy:4829 + { + MySQLVAL.select_statement = nil + } + case 2374: + //line sql_yacc.yy:4848 + { + MySQLVAL.select_statement = &SubQuery{SelectStatement: MySQLS[MySQLpt-0].select_statement} + } + case 2375: + //line sql_yacc.yy:4849 + { + MySQLVAL.select_statement = &SubQuery{SelectStatement: MySQLS[MySQLpt-1].select_statement} + } + case 2376: + //line sql_yacc.yy:4853 + { + MySQLVAL.select_statement = MySQLS[MySQLpt-1].select_statement + } + case 2377: + //line sql_yacc.yy:4854 + { + MySQLVAL.select_statement = &Union{Left: MySQLS[MySQLpt-4].select_statement, Right: MySQLS[MySQLpt-1].select_statement} + } + case 2378: + //line sql_yacc.yy:4857 + { + MySQLVAL.subquery = &SubQuery{SelectStatement: MySQLS[MySQLpt-1].select_statement} + } + case 2393: + //line sql_yacc.yy:4884 + { + MySQLVAL.interf = MySQLS[MySQLpt-0].interf + } + case 2394: + //line sql_yacc.yy:4885 + { + MySQLVAL.interf = MySQLS[MySQLpt-0].interf + } + case 2395: + //line sql_yacc.yy:4886 + { + MySQLVAL.interf = MySQLS[MySQLpt-0].view_tail + } + case 2396: + //line sql_yacc.yy:4889 + { + MySQLVAL.interf = MySQLS[MySQLpt-0].view_tail + } + case 2397: + //line sql_yacc.yy:4890 + { + MySQLVAL.interf = MySQLS[MySQLpt-0].trigger_tail + } + case 2398: + //line sql_yacc.yy:4891 + { + MySQLVAL.interf = MySQLS[MySQLpt-0].sp_tail + } + case 2399: + //line sql_yacc.yy:4892 + { + MySQLVAL.interf = MySQLS[MySQLpt-0].sf_tail + } + case 2400: + //line sql_yacc.yy:4893 + { + MySQLVAL.interf = MySQLS[MySQLpt-0].event_tail + } + case 2401: + //line sql_yacc.yy:4897 + { + MySQLVAL.interf = MySQLS[MySQLpt-0].view_tail + } + case 2402: + //line sql_yacc.yy:4898 + { + MySQLVAL.interf = MySQLS[MySQLpt-0].trigger_tail + } + case 2403: + //line sql_yacc.yy:4899 + { + MySQLVAL.interf = MySQLS[MySQLpt-0].sp_tail + } + case 2404: + //line sql_yacc.yy:4900 + { + MySQLVAL.interf = MySQLS[MySQLpt-0].sf_tail + } + case 2405: + //line sql_yacc.yy:4901 + { + MySQLVAL.interf = MySQLS[MySQLpt-0].udf_tail + } + case 2406: + //line sql_yacc.yy:4902 + { + MySQLVAL.interf = MySQLS[MySQLpt-0].event_tail + } + case 2421: + //line sql_yacc.yy:4935 + { + MySQLVAL.view_tail = &viewTail{View: MySQLS[MySQLpt-3].table, As: MySQLS[MySQLpt-0].select_statement} + } + case 2426: + //line sql_yacc.yy:4947 + { + MySQLVAL.select_statement = MySQLS[MySQLpt-1].select_statement + } + case 2427: + //line sql_yacc.yy:4951 + { + if MySQLS[MySQLpt-0].select_statement == nil { + MySQLVAL.select_statement = MySQLS[MySQLpt-1].select_statement + } else { + MySQLVAL.select_statement = &Union{Left: MySQLS[MySQLpt-1].select_statement, Right: MySQLS[MySQLpt-0].select_statement} + } + } + case 2428: + //line sql_yacc.yy:4959 + { + if MySQLS[MySQLpt-0].select_statement == nil { + MySQLVAL.select_statement = &ParenSelect{Select: MySQLS[MySQLpt-2].select_statement} + } else { + MySQLVAL.select_statement = &Union{Left: &ParenSelect{Select: MySQLS[MySQLpt-2].select_statement}, Right: MySQLS[MySQLpt-0].select_statement} + } + } + case 2429: + //line sql_yacc.yy:4969 + { + MySQLVAL.select_statement = MySQLS[MySQLpt-0].select_statement + } + case 2430: + //line sql_yacc.yy:4970 + { + MySQLVAL.select_statement = &ParenSelect{Select: MySQLS[MySQLpt-1].select_statement} + } + case 2431: + //line sql_yacc.yy:4974 + { + MySQLVAL.select_statement = MySQLS[MySQLpt-0].select_statement + } + case 2436: + //line sql_yacc.yy:4984 + { + MySQLVAL.trigger_tail = &triggerTail{Trigger: MySQLS[MySQLpt-10].spname} + } + case 2437: + //line sql_yacc.yy:4989 + { + MySQLVAL.udf_tail = &udfTail{} + } + case 2438: + //line sql_yacc.yy:4991 + { + MySQLVAL.udf_tail = &udfTail{} + } + case 2439: + //line sql_yacc.yy:4996 + { + MySQLVAL.sf_tail = &sfTail{Function: MySQLS[MySQLpt-7].spname} + } + case 2440: + //line sql_yacc.yy:5001 + { + MySQLVAL.sp_tail = &spTail{Procedure: MySQLS[MySQLpt-5].spname} + } + case 2441: + //line sql_yacc.yy:5005 + { + MySQLVAL.statement = &XA{} + } + case 2442: + //line sql_yacc.yy:5006 + { + MySQLVAL.statement = &XA{} + } + case 2443: + //line sql_yacc.yy:5007 + { + MySQLVAL.statement = &XA{} + } + case 2444: + //line sql_yacc.yy:5008 + { + MySQLVAL.statement = &XA{} + } + case 2445: + //line sql_yacc.yy:5009 + { + MySQLVAL.statement = &XA{} + } + case 2446: + //line sql_yacc.yy:5010 + { + MySQLVAL.statement = &XA{} + } + case 2461: + //line sql_yacc.yy:5040 + { + MySQLVAL.statement = &Install{} + } + case 2462: + //line sql_yacc.yy:5044 + { + MySQLVAL.statement = &Uninstall{} + } + } + goto MySQLstack /* stack new state and value */ +} From 8d055a29bca3d207f2cb0a0672badef0c5b7d493 Mon Sep 17 00:00:00 2001 From: huanglong Date: Wed, 23 Sep 2015 18:27:21 +0800 Subject: [PATCH 6/7] add the fingerprint and reqlimit for go-mysql-proxy Change-Id: I49976bda0283e30e3e3f842cbce80435f5b92dfe --- cmd/proxy/proxy.go | 3 +++ proxy/conn_query.go | 48 +++++++++++++++++++++++++++++++++++++++++++++ proxy/schema.go | 1 + proxy/server.go | 16 +++++++++++++++ 4 files changed, 68 insertions(+) diff --git a/cmd/proxy/proxy.go b/cmd/proxy/proxy.go index d947b45..0700c4d 100644 --- a/cmd/proxy/proxy.go +++ b/cmd/proxy/proxy.go @@ -2,6 +2,7 @@ package main import ( "flag" + "fmt" "github.com/wangjild/go-mysql-proxy/config" . "github.com/wangjild/go-mysql-proxy/log" "github.com/wangjild/go-mysql-proxy/proxy" @@ -33,6 +34,8 @@ func main() { return } + fmt.Println("the config : ", cfg) + //Init(&Config{FilePath: *logFile, LogLevel: *logLevel}, // &Config{FilePath: *logFile, LogLevel: *logLevel}) diff --git a/proxy/conn_query.go b/proxy/conn_query.go index 9efa28b..ed7cd06 100644 --- a/proxy/conn_query.go +++ b/proxy/conn_query.go @@ -2,12 +2,20 @@ package proxy import ( "fmt" + "time" + + "github.com/melong007/go-mysql/query" "github.com/wangjild/go-mysql-proxy/client" "github.com/wangjild/go-mysql-proxy/hack" . "github.com/wangjild/go-mysql-proxy/mysql" "github.com/wangjild/go-mysql-proxy/sql" ) +//we just go the microsecond timestamp +func getTimestamp() int64 { + return time.Now().UnixNano() / int64(time.Millisecond) +} + func (c *Conn) handleQuery(sqlstmt string) (err error) { /*defer func() { if e := recover(); e != nil { @@ -17,6 +25,46 @@ func (c *Conn) handleQuery(sqlstmt string) (err error) { }()*/ var stmt sql.IStatement + var excess int64 + + fp := query.Fingerprint(sqlstmt) + now := getTimestamp() + + c.server.mu.Lock() + if lr, ok := c.server.fingerprints[fp]; ok { + //how many microsecond elapsed since last query + ms := now - lr.last + //Default, we have 1 r/s + excess = lr.excess - c.server.cfg.ReqRate*(ms/1000) + 1000 + + //If we need caculate every second speed, + //Shouldn't reset to zero; + if excess < 0 { + excess = 0 + } + + //the race out the max Burst? + if excess > c.server.cfg.ReqBurst { + //Just close the client or + return fmt.Errorf(`the query excess(%d) over the reqBurst(%d), sql: %s "`, excess, c.server.cfg.ReqBurst, sqlstmt) + + //TODO: more gracefully add a Timer and retry? + } + lr.excess = excess + lr.last = now + lr.count++ + + } else { + lr := &LimitReqNode{} + lr.excess = 0 + lr.last = getTimestamp() + lr.query = fp + + lr.count = 1 + c.server.fingerprints[fp] = lr + } + c.server.mu.Unlock() + stmt, err = sql.Parse(sqlstmt) if err != nil { return fmt.Errorf(`parse sql "%s" error "%s"`, sqlstmt, err.Error()) diff --git a/proxy/schema.go b/proxy/schema.go index 8e76528..338412f 100644 --- a/proxy/schema.go +++ b/proxy/schema.go @@ -14,6 +14,7 @@ type Schema struct { func (s *Server) parseSchemas() error { s.schemas = make(map[string]*Schema) + fmt.Println("the schemaCfg: ", s.cfg) for _, schemaCfg := range s.cfg.Schemas { if _, ok := s.schemas[schemaCfg.DB]; ok { return fmt.Errorf("duplicate schema [%s].", schemaCfg.DB) diff --git a/proxy/server.go b/proxy/server.go index 33c8816..28adf31 100644 --- a/proxy/server.go +++ b/proxy/server.go @@ -4,9 +4,18 @@ import ( "github.com/wangjild/go-mysql-proxy/config" . "github.com/wangjild/go-mysql-proxy/log" "net" + "sync" // "runtime" ) +type LimitReqNode struct { + excess int64 + last int64 + query string + count int64 + lastSecond int64 //Last second to refresh the excess? +} + type Server struct { cfg *config.Config @@ -22,6 +31,10 @@ type Server struct { schemas map[string]*Schema + fingerprints map[string]*LimitReqNode + + mu *sync.Mutex + users *userAuth } @@ -34,6 +47,9 @@ func NewServer(cfg *config.Config) (*Server, error) { s.user = cfg.User s.password = cfg.Password + s.fingerprints = make(map[string]*LimitReqNode) + s.mu = &sync.Mutex{} + if err := s.parseNodes(); err != nil { return nil, err } From e4e09b620df1092f81b6b70f16dd84b346fbf64b Mon Sep 17 00:00:00 2001 From: huanglong Date: Wed, 14 Oct 2015 12:09:29 +0800 Subject: [PATCH 7/7] fix limitReqRate error Change-Id: I3bb954bbbf9fb17fc45c769d61acc30609185950 --- cmd/proxy/proxy.go | 20 +++++++++++--------- config/config.go | 12 ++++++++++++ log/logger.go | 2 +- log/milog.go | 10 ++++++++++ proxy/conn_query.go | 7 +++++-- proxy/schema.go | 1 - 6 files changed, 39 insertions(+), 13 deletions(-) diff --git a/cmd/proxy/proxy.go b/cmd/proxy/proxy.go index 0700c4d..3ccb215 100644 --- a/cmd/proxy/proxy.go +++ b/cmd/proxy/proxy.go @@ -2,9 +2,8 @@ package main import ( "flag" - "fmt" "github.com/wangjild/go-mysql-proxy/config" - . "github.com/wangjild/go-mysql-proxy/log" + "github.com/wangjild/go-mysql-proxy/log" "github.com/wangjild/go-mysql-proxy/proxy" "net/http" _ "net/http/pprof" @@ -24,25 +23,28 @@ func main() { flag.Parse() if len(*configFile) == 0 { - SysLog.Fatal("must use a config file") + log.SysLog.Fatal("must use a config file") return } cfg, err := config.ParseConfigFile(*configFile) if err != nil { - SysLog.Fatal(err.Error()) + log.SysLog.Fatal(err.Error()) return } - fmt.Println("the config : ", cfg) - - //Init(&Config{FilePath: *logFile, LogLevel: *logLevel}, + //log.Init(&log.Config{FilePath: cfg.LogFile, LogLevel: *logLevel}, // &Config{FilePath: *logFile, LogLevel: *logLevel}) + // ***** Init the log from the config file ****** // + //Default all the SysLog and AppLog are direct to the Same log File; + log.Init(&log.Config{FilePath: *logFile, LogLevel: 0}, + &log.Config{FilePath: *logFile, LogLevel: log.GetLogLevelFromString(cfg.LogLevel)}) + var svr *proxy.Server svr, err = proxy.NewServer(cfg) if err != nil { - SysLog.Fatal(err.Error()) + log.SysLog.Fatal(err.Error()) return } @@ -59,7 +61,7 @@ func main() { go func() { sig := <-sc - SysLog.Notice("Got signal [%d] to exit.", sig) + log.SysLog.Notice("Got signal [%d] to exit.", sig) svr.Close() }() diff --git a/config/config.go b/config/config.go index 4eb1541..53e5c4b 100644 --- a/config/config.go +++ b/config/config.go @@ -34,6 +34,8 @@ type Config struct { User string `yaml:"user"` Password string `yaml:"password"` LogLevel string `yaml:"log_level"` + ReqRate int64 `yaml:"rate"` + ReqBurst int64 `yaml:"burst"` Nodes []NodeConfig `yaml:"nodes"` @@ -45,6 +47,16 @@ func ParseConfigData(data []byte) (*Config, error) { if err := yaml.Unmarshal([]byte(data), &cfg); err != nil { return nil, err } + + if cfg.ReqRate > 0 { + /* integer value, 1 corresponds to 0.001 r/s */ + cfg.ReqRate = cfg.ReqRate * 1000 + } + + if cfg.ReqBurst > 0 { + /* integer value, 1 corresponds to 0.001 r/s */ + cfg.ReqBurst = cfg.ReqBurst * 1000 + } return &cfg, nil } diff --git a/log/logger.go b/log/logger.go index a581a1d..8b2ca77 100644 --- a/log/logger.go +++ b/log/logger.go @@ -89,7 +89,7 @@ type Config struct { func init() { realInit(&Config{FilePath: "/dev/stdout", LogLevel: 0}, - &Config{FilePath: "/dev/stdout", LogLevel: 0}) + &Config{FilePath: "/dev/stdout", LogLevel: 3}) } var once sync.Once diff --git a/log/milog.go b/log/milog.go index adf1ccb..b80023b 100644 --- a/log/milog.go +++ b/log/milog.go @@ -35,6 +35,16 @@ type Logger struct { lock *sync.Mutex } +func GetLogLevelFromString(ls string) (level int) { + for i := range Level { + if Level[i] == strings.ToUpper(ls) { + return i + } + } + //Default return the Min Level + return LevelTrace +} + // NewLogger return a Logger instance, // the params is filename and apptag is optional func NewLogger(filename string, apptag ...string) *Logger { diff --git a/proxy/conn_query.go b/proxy/conn_query.go index ed7cd06..5e4519b 100644 --- a/proxy/conn_query.go +++ b/proxy/conn_query.go @@ -7,6 +7,7 @@ import ( "github.com/melong007/go-mysql/query" "github.com/wangjild/go-mysql-proxy/client" "github.com/wangjild/go-mysql-proxy/hack" + "github.com/wangjild/go-mysql-proxy/log" . "github.com/wangjild/go-mysql-proxy/mysql" "github.com/wangjild/go-mysql-proxy/sql" ) @@ -38,16 +39,18 @@ func (c *Conn) handleQuery(sqlstmt string) (err error) { excess = lr.excess - c.server.cfg.ReqRate*(ms/1000) + 1000 //If we need caculate every second speed, - //Shouldn't reset to zero; + //Should reset to zero; if excess < 0 { excess = 0 } //the race out the max Burst? + log.AppLog.Notice("the Query excess(%d), the reqBurst(%d)", excess, c.server.cfg.ReqBurst) if excess > c.server.cfg.ReqBurst { + + c.server.mu.Unlock() //Just close the client or return fmt.Errorf(`the query excess(%d) over the reqBurst(%d), sql: %s "`, excess, c.server.cfg.ReqBurst, sqlstmt) - //TODO: more gracefully add a Timer and retry? } lr.excess = excess diff --git a/proxy/schema.go b/proxy/schema.go index 338412f..8e76528 100644 --- a/proxy/schema.go +++ b/proxy/schema.go @@ -14,7 +14,6 @@ type Schema struct { func (s *Server) parseSchemas() error { s.schemas = make(map[string]*Schema) - fmt.Println("the schemaCfg: ", s.cfg) for _, schemaCfg := range s.cfg.Schemas { if _, ok := s.schemas[schemaCfg.DB]; ok { return fmt.Errorf("duplicate schema [%s].", schemaCfg.DB)