diff --git a/Makefile b/Makefile index 96607e3c86c..d3473f19784 100644 --- a/Makefile +++ b/Makefile @@ -69,7 +69,7 @@ endif install: build # binaries mkdir -p "$${PREFIX}/bin" - cp "$${VTROOT}/bin/"{mysqlctld,orchestrator,vtctld,vtctlclient,vtgate,vttablet,vtworker,vtbackup} "$${PREFIX}/bin/" + cp "$${VTROOT}/bin/"{mysqlctld,vtorc,vtctld,vtctlclient,vtgate,vttablet,vtworker,vtbackup} "$${PREFIX}/bin/" # install copies the files needed to run test Vitess using vtcombo into the given directory tree. # Usage: make install PREFIX=/path/to/install/root diff --git a/docker/k8s/Dockerfile b/docker/k8s/Dockerfile index 2bcaadd2183..c6d28a79b6c 100644 --- a/docker/k8s/Dockerfile +++ b/docker/k8s/Dockerfile @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -ARG VT_BASE_VER +ARG VT_BASE_VER=latest FROM vitess/base:${VT_BASE_VER} AS base diff --git a/docker/k8s/mysqlctld/Dockerfile b/docker/k8s/mysqlctld/Dockerfile index d70f5335741..ff1ddc1215a 100644 --- a/docker/k8s/mysqlctld/Dockerfile +++ b/docker/k8s/mysqlctld/Dockerfile @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -ARG VT_BASE_VER +ARG VT_BASE_VER=latest FROM vitess/k8s:${VT_BASE_VER} AS k8s diff --git a/docker/k8s/orchestrator/Dockerfile b/docker/k8s/orchestrator/Dockerfile index 45f68536c5d..a56a2295cd8 100644 --- a/docker/k8s/orchestrator/Dockerfile +++ b/docker/k8s/orchestrator/Dockerfile @@ -12,12 +12,11 @@ # See the License for the specific language governing permissions and # limitations under the License. -ARG VT_BASE_VER -ARG ORC_VER - +ARG VT_BASE_VER=latest FROM vitess/k8s:${VT_BASE_VER} AS k8s FROM debian:buster-slim +ARG ORC_VER='3.2.3' RUN apt-get update && \ apt-get upgrade -qq && \ diff --git a/docker/k8s/pmm-client/Dockerfile b/docker/k8s/pmm-client/Dockerfile index 8905bd0b302..4fb986a8b7c 100644 --- a/docker/k8s/pmm-client/Dockerfile +++ b/docker/k8s/pmm-client/Dockerfile @@ -12,12 +12,11 @@ # See the License for the specific language governing permissions and # limitations under the License. -ARG VT_BASE_VER -ARG PMM_CLIENT_VER - +ARG VT_BASE_VER=latest FROM vitess/k8s:${VT_BASE_VER} AS k8s FROM debian:buster-slim +ARG PMM_CLIENT_VER='1.17.4' RUN apt-get update && \ apt-get upgrade -qq && \ diff --git a/docker/k8s/vtbackup/Dockerfile b/docker/k8s/vtbackup/Dockerfile index eb6a26973f7..2768017e247 100644 --- a/docker/k8s/vtbackup/Dockerfile +++ b/docker/k8s/vtbackup/Dockerfile @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -ARG VT_BASE_VER +ARG VT_BASE_VER=latest FROM vitess/k8s:${VT_BASE_VER} AS k8s diff --git a/docker/k8s/vtctl/Dockerfile b/docker/k8s/vtctl/Dockerfile index 6bd336338b2..2d9c717a9c5 100644 --- a/docker/k8s/vtctl/Dockerfile +++ b/docker/k8s/vtctl/Dockerfile @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -ARG VT_BASE_VER +ARG VT_BASE_VER=latest FROM vitess/k8s:${VT_BASE_VER} AS k8s diff --git a/docker/k8s/vtctlclient/Dockerfile b/docker/k8s/vtctlclient/Dockerfile index d68ffe43c66..4f50a333ea9 100644 --- a/docker/k8s/vtctlclient/Dockerfile +++ b/docker/k8s/vtctlclient/Dockerfile @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -ARG VT_BASE_VER +ARG VT_BASE_VER=latest FROM vitess/k8s:${VT_BASE_VER} AS k8s diff --git a/docker/k8s/vtctld/Dockerfile b/docker/k8s/vtctld/Dockerfile index 8cdcf338755..cc64990c05f 100644 --- a/docker/k8s/vtctld/Dockerfile +++ b/docker/k8s/vtctld/Dockerfile @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -ARG VT_BASE_VER +ARG VT_BASE_VER=latest FROM vitess/k8s:${VT_BASE_VER} AS k8s diff --git a/docker/k8s/vtgate/Dockerfile b/docker/k8s/vtgate/Dockerfile index fde4abfacbd..5f5bee0fade 100644 --- a/docker/k8s/vtgate/Dockerfile +++ b/docker/k8s/vtgate/Dockerfile @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -ARG VT_BASE_VER +ARG VT_BASE_VER=latest FROM vitess/k8s:${VT_BASE_VER} AS k8s diff --git a/docker/k8s/vttablet/Dockerfile b/docker/k8s/vttablet/Dockerfile index 40b23d726d2..97d40a0b6e2 100644 --- a/docker/k8s/vttablet/Dockerfile +++ b/docker/k8s/vttablet/Dockerfile @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -ARG VT_BASE_VER +ARG VT_BASE_VER=latest FROM vitess/k8s:${VT_BASE_VER} AS k8s diff --git a/docker/k8s/vtworker/Dockerfile b/docker/k8s/vtworker/Dockerfile index 1085647356c..b5628b0d69a 100644 --- a/docker/k8s/vtworker/Dockerfile +++ b/docker/k8s/vtworker/Dockerfile @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -ARG VT_BASE_VER +ARG VT_BASE_VER=latest FROM vitess/k8s:${VT_BASE_VER} AS k8s diff --git a/go/cmd/orchestrator/main.go b/go/cmd/vtorc/main.go similarity index 100% rename from go/cmd/orchestrator/main.go rename to go/cmd/vtorc/main.go diff --git a/go/cmd/orchestrator/plugin_consultopo.go b/go/cmd/vtorc/plugin_consultopo.go similarity index 100% rename from go/cmd/orchestrator/plugin_consultopo.go rename to go/cmd/vtorc/plugin_consultopo.go diff --git a/go/cmd/orchestrator/plugin_etcd2topo.go b/go/cmd/vtorc/plugin_etcd2topo.go similarity index 100% rename from go/cmd/orchestrator/plugin_etcd2topo.go rename to go/cmd/vtorc/plugin_etcd2topo.go diff --git a/go/cmd/orchestrator/plugin_grpctmclient.go b/go/cmd/vtorc/plugin_grpctmclient.go similarity index 100% rename from go/cmd/orchestrator/plugin_grpctmclient.go rename to go/cmd/vtorc/plugin_grpctmclient.go diff --git a/go/cmd/orchestrator/plugin_kubernetestopo.go b/go/cmd/vtorc/plugin_kubernetestopo.go similarity index 100% rename from go/cmd/orchestrator/plugin_kubernetestopo.go rename to go/cmd/vtorc/plugin_kubernetestopo.go diff --git a/go/cmd/orchestrator/plugin_zk2topo.go b/go/cmd/vtorc/plugin_zk2topo.go similarity index 100% rename from go/cmd/orchestrator/plugin_zk2topo.go rename to go/cmd/vtorc/plugin_zk2topo.go diff --git a/go/mysql/conn.go b/go/mysql/conn.go index 7a220168df4..bbb30d241d8 100644 --- a/go/mysql/conn.go +++ b/go/mysql/conn.go @@ -190,6 +190,7 @@ type PrepareData struct { BindVars map[string]*querypb.BindVariable } +// execResult is an enum signifying the result of executing a query type execResult byte const ( @@ -720,6 +721,23 @@ func (c *Conn) writeOKPacketWithEOFHeader(affectedRows, lastInsertID uint64, fla return c.writeEphemeralPacket() } +func (c *Conn) writeErrorAndLog(errorCode uint16, sqlState string, format string, args ...interface{}) bool { + if err := c.writeErrorPacket(errorCode, sqlState, format, args...); err != nil { + log.Errorf("Error writing error to %s: %v", c, err) + return false + } + return true +} + +func (c *Conn) writeErrorPacketFromErrorAndLog(err error) bool { + werr := c.writeErrorPacketFromError(err) + if werr != nil { + log.Errorf("Error writing error to %s: %v", c, werr) + return false + } + return true +} + // writeErrorPacket writes an error packet. // Server -> Client. // This method returns a generic error, not a SQLError. @@ -787,361 +805,350 @@ func (c *Conn) handleNextCommand(handler Handler) bool { res := c.execQuery("use "+sqlescape.EscapeID(db), handler, false) return res != connErr case ComQuery: - c.startWriterBuffering() - defer func() { - if err := c.endWriterBuffering(); err != nil { - log.Errorf("conn %v: flush() failed: %v", c.ID(), err) - } - }() - - queryStart := time.Now() - query := c.parseComQuery(data) - c.recycleReadPacket() - - var queries []string - if c.Capabilities&CapabilityClientMultiStatements != 0 { - queries, err = sqlparser.SplitStatementToPieces(query) - if err != nil { - log.Errorf("Conn %v: Error splitting query: %v", c, err) - if werr := c.writeErrorPacketFromError(err); werr != nil { - // If we can't even write the error, we're done. - log.Errorf("Conn %v: Error writing query error: %v", c, werr) - return false - } - } - } else { - queries = []string{query} - } - for index, sql := range queries { - more := false - if index != len(queries)-1 { - more = true - } - res := c.execQuery(sql, handler, more) - if res != execSuccess { - return res != connErr - } - } - - timings.Record(queryTimingKey, queryStart) - + return c.handleComQuery(handler, data) case ComPing: - c.recycleReadPacket() - // Return error if listener was shut down and OK otherwise - if c.listener.isShutdown() { - if err := c.writeErrorPacket(ERServerShutdown, SSServerShutdown, "Server shutdown in progress"); err != nil { - log.Errorf("Error writing ComPing error to %s: %v", c, err) - return false - } - } else { - if err := c.writeOKPacket(0, 0, c.StatusFlags, 0); err != nil { - log.Errorf("Error writing ComPing result to %s: %v", c, err) - return false - } - } - + return c.handleComPing() case ComSetOption: - operation, ok := c.parseComSetOption(data) + return c.handleComSetOption(data) + case ComPrepare: + return c.handleComPrepare(handler, data) + case ComStmtExecute: + return c.handleComStmtExecute(handler, data) + case ComStmtSendLongData: + return c.handleComStmtSendLongData(data) + case ComStmtClose: + stmtID, ok := c.parseComStmtClose(data) c.recycleReadPacket() if ok { - switch operation { - case 0: - c.Capabilities |= CapabilityClientMultiStatements - case 1: - c.Capabilities &^= CapabilityClientMultiStatements - default: - log.Errorf("Got unhandled packet (ComSetOption default) from client %v, returning error: %v", c.ConnectionID, data) - if err := c.writeErrorPacket(ERUnknownComError, SSUnknownComError, "error handling packet: %v", data); err != nil { - log.Errorf("Error writing error packet to client: %v", err) - return false - } - } - if err := c.writeEndResult(false, 0, 0, 0); err != nil { - log.Errorf("Error writeEndResult error %v ", err) - return false - } - } else { - log.Errorf("Got unhandled packet (ComSetOption else) from client %v, returning error: %v", c.ConnectionID, data) - if err := c.writeErrorPacket(ERUnknownComError, SSUnknownComError, "error handling packet: %v", data); err != nil { - log.Errorf("Error writing error packet to client: %v", err) - return false - } + delete(c.PrepareData, stmtID) } + case ComStmtReset: + return c.handleComStmtReset(data) + case ComResetConnection: + c.handleComResetConnection(handler) + return true - case ComPrepare: - query := c.parseComPrepare(data) + default: + log.Errorf("Got unhandled packet (default) from %s, returning error: %v", c, data) c.recycleReadPacket() + if !c.writeErrorAndLog(ERUnknownComError, SSUnknownComError, "command handling not implemented yet: %v", data[0]) { + return false + } + } - var queries []string - if c.Capabilities&CapabilityClientMultiStatements != 0 { - queries, err = sqlparser.SplitStatementToPieces(query) - if err != nil { - log.Errorf("Conn %v: Error splitting query: %v", c, err) - if werr := c.writeErrorPacketFromError(err); werr != nil { - // If we can't even write the error, we're done. - log.Errorf("Conn %v: Error writing query error: %v", c, werr) - return false - } - } - if len(queries) != 1 { - log.Errorf("Conn %v: can not prepare multiple statements", c, err) - if werr := c.writeErrorPacketFromError(err); werr != nil { - // If we can't even write the error, we're done. - log.Errorf("Conn %v: Error writing query error: %v", c, werr) - return false - } - return true - } - } else { - queries = []string{query} + return true +} + +func (c *Conn) handleComResetConnection(handler Handler) { + // Clean up and reset the connection + c.recycleReadPacket() + handler.ComResetConnection(c) + // Reset prepared statements + c.PrepareData = make(map[uint32]*PrepareData) + err := c.writeOKPacket(0, 0, 0, 0) + if err != nil { + c.writeErrorPacketFromError(err) + } +} + +func (c *Conn) handleComStmtReset(data []byte) bool { + stmtID, ok := c.parseComStmtReset(data) + c.recycleReadPacket() + if !ok { + log.Error("Got unhandled packet from client %v, returning error: %v", c.ConnectionID, data) + if !c.writeErrorAndLog(ERUnknownComError, SSUnknownComError, "error handling packet: %v", data) { + return false } + } - // Popoulate PrepareData - c.StatementID++ - prepare := &PrepareData{ - StatementID: c.StatementID, - PrepareStmt: queries[0], + prepare, ok := c.PrepareData[stmtID] + if !ok { + log.Error("Commands were executed in an improper order from client %v, packet: %v", c.ConnectionID, data) + if !c.writeErrorAndLog(CRCommandsOutOfSync, SSUnknownComError, "commands were executed in an improper order: %v", data) { + return false } + } - statement, err := sqlparser.ParseStrictDDL(query) - if err != nil { - log.Errorf("Conn %v: Error parsing prepared statement: %v", c, err) - if werr := c.writeErrorPacketFromError(err); werr != nil { - // If we can't even write the error, we're done. - log.Errorf("Conn %v: Error writing prepared statement error: %v", c, werr) - return false - } + if prepare.BindVars != nil { + for k := range prepare.BindVars { + prepare.BindVars[k] = nil } + } - paramsCount := uint16(0) - _ = sqlparser.Walk(func(node sqlparser.SQLNode) (bool, error) { - switch node := node.(type) { - case sqlparser.Argument: - if strings.HasPrefix(string(node), ":v") { - paramsCount++ - } - } - return true, nil - }, statement) + if err := c.writeOKPacket(0, 0, c.StatusFlags, 0); err != nil { + log.Error("Error writing ComStmtReset OK packet to client %v: %v", c.ConnectionID, err) + return false + } + return true +} - if paramsCount > 0 { - prepare.ParamsCount = paramsCount - prepare.ParamsType = make([]int32, paramsCount) - prepare.BindVars = make(map[string]*querypb.BindVariable, paramsCount) - } +func (c *Conn) handleComStmtSendLongData(data []byte) bool { + stmtID, paramID, chunkData, ok := c.parseComStmtSendLongData(data) + c.recycleReadPacket() + if !ok { + err := fmt.Errorf("error parsing statement send long data from client %v, returning error: %v", c.ConnectionID, data) + return c.writeErrorPacketFromErrorAndLog(err) + } - bindVars := make(map[string]*querypb.BindVariable, paramsCount) - for i := uint16(0); i < paramsCount; i++ { - parameterID := fmt.Sprintf("v%d", i+1) - bindVars[parameterID] = &querypb.BindVariable{} - } + prepare, ok := c.PrepareData[stmtID] + if !ok { + err := fmt.Errorf("got wrong statement id from client %v, statement ID(%v) is not found from record", c.ConnectionID, stmtID) + return !c.writeErrorPacketFromErrorAndLog(err) + } - c.PrepareData[c.StatementID] = prepare + if prepare.BindVars == nil || + prepare.ParamsCount == uint16(0) || + paramID >= prepare.ParamsCount { + err := fmt.Errorf("invalid parameter Number from client %v, statement: %v", c.ConnectionID, prepare.PrepareStmt) + return !c.writeErrorPacketFromErrorAndLog(err) + } - fld, err := handler.ComPrepare(c, queries[0], bindVars) + chunk := make([]byte, len(chunkData)) + copy(chunk, chunkData) - if err != nil { - if werr := c.writeErrorPacketFromError(err); werr != nil { - // If we can't even write the error, we're done. - log.Error("Error writing query error to client %v: %v", c.ConnectionID, werr) - return false - } - return true - } + key := fmt.Sprintf("v%d", paramID+1) + if val, ok := prepare.BindVars[key]; ok { + val.Value = append(val.Value, chunk...) + } else { + prepare.BindVars[key] = sqltypes.BytesBindVariable(chunk) + } + return true +} - if err := c.writePrepare(fld, c.PrepareData[c.StatementID]); err != nil { - log.Error("Error writing prepare data to client %v: %v", c.ConnectionID, err) - return false +func (c *Conn) handleComStmtExecute(handler Handler, data []byte) (kontinue bool) { + c.startWriterBuffering() + defer func() { + if err := c.endWriterBuffering(); err != nil { + log.Errorf("conn %v: flush() failed: %v", c.ID(), err) + kontinue = false } + }() + queryStart := time.Now() + stmtID, _, err := c.parseComStmtExecute(c.PrepareData, data) + c.recycleReadPacket() - case ComStmtExecute: - c.startWriterBuffering() + if stmtID != uint32(0) { defer func() { - if err := c.endWriterBuffering(); err != nil { - log.Errorf("conn %v: flush() failed: %v", c.ID(), err) - } + // Allocate a new bindvar map every time since VTGate.Execute() mutates it. + prepare := c.PrepareData[stmtID] + prepare.BindVars = make(map[string]*querypb.BindVariable, prepare.ParamsCount) }() - queryStart := time.Now() - stmtID, _, err := c.parseComStmtExecute(c.PrepareData, data) - c.recycleReadPacket() + } - if stmtID != uint32(0) { - defer func() { - // Allocate a new bindvar map every time since VTGate.Execute() mutates it. - prepare := c.PrepareData[stmtID] - prepare.BindVars = make(map[string]*querypb.BindVariable, prepare.ParamsCount) - }() - } + if err != nil { + return !c.writeErrorPacketFromErrorAndLog(err) + } - if err != nil { - if werr := c.writeErrorPacketFromError(err); werr != nil { - // If we can't even write the error, we're done. - log.Error("Error writing query error to client %v: %v", c.ConnectionID, werr) - return false - } - return true + fieldSent := false + // sendFinished is set if the response should just be an OK packet. + sendFinished := false + prepare := c.PrepareData[stmtID] + err = handler.ComStmtExecute(c, prepare, func(qr *sqltypes.Result) error { + if sendFinished { + // Failsafe: Unreachable if server is well-behaved. + return io.EOF } - fieldSent := false - // sendFinished is set if the response should just be an OK packet. - sendFinished := false - prepare := c.PrepareData[stmtID] - err = handler.ComStmtExecute(c, prepare, func(qr *sqltypes.Result) error { - if sendFinished { - // Failsafe: Unreachable if server is well-behaved. - return io.EOF - } - - if !fieldSent { - fieldSent = true - - if len(qr.Fields) == 0 { - sendFinished = true - // We should not send any more packets after this. - return c.writeOKPacket(qr.RowsAffected, qr.InsertID, c.StatusFlags, 0) - } - if err := c.writeFields(qr); err != nil { - return err - } - } - - return c.writeBinaryRows(qr) - }) - - // If no field was sent, we expect an error. if !fieldSent { - // This is just a failsafe. Should never happen. - if err == nil || err == io.EOF { - err = NewSQLErrorFromError(errors.New("unexpected: query ended without no results and no error")) - } - if werr := c.writeErrorPacketFromError(err); werr != nil { - // If we can't even write the error, we're done. - log.Errorf("Error writing query error to %s: %v", c, werr) - return false - } - } else { - if err != nil { - // We can't send an error in the middle of a stream. - // All we can do is abort the send, which will cause a 2013. - log.Errorf("Error in the middle of a stream to %s: %v", c, err) - return false - } + fieldSent = true - // Send the end packet only sendFinished is false (results were streamed). - // In this case the affectedRows and lastInsertID are always 0 since it - // was a read operation. - if !sendFinished { - if err := c.writeEndResult(false, 0, 0, handler.WarningCount(c)); err != nil { - log.Errorf("Error writing result to %s: %v", c, err) - return false - } + if len(qr.Fields) == 0 { + sendFinished = true + // We should not send any more packets after this. + return c.writeOKPacket(qr.RowsAffected, qr.InsertID, c.StatusFlags, 0) + } + if err := c.writeFields(qr); err != nil { + return err } } - timings.Record(queryTimingKey, queryStart) + return c.writeBinaryRows(qr) + }) - case ComStmtSendLongData: - stmtID, paramID, chunkData, ok := c.parseComStmtSendLongData(data) - c.recycleReadPacket() - if !ok { - err = fmt.Errorf("error parsing statement send long data from client %v, returning error: %v", c.ConnectionID, data) - if werr := c.writeErrorPacketFromError(err); werr != nil { - // If we can't even write the error, we're done. - log.Error("Error writing query error to client %v: %v", c.ConnectionID, werr) - return false - } - return true + // If no field was sent, we expect an error. + if !fieldSent { + // This is just a failsafe. Should never happen. + if err == nil || err == io.EOF { + err = NewSQLErrorFromError(errors.New("unexpected: query ended without no results and no error")) } - - prepare, ok := c.PrepareData[stmtID] - if !ok { - err = fmt.Errorf("got wrong statement id from client %v, statement ID(%v) is not found from record", c.ConnectionID, stmtID) - if werr := c.writeErrorPacketFromError(err); werr != nil { - // If we can't even write the error, we're done. - log.Error("Error writing query error to client %v: %v", c.ConnectionID, werr) - return false - } - return true + if !c.writeErrorPacketFromErrorAndLog(err) { + return false + } + } else { + if err != nil { + // We can't send an error in the middle of a stream. + // All we can do is abort the send, which will cause a 2013. + log.Errorf("Error in the middle of a stream to %s: %v", c, err) + return false } - if prepare.BindVars == nil || - prepare.ParamsCount == uint16(0) || - paramID >= prepare.ParamsCount { - err = fmt.Errorf("invalid parameter Number from client %v, statement: %v", c.ConnectionID, prepare.PrepareStmt) - if werr := c.writeErrorPacketFromError(err); werr != nil { - // If we can't even write the error, we're done. - log.Error("Error writing query error to client %v: %v", c.ConnectionID, werr) + // Send the end packet only sendFinished is false (results were streamed). + // In this case the affectedRows and lastInsertID are always 0 since it + // was a read operation. + if !sendFinished { + if err := c.writeEndResult(false, 0, 0, handler.WarningCount(c)); err != nil { + log.Errorf("Error writing result to %s: %v", c, err) return false } - return true } + } - chunk := make([]byte, len(chunkData)) - copy(chunk, chunkData) + timings.Record(queryTimingKey, queryStart) + return true +} + +func (c *Conn) handleComPrepare(handler Handler, data []byte) bool { + query := c.parseComPrepare(data) + c.recycleReadPacket() - key := fmt.Sprintf("v%d", paramID+1) - if val, ok := prepare.BindVars[key]; ok { - val.Value = append(val.Value, chunk...) - } else { - prepare.BindVars[key] = sqltypes.BytesBindVariable(chunk) + var queries []string + if c.Capabilities&CapabilityClientMultiStatements != 0 { + queries, err := sqlparser.SplitStatementToPieces(query) + if err != nil { + log.Errorf("Conn %v: Error splitting query: %v", c, err) + return !c.writeErrorPacketFromErrorAndLog(err) } - case ComStmtClose: - stmtID, ok := c.parseComStmtClose(data) - c.recycleReadPacket() - if ok { - delete(c.PrepareData, stmtID) + if len(queries) != 1 { + log.Errorf("Conn %v: can not prepare multiple statements", c, err) + return !c.writeErrorPacketFromErrorAndLog(err) } - case ComStmtReset: - stmtID, ok := c.parseComStmtReset(data) - c.recycleReadPacket() - if !ok { - log.Error("Got unhandled packet from client %v, returning error: %v", c.ConnectionID, data) - if err := c.writeErrorPacket(ERUnknownComError, SSUnknownComError, "error handling packet: %v", data); err != nil { - log.Error("Error writing error packet to client: %v", err) - return false - } + } else { + queries = []string{query} + } + + // Popoulate PrepareData + c.StatementID++ + prepare := &PrepareData{ + StatementID: c.StatementID, + PrepareStmt: queries[0], + } + + statement, err := sqlparser.ParseStrictDDL(query) + if err != nil { + log.Errorf("Conn %v: Error parsing prepared statement: %v", c, err) + if !c.writeErrorPacketFromErrorAndLog(err) { + return false } + } - prepare, ok := c.PrepareData[stmtID] - if !ok { - log.Error("Commands were executed in an improper order from client %v, packet: %v", c.ConnectionID, data) - if err := c.writeErrorPacket(CRCommandsOutOfSync, SSUnknownComError, "commands were executed in an improper order: %v", data); err != nil { - log.Error("Error writing error packet to client: %v", err) - return false + paramsCount := uint16(0) + _ = sqlparser.Walk(func(node sqlparser.SQLNode) (bool, error) { + switch node := node.(type) { + case sqlparser.Argument: + if strings.HasPrefix(string(node), ":v") { + paramsCount++ } } + return true, nil + }, statement) + + if paramsCount > 0 { + prepare.ParamsCount = paramsCount + prepare.ParamsType = make([]int32, paramsCount) + prepare.BindVars = make(map[string]*querypb.BindVariable, paramsCount) + } - if prepare.BindVars != nil { - for k := range prepare.BindVars { - prepare.BindVars[k] = nil + bindVars := make(map[string]*querypb.BindVariable, paramsCount) + for i := uint16(0); i < paramsCount; i++ { + parameterID := fmt.Sprintf("v%d", i+1) + bindVars[parameterID] = &querypb.BindVariable{} + } + + c.PrepareData[c.StatementID] = prepare + + fld, err := handler.ComPrepare(c, queries[0], bindVars) + + if err != nil { + return !c.writeErrorPacketFromErrorAndLog(err) + } + + if err := c.writePrepare(fld, c.PrepareData[c.StatementID]); err != nil { + log.Error("Error writing prepare data to client %v: %v", c.ConnectionID, err) + return false + } + return true +} + +func (c *Conn) handleComSetOption(data []byte) bool { + operation, ok := c.parseComSetOption(data) + c.recycleReadPacket() + if ok { + switch operation { + case 0: + c.Capabilities |= CapabilityClientMultiStatements + case 1: + c.Capabilities &^= CapabilityClientMultiStatements + default: + log.Errorf("Got unhandled packet (ComSetOption default) from client %v, returning error: %v", c.ConnectionID, data) + if !c.writeErrorAndLog(ERUnknownComError, SSUnknownComError, "error handling packet: %v", data) { + return false } } + if err := c.writeEndResult(false, 0, 0, 0); err != nil { + log.Errorf("Error writeEndResult error %v ", err) + return false + } + } else { + log.Errorf("Got unhandled packet (ComSetOption else) from client %v, returning error: %v", c.ConnectionID, data) + if !c.writeErrorAndLog(ERUnknownComError, SSUnknownComError, "error handling packet: %v", data) { + return false + } + } + return true +} +func (c *Conn) handleComPing() bool { + c.recycleReadPacket() + // Return error if listener was shut down and OK otherwise + if c.listener.isShutdown() { + if !c.writeErrorAndLog(ERServerShutdown, SSServerShutdown, "Server shutdown in progress") { + return false + } + } else { if err := c.writeOKPacket(0, 0, c.StatusFlags, 0); err != nil { - log.Error("Error writing ComStmtReset OK packet to client %v: %v", c.ConnectionID, err) + log.Errorf("Error writing ComPing result to %s: %v", c, err) return false } + } + return true +} - case ComResetConnection: - // Clean up and reset the connection - c.recycleReadPacket() - handler.ComResetConnection(c) - // Reset prepared statements - c.PrepareData = make(map[uint32]*PrepareData) - err = c.writeOKPacket(0, 0, 0, 0) - if err != nil { - c.writeErrorPacketFromError(err) +func (c *Conn) handleComQuery(handler Handler, data []byte) (kontinue bool) { + c.startWriterBuffering() + defer func() { + if err := c.endWriterBuffering(); err != nil { + log.Errorf("conn %v: flush() failed: %v", c.ID(), err) + kontinue = false } + }() - default: - log.Errorf("Got unhandled packet (default) from %s, returning error: %v", c, data) - c.recycleReadPacket() - if err := c.writeErrorPacket(ERUnknownComError, SSUnknownComError, "command handling not implemented yet: %v", data[0]); err != nil { - log.Errorf("Error writing error packet to %s: %s", c, err) - return false + queryStart := time.Now() + query := c.parseComQuery(data) + c.recycleReadPacket() + + var queries []string + var err error + if c.Capabilities&CapabilityClientMultiStatements != 0 { + queries, err = sqlparser.SplitStatementToPieces(query) + if err != nil { + log.Errorf("Conn %v: Error splitting query: %v", c, err) + return !c.writeErrorPacketFromErrorAndLog(err) + } + } else { + queries = []string{query} + } + for index, sql := range queries { + more := false + if index != len(queries)-1 { + more = true + } + res := c.execQuery(sql, handler, more) + if res != execSuccess { + return res != connErr } } + timings.Record(queryTimingKey, queryStart) return true } @@ -1188,9 +1195,7 @@ func (c *Conn) execQuery(query string, handler Handler, more bool) execResult { if err == nil || err == io.EOF { err = NewSQLErrorFromError(errors.New("unexpected: query ended without no results and no error")) } - if werr := c.writeErrorPacketFromError(err); werr != nil { - // If we can't even write the error, we're done. - log.Errorf("Error writing query error to %s: %v", c, werr) + if !c.writeErrorPacketFromErrorAndLog(err) { return connErr } return execErr diff --git a/go/test/endtoend/cluster/cluster_process.go b/go/test/endtoend/cluster/cluster_process.go index 7e436ffe116..18049c90051 100644 --- a/go/test/endtoend/cluster/cluster_process.go +++ b/go/test/endtoend/cluster/cluster_process.go @@ -72,7 +72,7 @@ type LocalProcessCluster struct { VtgateProcess VtgateProcess VtworkerProcess VtworkerProcess VtbackupProcess VtbackupProcess - OrcProcess *OrchestratorProcess + VtorcProcess *VtorcProcess nextPortForProcess int @@ -505,9 +505,9 @@ func (cluster *LocalProcessCluster) Teardown() { log.Errorf("Error in vtgate teardown: %v", err) } - if cluster.OrcProcess != nil { - if err := cluster.OrcProcess.TearDown(); err != nil { - log.Errorf("Error in orchestrator teardown: %v", err) + if cluster.VtorcProcess != nil { + if err := cluster.VtorcProcess.TearDown(); err != nil { + log.Errorf("Error in vtorc teardown: %v", err) } } @@ -674,11 +674,11 @@ func (cluster *LocalProcessCluster) NewVttabletInstance(tabletType string, UID i } } -// NewOrcProcess creates a new OrchestratorProcess object -func (cluster *LocalProcessCluster) NewOrcProcess(configFile string) *OrchestratorProcess { +// NewOrcProcess creates a new VtorcProcess object +func (cluster *LocalProcessCluster) NewOrcProcess(configFile string) *VtorcProcess { base := VtctlProcessInstance(cluster.TopoProcess.Port, cluster.Hostname) - base.Binary = "orchestrator" - return &OrchestratorProcess{ + base.Binary = "vtorc" + return &VtorcProcess{ VtctlProcess: *base, LogDir: cluster.TmpDirectory, Config: configFile, diff --git a/go/test/endtoend/cluster/orchestrator_process.go b/go/test/endtoend/cluster/vtorc_process.go similarity index 83% rename from go/test/endtoend/cluster/orchestrator_process.go rename to go/test/endtoend/cluster/vtorc_process.go index a17affd29f0..6bc00e1dfad 100644 --- a/go/test/endtoend/cluster/orchestrator_process.go +++ b/go/test/endtoend/cluster/vtorc_process.go @@ -28,9 +28,9 @@ import ( "vitess.io/vitess/go/vt/log" ) -// OrchestratorProcess is a test struct for running -// orchestrator as a separate process for testing -type OrchestratorProcess struct { +// VtorcProcess is a test struct for running +// vtorc as a separate process for testing +type VtorcProcess struct { VtctlProcess LogDir string ExtraArgs []string @@ -40,10 +40,10 @@ type OrchestratorProcess struct { } // Setup starts orc process with required arguements -func (orc *OrchestratorProcess) Setup() (err error) { +func (orc *VtorcProcess) Setup() (err error) { /* minimal command line arguments: - $ orchestrator -topo_implementation etcd2 -topo_global_server_address localhost:2379 -topo_global_root /vitess/global + $ vtorc -topo_implementation etcd2 -topo_global_server_address localhost:2379 -topo_global_root /vitess/global -config config/orchestrator/default.json -alsologtostderr http */ orc.proc = exec.Command( @@ -82,8 +82,8 @@ func (orc *OrchestratorProcess) Setup() (err error) { return nil } -// TearDown shuts down the running orchestrator service -func (orc *OrchestratorProcess) TearDown() error { +// TearDown shuts down the running vtorc service +func (orc *VtorcProcess) TearDown() error { if orc.proc == nil || orc.exit == nil { return nil } diff --git a/go/test/endtoend/orchestrator/orc_test.go b/go/test/endtoend/orchestrator/orc_test.go index 153879a9674..ca1f89394c3 100644 --- a/go/test/endtoend/orchestrator/orc_test.go +++ b/go/test/endtoend/orchestrator/orc_test.go @@ -111,10 +111,10 @@ func createCluster(t *testing.T, numReplicas int, numRdonly int, orcExtraArgs [] require.NoError(t, err) } - // Start orchestrator - clusterInstance.OrcProcess = clusterInstance.NewOrcProcess(path.Join(os.Getenv("PWD"), "test_config.json")) - clusterInstance.OrcProcess.ExtraArgs = orcExtraArgs - err = clusterInstance.OrcProcess.Setup() + // Start vtorc + clusterInstance.VtorcProcess = clusterInstance.NewOrcProcess(path.Join(os.Getenv("PWD"), "test_config.json")) + clusterInstance.VtorcProcess.ExtraArgs = orcExtraArgs + err = clusterInstance.VtorcProcess.Setup() require.NoError(t, err) return clusterInstance diff --git a/go/test/endtoend/vreplication/cluster.go b/go/test/endtoend/vreplication/cluster.go index 61555508f93..7d8db8c7b20 100644 --- a/go/test/endtoend/vreplication/cluster.go +++ b/go/test/endtoend/vreplication/cluster.go @@ -22,7 +22,7 @@ import ( ) var ( - debug = true // set to true to always use local env vtdataroot for local debugging + debug = false // set to true to always use local env vtdataroot for local debugging originalVtdataroot string vtdataroot string ) diff --git a/go/vt/binlog/binlogplayer/binlog_player.go b/go/vt/binlog/binlogplayer/binlog_player.go index d8f6f51c286..df04691b215 100644 --- a/go/vt/binlog/binlogplayer/binlog_player.go +++ b/go/vt/binlog/binlogplayer/binlog_player.go @@ -89,6 +89,7 @@ type Stats struct { QueryCount *stats.CountersWithSingleLabel CopyRowCount *stats.Counter CopyLoopCount *stats.Counter + ErrorCounts *stats.CountersWithMultiLabels } // SetLastPosition sets the last replication position. @@ -129,7 +130,7 @@ func NewStats() *Stats { bps.QueryCount = stats.NewCountersWithSingleLabel("", "", "Phase", "") bps.CopyRowCount = stats.NewCounter("", "") bps.CopyLoopCount = stats.NewCounter("", "") - + bps.ErrorCounts = stats.NewCountersWithMultiLabels("", "", []string{"type"}) return bps } diff --git a/go/vt/discovery/tablet_picker.go b/go/vt/discovery/tablet_picker.go index 2aded25401a..2c4f1f84584 100644 --- a/go/vt/discovery/tablet_picker.go +++ b/go/vt/discovery/tablet_picker.go @@ -82,7 +82,6 @@ func NewTabletPicker(ts *topo.Server, cells []string, keyspace, shard, tabletTyp missingFields = append(missingFields, "Cells") } if len(missingFields) > 0 { - //log.Errorf("missing picker fields %s", debug.Stack()) //FIXME: remove after all tests run return nil, vterrors.Errorf(vtrpcpb.Code_FAILED_PRECONDITION, fmt.Sprintf("Missing required field(s) for tablet picker: %s", strings.Join(missingFields, ", "))) } diff --git a/go/vt/mysqlctl/schema.go b/go/vt/mysqlctl/schema.go index c50cd439aaa..94178eff16c 100644 --- a/go/vt/mysqlctl/schema.go +++ b/go/vt/mysqlctl/schema.go @@ -128,7 +128,6 @@ func (mysqld *Mysqld) GetSchema(ctx context.Context, dbName string, tables, excl go func() { defer wg.Done() - log.Infof("mysqld GetSchema: GetPrimaryKeyColumns") var err error colMap, err = mysqld.getPrimaryKeyColumns(ctx, dbName, tableNames...) if err != nil { @@ -136,7 +135,6 @@ func (mysqld *Mysqld) GetSchema(ctx context.Context, dbName string, tables, excl cancel() return } - log.Infof("mysqld GetSchema: GetPrimaryKeyColumns done") }() } @@ -145,11 +143,9 @@ func (mysqld *Mysqld) GetSchema(ctx context.Context, dbName string, tables, excl return nil, err } - log.Infof("mysqld GetSchema: Collecting all table schemas") for _, td := range tds { td.PrimaryKeyColumns = colMap[td.Name] } - log.Infof("mysqld GetSchema: Collecting all table schemas done") sd.TableDefinitions = tds diff --git a/go/vt/sqlparser/ast.go b/go/vt/sqlparser/ast.go index b51872a9009..c65dd0d6a9b 100644 --- a/go/vt/sqlparser/ast.go +++ b/go/vt/sqlparser/ast.go @@ -69,6 +69,7 @@ type ( OrderBy OrderBy Limit *Limit Lock Lock + IntoOutfileS3 string } // Lock is an enum for the type of lock in the statement @@ -984,6 +985,9 @@ func (node *Select) Format(buf *TrackedBuffer) { node.From, node.Where, node.GroupBy, node.Having, node.OrderBy, node.Limit, node.Lock.ToString()) + if node.IntoOutfileS3 != "" { + buf.astPrintf(node, " into outfile s3 '%s'", node.IntoOutfileS3) + } } // Format formats the node. diff --git a/go/vt/sqlparser/parse_test.go b/go/vt/sqlparser/parse_test.go index a3cb6670eb1..494dc87a363 100644 --- a/go/vt/sqlparser/parse_test.go +++ b/go/vt/sqlparser/parse_test.go @@ -2108,6 +2108,56 @@ func TestConvert(t *testing.T) { } } +func TestIntoOutfileS3(t *testing.T) { + validSQL := []struct { + input string + output string + }{{ + input: "select * from t order by name limit 100 into outfile s3 'out_file_name'", + output: "select * from t order by name asc limit 100 into outfile s3 'out_file_name'", + }, { + input: "select * from (select * from t union select * from t2) as t3 where t3.name in (select col from t4) into outfile s3 'out_file_name'", + }, { + // Invalid queries but these are parsed and errors caught in planbuilder + input: "select * from t limit 100 into outfile s3 'out_file_name' union select * from t2", + }, { + input: "select * from (select * from t into outfile s3 'inner_outfile') as t2 into outfile s3 'out_file_name'", + }} + + for _, tcase := range validSQL { + if tcase.output == "" { + tcase.output = tcase.input + } + tree, err := Parse(tcase.input) + if err != nil { + t.Errorf("input: %s, err: %v", tcase.input, err) + continue + } + out := String(tree) + if out != tcase.output { + t.Errorf("out: %s, want %s", out, tcase.output) + } + } + + invalidSQL := []struct { + input string + output string + }{{ + input: "select convert('abc' as date) from t", + output: "syntax error at position 24 near 'as'", + }, { + input: "set transaction isolation level 12345", + output: "syntax error at position 38 near '12345'", + }} + + for _, tcase := range invalidSQL { + _, err := Parse(tcase.input) + if err == nil || err.Error() != tcase.output { + t.Errorf("%s: %v, want %s", tcase.input, err, tcase.output) + } + } +} + func TestPositionedErr(t *testing.T) { invalidSQL := []struct { input string @@ -2458,10 +2508,18 @@ func TestCreateTable(t *testing.T) { " f1 float default 1.23,\n" + " s1 varchar default 'c',\n" + " s2 varchar default 'this is a string',\n" + - " s3 varchar default null,\n" + + " `s3` varchar default null,\n" + " s4 timestamp default current_timestamp(),\n" + " s5 bit(1) default B'0'\n" + ")", + }, { + // test non_reserved word in column name + input: "create table t (\n" + + " repair int\n" + + ")", + output: "create table t (\n" + + " `repair` int\n" + + ")", }, { // test key field options input: "create table t (\n" + @@ -2791,6 +2849,11 @@ var ( input: "select /* aa", output: "syntax error at position 13 near '/* aa'", excludeMulti: true, + }, { + // non_reserved keywords are currently not permitted everywhere + input: "create database repair", + output: "syntax error at position 23 near 'repair'", + excludeMulti: true, }} ) @@ -2799,6 +2862,7 @@ func TestErrors(t *testing.T) { t.Run(tcase.input, func(t *testing.T) { _, err := Parse(tcase.input) require.Error(t, err, tcase.output) + require.Equal(t, err.Error(), tcase.output) }) } } diff --git a/go/vt/sqlparser/sql.go b/go/vt/sqlparser/sql.go index 28281795ce8..fca6b29afa6 100644 --- a/go/vt/sqlparser/sql.go +++ b/go/vt/sqlparser/sql.go @@ -156,321 +156,323 @@ const UNLOCK = 57375 const KEYS = 57376 const DO = 57377 const DISTINCTROW = 57378 -const VALUES = 57379 -const LAST_INSERT_ID = 57380 -const NEXT = 57381 -const VALUE = 57382 -const SHARE = 57383 -const MODE = 57384 -const SQL_NO_CACHE = 57385 -const SQL_CACHE = 57386 -const SQL_CALC_FOUND_ROWS = 57387 -const JOIN = 57388 -const STRAIGHT_JOIN = 57389 -const LEFT = 57390 -const RIGHT = 57391 -const INNER = 57392 -const OUTER = 57393 -const CROSS = 57394 -const NATURAL = 57395 -const USE = 57396 -const FORCE = 57397 -const ON = 57398 -const USING = 57399 -const ID = 57400 -const AT_ID = 57401 -const AT_AT_ID = 57402 -const HEX = 57403 -const STRING = 57404 -const INTEGRAL = 57405 -const FLOAT = 57406 -const HEXNUM = 57407 -const VALUE_ARG = 57408 -const LIST_ARG = 57409 -const COMMENT = 57410 -const COMMENT_KEYWORD = 57411 -const BIT_LITERAL = 57412 -const NULL = 57413 -const TRUE = 57414 -const FALSE = 57415 -const OFF = 57416 -const OR = 57417 -const XOR = 57418 -const AND = 57419 -const NOT = 57420 -const BETWEEN = 57421 -const CASE = 57422 -const WHEN = 57423 -const THEN = 57424 -const ELSE = 57425 -const END = 57426 -const LE = 57427 -const GE = 57428 -const NE = 57429 -const NULL_SAFE_EQUAL = 57430 -const IS = 57431 -const LIKE = 57432 -const REGEXP = 57433 -const IN = 57434 -const SHIFT_LEFT = 57435 -const SHIFT_RIGHT = 57436 -const DIV = 57437 -const MOD = 57438 -const UNARY = 57439 -const COLLATE = 57440 -const BINARY = 57441 -const UNDERSCORE_BINARY = 57442 -const UNDERSCORE_UTF8MB4 = 57443 -const UNDERSCORE_UTF8 = 57444 -const UNDERSCORE_LATIN1 = 57445 -const INTERVAL = 57446 -const JSON_EXTRACT_OP = 57447 -const JSON_UNQUOTE_EXTRACT_OP = 57448 -const CREATE = 57449 -const ALTER = 57450 -const DROP = 57451 -const RENAME = 57452 -const ANALYZE = 57453 -const ADD = 57454 -const FLUSH = 57455 -const SCHEMA = 57456 -const TABLE = 57457 -const INDEX = 57458 -const VIEW = 57459 -const TO = 57460 -const IGNORE = 57461 -const IF = 57462 -const UNIQUE = 57463 -const PRIMARY = 57464 -const COLUMN = 57465 -const SPATIAL = 57466 -const FULLTEXT = 57467 -const KEY_BLOCK_SIZE = 57468 -const CHECK = 57469 -const INDEXES = 57470 -const ACTION = 57471 -const CASCADE = 57472 -const CONSTRAINT = 57473 -const FOREIGN = 57474 -const NO = 57475 -const REFERENCES = 57476 -const RESTRICT = 57477 -const SHOW = 57478 -const DESCRIBE = 57479 -const EXPLAIN = 57480 -const DATE = 57481 -const ESCAPE = 57482 -const REPAIR = 57483 -const OPTIMIZE = 57484 -const TRUNCATE = 57485 -const MAXVALUE = 57486 -const PARTITION = 57487 -const REORGANIZE = 57488 -const LESS = 57489 -const THAN = 57490 -const PROCEDURE = 57491 -const TRIGGER = 57492 -const VINDEX = 57493 -const VINDEXES = 57494 -const STATUS = 57495 -const VARIABLES = 57496 -const WARNINGS = 57497 -const SEQUENCE = 57498 -const BEGIN = 57499 -const START = 57500 -const TRANSACTION = 57501 -const COMMIT = 57502 -const ROLLBACK = 57503 -const SAVEPOINT = 57504 -const RELEASE = 57505 -const WORK = 57506 -const BIT = 57507 -const TINYINT = 57508 -const SMALLINT = 57509 -const MEDIUMINT = 57510 -const INT = 57511 -const INTEGER = 57512 -const BIGINT = 57513 -const INTNUM = 57514 -const REAL = 57515 -const DOUBLE = 57516 -const FLOAT_TYPE = 57517 -const DECIMAL = 57518 -const NUMERIC = 57519 -const TIME = 57520 -const TIMESTAMP = 57521 -const DATETIME = 57522 -const YEAR = 57523 -const CHAR = 57524 -const VARCHAR = 57525 -const BOOL = 57526 -const CHARACTER = 57527 -const VARBINARY = 57528 -const NCHAR = 57529 -const TEXT = 57530 -const TINYTEXT = 57531 -const MEDIUMTEXT = 57532 -const LONGTEXT = 57533 -const BLOB = 57534 -const TINYBLOB = 57535 -const MEDIUMBLOB = 57536 -const LONGBLOB = 57537 -const JSON = 57538 -const ENUM = 57539 -const GEOMETRY = 57540 -const POINT = 57541 -const LINESTRING = 57542 -const POLYGON = 57543 -const GEOMETRYCOLLECTION = 57544 -const MULTIPOINT = 57545 -const MULTILINESTRING = 57546 -const MULTIPOLYGON = 57547 -const NULLX = 57548 -const AUTO_INCREMENT = 57549 -const APPROXNUM = 57550 -const SIGNED = 57551 -const UNSIGNED = 57552 -const ZEROFILL = 57553 -const COLLATION = 57554 -const DATABASES = 57555 -const TABLES = 57556 -const VITESS_METADATA = 57557 -const VSCHEMA = 57558 -const FULL = 57559 -const PROCESSLIST = 57560 -const COLUMNS = 57561 -const FIELDS = 57562 -const ENGINES = 57563 -const PLUGINS = 57564 -const EXTENDED = 57565 -const KEYSPACES = 57566 -const VITESS_KEYSPACES = 57567 -const VITESS_SHARDS = 57568 -const VITESS_TABLETS = 57569 -const NAMES = 57570 -const CHARSET = 57571 -const GLOBAL = 57572 -const SESSION = 57573 -const ISOLATION = 57574 -const LEVEL = 57575 -const READ = 57576 -const WRITE = 57577 -const ONLY = 57578 -const REPEATABLE = 57579 -const COMMITTED = 57580 -const UNCOMMITTED = 57581 -const SERIALIZABLE = 57582 -const CURRENT_TIMESTAMP = 57583 -const DATABASE = 57584 -const CURRENT_DATE = 57585 -const CURRENT_TIME = 57586 -const LOCALTIME = 57587 -const LOCALTIMESTAMP = 57588 -const UTC_DATE = 57589 -const UTC_TIME = 57590 -const UTC_TIMESTAMP = 57591 -const REPLACE = 57592 -const CONVERT = 57593 -const CAST = 57594 -const SUBSTR = 57595 -const SUBSTRING = 57596 -const GROUP_CONCAT = 57597 -const SEPARATOR = 57598 -const TIMESTAMPADD = 57599 -const TIMESTAMPDIFF = 57600 -const MATCH = 57601 -const AGAINST = 57602 -const BOOLEAN = 57603 -const LANGUAGE = 57604 -const WITH = 57605 -const QUERY = 57606 -const EXPANSION = 57607 -const UNUSED = 57608 -const ARRAY = 57609 -const CUME_DIST = 57610 -const DESCRIPTION = 57611 -const DENSE_RANK = 57612 -const EMPTY = 57613 -const EXCEPT = 57614 -const FIRST_VALUE = 57615 -const GROUPING = 57616 -const GROUPS = 57617 -const JSON_TABLE = 57618 -const LAG = 57619 -const LAST_VALUE = 57620 -const LATERAL = 57621 -const LEAD = 57622 -const MEMBER = 57623 -const NTH_VALUE = 57624 -const NTILE = 57625 -const OF = 57626 -const OVER = 57627 -const PERCENT_RANK = 57628 -const RANK = 57629 -const RECURSIVE = 57630 -const ROW_NUMBER = 57631 -const SYSTEM = 57632 -const WINDOW = 57633 -const ACTIVE = 57634 -const ADMIN = 57635 -const BUCKETS = 57636 -const CLONE = 57637 -const COMPONENT = 57638 -const DEFINITION = 57639 -const ENFORCED = 57640 -const EXCLUDE = 57641 -const FOLLOWING = 57642 -const GEOMCOLLECTION = 57643 -const GET_MASTER_PUBLIC_KEY = 57644 -const HISTOGRAM = 57645 -const HISTORY = 57646 -const INACTIVE = 57647 -const INVISIBLE = 57648 -const LOCKED = 57649 -const MASTER_COMPRESSION_ALGORITHMS = 57650 -const MASTER_PUBLIC_KEY_PATH = 57651 -const MASTER_TLS_CIPHERSUITES = 57652 -const MASTER_ZSTD_COMPRESSION_LEVEL = 57653 -const NESTED = 57654 -const NETWORK_NAMESPACE = 57655 -const NOWAIT = 57656 -const NULLS = 57657 -const OJ = 57658 -const OLD = 57659 -const OPTIONAL = 57660 -const ORDINALITY = 57661 -const ORGANIZATION = 57662 -const OTHERS = 57663 -const PATH = 57664 -const PERSIST = 57665 -const PERSIST_ONLY = 57666 -const PRECEDING = 57667 -const PRIVILEGE_CHECKS_USER = 57668 -const PROCESS = 57669 -const RANDOM = 57670 -const REFERENCE = 57671 -const REQUIRE_ROW_FORMAT = 57672 -const RESOURCE = 57673 -const RESPECT = 57674 -const RESTART = 57675 -const RETAIN = 57676 -const REUSE = 57677 -const ROLE = 57678 -const SECONDARY = 57679 -const SECONDARY_ENGINE = 57680 -const SECONDARY_LOAD = 57681 -const SECONDARY_UNLOAD = 57682 -const SKIP = 57683 -const SRID = 57684 -const THREAD_PRIORITY = 57685 -const TIES = 57686 -const UNBOUNDED = 57687 -const VCPU = 57688 -const VISIBLE = 57689 -const FORMAT = 57690 -const TREE = 57691 -const VITESS = 57692 -const TRADITIONAL = 57693 +const OUTFILE = 57379 +const S3 = 57380 +const VALUES = 57381 +const LAST_INSERT_ID = 57382 +const NEXT = 57383 +const VALUE = 57384 +const SHARE = 57385 +const MODE = 57386 +const SQL_NO_CACHE = 57387 +const SQL_CACHE = 57388 +const SQL_CALC_FOUND_ROWS = 57389 +const JOIN = 57390 +const STRAIGHT_JOIN = 57391 +const LEFT = 57392 +const RIGHT = 57393 +const INNER = 57394 +const OUTER = 57395 +const CROSS = 57396 +const NATURAL = 57397 +const USE = 57398 +const FORCE = 57399 +const ON = 57400 +const USING = 57401 +const ID = 57402 +const AT_ID = 57403 +const AT_AT_ID = 57404 +const HEX = 57405 +const STRING = 57406 +const INTEGRAL = 57407 +const FLOAT = 57408 +const HEXNUM = 57409 +const VALUE_ARG = 57410 +const LIST_ARG = 57411 +const COMMENT = 57412 +const COMMENT_KEYWORD = 57413 +const BIT_LITERAL = 57414 +const NULL = 57415 +const TRUE = 57416 +const FALSE = 57417 +const OFF = 57418 +const OR = 57419 +const XOR = 57420 +const AND = 57421 +const NOT = 57422 +const BETWEEN = 57423 +const CASE = 57424 +const WHEN = 57425 +const THEN = 57426 +const ELSE = 57427 +const END = 57428 +const LE = 57429 +const GE = 57430 +const NE = 57431 +const NULL_SAFE_EQUAL = 57432 +const IS = 57433 +const LIKE = 57434 +const REGEXP = 57435 +const IN = 57436 +const SHIFT_LEFT = 57437 +const SHIFT_RIGHT = 57438 +const DIV = 57439 +const MOD = 57440 +const UNARY = 57441 +const COLLATE = 57442 +const BINARY = 57443 +const UNDERSCORE_BINARY = 57444 +const UNDERSCORE_UTF8MB4 = 57445 +const UNDERSCORE_UTF8 = 57446 +const UNDERSCORE_LATIN1 = 57447 +const INTERVAL = 57448 +const JSON_EXTRACT_OP = 57449 +const JSON_UNQUOTE_EXTRACT_OP = 57450 +const CREATE = 57451 +const ALTER = 57452 +const DROP = 57453 +const RENAME = 57454 +const ANALYZE = 57455 +const ADD = 57456 +const FLUSH = 57457 +const SCHEMA = 57458 +const TABLE = 57459 +const INDEX = 57460 +const VIEW = 57461 +const TO = 57462 +const IGNORE = 57463 +const IF = 57464 +const UNIQUE = 57465 +const PRIMARY = 57466 +const COLUMN = 57467 +const SPATIAL = 57468 +const FULLTEXT = 57469 +const KEY_BLOCK_SIZE = 57470 +const CHECK = 57471 +const INDEXES = 57472 +const ACTION = 57473 +const CASCADE = 57474 +const CONSTRAINT = 57475 +const FOREIGN = 57476 +const NO = 57477 +const REFERENCES = 57478 +const RESTRICT = 57479 +const SHOW = 57480 +const DESCRIBE = 57481 +const EXPLAIN = 57482 +const DATE = 57483 +const ESCAPE = 57484 +const REPAIR = 57485 +const OPTIMIZE = 57486 +const TRUNCATE = 57487 +const MAXVALUE = 57488 +const PARTITION = 57489 +const REORGANIZE = 57490 +const LESS = 57491 +const THAN = 57492 +const PROCEDURE = 57493 +const TRIGGER = 57494 +const VINDEX = 57495 +const VINDEXES = 57496 +const STATUS = 57497 +const VARIABLES = 57498 +const WARNINGS = 57499 +const SEQUENCE = 57500 +const BEGIN = 57501 +const START = 57502 +const TRANSACTION = 57503 +const COMMIT = 57504 +const ROLLBACK = 57505 +const SAVEPOINT = 57506 +const RELEASE = 57507 +const WORK = 57508 +const BIT = 57509 +const TINYINT = 57510 +const SMALLINT = 57511 +const MEDIUMINT = 57512 +const INT = 57513 +const INTEGER = 57514 +const BIGINT = 57515 +const INTNUM = 57516 +const REAL = 57517 +const DOUBLE = 57518 +const FLOAT_TYPE = 57519 +const DECIMAL = 57520 +const NUMERIC = 57521 +const TIME = 57522 +const TIMESTAMP = 57523 +const DATETIME = 57524 +const YEAR = 57525 +const CHAR = 57526 +const VARCHAR = 57527 +const BOOL = 57528 +const CHARACTER = 57529 +const VARBINARY = 57530 +const NCHAR = 57531 +const TEXT = 57532 +const TINYTEXT = 57533 +const MEDIUMTEXT = 57534 +const LONGTEXT = 57535 +const BLOB = 57536 +const TINYBLOB = 57537 +const MEDIUMBLOB = 57538 +const LONGBLOB = 57539 +const JSON = 57540 +const ENUM = 57541 +const GEOMETRY = 57542 +const POINT = 57543 +const LINESTRING = 57544 +const POLYGON = 57545 +const GEOMETRYCOLLECTION = 57546 +const MULTIPOINT = 57547 +const MULTILINESTRING = 57548 +const MULTIPOLYGON = 57549 +const NULLX = 57550 +const AUTO_INCREMENT = 57551 +const APPROXNUM = 57552 +const SIGNED = 57553 +const UNSIGNED = 57554 +const ZEROFILL = 57555 +const COLLATION = 57556 +const DATABASES = 57557 +const TABLES = 57558 +const VITESS_METADATA = 57559 +const VSCHEMA = 57560 +const FULL = 57561 +const PROCESSLIST = 57562 +const COLUMNS = 57563 +const FIELDS = 57564 +const ENGINES = 57565 +const PLUGINS = 57566 +const EXTENDED = 57567 +const KEYSPACES = 57568 +const VITESS_KEYSPACES = 57569 +const VITESS_SHARDS = 57570 +const VITESS_TABLETS = 57571 +const NAMES = 57572 +const CHARSET = 57573 +const GLOBAL = 57574 +const SESSION = 57575 +const ISOLATION = 57576 +const LEVEL = 57577 +const READ = 57578 +const WRITE = 57579 +const ONLY = 57580 +const REPEATABLE = 57581 +const COMMITTED = 57582 +const UNCOMMITTED = 57583 +const SERIALIZABLE = 57584 +const CURRENT_TIMESTAMP = 57585 +const DATABASE = 57586 +const CURRENT_DATE = 57587 +const CURRENT_TIME = 57588 +const LOCALTIME = 57589 +const LOCALTIMESTAMP = 57590 +const UTC_DATE = 57591 +const UTC_TIME = 57592 +const UTC_TIMESTAMP = 57593 +const REPLACE = 57594 +const CONVERT = 57595 +const CAST = 57596 +const SUBSTR = 57597 +const SUBSTRING = 57598 +const GROUP_CONCAT = 57599 +const SEPARATOR = 57600 +const TIMESTAMPADD = 57601 +const TIMESTAMPDIFF = 57602 +const MATCH = 57603 +const AGAINST = 57604 +const BOOLEAN = 57605 +const LANGUAGE = 57606 +const WITH = 57607 +const QUERY = 57608 +const EXPANSION = 57609 +const UNUSED = 57610 +const ARRAY = 57611 +const CUME_DIST = 57612 +const DESCRIPTION = 57613 +const DENSE_RANK = 57614 +const EMPTY = 57615 +const EXCEPT = 57616 +const FIRST_VALUE = 57617 +const GROUPING = 57618 +const GROUPS = 57619 +const JSON_TABLE = 57620 +const LAG = 57621 +const LAST_VALUE = 57622 +const LATERAL = 57623 +const LEAD = 57624 +const MEMBER = 57625 +const NTH_VALUE = 57626 +const NTILE = 57627 +const OF = 57628 +const OVER = 57629 +const PERCENT_RANK = 57630 +const RANK = 57631 +const RECURSIVE = 57632 +const ROW_NUMBER = 57633 +const SYSTEM = 57634 +const WINDOW = 57635 +const ACTIVE = 57636 +const ADMIN = 57637 +const BUCKETS = 57638 +const CLONE = 57639 +const COMPONENT = 57640 +const DEFINITION = 57641 +const ENFORCED = 57642 +const EXCLUDE = 57643 +const FOLLOWING = 57644 +const GEOMCOLLECTION = 57645 +const GET_MASTER_PUBLIC_KEY = 57646 +const HISTOGRAM = 57647 +const HISTORY = 57648 +const INACTIVE = 57649 +const INVISIBLE = 57650 +const LOCKED = 57651 +const MASTER_COMPRESSION_ALGORITHMS = 57652 +const MASTER_PUBLIC_KEY_PATH = 57653 +const MASTER_TLS_CIPHERSUITES = 57654 +const MASTER_ZSTD_COMPRESSION_LEVEL = 57655 +const NESTED = 57656 +const NETWORK_NAMESPACE = 57657 +const NOWAIT = 57658 +const NULLS = 57659 +const OJ = 57660 +const OLD = 57661 +const OPTIONAL = 57662 +const ORDINALITY = 57663 +const ORGANIZATION = 57664 +const OTHERS = 57665 +const PATH = 57666 +const PERSIST = 57667 +const PERSIST_ONLY = 57668 +const PRECEDING = 57669 +const PRIVILEGE_CHECKS_USER = 57670 +const PROCESS = 57671 +const RANDOM = 57672 +const REFERENCE = 57673 +const REQUIRE_ROW_FORMAT = 57674 +const RESOURCE = 57675 +const RESPECT = 57676 +const RESTART = 57677 +const RETAIN = 57678 +const REUSE = 57679 +const ROLE = 57680 +const SECONDARY = 57681 +const SECONDARY_ENGINE = 57682 +const SECONDARY_LOAD = 57683 +const SECONDARY_UNLOAD = 57684 +const SKIP = 57685 +const SRID = 57686 +const THREAD_PRIORITY = 57687 +const TIES = 57688 +const UNBOUNDED = 57689 +const VCPU = 57690 +const VISIBLE = 57691 +const FORMAT = 57692 +const TREE = 57693 +const VITESS = 57694 +const TRADITIONAL = 57695 var yyToknames = [...]string{ "$end", @@ -509,6 +511,8 @@ var yyToknames = [...]string{ "KEYS", "DO", "DISTINCTROW", + "OUTFILE", + "S3", "VALUES", "LAST_INSERT_ID", "NEXT", @@ -856,1396 +860,1165 @@ var yyExca = [...]int{ -2, 0, -1, 44, 34, 312, - 133, 312, - 145, 312, - 170, 326, - 171, 326, + 135, 312, + 147, 312, + 172, 326, + 173, 326, -2, 314, -1, 49, - 135, 336, + 137, 336, -2, 334, -1, 72, - 39, 372, + 41, 372, -2, 380, - -1, 400, - 121, 706, - -2, 702, -1, 401, - 121, 707, - -2, 703, - -1, 415, - 39, 373, - -2, 385, + 123, 708, + -2, 704, + -1, 402, + 123, 709, + -2, 705, -1, 416, - 39, 374, + 41, 373, + -2, 385, + -1, 417, + 41, 374, -2, 386, - -1, 436, - 89, 961, - -2, 74, -1, 437, - 89, 876, + 91, 965, + -2, 74, + -1, 438, + 91, 879, -2, 75, - -1, 442, - 89, 843, - -2, 665, - -1, 444, - 89, 908, + -1, 443, + 91, 846, -2, 667, - -1, 947, - 121, 709, - -2, 705, - -1, 1032, - 57, 56, + -1, 445, + 91, 911, + -2, 669, + -1, 949, + 123, 711, + -2, 707, + -1, 1036, 59, 56, + 61, 56, -2, 60, - -1, 1382, + -1, 1388, 5, 624, 18, 624, 20, 624, 32, 624, - 60, 624, + 62, 624, -2, 411, } const yyPrivate = 57344 -const yyLast = 17958 +const yyLast = 18846 var yyAct = [...]int{ - 400, 1626, 1616, 1424, 972, 1308, 1054, 344, 1485, 1210, - 1498, 1532, 1230, 1583, 359, 1398, 1362, 617, 373, 408, - 1211, 1359, 1063, 1050, 1363, 1026, 736, 1097, 697, 1259, - 743, 1053, 71, 3, 1374, 1368, 1327, 1148, 1023, 92, - 598, 868, 934, 290, 441, 313, 290, 781, 941, 774, - 1067, 92, 1285, 290, 1005, 1012, 1028, 615, 887, 69, - 741, 417, 1276, 911, 746, 967, 330, 764, 28, 1093, - 763, 402, 346, 780, 1034, 566, 411, 67, 607, 897, - 92, 944, 778, 567, 290, 710, 290, 335, 753, 342, - 66, 8, 7, 72, 6, 711, 587, 438, 278, 771, - 1619, 276, 1603, 1116, 1614, 1591, 1083, 1611, 1425, 1602, - 1590, 1344, 1454, 571, 1197, 1392, 1247, 1115, 782, 1246, - 783, 331, 1248, 1044, 334, 74, 75, 76, 77, 78, - 79, 94, 95, 96, 1393, 1394, 403, 1045, 1046, 423, - 427, 286, 282, 283, 284, 630, 333, 332, 94, 95, - 96, 30, 1267, 1076, 60, 34, 35, 1488, 1084, 1114, - 1445, 1310, 435, 1558, 659, 658, 668, 669, 661, 662, - 663, 664, 665, 666, 667, 660, 1443, 385, 670, 391, - 392, 389, 390, 388, 387, 386, 625, 94, 95, 96, - 626, 623, 624, 393, 394, 323, 896, 325, 321, 856, - 279, 628, 604, 59, 606, 618, 619, 629, 620, 855, - 1312, 853, 1111, 1108, 1109, 1613, 1107, 1311, 1610, 1328, - 1584, 1307, 1006, 1576, 1068, 613, 277, 1634, 1541, 1533, - 1295, 588, 898, 899, 900, 1630, 603, 605, 1231, 1233, - 857, 429, 1070, 573, 1535, 854, 1313, 280, 861, 1118, - 1121, 633, 1304, 1070, 844, 1385, 1384, 1383, 1306, 576, - 1330, 569, 1291, 1292, 1293, 293, 281, 1128, 1565, 285, - 1127, 682, 683, 1467, 94, 95, 96, 290, 578, 579, - 1391, 1202, 290, 1177, 589, 1156, 1167, 1040, 290, 1113, - 757, 1164, 695, 1051, 290, 596, 594, 1332, 602, 1336, - 670, 1331, 1243, 1329, 583, 92, 660, 984, 1334, 670, - 650, 1112, 608, 1346, 92, 1534, 647, 1333, 968, 1574, - 1232, 94, 95, 96, 612, 1265, 92, 92, 1084, 601, - 1335, 1337, 650, 1550, 1294, 1589, 614, 1542, 1540, 1299, - 1296, 1287, 1297, 1290, 1559, 1286, 1069, 1372, 888, 1288, - 1289, 1628, 1077, 631, 1629, 1117, 1627, 1069, 883, 784, - 639, 643, 1305, 1298, 1303, 600, 814, 968, 846, 1174, - 1119, 632, 580, 1073, 581, 1411, 82, 582, 609, 610, - 1074, 590, 591, 592, 659, 658, 668, 669, 661, 662, - 663, 664, 665, 666, 667, 660, 682, 683, 670, 644, - 645, 682, 683, 663, 664, 665, 666, 667, 660, 918, - 779, 670, 61, 412, 680, 83, 94, 95, 96, 642, - 640, 1451, 641, 916, 917, 915, 92, 649, 647, 290, - 1579, 290, 290, 733, 92, 889, 1635, 734, 750, 1594, - 92, 1149, 1494, 698, 650, 884, 1141, 1142, 1143, 599, - 802, 438, 565, 659, 658, 668, 669, 661, 662, 663, - 664, 665, 666, 667, 660, 425, 1493, 670, 1280, 762, - 1279, 1268, 713, 715, 717, 719, 721, 723, 724, 747, - 1636, 339, 714, 716, 1371, 720, 722, 1596, 725, 1575, - 433, 815, 572, 906, 908, 909, 745, 1511, 1491, 735, - 907, 659, 658, 668, 669, 661, 662, 663, 664, 665, - 666, 667, 660, 1277, 881, 670, 873, 828, 831, 832, - 833, 834, 835, 836, 336, 837, 838, 839, 840, 841, - 816, 817, 818, 819, 800, 801, 829, 859, 803, 584, - 804, 805, 806, 807, 808, 809, 810, 811, 812, 813, - 820, 821, 822, 823, 824, 825, 826, 827, 661, 662, - 663, 664, 665, 666, 667, 660, 290, 412, 670, 428, - 842, 92, 986, 845, 59, 847, 290, 290, 92, 92, - 92, 574, 575, 1547, 290, 1163, 914, 1162, 290, 1161, - 1463, 290, 866, 867, 1546, 290, 1407, 92, 989, 990, - 1538, 1612, 92, 92, 92, 290, 92, 92, 648, 649, - 647, 1070, 985, 830, 1598, 412, 648, 649, 647, 92, - 92, 94, 95, 96, 1348, 936, 650, 1071, 843, 1538, - 1587, 648, 649, 647, 650, 850, 851, 852, 872, 870, - 648, 649, 647, 94, 95, 96, 646, 430, 431, 650, - 1549, 648, 649, 647, 871, 648, 649, 647, 650, 875, - 876, 877, 1360, 879, 880, 1371, 94, 95, 96, 650, - 1250, 935, 912, 650, 1538, 412, 885, 886, 1538, 1566, - 937, 891, 94, 95, 96, 1538, 1537, 862, 362, 361, - 364, 365, 366, 367, 92, 1483, 1482, 363, 368, 1469, - 412, 949, 950, 1466, 412, 1417, 1416, 893, 1413, 1414, - 68, 956, 959, 945, 1198, 1069, 30, 969, 1413, 1412, - 1066, 1064, 1415, 1065, 997, 412, 913, 92, 92, 951, - 1062, 1068, 1009, 412, 646, 412, 998, 946, 1198, 982, - 947, 1205, 1237, 1036, 1035, 92, 70, 1206, 1036, 1009, - 698, 1251, 290, 981, 1043, 92, 791, 790, 1180, 290, - 1009, 290, 1179, 991, 59, 412, 997, 1035, 59, 290, - 290, 290, 938, 939, 948, 945, 987, 92, 977, 978, - 92, 952, 953, 997, 1371, 958, 961, 962, 1037, 997, - 1039, 92, 567, 1037, 438, 1035, 860, 438, 1008, 1003, - 405, 1024, 947, 776, 651, 1604, 1500, 1078, 1055, 999, - 976, 30, 30, 979, 980, 658, 668, 669, 661, 662, - 663, 664, 665, 666, 667, 660, 1009, 1474, 670, 684, - 685, 686, 687, 688, 689, 690, 691, 692, 693, 1098, - 336, 1403, 1518, 1001, 1254, 290, 92, 1038, 92, 708, - 1120, 1042, 59, 1094, 290, 290, 290, 290, 290, 1041, - 1089, 290, 290, 59, 59, 290, 92, 1058, 1088, 1099, - 1033, 1375, 1376, 1309, 1501, 739, 742, 1101, 1014, 1017, - 1018, 1019, 1015, 290, 1016, 1020, 1621, 1617, 1608, 290, - 290, 290, 1405, 1378, 1360, 290, 92, 1281, 894, 864, - 1381, 1222, 1220, 1103, 1380, 1105, 1223, 1221, 1095, 1096, - 1219, 1218, 1085, 1086, 1087, 1014, 1017, 1018, 1019, 1015, - 1601, 1016, 1020, 1132, 1352, 1375, 1376, 1224, 1134, 1018, - 1019, 1187, 1138, 744, 912, 1606, 1196, 1195, 1272, 789, - 597, 1264, 1151, 1581, 1580, 1516, 1152, 668, 669, 661, - 662, 663, 664, 665, 666, 667, 660, 1159, 1160, 670, - 1262, 964, 1256, 1166, 737, 1461, 1169, 1170, 1496, 1104, - 863, 1158, 418, 409, 1176, 965, 738, 1022, 1178, 1144, - 1460, 1181, 1182, 1183, 1184, 1185, 419, 410, 913, 406, - 407, 70, 1194, 748, 749, 421, 1459, 420, 1355, 290, - 1193, 1198, 627, 1168, 401, 1623, 1622, 405, 1186, 1165, - 290, 290, 290, 290, 290, 890, 1212, 403, 1191, 758, - 1157, 751, 290, 1623, 1153, 1154, 290, 1563, 1227, 1228, - 290, 1489, 1173, 983, 68, 290, 290, 1200, 1207, 290, - 290, 290, 73, 93, 65, 1171, 1, 291, 1190, 312, - 291, 1615, 1249, 1426, 92, 93, 1497, 291, 1229, 1110, - 1252, 1201, 1199, 1255, 1582, 1531, 874, 1260, 1260, 1397, - 1061, 1055, 1052, 1238, 81, 564, 1225, 1240, 1214, 1215, - 1213, 1217, 80, 1216, 93, 870, 1235, 1236, 291, 1241, - 291, 1244, 1573, 892, 882, 611, 1060, 1261, 1059, 1539, - 1266, 1075, 92, 92, 418, 1487, 1404, 1271, 1263, 1273, - 1274, 1275, 901, 902, 903, 904, 1257, 1258, 419, 1203, - 1578, 797, 795, 796, 794, 415, 416, 421, 799, 420, - 798, 793, 92, 305, 910, 895, 322, 919, 920, 921, - 922, 923, 924, 925, 926, 927, 928, 929, 930, 931, - 932, 933, 1278, 1079, 1080, 1081, 1082, 92, 1321, 1322, - 1283, 1300, 1021, 935, 785, 1100, 752, 954, 955, 1090, - 1091, 1092, 84, 1284, 1324, 1302, 1301, 1106, 1072, 302, - 621, 622, 307, 1317, 275, 1326, 1269, 1270, 1325, 1314, - 678, 1192, 1315, 290, 973, 1349, 1316, 1245, 439, 432, - 1339, 1366, 1345, 92, 1323, 1338, 988, 740, 1458, 92, - 92, 1354, 1172, 1212, 707, 1361, 966, 767, 345, 946, - 1324, 905, 947, 1358, 360, 1364, 357, 358, 992, 1204, - 652, 343, 337, 766, 1382, 92, 759, 1013, 290, 1011, - 1010, 772, 1377, 1373, 765, 996, 414, 963, 1557, 1453, - 1049, 1379, 92, 413, 92, 92, 52, 33, 1260, 1260, - 1396, 327, 635, 422, 23, 22, 21, 20, 19, 1055, - 1386, 1055, 25, 1410, 18, 17, 1388, 16, 1400, 585, - 37, 291, 290, 1395, 27, 26, 291, 1401, 1402, 15, - 14, 13, 291, 1408, 1409, 12, 11, 10, 291, 9, - 5, 4, 290, 638, 24, 696, 2, 0, 92, 93, - 1427, 92, 92, 92, 290, 0, 0, 0, 93, 0, - 0, 0, 0, 0, 0, 1370, 0, 0, 1435, 0, - 93, 93, 1437, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1446, 1447, 1436, 0, 0, 0, 0, - 0, 1387, 1419, 1389, 0, 1390, 1432, 1433, 0, 0, - 1441, 0, 0, 0, 0, 0, 0, 1420, 0, 1422, - 1464, 1465, 0, 1468, 0, 0, 0, 0, 0, 1212, - 0, 0, 0, 1462, 0, 0, 0, 0, 0, 0, - 0, 1479, 1471, 0, 0, 0, 92, 0, 1145, 1146, - 1147, 1470, 1252, 0, 92, 0, 0, 0, 0, 0, - 0, 0, 0, 1055, 0, 0, 0, 0, 1480, 92, - 0, 0, 0, 0, 0, 0, 92, 0, 0, 0, - 93, 0, 0, 291, 1175, 291, 291, 0, 93, 0, - 1504, 0, 0, 1499, 93, 0, 0, 0, 0, 0, - 0, 1188, 1189, 742, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1502, 0, 0, 0, 92, 92, 0, - 92, 0, 0, 1510, 0, 92, 1495, 92, 92, 92, - 290, 1526, 1364, 1524, 92, 1525, 1527, 1528, 1517, 1515, - 1523, 0, 0, 0, 0, 0, 0, 0, 1519, 1536, - 1530, 92, 290, 1481, 1543, 1529, 0, 0, 0, 1551, - 1553, 1554, 1555, 1556, 1544, 1560, 1545, 1561, 1562, 1490, - 0, 1492, 0, 0, 0, 0, 0, 0, 0, 0, - 1567, 0, 1568, 1569, 1572, 1564, 0, 1364, 0, 92, - 0, 0, 1570, 1571, 0, 0, 1503, 0, 0, 0, - 92, 92, 0, 0, 0, 0, 0, 1586, 0, 0, - 1585, 0, 1588, 0, 0, 0, 92, 1499, 1055, 0, - 291, 1212, 0, 1592, 0, 93, 0, 290, 0, 0, - 291, 291, 93, 93, 93, 92, 0, 1597, 291, 0, - 0, 0, 291, 1600, 0, 291, 0, 0, 0, 291, - 0, 93, 0, 0, 1607, 92, 93, 93, 93, 291, - 93, 93, 1605, 1609, 0, 0, 0, 0, 1620, 0, - 0, 0, 0, 93, 93, 1631, 0, 0, 1457, 1632, - 1633, 1319, 1320, 0, 0, 0, 0, 0, 0, 0, - 1347, 0, 0, 0, 0, 0, 1340, 1341, 0, 1342, - 1343, 0, 0, 0, 0, 0, 0, 0, 1456, 0, - 0, 1350, 1351, 0, 1356, 0, 0, 0, 0, 659, - 658, 668, 669, 661, 662, 663, 664, 665, 666, 667, - 660, 1438, 1439, 670, 1440, 0, 0, 1442, 0, 1444, - 0, 0, 0, 0, 374, 29, 0, 0, 93, 659, - 658, 668, 669, 661, 662, 663, 664, 665, 666, 667, - 660, 0, 0, 670, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 29, 0, 0, 0, 0, 0, - 0, 93, 93, 0, 94, 95, 96, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1406, 0, 0, 93, - 0, 0, 1484, 0, 0, 0, 291, 0, 0, 93, - 0, 0, 404, 291, 0, 291, 0, 0, 0, 0, - 0, 0, 0, 291, 291, 291, 0, 0, 0, 0, - 0, 93, 0, 0, 93, 0, 0, 0, 294, 0, - 0, 371, 0, 0, 0, 93, 0, 297, 0, 654, - 1434, 657, 0, 0, 0, 306, 0, 671, 672, 673, - 674, 675, 676, 677, 1455, 655, 656, 653, 659, 658, - 668, 669, 661, 662, 663, 664, 665, 666, 667, 660, - 91, 336, 670, 0, 0, 0, 0, 0, 1472, 304, - 0, 1473, 324, 0, 1475, 311, 0, 0, 0, 291, - 93, 0, 93, 0, 0, 0, 0, 0, 291, 291, - 291, 291, 291, 1450, 0, 291, 291, 0, 0, 291, - 93, 440, 0, 0, 0, 295, 0, 0, 1449, 0, - 0, 0, 0, 0, 0, 0, 0, 291, 0, 0, - 0, 0, 0, 291, 291, 291, 1448, 0, 0, 291, - 93, 0, 308, 298, 0, 309, 310, 317, 0, 0, - 0, 301, 303, 314, 299, 300, 319, 318, 0, 296, - 316, 315, 0, 0, 0, 1514, 336, 0, 0, 0, - 1505, 1506, 1507, 1508, 1509, 0, 0, 0, 1512, 1513, - 0, 0, 0, 659, 658, 668, 669, 661, 662, 663, - 664, 665, 666, 667, 660, 0, 0, 670, 659, 658, - 668, 669, 661, 662, 663, 664, 665, 666, 667, 660, - 0, 0, 670, 0, 0, 0, 659, 658, 668, 669, - 661, 662, 663, 664, 665, 666, 667, 660, 0, 0, - 670, 0, 0, 0, 0, 0, 0, 0, 0, 616, - 0, 0, 0, 291, 0, 0, 0, 0, 616, 0, - 0, 0, 0, 0, 291, 291, 291, 291, 291, 0, - 0, 0, 29, 0, 0, 0, 291, 0, 0, 0, - 291, 0, 0, 0, 291, 679, 681, 0, 0, 291, - 291, 0, 0, 291, 291, 291, 659, 658, 668, 669, - 661, 662, 663, 664, 665, 666, 667, 660, 93, 0, - 670, 0, 0, 0, 0, 0, 694, 0, 0, 0, - 699, 700, 701, 702, 703, 704, 705, 706, 0, 709, - 712, 712, 712, 718, 712, 712, 718, 712, 726, 727, - 728, 729, 730, 731, 732, 0, 440, 0, 0, 29, - 1624, 0, 0, 0, 0, 440, 93, 93, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 634, 636, 1318, - 0, 0, 0, 0, 0, 768, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 93, 0, 0, 659, - 658, 668, 669, 661, 662, 663, 664, 665, 666, 667, - 660, 1150, 0, 670, 0, 0, 0, 0, 0, 0, - 0, 93, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 659, 658, 668, 669, 661, 662, 663, 664, 665, - 666, 667, 660, 0, 0, 670, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 291, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 93, 0, 0, - 0, 0, 0, 93, 93, 0, 0, 755, 0, 0, - 0, 0, 0, 0, 0, 440, 0, 0, 0, 0, - 0, 786, 0, 0, 0, 0, 0, 0, 0, 93, - 0, 0, 291, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 93, 0, 93, 93, - 0, 0, 0, 0, 0, 616, 0, 0, 0, 0, - 0, 0, 616, 616, 616, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 291, 0, 0, 0, - 0, 616, 0, 0, 0, 0, 616, 616, 616, 0, - 616, 616, 0, 0, 0, 0, 291, 0, 0, 0, - 0, 0, 93, 616, 616, 93, 93, 93, 291, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 440, 0, 0, 0, 0, 0, 0, 440, - 440, 440, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 440, 0, - 0, 0, 0, 440, 440, 440, 0, 440, 440, 0, - 93, 0, 0, 0, 0, 0, 0, 0, 93, 0, - 440, 440, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 93, 0, 0, 0, 0, 0, 0, - 93, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1025, 0, 0, 0, 0, 0, 0, - 0, 93, 93, 0, 93, 0, 0, 0, 769, 93, - 0, 93, 93, 93, 291, 940, 0, 440, 93, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 970, 0, 0, 0, 93, 291, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 974, 975, - 0, 288, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 326, 0, 0, 0, 0, 993, 0, 0, 0, - 616, 0, 616, 93, 0, 0, 755, 0, 0, 440, - 0, 0, 0, 0, 93, 93, 0, 0, 0, 0, - 616, 0, 568, 0, 570, 0, 0, 0, 440, 0, - 93, 440, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 291, 440, 0, 0, 0, 0, 0, 0, 93, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 93, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 440, 0, 440, - 1155, 0, 0, 404, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 440, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, - 31, 32, 60, 34, 35, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1140, 0, 64, - 0, 0, 0, 768, 36, 55, 56, 0, 58, 0, - 1208, 1209, 0, 0, 768, 768, 768, 768, 768, 0, - 372, 0, 0, 0, 0, 0, 0, 45, 0, 0, - 1025, 59, 1234, 0, 0, 0, 0, 0, 0, 768, - 0, 0, 0, 768, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 289, 0, 577, 320, 0, 0, 0, - 586, 0, 0, 289, 0, 0, 593, 0, 0, 0, - 0, 0, 595, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 426, 426, 38, 39, 41, - 40, 43, 0, 57, 289, 0, 289, 616, 0, 0, - 970, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 44, 63, 62, 0, - 0, 53, 54, 42, 0, 0, 616, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 46, 47, 0, - 48, 49, 50, 51, 0, 440, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1282, 440, 0, 0, 0, 0, 0, - 0, 1365, 0, 29, 0, 0, 0, 761, 0, 0, - 773, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 440, 0, 0, 0, 0, 0, 0, - 61, 0, 768, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 440, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 440, + 401, 1634, 1624, 1431, 1591, 1313, 345, 1215, 1506, 1540, + 1493, 1368, 1235, 1054, 1404, 360, 1216, 1030, 619, 374, + 1365, 1058, 1369, 1081, 738, 71, 3, 1264, 409, 699, + 1087, 1101, 1067, 745, 600, 1057, 331, 1332, 1027, 92, + 1202, 1152, 870, 291, 1380, 314, 291, 771, 1281, 936, + 1071, 92, 442, 291, 1374, 889, 1290, 1009, 776, 943, + 783, 1032, 69, 1016, 418, 743, 347, 766, 748, 969, + 403, 28, 765, 913, 782, 1097, 568, 755, 1038, 609, + 92, 67, 946, 92, 291, 617, 291, 780, 336, 773, + 289, 332, 72, 899, 335, 66, 712, 8, 439, 7, + 327, 343, 1627, 713, 1120, 6, 279, 1611, 1622, 277, + 1599, 589, 1619, 1432, 1610, 1598, 1349, 1461, 1119, 573, + 94, 95, 96, 1398, 74, 75, 76, 77, 78, 79, + 784, 570, 785, 572, 287, 283, 284, 285, 1048, 404, + 1399, 1400, 30, 424, 428, 60, 34, 35, 1049, 1050, + 632, 94, 95, 96, 1252, 1315, 334, 1251, 333, 627, + 1253, 1272, 1118, 628, 625, 626, 1080, 436, 1566, 661, + 660, 670, 671, 663, 664, 665, 666, 667, 668, 669, + 662, 1496, 386, 672, 392, 393, 390, 391, 389, 388, + 387, 606, 1088, 608, 1452, 1450, 59, 324, 394, 395, + 94, 95, 96, 898, 326, 322, 620, 621, 280, 858, + 630, 1316, 631, 622, 1317, 1115, 1112, 1113, 857, 1111, + 855, 1621, 1618, 1333, 1584, 605, 607, 1592, 1312, 1010, + 1407, 615, 1638, 1642, 278, 1549, 1541, 1236, 1238, 1074, + 30, 31, 32, 60, 34, 35, 900, 901, 902, 590, + 859, 1543, 1122, 1125, 856, 281, 575, 430, 1318, 863, + 64, 635, 286, 846, 1335, 36, 55, 56, 1074, 58, + 1309, 1573, 578, 94, 95, 96, 1311, 1391, 291, 580, + 581, 1390, 1389, 291, 571, 591, 294, 282, 1132, 291, + 45, 1131, 1117, 1475, 59, 291, 598, 684, 685, 604, + 1055, 1337, 1397, 1341, 1248, 1336, 92, 1334, 1171, 1207, + 1168, 1181, 1339, 1160, 1116, 92, 1044, 759, 603, 1237, + 672, 1338, 1542, 697, 988, 579, 596, 92, 92, 890, + 588, 602, 614, 585, 1340, 1342, 595, 610, 652, 1582, + 1597, 1088, 597, 1300, 616, 1073, 1550, 1548, 633, 1567, + 1636, 885, 816, 1637, 641, 1635, 662, 1558, 1121, 672, + 38, 39, 41, 40, 43, 82, 57, 649, 1378, 786, + 646, 647, 645, 1123, 1073, 651, 649, 1296, 1297, 1298, + 611, 612, 1310, 652, 1308, 94, 95, 96, 970, 44, + 63, 62, 652, 1167, 53, 54, 42, 592, 593, 594, + 634, 582, 1351, 583, 83, 61, 584, 848, 1270, 682, + 46, 47, 574, 48, 49, 50, 51, 601, 891, 1587, + 684, 685, 684, 685, 781, 1643, 644, 92, 642, 920, + 291, 736, 291, 291, 643, 92, 752, 735, 804, 1418, + 886, 92, 1602, 918, 919, 917, 970, 700, 1178, 1299, + 650, 651, 649, 439, 1304, 1301, 1292, 1302, 1295, 1077, + 1291, 1145, 1146, 1147, 1293, 1294, 1078, 1502, 652, 1501, + 764, 1644, 1285, 1284, 908, 910, 911, 763, 1303, 817, + 775, 909, 1273, 749, 715, 717, 719, 721, 723, 725, + 726, 716, 718, 1604, 722, 724, 1583, 727, 747, 737, + 59, 576, 577, 61, 434, 830, 833, 834, 835, 836, + 837, 838, 916, 839, 840, 841, 842, 843, 818, 819, + 820, 821, 802, 803, 831, 1519, 805, 1499, 806, 807, + 808, 809, 810, 811, 812, 813, 814, 815, 822, 823, + 824, 825, 826, 827, 828, 829, 661, 660, 670, 671, + 663, 664, 665, 666, 667, 668, 669, 662, 1465, 1282, + 672, 665, 666, 667, 668, 669, 662, 883, 291, 672, + 875, 861, 844, 92, 429, 847, 586, 849, 291, 291, + 92, 92, 92, 94, 95, 96, 291, 938, 413, 1166, + 291, 1165, 1377, 291, 868, 869, 1555, 291, 1554, 92, + 1414, 832, 1203, 1153, 92, 92, 92, 291, 92, 92, + 650, 651, 649, 993, 994, 794, 1203, 650, 651, 649, + 1075, 92, 92, 1546, 1620, 850, 851, 59, 652, 94, + 95, 96, 1471, 860, 874, 652, 990, 775, 1606, 413, + 867, 663, 664, 665, 666, 667, 668, 669, 662, 872, + 1013, 672, 431, 432, 880, 94, 95, 96, 845, 1255, + 1546, 1595, 1546, 413, 1377, 852, 853, 854, 650, 651, + 649, 1546, 1574, 937, 68, 914, 1546, 1545, 989, 864, + 893, 974, 939, 1242, 873, 1039, 652, 1491, 1490, 877, + 878, 879, 1366, 881, 882, 1377, 92, 650, 651, 649, + 1002, 650, 651, 649, 1477, 413, 887, 888, 648, 1353, + 895, 70, 958, 961, 1557, 652, 947, 1422, 971, 652, + 1474, 413, 915, 363, 362, 365, 366, 367, 368, 92, + 92, 413, 364, 369, 953, 1018, 1021, 1022, 1023, 1019, + 948, 1020, 1024, 1424, 1423, 1381, 1382, 92, 1314, 1001, + 949, 1420, 1421, 412, 291, 700, 1001, 92, 1420, 1419, + 1040, 291, 1013, 291, 983, 1001, 413, 1013, 413, 1256, + 30, 291, 291, 291, 995, 648, 413, 1047, 947, 92, + 950, 1184, 92, 1040, 954, 955, 940, 941, 960, 963, + 964, 979, 980, 92, 92, 1210, 1028, 439, 793, 792, + 439, 1004, 1007, 1211, 1183, 1001, 1012, 1041, 1008, 1043, + 1011, 1059, 949, 978, 1003, 406, 981, 982, 30, 1039, + 1036, 991, 862, 778, 59, 30, 1083, 1084, 1085, 1086, + 1041, 1509, 1039, 1612, 1005, 402, 1013, 1508, 1089, 1090, + 1091, 1082, 1094, 1095, 1096, 1482, 1102, 291, 92, 1410, + 92, 1526, 1124, 1042, 1046, 1259, 291, 291, 291, 291, + 291, 1098, 1037, 291, 291, 1093, 1045, 291, 92, 59, + 1062, 1092, 59, 1105, 93, 1103, 1381, 1382, 292, 59, + 1629, 292, 1625, 1412, 1384, 291, 93, 1366, 292, 1286, + 896, 291, 291, 291, 1106, 866, 1227, 291, 92, 1387, + 1386, 1228, 1224, 1126, 1127, 1128, 1129, 1130, 1225, 1223, + 1133, 1134, 1616, 1226, 1135, 93, 1099, 1100, 93, 292, + 1229, 292, 1022, 1023, 1138, 1609, 1358, 1192, 1142, 746, + 1614, 1201, 1137, 1107, 1200, 1109, 1357, 914, 1191, 739, + 1141, 1277, 791, 599, 1143, 1269, 656, 966, 659, 1589, + 1588, 740, 1524, 1136, 673, 674, 675, 676, 677, 678, + 679, 967, 657, 658, 655, 661, 660, 670, 671, 663, + 664, 665, 666, 667, 668, 669, 662, 1267, 1261, 672, + 1469, 1504, 1162, 986, 915, 1108, 865, 1026, 407, 408, + 410, 1148, 660, 670, 671, 663, 664, 665, 666, 667, + 668, 669, 662, 291, 1199, 672, 1468, 411, 1190, 70, + 1467, 1361, 1198, 1203, 291, 291, 291, 291, 291, 1217, + 1196, 1161, 404, 629, 1631, 1630, 291, 1157, 1158, 1172, + 291, 1169, 892, 760, 291, 1212, 753, 1631, 1177, 291, + 291, 1205, 1571, 291, 291, 291, 1497, 987, 1175, 1208, + 406, 68, 73, 65, 1, 1234, 1254, 1195, 92, 1018, + 1021, 1022, 1023, 1019, 313, 1020, 1024, 1260, 1206, 1623, + 1204, 1265, 1265, 1433, 1505, 1114, 1059, 1243, 1590, 1257, + 1539, 1245, 1219, 1220, 1403, 1222, 1218, 1244, 1230, 1221, + 1065, 1056, 81, 566, 1241, 1240, 80, 872, 1581, 1266, + 884, 1276, 1246, 1278, 1279, 1280, 92, 92, 1249, 613, + 1064, 1063, 1547, 292, 1274, 1275, 1271, 1079, 292, 1495, + 1262, 1263, 1411, 1268, 292, 1586, 799, 797, 798, 419, + 292, 796, 801, 800, 795, 306, 92, 897, 323, 1025, + 787, 93, 1283, 420, 1104, 754, 84, 1289, 1307, 1306, + 93, 419, 750, 751, 422, 1110, 421, 1076, 303, 623, + 624, 92, 93, 93, 308, 420, 276, 937, 680, 1305, + 1197, 1250, 440, 433, 416, 417, 422, 1372, 421, 1329, + 985, 992, 742, 1466, 1360, 1176, 709, 1331, 968, 769, + 346, 1322, 1288, 1320, 907, 1330, 361, 1321, 291, 358, + 1354, 359, 996, 1209, 654, 1344, 344, 338, 92, 1350, + 768, 761, 1017, 1015, 92, 92, 1343, 1217, 1367, 1328, + 1014, 1319, 774, 1383, 948, 1379, 1329, 767, 1000, 415, + 965, 1370, 1565, 1460, 949, 414, 52, 1364, 33, 328, + 92, 637, 423, 291, 23, 1359, 670, 671, 663, 664, + 665, 666, 667, 668, 669, 662, 1376, 92, 672, 92, + 92, 22, 93, 1265, 1265, 292, 1385, 292, 292, 21, + 93, 20, 19, 25, 18, 1059, 93, 1059, 1417, 17, + 1402, 1394, 1393, 16, 1395, 587, 1396, 291, 1415, 1416, + 1408, 1409, 1401, 1406, 1392, 37, 27, 26, 15, 14, + 13, 12, 11, 426, 10, 9, 5, 291, 4, 640, + 24, 698, 2, 92, 0, 1434, 92, 92, 92, 291, + 0, 0, 0, 0, 0, 0, 0, 1426, 0, 0, + 0, 0, 0, 0, 1425, 0, 0, 0, 0, 0, + 0, 0, 1427, 0, 1429, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1428, 1439, 1440, 1445, 1446, 1443, + 1447, 0, 337, 1449, 0, 1451, 1438, 0, 0, 1448, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 951, 952, 0, 0, 1217, 0, 0, 0, 1470, 0, + 0, 0, 0, 0, 1479, 0, 0, 0, 0, 0, + 0, 0, 92, 292, 0, 0, 0, 0, 93, 0, + 1478, 92, 0, 292, 292, 93, 93, 93, 984, 0, + 1059, 292, 0, 1257, 0, 292, 92, 1488, 292, 1492, + 0, 0, 292, 92, 93, 1489, 375, 29, 0, 93, + 93, 93, 292, 93, 93, 0, 0, 1512, 0, 0, + 1498, 1507, 1500, 0, 0, 0, 93, 93, 0, 0, + 0, 0, 0, 0, 0, 0, 29, 0, 1510, 0, + 0, 0, 0, 0, 0, 92, 92, 1511, 92, 0, + 0, 0, 0, 92, 0, 92, 92, 92, 291, 1518, + 0, 1370, 92, 1532, 1525, 1533, 1535, 1536, 1523, 1527, + 0, 0, 0, 0, 405, 1537, 1544, 1531, 0, 92, + 291, 1503, 1552, 1551, 1553, 0, 0, 1538, 0, 1559, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 93, 0, 0, 0, 0, 0, 0, 1572, 0, + 0, 0, 1580, 0, 0, 0, 1370, 92, 0, 1579, + 1578, 0, 0, 0, 0, 0, 0, 1560, 92, 92, + 0, 0, 0, 0, 93, 93, 1593, 0, 0, 0, + 0, 0, 0, 0, 92, 0, 1507, 1059, 1217, 1600, + 1594, 0, 93, 0, 0, 291, 0, 0, 0, 292, + 0, 0, 93, 92, 0, 0, 292, 0, 292, 0, + 0, 1608, 0, 0, 0, 0, 292, 292, 292, 0, + 0, 1613, 1615, 92, 93, 0, 0, 93, 94, 95, + 96, 1155, 0, 1617, 0, 1156, 1628, 0, 93, 93, + 0, 0, 1603, 1639, 0, 0, 1163, 1164, 0, 0, + 0, 0, 1170, 653, 0, 1173, 1174, 0, 0, 0, + 0, 0, 0, 1180, 0, 0, 0, 1182, 0, 0, + 1185, 1186, 1187, 1188, 1189, 0, 0, 0, 0, 0, + 0, 0, 295, 0, 0, 0, 0, 0, 0, 337, + 0, 298, 292, 93, 0, 93, 0, 0, 710, 307, + 0, 292, 292, 292, 292, 292, 0, 0, 292, 292, + 0, 0, 292, 93, 0, 0, 0, 0, 0, 1232, + 1233, 0, 0, 0, 741, 744, 0, 0, 0, 0, + 292, 0, 0, 305, 0, 1464, 292, 292, 292, 312, + 0, 0, 292, 93, 0, 0, 0, 0, 0, 0, + 0, 0, 618, 0, 0, 0, 0, 0, 0, 0, + 0, 618, 0, 0, 0, 0, 0, 0, 0, 296, + 0, 0, 0, 0, 0, 29, 661, 660, 670, 671, + 663, 664, 665, 666, 667, 668, 669, 662, 681, 683, + 672, 0, 0, 0, 0, 0, 309, 299, 0, 310, + 311, 318, 0, 0, 0, 302, 304, 315, 300, 301, + 320, 319, 0, 297, 317, 316, 0, 0, 372, 696, + 0, 0, 0, 701, 702, 703, 704, 705, 706, 707, + 708, 0, 711, 714, 714, 714, 720, 714, 714, 720, + 714, 728, 729, 730, 731, 732, 733, 734, 292, 1326, + 1327, 0, 29, 0, 0, 0, 0, 91, 0, 292, + 292, 292, 292, 292, 413, 0, 0, 0, 0, 325, + 0, 292, 0, 0, 0, 292, 0, 0, 770, 292, + 0, 0, 0, 0, 292, 292, 1463, 1458, 292, 292, + 292, 0, 0, 0, 0, 0, 0, 0, 441, 0, + 0, 569, 1457, 93, 661, 660, 670, 671, 663, 664, + 665, 666, 667, 668, 669, 662, 876, 0, 672, 0, + 0, 0, 0, 0, 0, 0, 1388, 661, 660, 670, + 671, 663, 664, 665, 666, 667, 668, 669, 662, 0, + 0, 672, 0, 894, 0, 0, 0, 0, 0, 0, + 0, 93, 93, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 903, 904, 905, 906, 0, 0, 0, 661, + 660, 670, 671, 663, 664, 665, 666, 667, 668, 669, + 662, 93, 0, 672, 661, 660, 670, 671, 663, 664, + 665, 666, 667, 668, 669, 662, 0, 0, 672, 0, + 0, 0, 0, 0, 0, 0, 93, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 956, 957, 618, + 1442, 0, 0, 0, 1444, 1456, 618, 618, 618, 0, + 0, 0, 0, 0, 0, 1453, 1454, 0, 0, 0, + 0, 0, 0, 292, 0, 618, 0, 0, 0, 1323, + 618, 618, 618, 93, 618, 618, 0, 0, 0, 93, + 93, 0, 0, 1472, 1473, 0, 1476, 618, 618, 661, + 660, 670, 671, 663, 664, 665, 666, 667, 668, 669, + 662, 0, 0, 672, 1487, 93, 0, 0, 292, 0, + 0, 0, 0, 0, 0, 1455, 0, 0, 0, 0, + 1053, 0, 93, 0, 93, 93, 0, 661, 660, 670, + 671, 663, 664, 665, 666, 667, 668, 669, 662, 0, + 0, 672, 0, 0, 441, 0, 0, 0, 0, 0, + 0, 0, 292, 441, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 340, 636, 638, 0, 0, 0, + 0, 0, 292, 0, 0, 0, 0, 0, 93, 0, + 0, 93, 93, 93, 292, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1534, 661, 660, 670, + 671, 663, 664, 665, 666, 667, 668, 669, 662, 0, + 0, 672, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1561, 1562, 1563, 1564, 1154, + 1568, 0, 1569, 1570, 0, 0, 0, 1029, 0, 0, + 0, 0, 0, 0, 0, 1575, 0, 1576, 1577, 661, + 660, 670, 671, 663, 664, 665, 666, 667, 668, 669, + 662, 0, 0, 672, 0, 757, 0, 93, 0, 0, + 0, 0, 0, 441, 0, 0, 93, 1596, 0, 788, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 93, 0, 0, 0, 0, 0, 0, 93, 0, + 0, 0, 1605, 0, 1179, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 618, 0, 618, 0, 0, 0, + 0, 0, 0, 1193, 1194, 744, 0, 0, 0, 0, + 0, 0, 0, 0, 618, 0, 0, 0, 0, 0, + 93, 93, 0, 93, 1640, 1641, 0, 0, 93, 0, + 93, 93, 93, 292, 0, 0, 0, 93, 661, 660, + 670, 671, 663, 664, 665, 666, 667, 668, 669, 662, + 0, 0, 672, 0, 93, 292, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 441, 93, 0, 1159, 0, 0, 405, 441, 441, + 441, 0, 0, 93, 93, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 441, 0, 93, + 0, 0, 441, 441, 441, 0, 441, 441, 0, 0, + 292, 0, 0, 0, 0, 0, 0, 0, 93, 441, + 441, 0, 0, 0, 0, 0, 0, 0, 0, 770, + 0, 0, 0, 0, 0, 0, 1213, 1214, 93, 0, + 770, 770, 770, 770, 770, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1029, 0, 1239, 0, + 0, 0, 0, 0, 0, 770, 0, 0, 0, 770, + 0, 0, 1352, 686, 687, 688, 689, 690, 691, 692, + 693, 694, 695, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 942, 0, 441, 1362, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 972, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 976, 977, 0, + 0, 0, 0, 618, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 997, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 757, 0, 0, 441, 0, + 0, 0, 618, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 441, 0, 0, + 441, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 441, 569, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 289, 0, 0, - 0, 0, 289, 0, 440, 0, 0, 970, 289, 0, - 1367, 1369, 0, 0, 289, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1369, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1452, - 0, 0, 0, 440, 792, 440, 1399, 0, 0, 0, - 0, 0, 0, 0, 848, 849, 0, 0, 0, 0, - 0, 0, 858, 0, 0, 0, 773, 0, 0, 865, - 0, 0, 0, 0, 0, 0, 0, 0, 1476, 1477, - 1478, 0, 0, 878, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1423, - 0, 0, 1428, 1429, 1430, 0, 0, 0, 0, 0, - 0, 0, 0, 616, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 426, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 289, - 0, 289, 775, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1365, 0, - 29, 0, 0, 970, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 440, 0, 0, - 0, 1548, 0, 0, 0, 1486, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1371, 0, + 29, 0, 0, 0, 0, 0, 441, 1462, 441, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 440, 0, 0, 1365, 0, 0, 0, 440, 0, 0, + 0, 0, 0, 0, 0, 337, 441, 0, 0, 770, + 0, 0, 1480, 0, 0, 1481, 0, 0, 1483, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1000, 0, 0, 0, 0, 0, 0, 1004, 0, 1007, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1032, - 0, 0, 0, 0, 0, 0, 0, 0, 1520, 1521, - 0, 1522, 0, 0, 0, 0, 1486, 0, 1486, 1486, - 1486, 0, 0, 0, 0, 1399, 289, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 289, 289, 0, 0, - 0, 0, 1486, 0, 289, 0, 0, 0, 289, 0, - 0, 289, 0, 0, 0, 869, 0, 0, 1618, 0, - 0, 0, 0, 0, 0, 289, 0, 0, 0, 0, - 0, 0, 0, 1102, 0, 0, 0, 0, 0, 0, - 1577, 0, 1122, 1123, 1124, 1125, 1126, 0, 0, 1129, - 1130, 440, 440, 1131, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 970, 0, 1593, 0, 0, - 0, 1133, 0, 0, 0, 0, 0, 0, 0, 1137, - 0, 0, 0, 1139, 0, 0, 1599, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1486, 0, 0, 0, - 0, 0, 0, 0, 0, 426, 869, 0, 0, 0, - 426, 426, 0, 0, 426, 426, 426, 0, 0, 0, - 971, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 426, - 426, 426, 426, 426, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 289, 0, 0, 0, 0, 0, 869, 289, - 0, 289, 0, 0, 0, 0, 0, 0, 0, 289, - 1030, 289, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1239, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 373, 0, 0, + 0, 1522, 337, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1459, 0, 0, 912, + 0, 0, 921, 922, 923, 924, 925, 926, 927, 928, + 929, 930, 931, 932, 933, 934, 935, 0, 0, 0, + 290, 0, 0, 321, 0, 0, 0, 0, 0, 0, + 290, 972, 0, 0, 0, 0, 1484, 1485, 1486, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 427, 427, 0, 0, 0, 0, 0, 975, + 0, 290, 0, 290, 0, 0, 0, 0, 0, 0, + 0, 0, 618, 0, 0, 0, 441, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 289, 0, 0, 0, 0, - 0, 0, 0, 0, 289, 289, 289, 289, 289, 0, - 0, 289, 289, 0, 0, 289, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 289, 0, 0, 0, 0, 0, 1135, - 1136, 289, 0, 0, 0, 289, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1371, 0, + 29, 0, 0, 0, 1287, 441, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1556, 0, 0, 441, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 426, 426, 0, 0, 0, 0, 0, + 0, 0, 0, 1371, 0, 0, 0, 0, 0, 441, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1353, 0, 0, 426, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 441, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 426, 289, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 971, - 289, 289, 289, 289, 289, 0, 0, 0, 0, 0, - 0, 0, 1226, 0, 0, 0, 289, 0, 0, 0, - 1030, 0, 0, 0, 0, 289, 289, 0, 0, 289, - 1242, 869, 0, 0, 0, 0, 0, 0, 0, 0, - 1418, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 441, 0, 0, 972, + 0, 0, 1373, 1375, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1421, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1431, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 290, 0, 0, 1375, 0, + 290, 0, 0, 1149, 1150, 1151, 290, 0, 1626, 0, + 0, 0, 290, 0, 0, 441, 0, 441, 1405, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1430, 0, 0, 1435, 1436, 1437, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 426, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 869, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 289, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 971, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 289, 0, + 0, 0, 0, 427, 0, 0, 972, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 290, 0, 290, + 777, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 441, 0, 0, 0, 0, 0, 0, 0, 0, 1494, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 441, 0, 0, 0, 0, 0, + 0, 441, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1552, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 289, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 289, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 289, 0, 0, 0, 0, 0, + 0, 0, 0, 1528, 1529, 0, 1530, 0, 1324, 1325, + 0, 1494, 0, 1494, 1494, 1494, 0, 0, 0, 0, + 1405, 0, 0, 1345, 1346, 0, 1347, 1348, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1494, 1355, 1356, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 290, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 290, 290, 0, 0, 0, + 0, 0, 0, 290, 0, 1585, 0, 290, 0, 0, + 290, 0, 0, 0, 871, 0, 441, 441, 0, 0, + 0, 0, 0, 0, 290, 0, 0, 0, 0, 0, + 972, 0, 1601, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1595, 0, 0, 0, 0, + 0, 1607, 0, 0, 1413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1494, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 971, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1441, 0, + 0, 0, 0, 0, 427, 871, 0, 0, 0, 427, + 427, 0, 0, 427, 427, 427, 0, 0, 0, 973, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 427, 427, + 427, 427, 427, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 290, 0, 0, 0, 0, 0, 871, 290, 0, + 290, 0, 0, 0, 0, 0, 0, 0, 290, 1034, + 290, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1513, 1514, 1515, 1516, 1517, 0, 0, 0, 1520, 1521, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 550, 538, 0, 0, 495, 553, - 468, 485, 561, 486, 489, 526, 453, 508, 184, 483, - 1030, 472, 448, 479, 449, 470, 497, 126, 501, 467, - 540, 511, 552, 155, 0, 473, 559, 158, 517, 0, - 231, 172, 289, 0, 0, 499, 542, 506, 535, 494, - 527, 458, 516, 554, 484, 524, 555, 0, 0, 0, - 94, 95, 96, 0, 1056, 1057, 0, 0, 0, 0, - 0, 116, 0, 521, 549, 481, 523, 525, 563, 447, - 518, 0, 451, 454, 560, 545, 476, 477, 1253, 0, - 0, 0, 0, 0, 0, 498, 507, 532, 492, 0, - 0, 0, 0, 0, 971, 0, 0, 474, 0, 515, - 0, 0, 0, 455, 452, 0, 0, 289, 0, 496, - 0, 0, 0, 457, 0, 475, 533, 0, 445, 135, - 537, 544, 493, 292, 548, 491, 490, 551, 203, 0, - 235, 139, 154, 112, 151, 98, 108, 0, 137, 181, - 211, 215, 541, 471, 480, 120, 478, 213, 191, 252, - 514, 193, 212, 159, 241, 204, 251, 261, 262, 238, - 259, 270, 228, 101, 237, 249, 117, 223, 0, 0, - 0, 103, 247, 234, 170, 148, 149, 102, 0, 209, - 125, 133, 122, 183, 244, 245, 121, 273, 109, 258, - 105, 110, 257, 177, 240, 248, 171, 164, 104, 246, - 169, 163, 153, 129, 141, 201, 161, 202, 142, 174, - 173, 175, 0, 450, 0, 232, 255, 274, 114, 466, - 239, 266, 269, 0, 205, 115, 134, 128, 200, 132, - 156, 265, 267, 268, 176, 111, 144, 229, 152, 160, - 208, 272, 190, 214, 118, 254, 230, 462, 465, 460, - 461, 509, 510, 556, 557, 558, 534, 456, 0, 463, - 464, 0, 539, 546, 547, 513, 97, 106, 157, 271, - 206, 131, 256, 446, 459, 124, 469, 0, 0, 482, - 487, 488, 500, 502, 503, 504, 505, 512, 519, 520, - 522, 528, 529, 530, 531, 536, 543, 562, 99, 100, - 107, 113, 119, 123, 127, 130, 136, 140, 143, 145, - 146, 147, 150, 162, 165, 166, 167, 168, 178, 179, - 180, 182, 185, 186, 187, 188, 189, 192, 194, 195, - 196, 197, 198, 199, 207, 210, 216, 217, 218, 219, - 220, 221, 222, 224, 225, 226, 227, 233, 236, 242, - 243, 253, 260, 263, 138, 250, 264, 550, 538, 0, - 0, 495, 553, 468, 485, 561, 486, 489, 526, 453, - 508, 184, 483, 0, 472, 448, 479, 449, 470, 497, - 126, 501, 467, 540, 511, 552, 155, 0, 473, 559, - 158, 517, 0, 231, 172, 0, 0, 0, 499, 542, - 506, 535, 494, 527, 458, 516, 554, 484, 524, 555, - 0, 0, 0, 94, 95, 96, 0, 1056, 1057, 0, - 0, 0, 0, 0, 116, 0, 521, 549, 481, 523, - 525, 563, 447, 518, 0, 451, 454, 560, 545, 476, - 477, 0, 0, 0, 0, 0, 0, 0, 498, 507, - 532, 492, 0, 0, 0, 0, 0, 0, 0, 0, - 474, 0, 515, 0, 0, 0, 455, 452, 0, 0, - 0, 0, 496, 0, 0, 0, 457, 0, 475, 533, - 0, 445, 135, 537, 544, 493, 292, 548, 491, 490, - 551, 203, 0, 235, 139, 154, 112, 151, 98, 108, - 0, 137, 181, 211, 215, 541, 471, 480, 120, 478, - 213, 191, 252, 514, 193, 212, 159, 241, 204, 251, - 261, 262, 238, 259, 270, 228, 101, 237, 249, 117, - 223, 0, 0, 0, 103, 247, 234, 170, 148, 149, - 102, 0, 209, 125, 133, 122, 183, 244, 245, 121, - 273, 109, 258, 105, 110, 257, 177, 240, 248, 171, - 164, 104, 246, 169, 163, 153, 129, 141, 201, 161, - 202, 142, 174, 173, 175, 0, 450, 0, 232, 255, - 274, 114, 466, 239, 266, 269, 0, 205, 115, 134, - 128, 200, 132, 156, 265, 267, 268, 176, 111, 144, - 229, 152, 160, 208, 272, 190, 214, 118, 254, 230, - 462, 465, 460, 461, 509, 510, 556, 557, 558, 534, - 456, 0, 463, 464, 0, 539, 546, 547, 513, 97, - 106, 157, 271, 206, 131, 256, 446, 459, 124, 469, - 0, 0, 482, 487, 488, 500, 502, 503, 504, 505, - 512, 519, 520, 522, 528, 529, 530, 531, 536, 543, - 562, 99, 100, 107, 113, 119, 123, 127, 130, 136, - 140, 143, 145, 146, 147, 150, 162, 165, 166, 167, - 168, 178, 179, 180, 182, 185, 186, 187, 188, 189, - 192, 194, 195, 196, 197, 198, 199, 207, 210, 216, - 217, 218, 219, 220, 221, 222, 224, 225, 226, 227, - 233, 236, 242, 243, 253, 260, 263, 138, 250, 264, - 550, 538, 0, 0, 495, 553, 468, 485, 561, 486, - 489, 526, 453, 508, 184, 483, 0, 472, 448, 479, - 449, 470, 497, 126, 501, 467, 540, 511, 552, 155, - 0, 473, 559, 158, 517, 0, 231, 172, 0, 0, - 0, 499, 542, 506, 535, 494, 527, 458, 516, 554, - 484, 524, 555, 59, 0, 0, 94, 95, 96, 0, - 0, 0, 0, 0, 0, 0, 0, 116, 0, 521, - 549, 481, 523, 525, 563, 447, 518, 0, 451, 454, - 560, 545, 476, 477, 0, 0, 0, 0, 0, 0, - 0, 498, 507, 532, 492, 0, 0, 0, 0, 0, - 0, 0, 0, 474, 0, 515, 0, 0, 0, 455, - 452, 0, 0, 0, 0, 496, 0, 0, 0, 457, - 0, 475, 533, 0, 445, 135, 537, 544, 493, 292, - 548, 491, 490, 551, 203, 0, 235, 139, 154, 112, - 151, 98, 108, 0, 137, 181, 211, 215, 541, 471, - 480, 120, 478, 213, 191, 252, 514, 193, 212, 159, - 241, 204, 251, 261, 262, 238, 259, 270, 228, 101, - 237, 249, 117, 223, 0, 0, 0, 103, 247, 234, - 170, 148, 149, 102, 0, 209, 125, 133, 122, 183, - 244, 245, 121, 273, 109, 258, 105, 110, 257, 177, - 240, 248, 171, 164, 104, 246, 169, 163, 153, 129, - 141, 201, 161, 202, 142, 174, 173, 175, 0, 450, - 0, 232, 255, 274, 114, 466, 239, 266, 269, 0, - 205, 115, 134, 128, 200, 132, 156, 265, 267, 268, - 176, 111, 144, 229, 152, 160, 208, 272, 190, 214, - 118, 254, 230, 462, 465, 460, 461, 509, 510, 556, - 557, 558, 534, 456, 0, 463, 464, 0, 539, 546, - 547, 513, 97, 106, 157, 271, 206, 131, 256, 446, - 459, 124, 469, 0, 0, 482, 487, 488, 500, 502, - 503, 504, 505, 512, 519, 520, 522, 528, 529, 530, - 531, 536, 543, 562, 99, 100, 107, 113, 119, 123, - 127, 130, 136, 140, 143, 145, 146, 147, 150, 162, - 165, 166, 167, 168, 178, 179, 180, 182, 185, 186, - 187, 188, 189, 192, 194, 195, 196, 197, 198, 199, - 207, 210, 216, 217, 218, 219, 220, 221, 222, 224, - 225, 226, 227, 233, 236, 242, 243, 253, 260, 263, - 138, 250, 264, 550, 538, 0, 0, 495, 553, 468, - 485, 561, 486, 489, 526, 453, 508, 184, 483, 0, - 472, 448, 479, 449, 470, 497, 126, 501, 467, 540, - 511, 552, 155, 0, 473, 559, 158, 517, 0, 231, - 172, 0, 0, 0, 499, 542, 506, 535, 494, 527, - 458, 516, 554, 484, 524, 555, 0, 0, 0, 94, - 95, 96, 0, 0, 0, 0, 0, 0, 0, 0, - 116, 0, 521, 549, 481, 523, 525, 563, 447, 518, - 0, 451, 454, 560, 545, 476, 477, 0, 0, 0, - 0, 0, 0, 0, 498, 507, 532, 492, 0, 0, - 0, 0, 0, 0, 1357, 0, 474, 0, 515, 0, - 0, 0, 455, 452, 0, 0, 0, 0, 496, 0, - 0, 0, 457, 0, 475, 533, 0, 445, 135, 537, - 544, 493, 292, 548, 491, 490, 551, 203, 0, 235, - 139, 154, 112, 151, 98, 108, 0, 137, 181, 211, - 215, 541, 471, 480, 120, 478, 213, 191, 252, 514, - 193, 212, 159, 241, 204, 251, 261, 262, 238, 259, - 270, 228, 101, 237, 249, 117, 223, 0, 0, 0, - 103, 247, 234, 170, 148, 149, 102, 0, 209, 125, - 133, 122, 183, 244, 245, 121, 273, 109, 258, 105, - 110, 257, 177, 240, 248, 171, 164, 104, 246, 169, - 163, 153, 129, 141, 201, 161, 202, 142, 174, 173, - 175, 0, 450, 0, 232, 255, 274, 114, 466, 239, - 266, 269, 0, 205, 115, 134, 128, 200, 132, 156, - 265, 267, 268, 176, 111, 144, 229, 152, 160, 208, - 272, 190, 214, 118, 254, 230, 462, 465, 460, 461, - 509, 510, 556, 557, 558, 534, 456, 0, 463, 464, - 0, 539, 546, 547, 513, 97, 106, 157, 271, 206, - 131, 256, 446, 459, 124, 469, 0, 0, 482, 487, - 488, 500, 502, 503, 504, 505, 512, 519, 520, 522, - 528, 529, 530, 531, 536, 543, 562, 99, 100, 107, - 113, 119, 123, 127, 130, 136, 140, 143, 145, 146, - 147, 150, 162, 165, 166, 167, 168, 178, 179, 180, - 182, 185, 186, 187, 188, 189, 192, 194, 195, 196, - 197, 198, 199, 207, 210, 216, 217, 218, 219, 220, - 221, 222, 224, 225, 226, 227, 233, 236, 242, 243, - 253, 260, 263, 138, 250, 264, 550, 538, 0, 0, - 495, 553, 468, 485, 561, 486, 489, 526, 453, 508, - 184, 483, 0, 472, 448, 479, 449, 470, 497, 126, - 501, 467, 540, 511, 552, 155, 0, 473, 559, 158, - 517, 0, 231, 172, 0, 0, 0, 499, 542, 506, - 535, 494, 527, 458, 516, 554, 484, 524, 555, 0, - 0, 0, 94, 95, 96, 0, 0, 0, 0, 0, - 0, 0, 0, 116, 0, 521, 549, 481, 523, 525, - 563, 447, 518, 0, 451, 454, 560, 545, 476, 477, - 0, 0, 0, 0, 0, 0, 0, 498, 507, 532, - 492, 0, 0, 0, 0, 0, 0, 1243, 0, 474, - 0, 515, 0, 0, 0, 455, 452, 0, 0, 0, - 0, 496, 0, 0, 0, 457, 0, 475, 533, 0, - 445, 135, 537, 544, 493, 292, 548, 491, 490, 551, - 203, 0, 235, 139, 154, 112, 151, 98, 108, 0, - 137, 181, 211, 215, 541, 471, 480, 120, 478, 213, - 191, 252, 514, 193, 212, 159, 241, 204, 251, 261, - 262, 238, 259, 270, 228, 101, 237, 249, 117, 223, - 0, 0, 0, 103, 247, 234, 170, 148, 149, 102, - 0, 209, 125, 133, 122, 183, 244, 245, 121, 273, - 109, 258, 105, 110, 257, 177, 240, 248, 171, 164, - 104, 246, 169, 163, 153, 129, 141, 201, 161, 202, - 142, 174, 173, 175, 0, 450, 0, 232, 255, 274, - 114, 466, 239, 266, 269, 0, 205, 115, 134, 128, - 200, 132, 156, 265, 267, 268, 176, 111, 144, 229, - 152, 160, 208, 272, 190, 214, 118, 254, 230, 462, - 465, 460, 461, 509, 510, 556, 557, 558, 534, 456, - 0, 463, 464, 0, 539, 546, 547, 513, 97, 106, - 157, 271, 206, 131, 256, 446, 459, 124, 469, 0, - 0, 482, 487, 488, 500, 502, 503, 504, 505, 512, - 519, 520, 522, 528, 529, 530, 531, 536, 543, 562, - 99, 100, 107, 113, 119, 123, 127, 130, 136, 140, - 143, 145, 146, 147, 150, 162, 165, 166, 167, 168, - 178, 179, 180, 182, 185, 186, 187, 188, 189, 192, - 194, 195, 196, 197, 198, 199, 207, 210, 216, 217, - 218, 219, 220, 221, 222, 224, 225, 226, 227, 233, - 236, 242, 243, 253, 260, 263, 138, 250, 264, 550, - 538, 0, 0, 495, 553, 468, 485, 561, 486, 489, - 526, 453, 508, 184, 483, 0, 472, 448, 479, 449, - 470, 497, 126, 501, 467, 540, 511, 552, 155, 0, - 473, 559, 158, 517, 0, 231, 172, 0, 0, 0, - 499, 542, 506, 535, 494, 527, 458, 516, 554, 484, - 524, 555, 0, 0, 0, 94, 95, 96, 0, 0, - 0, 0, 0, 0, 0, 0, 116, 0, 521, 549, - 481, 523, 525, 563, 447, 518, 0, 451, 454, 560, - 545, 476, 477, 0, 0, 0, 0, 0, 0, 0, - 498, 507, 532, 492, 0, 0, 0, 0, 0, 0, - 1002, 0, 474, 0, 515, 0, 0, 0, 455, 452, - 0, 0, 0, 0, 496, 0, 0, 0, 457, 0, - 475, 533, 0, 445, 135, 537, 544, 493, 292, 548, - 491, 490, 551, 203, 0, 235, 139, 154, 112, 151, - 98, 108, 0, 137, 181, 211, 215, 541, 471, 480, - 120, 478, 213, 191, 252, 514, 193, 212, 159, 241, - 204, 251, 261, 262, 238, 259, 270, 228, 101, 237, - 249, 117, 223, 0, 0, 0, 103, 247, 234, 170, - 148, 149, 102, 0, 209, 125, 133, 122, 183, 244, - 245, 121, 273, 109, 258, 105, 110, 257, 177, 240, - 248, 171, 164, 104, 246, 169, 163, 153, 129, 141, - 201, 161, 202, 142, 174, 173, 175, 0, 450, 0, - 232, 255, 274, 114, 466, 239, 266, 269, 0, 205, - 115, 134, 128, 200, 132, 156, 265, 267, 268, 176, - 111, 144, 229, 152, 160, 208, 272, 190, 214, 118, - 254, 230, 462, 465, 460, 461, 509, 510, 556, 557, - 558, 534, 456, 0, 463, 464, 0, 539, 546, 547, - 513, 97, 106, 157, 271, 206, 131, 256, 446, 459, - 124, 469, 0, 0, 482, 487, 488, 500, 502, 503, - 504, 505, 512, 519, 520, 522, 528, 529, 530, 531, - 536, 543, 562, 99, 100, 107, 113, 119, 123, 127, - 130, 136, 140, 143, 145, 146, 147, 150, 162, 165, - 166, 167, 168, 178, 179, 180, 182, 185, 186, 187, - 188, 189, 192, 194, 195, 196, 197, 198, 199, 207, - 210, 216, 217, 218, 219, 220, 221, 222, 224, 225, - 226, 227, 233, 236, 242, 243, 253, 260, 263, 138, - 250, 264, 550, 538, 0, 0, 495, 553, 468, 485, - 561, 486, 489, 526, 453, 508, 184, 483, 0, 472, - 448, 479, 449, 470, 497, 126, 501, 467, 540, 511, - 552, 155, 0, 473, 559, 158, 517, 0, 231, 172, - 0, 0, 0, 499, 542, 506, 535, 494, 527, 458, - 516, 554, 484, 524, 555, 0, 0, 0, 94, 95, - 96, 0, 0, 0, 0, 0, 0, 0, 0, 116, - 0, 521, 549, 481, 523, 525, 563, 447, 518, 0, - 451, 454, 560, 545, 476, 477, 0, 0, 0, 0, - 0, 0, 0, 498, 507, 532, 492, 0, 0, 0, - 0, 0, 0, 0, 0, 474, 0, 515, 0, 0, - 0, 455, 452, 0, 0, 0, 0, 496, 0, 0, - 0, 457, 0, 475, 533, 0, 445, 135, 537, 544, - 493, 292, 548, 491, 490, 551, 203, 0, 235, 139, - 154, 112, 151, 98, 108, 0, 137, 181, 211, 215, - 541, 471, 480, 120, 478, 213, 191, 252, 514, 193, - 212, 159, 241, 204, 251, 261, 262, 238, 259, 270, - 228, 101, 237, 249, 117, 223, 0, 0, 0, 103, - 247, 234, 170, 148, 149, 102, 0, 209, 125, 133, - 122, 183, 244, 245, 121, 273, 109, 258, 105, 110, - 257, 177, 240, 248, 171, 164, 104, 246, 169, 163, - 153, 129, 141, 201, 161, 202, 142, 174, 173, 175, - 0, 450, 0, 232, 255, 274, 114, 466, 239, 266, - 269, 0, 205, 115, 134, 128, 200, 132, 156, 265, - 267, 268, 176, 111, 144, 229, 152, 160, 208, 272, - 190, 214, 118, 254, 230, 462, 465, 460, 461, 509, - 510, 556, 557, 558, 534, 456, 0, 463, 464, 0, - 539, 546, 547, 513, 97, 106, 157, 271, 206, 131, - 256, 446, 459, 124, 469, 0, 0, 482, 487, 488, - 500, 502, 503, 504, 505, 512, 519, 520, 522, 528, - 529, 530, 531, 536, 543, 562, 99, 100, 107, 113, - 119, 123, 127, 130, 136, 140, 143, 145, 146, 147, - 150, 162, 165, 166, 167, 168, 178, 179, 180, 182, - 185, 186, 187, 188, 189, 192, 194, 195, 196, 197, - 198, 199, 207, 210, 216, 217, 218, 219, 220, 221, - 222, 224, 225, 226, 227, 233, 236, 242, 243, 253, - 260, 263, 138, 250, 264, 550, 538, 0, 0, 495, - 553, 468, 485, 561, 486, 489, 526, 453, 508, 184, - 483, 0, 472, 448, 479, 449, 470, 497, 126, 501, - 467, 540, 511, 552, 155, 0, 473, 559, 158, 517, - 0, 231, 172, 0, 0, 0, 499, 542, 506, 535, - 494, 527, 458, 516, 554, 484, 524, 555, 0, 0, - 0, 94, 95, 96, 0, 0, 0, 0, 0, 0, - 0, 0, 116, 0, 521, 549, 481, 523, 525, 563, - 447, 518, 0, 451, 454, 560, 545, 476, 477, 0, - 0, 0, 0, 0, 0, 0, 498, 507, 532, 492, - 0, 0, 0, 0, 0, 0, 0, 0, 474, 0, - 515, 0, 0, 0, 455, 452, 0, 0, 0, 0, - 496, 0, 0, 0, 457, 0, 475, 533, 0, 445, - 135, 537, 544, 493, 292, 548, 491, 490, 551, 203, - 0, 235, 139, 154, 112, 151, 98, 108, 0, 137, - 181, 211, 215, 541, 471, 480, 120, 478, 213, 191, - 252, 514, 193, 212, 159, 241, 204, 251, 261, 262, - 238, 259, 270, 228, 101, 237, 249, 117, 223, 0, - 0, 0, 103, 247, 234, 170, 148, 149, 102, 0, - 209, 125, 133, 122, 183, 244, 245, 121, 273, 109, - 258, 105, 443, 257, 177, 240, 248, 171, 164, 104, - 246, 169, 163, 153, 129, 141, 201, 161, 202, 142, - 174, 173, 175, 0, 450, 0, 232, 255, 274, 114, - 466, 239, 266, 269, 0, 205, 115, 134, 128, 200, - 132, 156, 265, 267, 268, 444, 442, 437, 436, 152, - 160, 208, 272, 190, 214, 118, 254, 230, 462, 465, - 460, 461, 509, 510, 556, 557, 558, 534, 456, 0, - 463, 464, 0, 539, 546, 547, 513, 97, 106, 157, - 271, 206, 131, 256, 446, 459, 124, 469, 0, 0, - 482, 487, 488, 500, 502, 503, 504, 505, 512, 519, - 520, 522, 528, 529, 530, 531, 536, 543, 562, 99, - 100, 107, 113, 119, 123, 127, 130, 136, 140, 143, - 145, 146, 147, 150, 162, 165, 166, 167, 168, 178, - 179, 180, 182, 185, 186, 187, 188, 189, 192, 194, - 195, 196, 197, 198, 199, 207, 210, 216, 217, 218, - 219, 220, 221, 222, 224, 225, 226, 227, 233, 236, - 242, 243, 253, 260, 263, 138, 250, 264, 550, 538, - 0, 0, 495, 553, 468, 485, 561, 486, 489, 526, - 453, 508, 184, 483, 0, 472, 448, 479, 449, 470, - 497, 126, 501, 467, 540, 511, 552, 155, 0, 473, - 559, 158, 517, 0, 231, 172, 0, 0, 0, 499, - 542, 506, 535, 494, 527, 458, 516, 554, 484, 524, - 555, 0, 0, 0, 94, 95, 96, 0, 0, 0, - 0, 0, 0, 0, 0, 116, 0, 521, 549, 481, - 523, 525, 563, 447, 518, 0, 451, 454, 560, 545, - 476, 477, 0, 0, 0, 0, 0, 0, 0, 498, - 507, 532, 492, 0, 0, 0, 0, 0, 0, 0, - 0, 474, 0, 515, 0, 0, 0, 455, 452, 0, - 0, 0, 0, 496, 0, 0, 0, 457, 0, 475, - 533, 0, 445, 135, 537, 544, 493, 292, 548, 491, - 490, 551, 203, 0, 235, 139, 154, 112, 151, 98, - 108, 0, 137, 181, 211, 215, 541, 471, 480, 120, - 478, 213, 191, 252, 514, 193, 212, 159, 241, 204, - 251, 261, 262, 238, 259, 270, 228, 101, 237, 777, - 117, 223, 0, 0, 0, 103, 247, 234, 170, 148, - 149, 102, 0, 209, 125, 133, 122, 183, 244, 245, - 121, 273, 109, 258, 105, 443, 257, 177, 240, 248, - 171, 164, 104, 246, 169, 163, 153, 129, 141, 201, - 161, 202, 142, 174, 173, 175, 0, 450, 0, 232, - 255, 274, 114, 466, 239, 266, 269, 0, 205, 115, - 134, 128, 200, 132, 156, 265, 267, 268, 444, 442, - 437, 436, 152, 160, 208, 272, 190, 214, 118, 254, - 230, 462, 465, 460, 461, 509, 510, 556, 557, 558, - 534, 456, 0, 463, 464, 0, 539, 546, 547, 513, - 97, 106, 157, 271, 206, 131, 256, 446, 459, 124, - 469, 0, 0, 482, 487, 488, 500, 502, 503, 504, - 505, 512, 519, 520, 522, 528, 529, 530, 531, 536, - 543, 562, 99, 100, 107, 113, 119, 123, 127, 130, - 136, 140, 143, 145, 146, 147, 150, 162, 165, 166, - 167, 168, 178, 179, 180, 182, 185, 186, 187, 188, - 189, 192, 194, 195, 196, 197, 198, 199, 207, 210, - 216, 217, 218, 219, 220, 221, 222, 224, 225, 226, - 227, 233, 236, 242, 243, 253, 260, 263, 138, 250, - 264, 550, 538, 0, 0, 495, 553, 468, 485, 561, - 486, 489, 526, 453, 508, 184, 483, 0, 472, 448, - 479, 449, 470, 497, 126, 501, 467, 540, 511, 552, - 155, 0, 473, 559, 158, 517, 0, 231, 172, 0, - 0, 0, 499, 542, 506, 535, 494, 527, 458, 516, - 554, 484, 524, 555, 0, 0, 0, 94, 95, 96, - 0, 0, 0, 0, 0, 0, 0, 0, 116, 0, - 521, 549, 481, 523, 525, 563, 447, 518, 0, 451, - 454, 560, 545, 476, 477, 0, 0, 0, 0, 0, - 0, 0, 498, 507, 532, 492, 0, 0, 0, 0, - 0, 0, 0, 0, 474, 0, 515, 0, 0, 0, - 455, 452, 0, 0, 0, 0, 496, 0, 0, 0, - 457, 0, 475, 533, 0, 445, 135, 537, 544, 493, - 292, 548, 491, 490, 551, 203, 0, 235, 139, 154, - 112, 151, 98, 108, 0, 137, 181, 211, 215, 541, - 471, 480, 120, 478, 213, 191, 252, 514, 193, 212, - 159, 241, 204, 251, 261, 262, 238, 259, 270, 228, - 101, 237, 434, 117, 223, 0, 0, 0, 103, 247, - 234, 170, 148, 149, 102, 0, 209, 125, 133, 122, - 183, 244, 245, 121, 273, 109, 258, 105, 443, 257, - 177, 240, 248, 171, 164, 104, 246, 169, 163, 153, - 129, 141, 201, 161, 202, 142, 174, 173, 175, 0, - 450, 0, 232, 255, 274, 114, 466, 239, 266, 269, - 0, 205, 115, 134, 128, 200, 132, 156, 265, 267, - 268, 444, 442, 437, 436, 152, 160, 208, 272, 190, - 214, 118, 254, 230, 462, 465, 460, 461, 509, 510, - 556, 557, 558, 534, 456, 0, 463, 464, 0, 539, - 546, 547, 513, 97, 106, 157, 271, 206, 131, 256, - 446, 459, 124, 469, 0, 0, 482, 487, 488, 500, - 502, 503, 504, 505, 512, 519, 520, 522, 528, 529, - 530, 531, 536, 543, 562, 99, 100, 107, 113, 119, - 123, 127, 130, 136, 140, 143, 145, 146, 147, 150, - 162, 165, 166, 167, 168, 178, 179, 180, 182, 185, - 186, 187, 188, 189, 192, 194, 195, 196, 197, 198, - 199, 207, 210, 216, 217, 218, 219, 220, 221, 222, - 224, 225, 226, 227, 233, 236, 242, 243, 253, 260, - 263, 138, 250, 264, 184, 0, 0, 942, 0, 341, - 0, 0, 0, 126, 0, 340, 0, 0, 0, 155, - 0, 943, 384, 158, 0, 0, 231, 172, 0, 0, - 0, 0, 0, 375, 376, 0, 0, 0, 0, 0, - 0, 0, 0, 59, 0, 0, 94, 95, 96, 362, - 361, 364, 365, 366, 367, 0, 0, 116, 363, 368, - 369, 370, 0, 0, 0, 0, 338, 355, 0, 383, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 352, - 353, 424, 0, 0, 0, 398, 0, 354, 0, 0, - 347, 348, 350, 349, 351, 356, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 135, 397, 0, 0, 292, - 0, 0, 395, 0, 203, 0, 235, 139, 154, 112, - 151, 98, 108, 0, 137, 181, 211, 215, 0, 0, - 0, 120, 0, 213, 191, 252, 0, 193, 212, 159, - 241, 204, 251, 261, 262, 238, 259, 270, 228, 101, - 237, 249, 117, 223, 0, 0, 0, 103, 247, 234, - 170, 148, 149, 102, 0, 209, 125, 133, 122, 183, - 244, 245, 121, 273, 109, 258, 105, 110, 257, 177, - 240, 248, 171, 164, 104, 246, 169, 163, 153, 129, - 141, 201, 161, 202, 142, 174, 173, 175, 0, 0, - 0, 232, 255, 274, 114, 0, 239, 266, 269, 0, - 205, 115, 134, 128, 200, 132, 156, 265, 267, 268, - 176, 111, 144, 229, 152, 160, 208, 272, 190, 214, - 118, 254, 230, 385, 396, 391, 392, 389, 390, 388, - 387, 386, 399, 377, 378, 379, 380, 382, 0, 393, - 394, 381, 97, 106, 157, 271, 206, 131, 256, 0, - 0, 124, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 290, 0, 0, 0, 0, 0, + 0, 0, 0, 290, 290, 290, 290, 290, 0, 0, + 290, 290, 0, 0, 290, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 99, 100, 107, 113, 119, 123, - 127, 130, 136, 140, 143, 145, 146, 147, 150, 162, - 165, 166, 167, 168, 178, 179, 180, 182, 185, 186, - 187, 188, 189, 192, 194, 195, 196, 197, 198, 199, - 207, 210, 216, 217, 218, 219, 220, 221, 222, 224, - 225, 226, 227, 233, 236, 242, 243, 253, 260, 263, - 138, 250, 264, 184, 0, 0, 0, 0, 341, 0, - 0, 0, 126, 0, 340, 0, 0, 0, 155, 0, - 0, 384, 158, 0, 0, 231, 172, 0, 0, 0, - 0, 0, 375, 376, 0, 0, 0, 0, 0, 0, - 1047, 0, 59, 0, 0, 94, 95, 96, 362, 361, - 364, 365, 366, 367, 0, 0, 116, 363, 368, 369, - 370, 1048, 0, 0, 0, 338, 355, 0, 383, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 352, 353, - 0, 0, 0, 0, 398, 0, 354, 0, 0, 347, - 348, 350, 349, 351, 356, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 135, 397, 0, 0, 292, 0, - 0, 395, 0, 203, 0, 235, 139, 154, 112, 151, - 98, 108, 0, 137, 181, 211, 215, 0, 0, 0, - 120, 0, 213, 191, 252, 0, 193, 212, 159, 241, - 204, 251, 261, 262, 238, 259, 270, 228, 101, 237, - 249, 117, 223, 0, 0, 0, 103, 247, 234, 170, - 148, 149, 102, 0, 209, 125, 133, 122, 183, 244, - 245, 121, 273, 109, 258, 105, 110, 257, 177, 240, - 248, 171, 164, 104, 246, 169, 163, 153, 129, 141, - 201, 161, 202, 142, 174, 173, 175, 0, 0, 0, - 232, 255, 274, 114, 0, 239, 266, 269, 0, 205, - 115, 134, 128, 200, 132, 156, 265, 267, 268, 176, - 111, 144, 229, 152, 160, 208, 272, 190, 214, 118, - 254, 230, 385, 396, 391, 392, 389, 390, 388, 387, - 386, 399, 377, 378, 379, 380, 382, 0, 393, 394, - 381, 97, 106, 157, 271, 206, 131, 256, 0, 0, - 124, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 290, 0, 0, 0, 0, 0, 1139, 1140, + 290, 0, 0, 0, 290, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 99, 100, 107, 113, 119, 123, 127, - 130, 136, 140, 143, 145, 146, 147, 150, 162, 165, - 166, 167, 168, 178, 179, 180, 182, 185, 186, 187, - 188, 189, 192, 194, 195, 196, 197, 198, 199, 207, - 210, 216, 217, 218, 219, 220, 221, 222, 224, 225, - 226, 227, 233, 236, 242, 243, 253, 260, 263, 138, - 250, 264, 184, 0, 0, 0, 0, 341, 0, 0, - 0, 126, 0, 340, 0, 0, 0, 155, 0, 0, - 384, 158, 0, 0, 231, 172, 0, 0, 0, 0, - 0, 375, 376, 0, 0, 0, 0, 0, 0, 0, - 0, 59, 0, 412, 94, 95, 96, 362, 361, 364, - 365, 366, 367, 0, 0, 116, 363, 368, 369, 370, - 0, 0, 0, 0, 338, 355, 0, 383, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 352, 353, 0, - 0, 0, 0, 398, 0, 354, 0, 0, 347, 348, - 350, 349, 351, 356, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 135, 397, 0, 0, 292, 0, 0, - 395, 0, 203, 0, 235, 139, 154, 112, 151, 98, - 108, 0, 137, 181, 211, 215, 0, 0, 0, 120, - 0, 213, 191, 252, 0, 193, 212, 159, 241, 204, - 251, 261, 262, 238, 259, 270, 228, 101, 237, 249, - 117, 223, 0, 0, 0, 103, 247, 234, 170, 148, - 149, 102, 0, 209, 125, 133, 122, 183, 244, 245, - 121, 273, 109, 258, 105, 110, 257, 177, 240, 248, - 171, 164, 104, 246, 169, 163, 153, 129, 141, 201, - 161, 202, 142, 174, 173, 175, 0, 0, 0, 232, - 255, 274, 114, 0, 239, 266, 269, 0, 205, 115, - 134, 128, 200, 132, 156, 265, 267, 268, 176, 111, - 144, 229, 152, 160, 208, 272, 190, 214, 118, 254, - 230, 385, 396, 391, 392, 389, 390, 388, 387, 386, - 399, 377, 378, 379, 380, 382, 0, 393, 394, 381, - 97, 106, 157, 271, 206, 131, 256, 0, 0, 124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 99, 100, 107, 113, 119, 123, 127, 130, - 136, 140, 143, 145, 146, 147, 150, 162, 165, 166, - 167, 168, 178, 179, 180, 182, 185, 186, 187, 188, - 189, 192, 194, 195, 196, 197, 198, 199, 207, 210, - 216, 217, 218, 219, 220, 221, 222, 224, 225, 226, - 227, 233, 236, 242, 243, 253, 260, 263, 138, 250, - 264, 184, 0, 0, 0, 0, 341, 0, 0, 0, - 126, 0, 340, 0, 0, 0, 155, 0, 0, 384, - 158, 0, 0, 231, 172, 0, 0, 0, 0, 0, - 375, 376, 0, 0, 0, 0, 0, 0, 0, 0, - 59, 0, 0, 94, 95, 96, 362, 361, 364, 365, - 366, 367, 0, 0, 116, 363, 368, 369, 370, 0, - 0, 0, 0, 338, 355, 0, 383, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 352, 353, 424, 0, - 0, 0, 398, 0, 354, 0, 0, 347, 348, 350, - 349, 351, 356, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 135, 397, 0, 0, 292, 0, 0, 395, - 0, 203, 0, 235, 139, 154, 112, 151, 98, 108, - 0, 137, 181, 211, 215, 0, 0, 0, 120, 0, - 213, 191, 252, 0, 193, 212, 159, 241, 204, 251, - 261, 262, 238, 259, 270, 228, 101, 237, 249, 117, - 223, 0, 0, 0, 103, 247, 234, 170, 148, 149, - 102, 0, 209, 125, 133, 122, 183, 244, 245, 121, - 273, 109, 258, 105, 110, 257, 177, 240, 248, 171, - 164, 104, 246, 169, 163, 153, 129, 141, 201, 161, - 202, 142, 174, 173, 175, 0, 0, 0, 232, 255, - 274, 114, 0, 239, 266, 269, 0, 205, 115, 134, - 128, 200, 132, 156, 265, 267, 268, 176, 111, 144, - 229, 152, 160, 208, 272, 190, 214, 118, 254, 230, - 385, 396, 391, 392, 389, 390, 388, 387, 386, 399, - 377, 378, 379, 380, 382, 0, 393, 394, 381, 97, - 106, 157, 271, 206, 131, 256, 0, 0, 124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 427, 427, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 99, 100, 107, 113, 119, 123, 127, 130, 136, - 140, 143, 145, 146, 147, 150, 162, 165, 166, 167, - 168, 178, 179, 180, 182, 185, 186, 187, 188, 189, - 192, 194, 195, 196, 197, 198, 199, 207, 210, 216, - 217, 218, 219, 220, 221, 222, 224, 225, 226, 227, - 233, 236, 242, 243, 253, 260, 263, 138, 250, 264, - 184, 0, 0, 0, 0, 341, 0, 0, 0, 126, - 0, 340, 0, 0, 0, 155, 0, 0, 384, 158, - 0, 0, 231, 172, 0, 0, 0, 0, 0, 375, - 376, 0, 0, 0, 0, 0, 0, 0, 0, 59, - 0, 0, 94, 95, 96, 362, 960, 364, 365, 366, - 367, 0, 0, 116, 363, 368, 369, 370, 0, 0, - 0, 0, 338, 355, 0, 383, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 352, 353, 424, 0, 0, - 0, 398, 0, 354, 0, 0, 347, 348, 350, 349, - 351, 356, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 135, 397, 0, 0, 292, 0, 0, 395, 0, - 203, 0, 235, 139, 154, 112, 151, 98, 108, 0, - 137, 181, 211, 215, 0, 0, 0, 120, 0, 213, - 191, 252, 0, 193, 212, 159, 241, 204, 251, 261, - 262, 238, 259, 270, 228, 101, 237, 249, 117, 223, - 0, 0, 0, 103, 247, 234, 170, 148, 149, 102, - 0, 209, 125, 133, 122, 183, 244, 245, 121, 273, - 109, 258, 105, 110, 257, 177, 240, 248, 171, 164, - 104, 246, 169, 163, 153, 129, 141, 201, 161, 202, - 142, 174, 173, 175, 0, 0, 0, 232, 255, 274, - 114, 0, 239, 266, 269, 0, 205, 115, 134, 128, - 200, 132, 156, 265, 267, 268, 176, 111, 144, 229, - 152, 160, 208, 272, 190, 214, 118, 254, 230, 385, - 396, 391, 392, 389, 390, 388, 387, 386, 399, 377, - 378, 379, 380, 382, 0, 393, 394, 381, 97, 106, - 157, 271, 206, 131, 256, 0, 0, 124, 0, 0, + 0, 0, 0, 427, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 99, 100, 107, 113, 119, 123, 127, 130, 136, 140, - 143, 145, 146, 147, 150, 162, 165, 166, 167, 168, - 178, 179, 180, 182, 185, 186, 187, 188, 189, 192, - 194, 195, 196, 197, 198, 199, 207, 210, 216, 217, - 218, 219, 220, 221, 222, 224, 225, 226, 227, 233, - 236, 242, 243, 253, 260, 263, 138, 250, 264, 184, - 0, 0, 0, 0, 341, 0, 0, 0, 126, 0, - 340, 0, 0, 0, 155, 0, 0, 384, 158, 0, - 0, 231, 172, 0, 0, 0, 0, 0, 375, 376, - 0, 0, 0, 0, 0, 0, 0, 0, 59, 0, - 0, 94, 95, 96, 362, 957, 364, 365, 366, 367, - 0, 0, 116, 363, 368, 369, 370, 0, 0, 0, - 0, 338, 355, 0, 383, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 352, 353, 424, 0, 0, 0, - 398, 0, 354, 0, 0, 347, 348, 350, 349, 351, - 356, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 135, 397, 0, 0, 292, 0, 0, 395, 0, 203, - 0, 235, 139, 154, 112, 151, 98, 108, 0, 137, - 181, 211, 215, 0, 0, 0, 120, 0, 213, 191, - 252, 0, 193, 212, 159, 241, 204, 251, 261, 262, - 238, 259, 270, 228, 101, 237, 249, 117, 223, 0, - 0, 0, 103, 247, 234, 170, 148, 149, 102, 0, - 209, 125, 133, 122, 183, 244, 245, 121, 273, 109, - 258, 105, 110, 257, 177, 240, 248, 171, 164, 104, - 246, 169, 163, 153, 129, 141, 201, 161, 202, 142, - 174, 173, 175, 0, 0, 0, 232, 255, 274, 114, - 0, 239, 266, 269, 0, 205, 115, 134, 128, 200, - 132, 156, 265, 267, 268, 176, 111, 144, 229, 152, - 160, 208, 272, 190, 214, 118, 254, 230, 385, 396, - 391, 392, 389, 390, 388, 387, 386, 399, 377, 378, - 379, 380, 382, 0, 393, 394, 381, 97, 106, 157, - 271, 206, 131, 256, 0, 0, 124, 0, 0, 0, + 0, 1632, 0, 0, 0, 0, 0, 0, 0, 427, + 290, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 973, 290, 290, 290, 290, 290, 0, 0, 0, 0, + 0, 0, 0, 1231, 0, 0, 0, 290, 0, 0, + 0, 1034, 0, 0, 0, 0, 290, 290, 0, 0, + 290, 1247, 871, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 99, - 100, 107, 113, 119, 123, 127, 130, 136, 140, 143, - 145, 146, 147, 150, 162, 165, 166, 167, 168, 178, - 179, 180, 182, 185, 186, 187, 188, 189, 192, 194, - 195, 196, 197, 198, 199, 207, 210, 216, 217, 218, - 219, 220, 221, 222, 224, 225, 226, 227, 233, 236, - 242, 243, 253, 260, 263, 138, 250, 264, 405, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 184, 0, 0, 0, 0, 341, 0, 0, 0, - 126, 0, 340, 0, 0, 0, 155, 0, 0, 384, - 158, 0, 0, 231, 172, 0, 0, 0, 0, 0, - 375, 376, 0, 0, 0, 0, 0, 0, 0, 0, - 59, 0, 0, 94, 95, 96, 362, 361, 364, 365, - 366, 367, 0, 0, 116, 363, 368, 369, 370, 0, - 0, 0, 0, 338, 355, 0, 383, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 352, 353, 0, 0, - 0, 0, 398, 0, 354, 0, 0, 347, 348, 350, - 349, 351, 356, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 135, 397, 0, 0, 292, 0, 0, 395, - 0, 203, 0, 235, 139, 154, 112, 151, 98, 108, - 0, 137, 181, 211, 215, 0, 0, 0, 120, 0, - 213, 191, 252, 0, 193, 212, 159, 241, 204, 251, - 261, 262, 238, 259, 270, 228, 101, 237, 249, 117, - 223, 0, 0, 0, 103, 247, 234, 170, 148, 149, - 102, 0, 209, 125, 133, 122, 183, 244, 245, 121, - 273, 109, 258, 105, 110, 257, 177, 240, 248, 171, - 164, 104, 246, 169, 163, 153, 129, 141, 201, 161, - 202, 142, 174, 173, 175, 0, 0, 0, 232, 255, - 274, 114, 0, 239, 266, 269, 0, 205, 115, 134, - 128, 200, 132, 156, 265, 267, 268, 176, 111, 144, - 229, 152, 160, 208, 272, 190, 214, 118, 254, 230, - 385, 396, 391, 392, 389, 390, 388, 387, 386, 399, - 377, 378, 379, 380, 382, 0, 393, 394, 381, 97, - 106, 157, 271, 206, 131, 256, 0, 0, 124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 99, 100, 107, 113, 119, 123, 127, 130, 136, - 140, 143, 145, 146, 147, 150, 162, 165, 166, 167, - 168, 178, 179, 180, 182, 185, 186, 187, 188, 189, - 192, 194, 195, 196, 197, 198, 199, 207, 210, 216, - 217, 218, 219, 220, 221, 222, 224, 225, 226, 227, - 233, 236, 242, 243, 253, 260, 263, 138, 250, 264, - 184, 0, 0, 0, 0, 341, 0, 0, 0, 126, - 0, 340, 0, 0, 0, 155, 0, 0, 384, 158, - 0, 0, 231, 172, 0, 0, 0, 0, 0, 375, - 376, 0, 0, 0, 0, 0, 0, 0, 0, 59, - 0, 0, 94, 95, 96, 362, 361, 364, 365, 366, - 367, 0, 0, 116, 363, 368, 369, 370, 0, 0, - 0, 0, 338, 355, 0, 383, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 352, 353, 0, 0, 0, - 0, 398, 0, 354, 0, 0, 347, 348, 350, 349, - 351, 356, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 135, 397, 0, 0, 292, 0, 0, 395, 0, - 203, 0, 235, 139, 154, 112, 151, 98, 108, 0, - 137, 181, 211, 215, 0, 0, 0, 120, 0, 213, - 191, 252, 0, 193, 212, 159, 241, 204, 251, 261, - 262, 238, 259, 270, 228, 101, 237, 249, 117, 223, - 0, 0, 0, 103, 247, 234, 170, 148, 149, 102, - 0, 209, 125, 133, 122, 183, 244, 245, 121, 273, - 109, 258, 105, 110, 257, 177, 240, 248, 171, 164, - 104, 246, 169, 163, 153, 129, 141, 201, 161, 202, - 142, 174, 173, 175, 0, 0, 0, 232, 255, 274, - 114, 0, 239, 266, 269, 0, 205, 115, 134, 128, - 200, 132, 156, 265, 267, 268, 176, 111, 144, 229, - 152, 160, 208, 272, 190, 214, 118, 254, 230, 385, - 396, 391, 392, 389, 390, 388, 387, 386, 399, 377, - 378, 379, 380, 382, 0, 393, 394, 381, 97, 106, - 157, 271, 206, 131, 256, 0, 0, 124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 99, 100, 107, 113, 119, 123, 127, 130, 136, 140, - 143, 145, 146, 147, 150, 162, 165, 166, 167, 168, - 178, 179, 180, 182, 185, 186, 187, 188, 189, 192, - 194, 195, 196, 197, 198, 199, 207, 210, 216, 217, - 218, 219, 220, 221, 222, 224, 225, 226, 227, 233, - 236, 242, 243, 253, 260, 263, 138, 250, 264, 184, - 0, 0, 0, 0, 0, 0, 0, 0, 126, 0, - 0, 0, 0, 0, 155, 0, 0, 384, 158, 0, - 0, 231, 172, 0, 0, 0, 0, 0, 375, 376, - 0, 0, 0, 0, 0, 0, 0, 0, 59, 0, - 0, 94, 95, 96, 362, 361, 364, 365, 366, 367, - 0, 0, 116, 363, 368, 369, 370, 0, 0, 0, - 0, 0, 355, 0, 383, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 352, 353, 0, 0, 0, 0, - 398, 0, 354, 0, 0, 347, 348, 350, 349, 351, - 356, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 135, 397, 0, 0, 292, 0, 0, 395, 0, 203, - 0, 235, 139, 154, 112, 151, 98, 108, 0, 137, - 181, 211, 215, 0, 0, 0, 120, 0, 213, 191, - 252, 1625, 193, 212, 159, 241, 204, 251, 261, 262, - 238, 259, 270, 228, 101, 237, 249, 117, 223, 0, - 0, 0, 103, 247, 234, 170, 148, 149, 102, 0, - 209, 125, 133, 122, 183, 244, 245, 121, 273, 109, - 258, 105, 110, 257, 177, 240, 248, 171, 164, 104, - 246, 169, 163, 153, 129, 141, 201, 161, 202, 142, - 174, 173, 175, 0, 0, 0, 232, 255, 274, 114, - 0, 239, 266, 269, 0, 205, 115, 134, 128, 200, - 132, 156, 265, 267, 268, 176, 111, 144, 229, 152, - 160, 208, 272, 190, 214, 118, 254, 230, 385, 396, - 391, 392, 389, 390, 388, 387, 386, 399, 377, 378, - 379, 380, 382, 0, 393, 394, 381, 97, 106, 157, - 271, 206, 131, 256, 0, 0, 124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 99, - 100, 107, 113, 119, 123, 127, 130, 136, 140, 143, - 145, 146, 147, 150, 162, 165, 166, 167, 168, 178, - 179, 180, 182, 185, 186, 187, 188, 189, 192, 194, - 195, 196, 197, 198, 199, 207, 210, 216, 217, 218, - 219, 220, 221, 222, 224, 225, 226, 227, 233, 236, - 242, 243, 253, 260, 263, 138, 250, 264, 184, 0, - 0, 0, 0, 0, 0, 0, 0, 126, 0, 0, - 0, 0, 0, 155, 0, 0, 384, 158, 0, 0, - 231, 172, 0, 0, 0, 0, 0, 375, 376, 0, - 0, 0, 0, 0, 0, 0, 0, 59, 0, 412, - 94, 95, 96, 362, 361, 364, 365, 366, 367, 0, - 0, 116, 363, 368, 369, 370, 0, 0, 0, 0, - 0, 355, 0, 383, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 352, 353, 0, 0, 0, 0, 398, - 0, 354, 0, 0, 347, 348, 350, 349, 351, 356, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 135, - 397, 0, 0, 292, 0, 0, 395, 0, 203, 0, - 235, 139, 154, 112, 151, 98, 108, 0, 137, 181, - 211, 215, 0, 0, 0, 120, 0, 213, 191, 252, - 0, 193, 212, 159, 241, 204, 251, 261, 262, 238, - 259, 270, 228, 101, 237, 249, 117, 223, 0, 0, - 0, 103, 247, 234, 170, 148, 149, 102, 0, 209, - 125, 133, 122, 183, 244, 245, 121, 273, 109, 258, - 105, 110, 257, 177, 240, 248, 171, 164, 104, 246, - 169, 163, 153, 129, 141, 201, 161, 202, 142, 174, - 173, 175, 0, 0, 0, 232, 255, 274, 114, 0, - 239, 266, 269, 0, 205, 115, 134, 128, 200, 132, - 156, 265, 267, 268, 176, 111, 144, 229, 152, 160, - 208, 272, 190, 214, 118, 254, 230, 385, 396, 391, - 392, 389, 390, 388, 387, 386, 399, 377, 378, 379, - 380, 382, 0, 393, 394, 381, 97, 106, 157, 271, - 206, 131, 256, 0, 0, 124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 99, 100, - 107, 113, 119, 123, 127, 130, 136, 140, 143, 145, - 146, 147, 150, 162, 165, 166, 167, 168, 178, 179, - 180, 182, 185, 186, 187, 188, 189, 192, 194, 195, - 196, 197, 198, 199, 207, 210, 216, 217, 218, 219, - 220, 221, 222, 224, 225, 226, 227, 233, 236, 242, - 243, 253, 260, 263, 138, 250, 264, 184, 0, 0, - 0, 0, 0, 0, 0, 0, 126, 0, 0, 0, - 0, 0, 155, 0, 0, 384, 158, 0, 0, 231, - 172, 0, 0, 0, 0, 0, 375, 376, 0, 0, - 0, 0, 0, 0, 0, 0, 59, 0, 0, 94, - 95, 96, 362, 361, 364, 365, 366, 367, 0, 0, - 116, 363, 368, 369, 370, 0, 0, 0, 0, 0, - 355, 0, 383, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 352, 353, 0, 0, 0, 0, 398, 0, - 354, 0, 0, 347, 348, 350, 349, 351, 356, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 135, 397, - 0, 0, 292, 0, 0, 395, 0, 203, 0, 235, - 139, 154, 112, 151, 98, 108, 0, 137, 181, 211, - 215, 0, 0, 0, 120, 0, 213, 191, 252, 0, - 193, 212, 159, 241, 204, 251, 261, 262, 238, 259, - 270, 228, 101, 237, 249, 117, 223, 0, 0, 0, - 103, 247, 234, 170, 148, 149, 102, 0, 209, 125, - 133, 122, 183, 244, 245, 121, 273, 109, 258, 105, - 110, 257, 177, 240, 248, 171, 164, 104, 246, 169, - 163, 153, 129, 141, 201, 161, 202, 142, 174, 173, - 175, 0, 0, 0, 232, 255, 274, 114, 0, 239, - 266, 269, 0, 205, 115, 134, 128, 200, 132, 156, - 265, 267, 268, 176, 111, 144, 229, 152, 160, 208, - 272, 190, 214, 118, 254, 230, 385, 396, 391, 392, - 389, 390, 388, 387, 386, 399, 377, 378, 379, 380, - 382, 0, 393, 394, 381, 97, 106, 157, 271, 206, - 131, 256, 0, 0, 124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 99, 100, 107, - 113, 119, 123, 127, 130, 136, 140, 143, 145, 146, - 147, 150, 162, 165, 166, 167, 168, 178, 179, 180, - 182, 185, 186, 187, 188, 189, 192, 194, 195, 196, - 197, 198, 199, 207, 210, 216, 217, 218, 219, 220, - 221, 222, 224, 225, 226, 227, 233, 236, 242, 243, - 253, 260, 263, 138, 250, 264, 184, 0, 0, 0, - 0, 0, 0, 0, 0, 126, 0, 0, 0, 0, - 0, 155, 0, 0, 0, 158, 0, 0, 231, 172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 94, 95, - 96, 0, 0, 0, 0, 0, 0, 0, 0, 116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 427, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 659, 658, 668, - 669, 661, 662, 663, 664, 665, 666, 667, 660, 0, - 0, 670, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 135, 0, 0, - 0, 292, 0, 0, 0, 0, 203, 0, 235, 139, - 154, 112, 151, 98, 108, 0, 137, 181, 211, 215, - 0, 0, 0, 120, 0, 213, 191, 252, 0, 193, - 212, 159, 241, 204, 251, 261, 262, 238, 259, 270, - 228, 101, 237, 249, 117, 223, 0, 0, 0, 103, - 247, 234, 170, 148, 149, 102, 0, 209, 125, 133, - 122, 183, 244, 245, 121, 273, 109, 258, 105, 110, - 257, 177, 240, 248, 171, 164, 104, 246, 169, 163, - 153, 129, 141, 201, 161, 202, 142, 174, 173, 175, - 0, 0, 0, 232, 255, 274, 114, 0, 239, 266, - 269, 0, 205, 115, 134, 128, 200, 132, 156, 265, - 267, 268, 176, 111, 144, 229, 152, 160, 208, 272, - 190, 214, 118, 254, 230, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 871, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 97, 106, 157, 271, 206, 131, - 256, 0, 0, 124, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 290, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 973, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 99, 100, 107, 113, - 119, 123, 127, 130, 136, 140, 143, 145, 146, 147, - 150, 162, 165, 166, 167, 168, 178, 179, 180, 182, - 185, 186, 187, 188, 189, 192, 194, 195, 196, 197, - 198, 199, 207, 210, 216, 217, 218, 219, 220, 221, - 222, 224, 225, 226, 227, 233, 236, 242, 243, 253, - 260, 263, 138, 250, 264, 184, 0, 0, 0, 754, - 0, 0, 0, 0, 126, 0, 0, 0, 0, 0, - 155, 0, 0, 0, 158, 0, 0, 231, 172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 94, 95, 96, - 0, 756, 0, 0, 0, 0, 0, 0, 116, 0, - 0, 0, 0, 0, 648, 649, 647, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 650, 0, 0, 0, 0, 0, 0, 0, + 290, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 135, 0, 0, 0, - 292, 0, 0, 0, 0, 203, 0, 235, 139, 154, - 112, 151, 98, 108, 0, 137, 181, 211, 215, 0, - 0, 0, 120, 0, 213, 191, 252, 0, 193, 212, - 159, 241, 204, 251, 261, 262, 238, 259, 270, 228, - 101, 237, 249, 117, 223, 0, 0, 0, 103, 247, - 234, 170, 148, 149, 102, 0, 209, 125, 133, 122, - 183, 244, 245, 121, 273, 109, 258, 105, 110, 257, - 177, 240, 248, 171, 164, 104, 246, 169, 163, 153, - 129, 141, 201, 161, 202, 142, 174, 173, 175, 0, - 0, 0, 232, 255, 274, 114, 0, 239, 266, 269, - 0, 205, 115, 134, 128, 200, 132, 156, 265, 267, - 268, 176, 111, 144, 229, 152, 160, 208, 272, 190, - 214, 118, 254, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 97, 106, 157, 271, 206, 131, 256, - 0, 0, 124, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 290, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 290, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 290, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 99, 100, 107, 113, 119, - 123, 127, 130, 136, 140, 143, 145, 146, 147, 150, - 162, 165, 166, 167, 168, 178, 179, 180, 182, 185, - 186, 187, 188, 189, 192, 194, 195, 196, 197, 198, - 199, 207, 210, 216, 217, 218, 219, 220, 221, 222, - 224, 225, 226, 227, 233, 236, 242, 243, 253, 260, - 263, 138, 250, 264, 184, 0, 0, 0, 0, 0, - 0, 0, 0, 126, 0, 0, 0, 0, 0, 155, - 0, 0, 0, 158, 0, 0, 231, 172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 94, 95, 96, 0, - 0, 0, 0, 0, 0, 0, 0, 116, 0, 0, - 0, 0, 0, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 973, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 135, 88, 89, 0, 85, - 0, 0, 0, 90, 203, 0, 235, 139, 154, 112, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1034, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 290, 0, 0, + 0, 0, 552, 540, 0, 0, 496, 555, 469, 486, + 563, 487, 490, 527, 454, 509, 184, 484, 0, 473, + 449, 480, 450, 471, 498, 126, 502, 468, 542, 512, + 554, 155, 0, 474, 529, 224, 561, 158, 518, 0, + 232, 172, 0, 0, 0, 500, 544, 507, 537, 495, + 528, 459, 517, 556, 485, 525, 557, 0, 0, 973, + 94, 95, 96, 0, 1060, 1061, 0, 0, 0, 0, + 0, 116, 290, 522, 551, 482, 524, 526, 565, 448, + 519, 0, 452, 455, 562, 547, 477, 478, 1258, 0, + 0, 0, 0, 0, 0, 499, 508, 534, 493, 0, + 0, 0, 0, 0, 0, 0, 0, 475, 0, 516, + 0, 0, 0, 456, 453, 0, 0, 0, 0, 497, + 0, 0, 0, 458, 0, 476, 535, 0, 446, 135, + 539, 546, 494, 293, 550, 492, 491, 553, 203, 0, + 236, 139, 154, 112, 151, 98, 108, 0, 137, 181, + 211, 215, 543, 472, 481, 120, 479, 213, 191, 253, + 515, 193, 212, 159, 242, 204, 252, 262, 263, 239, + 260, 271, 229, 101, 238, 250, 117, 223, 0, 0, + 0, 103, 248, 235, 170, 148, 149, 102, 0, 209, + 125, 133, 122, 183, 245, 246, 121, 274, 109, 259, + 105, 110, 258, 177, 241, 249, 171, 164, 104, 247, + 169, 163, 153, 129, 141, 201, 161, 202, 142, 174, + 173, 175, 0, 451, 0, 233, 256, 275, 114, 467, + 240, 267, 270, 0, 205, 115, 134, 128, 200, 132, + 156, 266, 268, 269, 176, 111, 144, 230, 152, 160, + 208, 273, 190, 214, 118, 255, 231, 463, 466, 461, + 462, 510, 511, 558, 559, 560, 536, 457, 0, 464, + 465, 0, 541, 548, 549, 514, 97, 106, 157, 272, + 206, 131, 257, 447, 460, 124, 470, 0, 0, 483, + 488, 489, 501, 503, 504, 505, 506, 513, 520, 521, + 523, 530, 531, 532, 533, 538, 545, 564, 99, 100, + 107, 113, 119, 123, 127, 130, 136, 140, 143, 145, + 146, 147, 150, 162, 165, 166, 167, 168, 178, 179, + 180, 182, 185, 186, 187, 188, 189, 192, 194, 195, + 196, 197, 198, 199, 207, 210, 216, 217, 218, 219, + 220, 221, 222, 225, 226, 227, 228, 234, 237, 243, + 244, 254, 261, 264, 138, 251, 265, 552, 540, 0, + 0, 496, 555, 469, 486, 563, 487, 490, 527, 454, + 509, 184, 484, 0, 473, 449, 480, 450, 471, 498, + 126, 502, 468, 542, 512, 554, 155, 0, 474, 529, + 224, 561, 158, 518, 0, 232, 172, 0, 0, 0, + 500, 544, 507, 537, 495, 528, 459, 517, 556, 485, + 525, 557, 0, 0, 0, 94, 95, 96, 0, 1060, + 1061, 0, 0, 0, 0, 0, 116, 0, 522, 551, + 482, 524, 526, 565, 448, 519, 0, 452, 455, 562, + 547, 477, 478, 0, 0, 0, 0, 0, 0, 0, + 499, 508, 534, 493, 0, 0, 0, 0, 0, 0, + 0, 0, 475, 0, 516, 0, 0, 0, 456, 453, + 0, 0, 0, 0, 497, 0, 0, 0, 458, 0, + 476, 535, 0, 446, 135, 539, 546, 494, 293, 550, + 492, 491, 553, 203, 0, 236, 139, 154, 112, 151, + 98, 108, 0, 137, 181, 211, 215, 543, 472, 481, + 120, 479, 213, 191, 253, 515, 193, 212, 159, 242, + 204, 252, 262, 263, 239, 260, 271, 229, 101, 238, + 250, 117, 223, 0, 0, 0, 103, 248, 235, 170, + 148, 149, 102, 0, 209, 125, 133, 122, 183, 245, + 246, 121, 274, 109, 259, 105, 110, 258, 177, 241, + 249, 171, 164, 104, 247, 169, 163, 153, 129, 141, + 201, 161, 202, 142, 174, 173, 175, 0, 451, 0, + 233, 256, 275, 114, 467, 240, 267, 270, 0, 205, + 115, 134, 128, 200, 132, 156, 266, 268, 269, 176, + 111, 144, 230, 152, 160, 208, 273, 190, 214, 118, + 255, 231, 463, 466, 461, 462, 510, 511, 558, 559, + 560, 536, 457, 0, 464, 465, 0, 541, 548, 549, + 514, 97, 106, 157, 272, 206, 131, 257, 447, 460, + 124, 470, 0, 0, 483, 488, 489, 501, 503, 504, + 505, 506, 513, 520, 521, 523, 530, 531, 532, 533, + 538, 545, 564, 99, 100, 107, 113, 119, 123, 127, + 130, 136, 140, 143, 145, 146, 147, 150, 162, 165, + 166, 167, 168, 178, 179, 180, 182, 185, 186, 187, + 188, 189, 192, 194, 195, 196, 197, 198, 199, 207, + 210, 216, 217, 218, 219, 220, 221, 222, 225, 226, + 227, 228, 234, 237, 243, 244, 254, 261, 264, 138, + 251, 265, 552, 540, 0, 0, 496, 555, 469, 486, + 563, 487, 490, 527, 454, 509, 184, 484, 0, 473, + 449, 480, 450, 471, 498, 126, 502, 468, 542, 512, + 554, 155, 0, 474, 529, 224, 561, 158, 518, 0, + 232, 172, 0, 0, 0, 500, 544, 507, 537, 495, + 528, 459, 517, 556, 485, 525, 557, 59, 0, 0, + 94, 95, 96, 0, 0, 0, 0, 0, 0, 0, + 0, 116, 0, 522, 551, 482, 524, 526, 565, 448, + 519, 0, 452, 455, 562, 547, 477, 478, 0, 0, + 0, 0, 0, 0, 0, 499, 508, 534, 493, 0, + 0, 0, 0, 0, 0, 0, 0, 475, 0, 516, + 0, 0, 0, 456, 453, 0, 0, 0, 0, 497, + 0, 0, 0, 458, 0, 476, 535, 0, 446, 135, + 539, 546, 494, 293, 550, 492, 491, 553, 203, 0, + 236, 139, 154, 112, 151, 98, 108, 0, 137, 181, + 211, 215, 543, 472, 481, 120, 479, 213, 191, 253, + 515, 193, 212, 159, 242, 204, 252, 262, 263, 239, + 260, 271, 229, 101, 238, 250, 117, 223, 0, 0, + 0, 103, 248, 235, 170, 148, 149, 102, 0, 209, + 125, 133, 122, 183, 245, 246, 121, 274, 109, 259, + 105, 110, 258, 177, 241, 249, 171, 164, 104, 247, + 169, 163, 153, 129, 141, 201, 161, 202, 142, 174, + 173, 175, 0, 451, 0, 233, 256, 275, 114, 467, + 240, 267, 270, 0, 205, 115, 134, 128, 200, 132, + 156, 266, 268, 269, 176, 111, 144, 230, 152, 160, + 208, 273, 190, 214, 118, 255, 231, 463, 466, 461, + 462, 510, 511, 558, 559, 560, 536, 457, 0, 464, + 465, 0, 541, 548, 549, 514, 97, 106, 157, 272, + 206, 131, 257, 447, 460, 124, 470, 0, 0, 483, + 488, 489, 501, 503, 504, 505, 506, 513, 520, 521, + 523, 530, 531, 532, 533, 538, 545, 564, 99, 100, + 107, 113, 119, 123, 127, 130, 136, 140, 143, 145, + 146, 147, 150, 162, 165, 166, 167, 168, 178, 179, + 180, 182, 185, 186, 187, 188, 189, 192, 194, 195, + 196, 197, 198, 199, 207, 210, 216, 217, 218, 219, + 220, 221, 222, 225, 226, 227, 228, 234, 237, 243, + 244, 254, 261, 264, 138, 251, 265, 552, 540, 0, + 0, 496, 555, 469, 486, 563, 487, 490, 527, 454, + 509, 184, 484, 0, 473, 449, 480, 450, 471, 498, + 126, 502, 468, 542, 512, 554, 155, 0, 474, 529, + 224, 561, 158, 518, 0, 232, 172, 0, 0, 0, + 500, 544, 507, 537, 495, 528, 459, 517, 556, 485, + 525, 557, 0, 0, 0, 94, 95, 96, 0, 0, + 0, 0, 0, 0, 0, 0, 116, 0, 522, 551, + 482, 524, 526, 565, 448, 519, 0, 452, 455, 562, + 547, 477, 478, 0, 0, 0, 0, 0, 0, 0, + 499, 508, 534, 493, 0, 0, 0, 0, 0, 0, + 1363, 0, 475, 0, 516, 0, 0, 0, 456, 453, + 0, 0, 0, 0, 497, 0, 0, 0, 458, 0, + 476, 535, 0, 446, 135, 539, 546, 494, 293, 550, + 492, 491, 553, 203, 0, 236, 139, 154, 112, 151, + 98, 108, 0, 137, 181, 211, 215, 543, 472, 481, + 120, 479, 213, 191, 253, 515, 193, 212, 159, 242, + 204, 252, 262, 263, 239, 260, 271, 229, 101, 238, + 250, 117, 223, 0, 0, 0, 103, 248, 235, 170, + 148, 149, 102, 0, 209, 125, 133, 122, 183, 245, + 246, 121, 274, 109, 259, 105, 110, 258, 177, 241, + 249, 171, 164, 104, 247, 169, 163, 153, 129, 141, + 201, 161, 202, 142, 174, 173, 175, 0, 451, 0, + 233, 256, 275, 114, 467, 240, 267, 270, 0, 205, + 115, 134, 128, 200, 132, 156, 266, 268, 269, 176, + 111, 144, 230, 152, 160, 208, 273, 190, 214, 118, + 255, 231, 463, 466, 461, 462, 510, 511, 558, 559, + 560, 536, 457, 0, 464, 465, 0, 541, 548, 549, + 514, 97, 106, 157, 272, 206, 131, 257, 447, 460, + 124, 470, 0, 0, 483, 488, 489, 501, 503, 504, + 505, 506, 513, 520, 521, 523, 530, 531, 532, 533, + 538, 545, 564, 99, 100, 107, 113, 119, 123, 127, + 130, 136, 140, 143, 145, 146, 147, 150, 162, 165, + 166, 167, 168, 178, 179, 180, 182, 185, 186, 187, + 188, 189, 192, 194, 195, 196, 197, 198, 199, 207, + 210, 216, 217, 218, 219, 220, 221, 222, 225, 226, + 227, 228, 234, 237, 243, 244, 254, 261, 264, 138, + 251, 265, 552, 540, 0, 0, 496, 555, 469, 486, + 563, 487, 490, 527, 454, 509, 184, 484, 0, 473, + 449, 480, 450, 471, 498, 126, 502, 468, 542, 512, + 554, 155, 0, 474, 529, 224, 561, 158, 518, 0, + 232, 172, 0, 0, 0, 500, 544, 507, 537, 495, + 528, 459, 517, 556, 485, 525, 557, 0, 0, 0, + 94, 95, 96, 0, 0, 0, 0, 0, 0, 0, + 0, 116, 0, 522, 551, 482, 524, 526, 565, 448, + 519, 0, 452, 455, 562, 547, 477, 478, 0, 0, + 0, 0, 0, 0, 0, 499, 508, 534, 493, 0, + 0, 0, 0, 0, 0, 1248, 0, 475, 0, 516, + 0, 0, 0, 456, 453, 0, 0, 0, 0, 497, + 0, 0, 0, 458, 0, 476, 535, 0, 446, 135, + 539, 546, 494, 293, 550, 492, 491, 553, 203, 0, + 236, 139, 154, 112, 151, 98, 108, 0, 137, 181, + 211, 215, 543, 472, 481, 120, 479, 213, 191, 253, + 515, 193, 212, 159, 242, 204, 252, 262, 263, 239, + 260, 271, 229, 101, 238, 250, 117, 223, 0, 0, + 0, 103, 248, 235, 170, 148, 149, 102, 0, 209, + 125, 133, 122, 183, 245, 246, 121, 274, 109, 259, + 105, 110, 258, 177, 241, 249, 171, 164, 104, 247, + 169, 163, 153, 129, 141, 201, 161, 202, 142, 174, + 173, 175, 0, 451, 0, 233, 256, 275, 114, 467, + 240, 267, 270, 0, 205, 115, 134, 128, 200, 132, + 156, 266, 268, 269, 176, 111, 144, 230, 152, 160, + 208, 273, 190, 214, 118, 255, 231, 463, 466, 461, + 462, 510, 511, 558, 559, 560, 536, 457, 0, 464, + 465, 0, 541, 548, 549, 514, 97, 106, 157, 272, + 206, 131, 257, 447, 460, 124, 470, 0, 0, 483, + 488, 489, 501, 503, 504, 505, 506, 513, 520, 521, + 523, 530, 531, 532, 533, 538, 545, 564, 99, 100, + 107, 113, 119, 123, 127, 130, 136, 140, 143, 145, + 146, 147, 150, 162, 165, 166, 167, 168, 178, 179, + 180, 182, 185, 186, 187, 188, 189, 192, 194, 195, + 196, 197, 198, 199, 207, 210, 216, 217, 218, 219, + 220, 221, 222, 225, 226, 227, 228, 234, 237, 243, + 244, 254, 261, 264, 138, 251, 265, 552, 540, 0, + 0, 496, 555, 469, 486, 563, 487, 490, 527, 454, + 509, 184, 484, 0, 473, 449, 480, 450, 471, 498, + 126, 502, 468, 542, 512, 554, 155, 0, 474, 529, + 224, 561, 158, 518, 0, 232, 172, 0, 0, 0, + 500, 544, 507, 537, 495, 528, 459, 517, 556, 485, + 525, 557, 0, 0, 0, 94, 95, 96, 0, 0, + 0, 0, 0, 0, 0, 0, 116, 0, 522, 551, + 482, 524, 526, 565, 448, 519, 0, 452, 455, 562, + 547, 477, 478, 0, 0, 0, 0, 0, 0, 0, + 499, 508, 534, 493, 0, 0, 0, 0, 0, 0, + 1006, 0, 475, 0, 516, 0, 0, 0, 456, 453, + 0, 0, 0, 0, 497, 0, 0, 0, 458, 0, + 476, 535, 0, 446, 135, 539, 546, 494, 293, 550, + 492, 491, 553, 203, 0, 236, 139, 154, 112, 151, + 98, 108, 0, 137, 181, 211, 215, 543, 472, 481, + 120, 479, 213, 191, 253, 515, 193, 212, 159, 242, + 204, 252, 262, 263, 239, 260, 271, 229, 101, 238, + 250, 117, 223, 0, 0, 0, 103, 248, 235, 170, + 148, 149, 102, 0, 209, 125, 133, 122, 183, 245, + 246, 121, 274, 109, 259, 105, 110, 258, 177, 241, + 249, 171, 164, 104, 247, 169, 163, 153, 129, 141, + 201, 161, 202, 142, 174, 173, 175, 0, 451, 0, + 233, 256, 275, 114, 467, 240, 267, 270, 0, 205, + 115, 134, 128, 200, 132, 156, 266, 268, 269, 176, + 111, 144, 230, 152, 160, 208, 273, 190, 214, 118, + 255, 231, 463, 466, 461, 462, 510, 511, 558, 559, + 560, 536, 457, 0, 464, 465, 0, 541, 548, 549, + 514, 97, 106, 157, 272, 206, 131, 257, 447, 460, + 124, 470, 0, 0, 483, 488, 489, 501, 503, 504, + 505, 506, 513, 520, 521, 523, 530, 531, 532, 533, + 538, 545, 564, 99, 100, 107, 113, 119, 123, 127, + 130, 136, 140, 143, 145, 146, 147, 150, 162, 165, + 166, 167, 168, 178, 179, 180, 182, 185, 186, 187, + 188, 189, 192, 194, 195, 196, 197, 198, 199, 207, + 210, 216, 217, 218, 219, 220, 221, 222, 225, 226, + 227, 228, 234, 237, 243, 244, 254, 261, 264, 138, + 251, 265, 552, 540, 0, 0, 496, 555, 469, 486, + 563, 487, 490, 527, 454, 509, 184, 484, 0, 473, + 449, 480, 450, 471, 498, 126, 502, 468, 542, 512, + 554, 155, 0, 474, 529, 224, 561, 158, 518, 0, + 232, 172, 0, 0, 0, 500, 544, 507, 537, 495, + 528, 459, 517, 556, 485, 525, 557, 0, 0, 0, + 94, 95, 96, 0, 0, 0, 0, 0, 0, 0, + 0, 116, 0, 522, 551, 482, 524, 526, 565, 448, + 519, 0, 452, 455, 562, 547, 477, 478, 0, 0, + 0, 0, 0, 0, 0, 499, 508, 534, 493, 0, + 0, 0, 0, 0, 0, 0, 0, 475, 0, 516, + 0, 0, 0, 456, 453, 0, 0, 0, 0, 497, + 0, 0, 0, 458, 0, 476, 535, 0, 446, 135, + 539, 546, 494, 293, 550, 492, 491, 553, 203, 0, + 236, 139, 154, 112, 151, 98, 108, 0, 137, 181, + 211, 215, 543, 472, 481, 120, 479, 213, 191, 253, + 515, 193, 212, 159, 242, 204, 252, 262, 263, 239, + 260, 271, 229, 101, 238, 250, 117, 223, 0, 0, + 0, 103, 248, 235, 170, 148, 149, 102, 0, 209, + 125, 133, 122, 183, 245, 246, 121, 274, 109, 259, + 105, 110, 258, 177, 241, 249, 171, 164, 104, 247, + 169, 163, 153, 129, 141, 201, 161, 202, 142, 174, + 173, 175, 0, 451, 0, 233, 256, 275, 114, 467, + 240, 267, 270, 0, 205, 115, 134, 128, 200, 132, + 156, 266, 268, 269, 176, 111, 144, 230, 152, 160, + 208, 273, 190, 214, 118, 255, 231, 463, 466, 461, + 462, 510, 511, 558, 559, 560, 536, 457, 0, 464, + 465, 0, 541, 548, 549, 514, 97, 106, 157, 272, + 206, 131, 257, 447, 460, 124, 470, 0, 0, 483, + 488, 489, 501, 503, 504, 505, 506, 513, 520, 521, + 523, 530, 531, 532, 533, 538, 545, 564, 99, 100, + 107, 113, 119, 123, 127, 130, 136, 140, 143, 145, + 146, 147, 150, 162, 165, 166, 167, 168, 178, 179, + 180, 182, 185, 186, 187, 188, 189, 192, 194, 195, + 196, 197, 198, 199, 207, 210, 216, 217, 218, 219, + 220, 221, 222, 225, 226, 227, 228, 234, 237, 243, + 244, 254, 261, 264, 138, 251, 265, 552, 540, 0, + 0, 496, 555, 469, 486, 563, 487, 490, 527, 454, + 509, 184, 484, 0, 473, 449, 480, 450, 471, 498, + 126, 502, 468, 542, 512, 554, 155, 0, 474, 529, + 224, 561, 158, 518, 0, 232, 172, 0, 0, 0, + 500, 544, 507, 537, 495, 528, 459, 517, 556, 485, + 525, 557, 0, 0, 0, 94, 95, 96, 0, 0, + 0, 0, 0, 0, 0, 0, 116, 0, 522, 551, + 482, 524, 526, 565, 448, 519, 0, 452, 455, 562, + 547, 477, 478, 0, 0, 0, 0, 0, 0, 0, + 499, 508, 534, 493, 0, 0, 0, 0, 0, 0, + 0, 0, 475, 0, 516, 0, 0, 0, 456, 453, + 0, 0, 0, 0, 497, 0, 0, 0, 458, 0, + 476, 535, 0, 446, 135, 539, 546, 494, 293, 550, + 492, 491, 553, 203, 0, 236, 139, 154, 112, 151, + 98, 108, 0, 137, 181, 211, 215, 543, 472, 481, + 120, 479, 213, 191, 253, 515, 193, 212, 159, 242, + 204, 252, 262, 263, 239, 260, 271, 229, 101, 238, + 250, 117, 223, 0, 0, 0, 103, 248, 235, 170, + 148, 149, 102, 0, 209, 125, 133, 122, 183, 245, + 246, 121, 274, 109, 259, 105, 444, 258, 177, 241, + 249, 171, 164, 104, 247, 169, 163, 153, 129, 141, + 201, 161, 202, 142, 174, 173, 175, 0, 451, 0, + 233, 256, 275, 114, 467, 240, 267, 270, 0, 205, + 115, 134, 128, 200, 132, 156, 266, 268, 269, 445, + 443, 438, 437, 152, 160, 208, 273, 190, 214, 118, + 255, 231, 463, 466, 461, 462, 510, 511, 558, 559, + 560, 536, 457, 0, 464, 465, 0, 541, 548, 549, + 514, 97, 106, 157, 272, 206, 131, 257, 447, 460, + 124, 470, 0, 0, 483, 488, 489, 501, 503, 504, + 505, 506, 513, 520, 521, 523, 530, 531, 532, 533, + 538, 545, 564, 99, 100, 107, 113, 119, 123, 127, + 130, 136, 140, 143, 145, 146, 147, 150, 162, 165, + 166, 167, 168, 178, 179, 180, 182, 185, 186, 187, + 188, 189, 192, 194, 195, 196, 197, 198, 199, 207, + 210, 216, 217, 218, 219, 220, 221, 222, 225, 226, + 227, 228, 234, 237, 243, 244, 254, 261, 264, 138, + 251, 265, 552, 540, 0, 0, 496, 555, 469, 486, + 563, 487, 490, 527, 454, 509, 184, 484, 0, 473, + 449, 480, 450, 471, 498, 126, 502, 468, 542, 512, + 554, 155, 0, 474, 529, 224, 561, 158, 518, 0, + 232, 172, 0, 0, 0, 500, 544, 507, 537, 495, + 528, 459, 517, 556, 485, 525, 557, 0, 0, 0, + 94, 95, 96, 0, 0, 0, 0, 0, 0, 0, + 0, 116, 0, 522, 551, 482, 524, 526, 565, 448, + 519, 0, 452, 455, 562, 547, 477, 478, 0, 0, + 0, 0, 0, 0, 0, 499, 508, 534, 493, 0, + 0, 0, 0, 0, 0, 0, 0, 475, 0, 516, + 0, 0, 0, 456, 453, 0, 0, 0, 0, 497, + 0, 0, 0, 458, 0, 476, 535, 0, 446, 135, + 539, 546, 494, 293, 550, 492, 491, 553, 203, 0, + 236, 139, 154, 112, 151, 98, 108, 0, 137, 181, + 211, 215, 543, 472, 481, 120, 479, 213, 191, 253, + 515, 193, 212, 159, 242, 204, 252, 262, 263, 239, + 260, 271, 229, 101, 238, 779, 117, 223, 0, 0, + 0, 103, 248, 235, 170, 148, 149, 102, 0, 209, + 125, 133, 122, 183, 245, 246, 121, 274, 109, 259, + 105, 444, 258, 177, 241, 249, 171, 164, 104, 247, + 169, 163, 153, 129, 141, 201, 161, 202, 142, 174, + 173, 175, 0, 451, 0, 233, 256, 275, 114, 467, + 240, 267, 270, 0, 205, 115, 134, 128, 200, 132, + 156, 266, 268, 269, 445, 443, 438, 437, 152, 160, + 208, 273, 190, 214, 118, 255, 231, 463, 466, 461, + 462, 510, 511, 558, 559, 560, 536, 457, 0, 464, + 465, 0, 541, 548, 549, 514, 97, 106, 157, 272, + 206, 131, 257, 447, 460, 124, 470, 0, 0, 483, + 488, 489, 501, 503, 504, 505, 506, 513, 520, 521, + 523, 530, 531, 532, 533, 538, 545, 564, 99, 100, + 107, 113, 119, 123, 127, 130, 136, 140, 143, 145, + 146, 147, 150, 162, 165, 166, 167, 168, 178, 179, + 180, 182, 185, 186, 187, 188, 189, 192, 194, 195, + 196, 197, 198, 199, 207, 210, 216, 217, 218, 219, + 220, 221, 222, 225, 226, 227, 228, 234, 237, 243, + 244, 254, 261, 264, 138, 251, 265, 552, 540, 0, + 0, 496, 555, 469, 486, 563, 487, 490, 527, 454, + 509, 184, 484, 0, 473, 449, 480, 450, 471, 498, + 126, 502, 468, 542, 512, 554, 155, 0, 474, 529, + 224, 561, 158, 518, 0, 232, 172, 0, 0, 0, + 500, 544, 507, 537, 495, 528, 459, 517, 556, 485, + 525, 557, 0, 0, 0, 94, 95, 96, 0, 0, + 0, 0, 0, 0, 0, 0, 116, 0, 522, 551, + 482, 524, 526, 565, 448, 519, 0, 452, 455, 562, + 547, 477, 478, 0, 0, 0, 0, 0, 0, 0, + 499, 508, 534, 493, 0, 0, 0, 0, 0, 0, + 0, 0, 475, 0, 516, 0, 0, 0, 456, 453, + 0, 0, 0, 0, 497, 0, 0, 0, 458, 0, + 476, 535, 0, 446, 135, 539, 546, 494, 293, 550, + 492, 491, 553, 203, 0, 236, 139, 154, 112, 151, + 98, 108, 0, 137, 181, 211, 215, 543, 472, 481, + 120, 479, 213, 191, 253, 515, 193, 212, 159, 242, + 204, 252, 262, 263, 239, 260, 271, 229, 101, 238, + 435, 117, 223, 0, 0, 0, 103, 248, 235, 170, + 148, 149, 102, 0, 209, 125, 133, 122, 183, 245, + 246, 121, 274, 109, 259, 105, 444, 258, 177, 241, + 249, 171, 164, 104, 247, 169, 163, 153, 129, 141, + 201, 161, 202, 142, 174, 173, 175, 0, 451, 0, + 233, 256, 275, 114, 467, 240, 267, 270, 0, 205, + 115, 134, 128, 200, 132, 156, 266, 268, 269, 445, + 443, 438, 437, 152, 160, 208, 273, 190, 214, 118, + 255, 231, 463, 466, 461, 462, 510, 511, 558, 559, + 560, 536, 457, 0, 464, 465, 0, 541, 548, 549, + 514, 97, 106, 157, 272, 206, 131, 257, 447, 460, + 124, 470, 0, 0, 483, 488, 489, 501, 503, 504, + 505, 506, 513, 520, 521, 523, 530, 531, 532, 533, + 538, 545, 564, 99, 100, 107, 113, 119, 123, 127, + 130, 136, 140, 143, 145, 146, 147, 150, 162, 165, + 166, 167, 168, 178, 179, 180, 182, 185, 186, 187, + 188, 189, 192, 194, 195, 196, 197, 198, 199, 207, + 210, 216, 217, 218, 219, 220, 221, 222, 225, 226, + 227, 228, 234, 237, 243, 244, 254, 261, 264, 138, + 251, 265, 184, 0, 0, 944, 0, 342, 0, 0, + 0, 126, 0, 341, 0, 0, 0, 155, 0, 945, + 0, 224, 385, 158, 0, 0, 232, 172, 0, 0, + 0, 0, 0, 376, 377, 0, 0, 0, 0, 0, + 0, 0, 0, 59, 0, 0, 94, 95, 96, 363, + 362, 365, 366, 367, 368, 0, 0, 116, 364, 369, + 370, 371, 0, 0, 0, 0, 339, 356, 0, 384, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 353, + 354, 425, 0, 0, 0, 399, 0, 355, 0, 0, + 348, 349, 351, 350, 352, 357, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 135, 398, 0, 0, 293, + 0, 0, 396, 0, 203, 0, 236, 139, 154, 112, 151, 98, 108, 0, 137, 181, 211, 215, 0, 0, - 0, 120, 0, 213, 191, 252, 0, 193, 212, 159, - 241, 204, 251, 261, 262, 238, 259, 270, 228, 101, - 237, 249, 117, 223, 0, 0, 0, 103, 247, 234, + 0, 120, 0, 213, 191, 253, 0, 193, 212, 159, + 242, 204, 252, 262, 263, 239, 260, 271, 229, 101, + 238, 250, 117, 223, 0, 0, 0, 103, 248, 235, 170, 148, 149, 102, 0, 209, 125, 133, 122, 183, - 244, 245, 121, 273, 109, 258, 105, 110, 257, 177, - 240, 248, 171, 164, 104, 246, 169, 163, 153, 129, + 245, 246, 121, 274, 109, 259, 105, 110, 258, 177, + 241, 249, 171, 164, 104, 247, 169, 163, 153, 129, 141, 201, 161, 202, 142, 174, 173, 175, 0, 0, - 0, 232, 255, 274, 114, 0, 239, 266, 269, 0, - 205, 115, 134, 128, 200, 132, 156, 265, 267, 268, - 176, 111, 144, 229, 152, 160, 208, 272, 190, 214, - 118, 254, 230, 0, 87, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 97, 106, 157, 271, 206, 131, 256, 0, + 0, 233, 256, 275, 114, 0, 240, 267, 270, 0, + 205, 115, 134, 128, 200, 132, 156, 266, 268, 269, + 176, 111, 144, 230, 152, 160, 208, 273, 190, 214, + 118, 255, 231, 386, 397, 392, 393, 390, 391, 389, + 388, 387, 400, 378, 379, 380, 381, 383, 0, 394, + 395, 382, 97, 106, 157, 272, 206, 131, 257, 0, 0, 124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 99, 100, 107, 113, 119, 123, 127, 130, 136, 140, 143, 145, 146, 147, 150, 162, 165, 166, 167, 168, 178, 179, 180, 182, 185, 186, 187, 188, 189, 192, 194, 195, 196, 197, 198, 199, - 207, 210, 216, 217, 218, 219, 220, 221, 222, 224, - 225, 226, 227, 233, 236, 242, 243, 253, 260, 263, - 138, 250, 264, 184, 0, 0, 0, 1029, 0, 0, - 0, 0, 126, 0, 0, 0, 0, 0, 155, 0, - 0, 0, 158, 0, 0, 231, 172, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 94, 95, 96, 0, 1031, - 0, 0, 0, 0, 0, 0, 116, 0, 0, 0, + 207, 210, 216, 217, 218, 219, 220, 221, 222, 225, + 226, 227, 228, 234, 237, 243, 244, 254, 261, 264, + 138, 251, 265, 184, 0, 0, 0, 0, 342, 0, + 0, 0, 126, 0, 341, 0, 0, 0, 155, 0, + 0, 0, 224, 385, 158, 0, 0, 232, 172, 0, + 0, 0, 0, 0, 376, 377, 0, 0, 0, 0, + 0, 0, 1051, 0, 59, 0, 0, 94, 95, 96, + 363, 362, 365, 366, 367, 368, 0, 0, 116, 364, + 369, 370, 371, 1052, 0, 0, 0, 339, 356, 0, + 384, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 353, 354, 0, 0, 0, 0, 399, 0, 355, 0, + 0, 348, 349, 351, 350, 352, 357, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 135, 398, 0, 0, + 293, 0, 0, 396, 0, 203, 0, 236, 139, 154, + 112, 151, 98, 108, 0, 137, 181, 211, 215, 0, + 0, 0, 120, 0, 213, 191, 253, 0, 193, 212, + 159, 242, 204, 252, 262, 263, 239, 260, 271, 229, + 101, 238, 250, 117, 223, 0, 0, 0, 103, 248, + 235, 170, 148, 149, 102, 0, 209, 125, 133, 122, + 183, 245, 246, 121, 274, 109, 259, 105, 110, 258, + 177, 241, 249, 171, 164, 104, 247, 169, 163, 153, + 129, 141, 201, 161, 202, 142, 174, 173, 175, 0, + 0, 0, 233, 256, 275, 114, 0, 240, 267, 270, + 0, 205, 115, 134, 128, 200, 132, 156, 266, 268, + 269, 176, 111, 144, 230, 152, 160, 208, 273, 190, + 214, 118, 255, 231, 386, 397, 392, 393, 390, 391, + 389, 388, 387, 400, 378, 379, 380, 381, 383, 0, + 394, 395, 382, 97, 106, 157, 272, 206, 131, 257, + 0, 0, 124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 99, 100, 107, 113, 119, + 123, 127, 130, 136, 140, 143, 145, 146, 147, 150, + 162, 165, 166, 167, 168, 178, 179, 180, 182, 185, + 186, 187, 188, 189, 192, 194, 195, 196, 197, 198, + 199, 207, 210, 216, 217, 218, 219, 220, 221, 222, + 225, 226, 227, 228, 234, 237, 243, 244, 254, 261, + 264, 138, 251, 265, 184, 0, 0, 0, 0, 342, + 0, 0, 0, 126, 0, 341, 0, 0, 0, 155, + 0, 0, 0, 224, 385, 158, 0, 0, 232, 172, + 0, 0, 0, 0, 0, 376, 377, 0, 0, 0, + 0, 0, 0, 0, 0, 59, 0, 413, 94, 95, + 96, 363, 362, 365, 366, 367, 368, 0, 0, 116, + 364, 369, 370, 371, 0, 0, 0, 0, 339, 356, + 0, 384, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 353, 354, 0, 0, 0, 0, 399, 0, 355, + 0, 0, 348, 349, 351, 350, 352, 357, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 135, 398, 0, + 0, 293, 0, 0, 396, 0, 203, 0, 236, 139, + 154, 112, 151, 98, 108, 0, 137, 181, 211, 215, + 0, 0, 0, 120, 0, 213, 191, 253, 0, 193, + 212, 159, 242, 204, 252, 262, 263, 239, 260, 271, + 229, 101, 238, 250, 117, 223, 0, 0, 0, 103, + 248, 235, 170, 148, 149, 102, 0, 209, 125, 133, + 122, 183, 245, 246, 121, 274, 109, 259, 105, 110, + 258, 177, 241, 249, 171, 164, 104, 247, 169, 163, + 153, 129, 141, 201, 161, 202, 142, 174, 173, 175, + 0, 0, 0, 233, 256, 275, 114, 0, 240, 267, + 270, 0, 205, 115, 134, 128, 200, 132, 156, 266, + 268, 269, 176, 111, 144, 230, 152, 160, 208, 273, + 190, 214, 118, 255, 231, 386, 397, 392, 393, 390, + 391, 389, 388, 387, 400, 378, 379, 380, 381, 383, + 0, 394, 395, 382, 97, 106, 157, 272, 206, 131, + 257, 0, 0, 124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 99, 100, 107, 113, + 119, 123, 127, 130, 136, 140, 143, 145, 146, 147, + 150, 162, 165, 166, 167, 168, 178, 179, 180, 182, + 185, 186, 187, 188, 189, 192, 194, 195, 196, 197, + 198, 199, 207, 210, 216, 217, 218, 219, 220, 221, + 222, 225, 226, 227, 228, 234, 237, 243, 244, 254, + 261, 264, 138, 251, 265, 184, 0, 0, 0, 0, + 342, 0, 0, 0, 126, 0, 341, 0, 0, 0, + 155, 0, 0, 0, 224, 385, 158, 0, 0, 232, + 172, 0, 0, 0, 0, 0, 376, 377, 0, 0, + 0, 0, 0, 0, 0, 0, 59, 0, 0, 94, + 95, 96, 363, 362, 365, 366, 367, 368, 0, 0, + 116, 364, 369, 370, 371, 0, 0, 0, 0, 339, + 356, 0, 384, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 353, 354, 425, 0, 0, 0, 399, 0, + 355, 0, 0, 348, 349, 351, 350, 352, 357, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 135, 398, + 0, 0, 293, 0, 0, 396, 0, 203, 0, 236, + 139, 154, 112, 151, 98, 108, 0, 137, 181, 211, + 215, 0, 0, 0, 120, 0, 213, 191, 253, 0, + 193, 212, 159, 242, 204, 252, 262, 263, 239, 260, + 271, 229, 101, 238, 250, 117, 223, 0, 0, 0, + 103, 248, 235, 170, 148, 149, 102, 0, 209, 125, + 133, 122, 183, 245, 246, 121, 274, 109, 259, 105, + 110, 258, 177, 241, 249, 171, 164, 104, 247, 169, + 163, 153, 129, 141, 201, 161, 202, 142, 174, 173, + 175, 0, 0, 0, 233, 256, 275, 114, 0, 240, + 267, 270, 0, 205, 115, 134, 128, 200, 132, 156, + 266, 268, 269, 176, 111, 144, 230, 152, 160, 208, + 273, 190, 214, 118, 255, 231, 386, 397, 392, 393, + 390, 391, 389, 388, 387, 400, 378, 379, 380, 381, + 383, 0, 394, 395, 382, 97, 106, 157, 272, 206, + 131, 257, 0, 0, 124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 99, 100, 107, + 113, 119, 123, 127, 130, 136, 140, 143, 145, 146, + 147, 150, 162, 165, 166, 167, 168, 178, 179, 180, + 182, 185, 186, 187, 188, 189, 192, 194, 195, 196, + 197, 198, 199, 207, 210, 216, 217, 218, 219, 220, + 221, 222, 225, 226, 227, 228, 234, 237, 243, 244, + 254, 261, 264, 138, 251, 265, 184, 0, 0, 0, + 0, 342, 0, 0, 0, 126, 0, 341, 0, 0, + 0, 155, 0, 0, 0, 224, 385, 158, 0, 0, + 232, 172, 0, 0, 0, 0, 0, 376, 377, 0, + 0, 0, 0, 0, 0, 0, 0, 59, 0, 0, + 94, 95, 96, 363, 962, 365, 366, 367, 368, 0, + 0, 116, 364, 369, 370, 371, 0, 0, 0, 0, + 339, 356, 0, 384, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 353, 354, 425, 0, 0, 0, 399, + 0, 355, 0, 0, 348, 349, 351, 350, 352, 357, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 135, + 398, 0, 0, 293, 0, 0, 396, 0, 203, 0, + 236, 139, 154, 112, 151, 98, 108, 0, 137, 181, + 211, 215, 0, 0, 0, 120, 0, 213, 191, 253, + 0, 193, 212, 159, 242, 204, 252, 262, 263, 239, + 260, 271, 229, 101, 238, 250, 117, 223, 0, 0, + 0, 103, 248, 235, 170, 148, 149, 102, 0, 209, + 125, 133, 122, 183, 245, 246, 121, 274, 109, 259, + 105, 110, 258, 177, 241, 249, 171, 164, 104, 247, + 169, 163, 153, 129, 141, 201, 161, 202, 142, 174, + 173, 175, 0, 0, 0, 233, 256, 275, 114, 0, + 240, 267, 270, 0, 205, 115, 134, 128, 200, 132, + 156, 266, 268, 269, 176, 111, 144, 230, 152, 160, + 208, 273, 190, 214, 118, 255, 231, 386, 397, 392, + 393, 390, 391, 389, 388, 387, 400, 378, 379, 380, + 381, 383, 0, 394, 395, 382, 97, 106, 157, 272, + 206, 131, 257, 0, 0, 124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 99, 100, + 107, 113, 119, 123, 127, 130, 136, 140, 143, 145, + 146, 147, 150, 162, 165, 166, 167, 168, 178, 179, + 180, 182, 185, 186, 187, 188, 189, 192, 194, 195, + 196, 197, 198, 199, 207, 210, 216, 217, 218, 219, + 220, 221, 222, 225, 226, 227, 228, 234, 237, 243, + 244, 254, 261, 264, 138, 251, 265, 184, 0, 0, + 0, 0, 342, 0, 0, 0, 126, 0, 341, 0, + 0, 0, 155, 0, 0, 0, 224, 385, 158, 0, + 0, 232, 172, 0, 0, 0, 0, 0, 376, 377, + 0, 0, 0, 0, 0, 0, 0, 0, 59, 0, + 0, 94, 95, 96, 363, 959, 365, 366, 367, 368, + 0, 0, 116, 364, 369, 370, 371, 0, 0, 0, + 0, 339, 356, 0, 384, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 353, 354, 425, 0, 0, 0, + 399, 0, 355, 0, 0, 348, 349, 351, 350, 352, + 357, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 135, 398, 0, 0, 293, 0, 0, 396, 0, 203, + 0, 236, 139, 154, 112, 151, 98, 108, 0, 137, + 181, 211, 215, 0, 0, 0, 120, 0, 213, 191, + 253, 0, 193, 212, 159, 242, 204, 252, 262, 263, + 239, 260, 271, 229, 101, 238, 250, 117, 223, 0, + 0, 0, 103, 248, 235, 170, 148, 149, 102, 0, + 209, 125, 133, 122, 183, 245, 246, 121, 274, 109, + 259, 105, 110, 258, 177, 241, 249, 171, 164, 104, + 247, 169, 163, 153, 129, 141, 201, 161, 202, 142, + 174, 173, 175, 0, 0, 0, 233, 256, 275, 114, + 0, 240, 267, 270, 0, 205, 115, 134, 128, 200, + 132, 156, 266, 268, 269, 176, 111, 144, 230, 152, + 160, 208, 273, 190, 214, 118, 255, 231, 386, 397, + 392, 393, 390, 391, 389, 388, 387, 400, 378, 379, + 380, 381, 383, 0, 394, 395, 382, 97, 106, 157, + 272, 206, 131, 257, 0, 0, 124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 135, 0, 0, 0, 292, 0, - 0, 0, 0, 203, 0, 235, 139, 154, 112, 151, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 99, + 100, 107, 113, 119, 123, 127, 130, 136, 140, 143, + 145, 146, 147, 150, 162, 165, 166, 167, 168, 178, + 179, 180, 182, 185, 186, 187, 188, 189, 192, 194, + 195, 196, 197, 198, 199, 207, 210, 216, 217, 218, + 219, 220, 221, 222, 225, 226, 227, 228, 234, 237, + 243, 244, 254, 261, 264, 138, 251, 265, 406, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 184, 0, 0, 0, 0, 342, 0, 0, 0, + 126, 0, 341, 0, 0, 0, 155, 0, 0, 0, + 224, 385, 158, 0, 0, 232, 172, 0, 0, 0, + 0, 0, 376, 377, 0, 0, 0, 0, 0, 0, + 0, 0, 59, 0, 0, 94, 95, 96, 363, 362, + 365, 366, 367, 368, 0, 0, 116, 364, 369, 370, + 371, 0, 0, 0, 0, 339, 356, 0, 384, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 353, 354, + 0, 0, 0, 0, 399, 0, 355, 0, 0, 348, + 349, 351, 350, 352, 357, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 135, 398, 0, 0, 293, 0, + 0, 396, 0, 203, 0, 236, 139, 154, 112, 151, 98, 108, 0, 137, 181, 211, 215, 0, 0, 0, - 120, 0, 213, 191, 252, 0, 193, 212, 159, 241, - 204, 251, 261, 262, 238, 259, 270, 228, 101, 237, - 249, 117, 223, 0, 0, 0, 103, 247, 234, 170, - 148, 149, 102, 0, 209, 125, 133, 122, 183, 244, - 245, 121, 273, 109, 258, 105, 110, 257, 177, 240, - 248, 171, 164, 104, 246, 169, 163, 153, 129, 141, + 120, 0, 213, 191, 253, 0, 193, 212, 159, 242, + 204, 252, 262, 263, 239, 260, 271, 229, 101, 238, + 250, 117, 223, 0, 0, 0, 103, 248, 235, 170, + 148, 149, 102, 0, 209, 125, 133, 122, 183, 245, + 246, 121, 274, 109, 259, 105, 110, 258, 177, 241, + 249, 171, 164, 104, 247, 169, 163, 153, 129, 141, 201, 161, 202, 142, 174, 173, 175, 0, 0, 0, - 232, 255, 274, 114, 0, 239, 266, 269, 0, 205, - 115, 134, 128, 200, 132, 156, 265, 267, 268, 176, - 111, 144, 229, 152, 160, 208, 272, 190, 214, 118, - 254, 230, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 97, 106, 157, 271, 206, 131, 256, 0, 0, + 233, 256, 275, 114, 0, 240, 267, 270, 0, 205, + 115, 134, 128, 200, 132, 156, 266, 268, 269, 176, + 111, 144, 230, 152, 160, 208, 273, 190, 214, 118, + 255, 231, 386, 397, 392, 393, 390, 391, 389, 388, + 387, 400, 378, 379, 380, 381, 383, 0, 394, 395, + 382, 97, 106, 157, 272, 206, 131, 257, 0, 0, 124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 99, 100, 107, 113, 119, 123, 127, 130, 136, 140, 143, 145, 146, 147, 150, 162, 165, 166, 167, 168, 178, 179, 180, 182, 185, 186, 187, 188, 189, 192, 194, 195, 196, 197, 198, 199, 207, - 210, 216, 217, 218, 219, 220, 221, 222, 224, 225, - 226, 227, 233, 236, 242, 243, 253, 260, 263, 138, - 250, 264, 30, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 184, 0, 0, 0, 0, - 0, 0, 0, 0, 126, 0, 0, 0, 0, 0, - 155, 0, 0, 0, 158, 0, 0, 231, 172, 0, + 210, 216, 217, 218, 219, 220, 221, 222, 225, 226, + 227, 228, 234, 237, 243, 244, 254, 261, 264, 138, + 251, 265, 184, 0, 0, 0, 0, 342, 0, 0, + 0, 126, 0, 341, 0, 0, 0, 155, 0, 0, + 0, 224, 385, 158, 0, 0, 232, 172, 0, 0, + 0, 0, 0, 376, 377, 0, 0, 0, 0, 0, + 0, 0, 0, 59, 0, 0, 94, 95, 96, 363, + 362, 365, 366, 367, 368, 0, 0, 116, 364, 369, + 370, 371, 0, 0, 0, 0, 339, 356, 0, 384, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 353, + 354, 0, 0, 0, 0, 399, 0, 355, 0, 0, + 348, 349, 351, 350, 352, 357, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 135, 398, 0, 0, 293, + 0, 0, 396, 0, 203, 0, 236, 139, 154, 112, + 151, 98, 108, 0, 137, 181, 211, 215, 0, 0, + 0, 120, 0, 213, 191, 253, 0, 193, 212, 159, + 242, 204, 252, 262, 263, 239, 260, 271, 229, 101, + 238, 250, 117, 223, 0, 0, 0, 103, 248, 235, + 170, 148, 149, 102, 0, 209, 125, 133, 122, 183, + 245, 246, 121, 274, 109, 259, 105, 110, 258, 177, + 241, 249, 171, 164, 104, 247, 169, 163, 153, 129, + 141, 201, 161, 202, 142, 174, 173, 175, 0, 0, + 0, 233, 256, 275, 114, 0, 240, 267, 270, 0, + 205, 115, 134, 128, 200, 132, 156, 266, 268, 269, + 176, 111, 144, 230, 152, 160, 208, 273, 190, 214, + 118, 255, 231, 386, 397, 392, 393, 390, 391, 389, + 388, 387, 400, 378, 379, 380, 381, 383, 0, 394, + 395, 382, 97, 106, 157, 272, 206, 131, 257, 0, + 0, 124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 99, 100, 107, 113, 119, 123, + 127, 130, 136, 140, 143, 145, 146, 147, 150, 162, + 165, 166, 167, 168, 178, 179, 180, 182, 185, 186, + 187, 188, 189, 192, 194, 195, 196, 197, 198, 199, + 207, 210, 216, 217, 218, 219, 220, 221, 222, 225, + 226, 227, 228, 234, 237, 243, 244, 254, 261, 264, + 138, 251, 265, 184, 0, 0, 0, 0, 0, 0, + 0, 0, 126, 0, 0, 0, 0, 0, 155, 0, + 0, 0, 224, 385, 158, 0, 0, 232, 172, 0, + 0, 0, 0, 0, 376, 377, 0, 0, 0, 0, 0, 0, 0, 0, 59, 0, 0, 94, 95, 96, - 0, 0, 0, 0, 0, 0, 0, 0, 116, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 135, 0, 0, 0, - 292, 0, 0, 0, 0, 203, 0, 235, 139, 154, + 363, 362, 365, 366, 367, 368, 0, 0, 116, 364, + 369, 370, 371, 0, 0, 0, 0, 0, 356, 0, + 384, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 353, 354, 0, 0, 0, 0, 399, 0, 355, 0, + 0, 348, 349, 351, 350, 352, 357, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 135, 398, 0, 0, + 293, 0, 0, 396, 0, 203, 0, 236, 139, 154, 112, 151, 98, 108, 0, 137, 181, 211, 215, 0, - 0, 0, 120, 0, 213, 191, 252, 0, 193, 212, - 159, 241, 204, 251, 261, 262, 238, 259, 270, 228, - 101, 237, 249, 117, 223, 0, 0, 0, 103, 247, - 234, 170, 148, 149, 102, 0, 209, 125, 133, 122, - 183, 244, 245, 121, 273, 109, 258, 105, 110, 257, - 177, 240, 248, 171, 164, 104, 246, 169, 163, 153, + 0, 0, 120, 0, 213, 191, 253, 1633, 193, 212, + 159, 242, 204, 252, 262, 263, 239, 260, 271, 229, + 101, 238, 250, 117, 223, 0, 0, 0, 103, 248, + 235, 170, 148, 149, 102, 0, 209, 125, 133, 122, + 183, 245, 246, 121, 274, 109, 259, 105, 110, 258, + 177, 241, 249, 171, 164, 104, 247, 169, 163, 153, 129, 141, 201, 161, 202, 142, 174, 173, 175, 0, - 0, 0, 232, 255, 274, 114, 0, 239, 266, 269, - 0, 205, 115, 134, 128, 200, 132, 156, 265, 267, - 268, 176, 111, 144, 229, 152, 160, 208, 272, 190, - 214, 118, 254, 230, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 97, 106, 157, 271, 206, 131, 256, + 0, 0, 233, 256, 275, 114, 0, 240, 267, 270, + 0, 205, 115, 134, 128, 200, 132, 156, 266, 268, + 269, 176, 111, 144, 230, 152, 160, 208, 273, 190, + 214, 118, 255, 231, 386, 397, 392, 393, 390, 391, + 389, 388, 387, 400, 378, 379, 380, 381, 383, 0, + 394, 395, 382, 97, 106, 157, 272, 206, 131, 257, 0, 0, 124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 99, 100, 107, 113, 119, @@ -2253,475 +2026,794 @@ var yyAct = [...]int{ 162, 165, 166, 167, 168, 178, 179, 180, 182, 185, 186, 187, 188, 189, 192, 194, 195, 196, 197, 198, 199, 207, 210, 216, 217, 218, 219, 220, 221, 222, - 224, 225, 226, 227, 233, 236, 242, 243, 253, 260, - 263, 138, 250, 264, 184, 0, 0, 0, 1029, 0, + 225, 226, 227, 228, 234, 237, 243, 244, 254, 261, + 264, 138, 251, 265, 184, 0, 0, 0, 0, 0, 0, 0, 0, 126, 0, 0, 0, 0, 0, 155, - 0, 0, 0, 158, 0, 0, 231, 172, 0, 0, + 0, 0, 0, 224, 385, 158, 0, 0, 232, 172, + 0, 0, 0, 0, 0, 376, 377, 0, 0, 0, + 0, 0, 0, 0, 0, 59, 0, 413, 94, 95, + 96, 363, 362, 365, 366, 367, 368, 0, 0, 116, + 364, 369, 370, 371, 0, 0, 0, 0, 0, 356, + 0, 384, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 353, 354, 0, 0, 0, 0, 399, 0, 355, + 0, 0, 348, 349, 351, 350, 352, 357, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 135, 398, 0, + 0, 293, 0, 0, 396, 0, 203, 0, 236, 139, + 154, 112, 151, 98, 108, 0, 137, 181, 211, 215, + 0, 0, 0, 120, 0, 213, 191, 253, 0, 193, + 212, 159, 242, 204, 252, 262, 263, 239, 260, 271, + 229, 101, 238, 250, 117, 223, 0, 0, 0, 103, + 248, 235, 170, 148, 149, 102, 0, 209, 125, 133, + 122, 183, 245, 246, 121, 274, 109, 259, 105, 110, + 258, 177, 241, 249, 171, 164, 104, 247, 169, 163, + 153, 129, 141, 201, 161, 202, 142, 174, 173, 175, + 0, 0, 0, 233, 256, 275, 114, 0, 240, 267, + 270, 0, 205, 115, 134, 128, 200, 132, 156, 266, + 268, 269, 176, 111, 144, 230, 152, 160, 208, 273, + 190, 214, 118, 255, 231, 386, 397, 392, 393, 390, + 391, 389, 388, 387, 400, 378, 379, 380, 381, 383, + 0, 394, 395, 382, 97, 106, 157, 272, 206, 131, + 257, 0, 0, 124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 94, 95, 96, 0, - 1031, 0, 0, 0, 0, 0, 0, 116, 0, 0, + 0, 0, 0, 0, 0, 0, 99, 100, 107, 113, + 119, 123, 127, 130, 136, 140, 143, 145, 146, 147, + 150, 162, 165, 166, 167, 168, 178, 179, 180, 182, + 185, 186, 187, 188, 189, 192, 194, 195, 196, 197, + 198, 199, 207, 210, 216, 217, 218, 219, 220, 221, + 222, 225, 226, 227, 228, 234, 237, 243, 244, 254, + 261, 264, 138, 251, 265, 184, 0, 0, 0, 0, + 0, 0, 0, 0, 126, 0, 0, 0, 0, 0, + 155, 0, 0, 0, 224, 385, 158, 0, 0, 232, + 172, 0, 0, 0, 0, 0, 376, 377, 0, 0, + 0, 0, 0, 0, 0, 0, 59, 0, 0, 94, + 95, 96, 363, 362, 365, 366, 367, 368, 0, 0, + 116, 364, 369, 370, 371, 0, 0, 0, 0, 0, + 356, 0, 384, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 353, 354, 0, 0, 0, 0, 399, 0, + 355, 0, 0, 348, 349, 351, 350, 352, 357, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 135, 398, + 0, 0, 293, 0, 0, 396, 0, 203, 0, 236, + 139, 154, 112, 151, 98, 108, 0, 137, 181, 211, + 215, 0, 0, 0, 120, 0, 213, 191, 253, 0, + 193, 212, 159, 242, 204, 252, 262, 263, 239, 260, + 271, 229, 101, 238, 250, 117, 223, 0, 0, 0, + 103, 248, 235, 170, 148, 149, 102, 0, 209, 125, + 133, 122, 183, 245, 246, 121, 274, 109, 259, 105, + 110, 258, 177, 241, 249, 171, 164, 104, 247, 169, + 163, 153, 129, 141, 201, 161, 202, 142, 174, 173, + 175, 0, 0, 0, 233, 256, 275, 114, 0, 240, + 267, 270, 0, 205, 115, 134, 128, 200, 132, 156, + 266, 268, 269, 176, 111, 144, 230, 152, 160, 208, + 273, 190, 214, 118, 255, 231, 386, 397, 392, 393, + 390, 391, 389, 388, 387, 400, 378, 379, 380, 381, + 383, 0, 394, 395, 382, 97, 106, 157, 272, 206, + 131, 257, 0, 0, 124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 99, 100, 107, + 113, 119, 123, 127, 130, 136, 140, 143, 145, 146, + 147, 150, 162, 165, 166, 167, 168, 178, 179, 180, + 182, 185, 186, 187, 188, 189, 192, 194, 195, 196, + 197, 198, 199, 207, 210, 216, 217, 218, 219, 220, + 221, 222, 225, 226, 227, 228, 234, 237, 243, 244, + 254, 261, 264, 138, 251, 265, 184, 0, 0, 0, + 0, 0, 0, 0, 0, 126, 0, 0, 0, 0, + 0, 155, 0, 0, 0, 224, 0, 158, 0, 0, + 232, 172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 94, 95, 96, 0, 0, 0, 0, 0, 0, 0, + 0, 116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 661, + 660, 670, 671, 663, 664, 665, 666, 667, 668, 669, + 662, 0, 0, 672, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 135, + 0, 0, 0, 293, 0, 0, 0, 0, 203, 0, + 236, 139, 154, 112, 151, 98, 108, 0, 137, 181, + 211, 215, 0, 0, 0, 120, 0, 213, 191, 253, + 0, 193, 212, 159, 242, 204, 252, 262, 263, 239, + 260, 271, 229, 101, 238, 250, 117, 223, 0, 0, + 0, 103, 248, 235, 170, 148, 149, 102, 0, 209, + 125, 133, 122, 183, 245, 246, 121, 274, 109, 259, + 105, 110, 258, 177, 241, 249, 171, 164, 104, 247, + 169, 163, 153, 129, 141, 201, 161, 202, 142, 174, + 173, 175, 0, 0, 0, 233, 256, 275, 114, 0, + 240, 267, 270, 0, 205, 115, 134, 128, 200, 132, + 156, 266, 268, 269, 176, 111, 144, 230, 152, 160, + 208, 273, 190, 214, 118, 255, 231, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 97, 106, 157, 272, + 206, 131, 257, 0, 0, 124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 135, 0, 0, 0, 292, - 0, 0, 0, 0, 203, 0, 235, 139, 154, 112, - 151, 98, 108, 0, 137, 181, 211, 215, 0, 0, - 0, 120, 0, 213, 191, 252, 0, 1027, 212, 159, - 241, 204, 251, 261, 262, 238, 259, 270, 228, 101, - 237, 249, 117, 223, 0, 0, 0, 103, 247, 234, - 170, 148, 149, 102, 0, 209, 125, 133, 122, 183, - 244, 245, 121, 273, 109, 258, 105, 110, 257, 177, - 240, 248, 171, 164, 104, 246, 169, 163, 153, 129, - 141, 201, 161, 202, 142, 174, 173, 175, 0, 0, - 0, 232, 255, 274, 114, 0, 239, 266, 269, 0, - 205, 115, 134, 128, 200, 132, 156, 265, 267, 268, - 176, 111, 144, 229, 152, 160, 208, 272, 190, 214, - 118, 254, 230, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 99, 100, + 107, 113, 119, 123, 127, 130, 136, 140, 143, 145, + 146, 147, 150, 162, 165, 166, 167, 168, 178, 179, + 180, 182, 185, 186, 187, 188, 189, 192, 194, 195, + 196, 197, 198, 199, 207, 210, 216, 217, 218, 219, + 220, 221, 222, 225, 226, 227, 228, 234, 237, 243, + 244, 254, 261, 264, 138, 251, 265, 184, 0, 0, + 0, 756, 0, 0, 0, 0, 126, 0, 0, 0, + 0, 0, 155, 0, 0, 0, 224, 0, 158, 0, + 0, 232, 172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 97, 106, 157, 271, 206, 131, 256, 0, - 0, 124, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 94, 95, 96, 0, 758, 0, 0, 0, 0, + 0, 0, 116, 0, 0, 0, 0, 0, 650, 651, + 649, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 652, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 99, 100, 107, 113, 119, 123, - 127, 130, 136, 140, 143, 145, 146, 147, 150, 162, - 165, 166, 167, 168, 178, 179, 180, 182, 185, 186, - 187, 188, 189, 192, 194, 195, 196, 197, 198, 199, - 207, 210, 216, 217, 218, 219, 220, 221, 222, 224, - 225, 226, 227, 233, 236, 242, 243, 253, 260, 263, - 138, 250, 264, 184, 0, 0, 0, 0, 0, 0, - 0, 0, 126, 0, 0, 0, 0, 0, 155, 0, - 0, 0, 158, 0, 0, 231, 172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 94, 95, 96, 0, 0, - 994, 0, 0, 995, 0, 0, 116, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 135, 0, 0, 0, 293, 0, 0, 0, 0, 203, + 0, 236, 139, 154, 112, 151, 98, 108, 0, 137, + 181, 211, 215, 0, 0, 0, 120, 0, 213, 191, + 253, 0, 193, 212, 159, 242, 204, 252, 262, 263, + 239, 260, 271, 229, 101, 238, 250, 117, 223, 0, + 0, 0, 103, 248, 235, 170, 148, 149, 102, 0, + 209, 125, 133, 122, 183, 245, 246, 121, 274, 109, + 259, 105, 110, 258, 177, 241, 249, 171, 164, 104, + 247, 169, 163, 153, 129, 141, 201, 161, 202, 142, + 174, 173, 175, 0, 0, 0, 233, 256, 275, 114, + 0, 240, 267, 270, 0, 205, 115, 134, 128, 200, + 132, 156, 266, 268, 269, 176, 111, 144, 230, 152, + 160, 208, 273, 190, 214, 118, 255, 231, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 97, 106, 157, + 272, 206, 131, 257, 0, 0, 124, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 99, + 100, 107, 113, 119, 123, 127, 130, 136, 140, 143, + 145, 146, 147, 150, 162, 165, 166, 167, 168, 178, + 179, 180, 182, 185, 186, 187, 188, 189, 192, 194, + 195, 196, 197, 198, 199, 207, 210, 216, 217, 218, + 219, 220, 221, 222, 225, 226, 227, 228, 234, 237, + 243, 244, 254, 261, 264, 138, 251, 265, 184, 0, + 0, 0, 0, 0, 0, 0, 0, 126, 0, 0, + 0, 0, 0, 155, 0, 0, 0, 224, 0, 158, + 0, 0, 232, 172, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 94, 95, 96, 0, 0, 0, 0, 0, + 0, 0, 0, 116, 0, 0, 0, 0, 0, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 135, 0, 0, 0, 292, 0, - 0, 0, 0, 203, 0, 235, 139, 154, 112, 151, - 98, 108, 0, 137, 181, 211, 215, 0, 0, 0, - 120, 0, 213, 191, 252, 0, 193, 212, 159, 241, - 204, 251, 261, 262, 238, 259, 270, 228, 101, 237, - 249, 117, 223, 0, 0, 0, 103, 247, 234, 170, - 148, 149, 102, 0, 209, 125, 133, 122, 183, 244, - 245, 121, 273, 109, 258, 105, 110, 257, 177, 240, - 248, 171, 164, 104, 246, 169, 163, 153, 129, 141, - 201, 161, 202, 142, 174, 173, 175, 0, 0, 0, - 232, 255, 274, 114, 0, 239, 266, 269, 0, 205, - 115, 134, 128, 200, 132, 156, 265, 267, 268, 176, - 111, 144, 229, 152, 160, 208, 272, 190, 214, 118, - 254, 230, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 135, 88, 89, 0, 85, 0, 0, 0, 90, + 203, 0, 236, 139, 154, 112, 151, 98, 108, 0, + 137, 181, 211, 215, 0, 0, 0, 120, 0, 213, + 191, 253, 0, 193, 212, 159, 242, 204, 252, 262, + 263, 239, 260, 271, 229, 101, 238, 250, 117, 223, + 0, 0, 0, 103, 248, 235, 170, 148, 149, 102, + 0, 209, 125, 133, 122, 183, 245, 246, 121, 274, + 109, 259, 105, 110, 258, 177, 241, 249, 171, 164, + 104, 247, 169, 163, 153, 129, 141, 201, 161, 202, + 142, 174, 173, 175, 0, 0, 0, 233, 256, 275, + 114, 0, 240, 267, 270, 0, 205, 115, 134, 128, + 200, 132, 156, 266, 268, 269, 176, 111, 144, 230, + 152, 160, 208, 273, 190, 214, 118, 255, 231, 0, + 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 97, 106, + 157, 272, 206, 131, 257, 0, 0, 124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 97, 106, 157, 271, 206, 131, 256, 0, 0, - 124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 99, 100, 107, 113, 119, 123, 127, - 130, 136, 140, 143, 145, 146, 147, 150, 162, 165, - 166, 167, 168, 178, 179, 180, 182, 185, 186, 187, - 188, 189, 192, 194, 195, 196, 197, 198, 199, 207, - 210, 216, 217, 218, 219, 220, 221, 222, 224, 225, - 226, 227, 233, 236, 242, 243, 253, 260, 263, 138, - 250, 264, 184, 0, 0, 0, 0, 0, 0, 0, - 0, 126, 0, 788, 0, 0, 0, 155, 0, 0, - 0, 158, 0, 0, 231, 172, 0, 0, 0, 0, + 99, 100, 107, 113, 119, 123, 127, 130, 136, 140, + 143, 145, 146, 147, 150, 162, 165, 166, 167, 168, + 178, 179, 180, 182, 185, 186, 187, 188, 189, 192, + 194, 195, 196, 197, 198, 199, 207, 210, 216, 217, + 218, 219, 220, 221, 222, 225, 226, 227, 228, 234, + 237, 243, 244, 254, 261, 264, 138, 251, 265, 184, + 0, 0, 0, 0, 0, 0, 0, 0, 126, 1074, + 0, 0, 0, 0, 155, 0, 0, 0, 224, 0, + 158, 0, 0, 232, 172, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 94, 95, 96, 0, 0, 0, 0, + 0, 0, 0, 0, 116, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 135, 0, 0, 1073, 293, 0, 0, 0, + 1070, 1068, 0, 1069, 139, 154, 112, 151, 98, 108, + 1066, 1072, 181, 211, 215, 0, 0, 0, 120, 0, + 213, 191, 253, 0, 193, 212, 159, 242, 204, 252, + 262, 263, 239, 260, 271, 229, 101, 238, 250, 117, + 223, 0, 0, 0, 103, 248, 235, 170, 148, 149, + 102, 0, 209, 125, 133, 122, 183, 245, 246, 121, + 274, 109, 259, 105, 110, 258, 177, 241, 249, 171, + 164, 104, 247, 169, 163, 153, 129, 141, 201, 161, + 202, 142, 174, 173, 175, 0, 0, 0, 233, 256, + 275, 114, 0, 240, 267, 270, 0, 205, 115, 134, + 128, 200, 132, 156, 266, 268, 269, 176, 111, 144, + 230, 152, 160, 208, 273, 190, 214, 118, 255, 231, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, + 106, 157, 272, 206, 131, 257, 0, 0, 124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 94, 95, 96, 0, 787, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 99, 100, 107, 113, 119, 123, 127, 130, 136, + 140, 143, 145, 146, 147, 150, 162, 165, 166, 167, + 168, 178, 179, 180, 182, 185, 186, 187, 188, 189, + 192, 194, 195, 196, 197, 198, 199, 207, 210, 216, + 217, 218, 219, 220, 221, 222, 225, 226, 227, 228, + 234, 237, 243, 244, 254, 261, 264, 138, 251, 265, + 184, 0, 0, 0, 1033, 0, 0, 0, 0, 126, + 0, 0, 0, 0, 0, 155, 0, 0, 0, 224, + 0, 158, 0, 0, 232, 172, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 94, 95, 96, 0, 1035, 0, 0, 0, 0, 0, 0, 116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 135, 0, 0, 0, 292, 0, 0, - 0, 0, 203, 0, 235, 139, 154, 112, 151, 98, + 0, 0, 0, 135, 0, 0, 0, 293, 0, 0, + 0, 0, 203, 0, 236, 139, 154, 112, 151, 98, 108, 0, 137, 181, 211, 215, 0, 0, 0, 120, - 0, 213, 191, 252, 0, 193, 212, 159, 241, 204, - 251, 261, 262, 238, 259, 270, 228, 101, 237, 249, - 117, 223, 0, 0, 0, 103, 247, 234, 170, 148, - 149, 102, 0, 209, 125, 133, 122, 183, 244, 245, - 121, 273, 109, 258, 105, 110, 257, 177, 240, 248, - 171, 164, 104, 246, 169, 163, 153, 129, 141, 201, - 161, 202, 142, 174, 173, 175, 0, 0, 0, 232, - 255, 274, 114, 0, 239, 266, 269, 0, 205, 115, - 134, 128, 200, 132, 156, 265, 267, 268, 176, 111, - 144, 229, 152, 160, 208, 272, 190, 214, 118, 254, - 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 213, 191, 253, 0, 193, 212, 159, 242, 204, + 252, 262, 263, 239, 260, 271, 229, 101, 238, 250, + 117, 223, 0, 0, 0, 103, 248, 235, 170, 148, + 149, 102, 0, 209, 125, 133, 122, 183, 245, 246, + 121, 274, 109, 259, 105, 110, 258, 177, 241, 249, + 171, 164, 104, 247, 169, 163, 153, 129, 141, 201, + 161, 202, 142, 174, 173, 175, 0, 0, 0, 233, + 256, 275, 114, 0, 240, 267, 270, 0, 205, 115, + 134, 128, 200, 132, 156, 266, 268, 269, 176, 111, + 144, 230, 152, 160, 208, 273, 190, 214, 118, 255, + 231, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 97, 106, 157, 271, 206, 131, 256, 0, 0, 124, + 97, 106, 157, 272, 206, 131, 257, 0, 0, 124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 99, 100, 107, 113, 119, 123, 127, 130, 136, 140, 143, 145, 146, 147, 150, 162, 165, 166, 167, 168, 178, 179, 180, 182, 185, 186, 187, 188, 189, 192, 194, 195, 196, 197, 198, 199, 207, 210, - 216, 217, 218, 219, 220, 221, 222, 224, 225, 226, - 227, 233, 236, 242, 243, 253, 260, 263, 138, 250, - 264, 184, 0, 0, 0, 0, 0, 0, 0, 0, - 126, 0, 0, 0, 0, 0, 155, 0, 0, 0, - 158, 0, 0, 231, 172, 0, 0, 0, 0, 0, + 216, 217, 218, 219, 220, 221, 222, 225, 226, 227, + 228, 234, 237, 243, 244, 254, 261, 264, 138, 251, + 265, 30, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 184, 0, 0, 0, 0, 0, + 0, 0, 0, 126, 0, 0, 0, 0, 0, 155, + 0, 0, 0, 224, 0, 158, 0, 0, 232, 172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 412, 94, 95, 96, 0, 0, 0, 0, - 0, 0, 0, 0, 116, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 59, 0, 0, 94, 95, + 96, 0, 0, 0, 0, 0, 0, 0, 0, 116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 135, 0, 0, 0, 292, 0, 0, 0, - 0, 203, 0, 235, 139, 154, 112, 151, 98, 108, - 0, 137, 181, 211, 215, 0, 0, 0, 120, 0, - 213, 191, 252, 0, 193, 212, 159, 241, 204, 251, - 261, 262, 238, 259, 270, 228, 101, 237, 249, 117, - 223, 0, 0, 0, 103, 247, 234, 170, 148, 149, - 102, 0, 209, 125, 133, 122, 183, 244, 245, 121, - 273, 109, 258, 105, 110, 257, 177, 240, 248, 171, - 164, 104, 246, 169, 163, 153, 129, 141, 201, 161, - 202, 142, 174, 173, 175, 0, 0, 0, 232, 255, - 274, 114, 0, 239, 266, 269, 0, 205, 115, 134, - 128, 200, 132, 156, 265, 267, 268, 176, 111, 144, - 229, 152, 160, 208, 272, 190, 214, 118, 254, 230, + 0, 0, 0, 0, 0, 0, 0, 135, 0, 0, + 0, 293, 0, 0, 0, 0, 203, 0, 236, 139, + 154, 112, 151, 98, 108, 0, 137, 181, 211, 215, + 0, 0, 0, 120, 0, 213, 191, 253, 0, 193, + 212, 159, 242, 204, 252, 262, 263, 239, 260, 271, + 229, 101, 238, 250, 117, 223, 0, 0, 0, 103, + 248, 235, 170, 148, 149, 102, 0, 209, 125, 133, + 122, 183, 245, 246, 121, 274, 109, 259, 105, 110, + 258, 177, 241, 249, 171, 164, 104, 247, 169, 163, + 153, 129, 141, 201, 161, 202, 142, 174, 173, 175, + 0, 0, 0, 233, 256, 275, 114, 0, 240, 267, + 270, 0, 205, 115, 134, 128, 200, 132, 156, 266, + 268, 269, 176, 111, 144, 230, 152, 160, 208, 273, + 190, 214, 118, 255, 231, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, - 106, 157, 271, 206, 131, 256, 0, 0, 124, 0, + 0, 0, 0, 0, 97, 106, 157, 272, 206, 131, + 257, 0, 0, 124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 99, 100, 107, 113, + 119, 123, 127, 130, 136, 140, 143, 145, 146, 147, + 150, 162, 165, 166, 167, 168, 178, 179, 180, 182, + 185, 186, 187, 188, 189, 192, 194, 195, 196, 197, + 198, 199, 207, 210, 216, 217, 218, 219, 220, 221, + 222, 225, 226, 227, 228, 234, 237, 243, 244, 254, + 261, 264, 138, 251, 265, 184, 0, 0, 0, 1033, + 0, 0, 0, 0, 126, 0, 0, 0, 0, 0, + 155, 0, 0, 0, 224, 0, 158, 0, 0, 232, + 172, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, + 95, 96, 0, 1035, 0, 0, 0, 0, 0, 0, + 116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 99, 100, 107, 113, 119, 123, 127, 130, 136, - 140, 143, 145, 146, 147, 150, 162, 165, 166, 167, - 168, 178, 179, 180, 182, 185, 186, 187, 188, 189, - 192, 194, 195, 196, 197, 198, 199, 207, 210, 216, - 217, 218, 219, 220, 221, 222, 224, 225, 226, 227, - 233, 236, 242, 243, 253, 260, 263, 138, 250, 264, - 184, 0, 0, 0, 0, 0, 0, 0, 0, 126, - 0, 0, 0, 0, 0, 155, 0, 0, 0, 158, - 0, 0, 231, 172, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 59, - 0, 0, 94, 95, 96, 0, 0, 0, 0, 0, - 0, 0, 0, 116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 135, 0, + 0, 0, 293, 0, 0, 0, 0, 203, 0, 236, + 139, 154, 112, 151, 98, 108, 0, 137, 181, 211, + 215, 0, 0, 0, 120, 0, 213, 191, 253, 0, + 1031, 212, 159, 242, 204, 252, 262, 263, 239, 260, + 271, 229, 101, 238, 250, 117, 223, 0, 0, 0, + 103, 248, 235, 170, 148, 149, 102, 0, 209, 125, + 133, 122, 183, 245, 246, 121, 274, 109, 259, 105, + 110, 258, 177, 241, 249, 171, 164, 104, 247, 169, + 163, 153, 129, 141, 201, 161, 202, 142, 174, 173, + 175, 0, 0, 0, 233, 256, 275, 114, 0, 240, + 267, 270, 0, 205, 115, 134, 128, 200, 132, 156, + 266, 268, 269, 176, 111, 144, 230, 152, 160, 208, + 273, 190, 214, 118, 255, 231, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 97, 106, 157, 272, 206, + 131, 257, 0, 0, 124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 135, 0, 0, 0, 292, 0, 0, 0, 0, - 203, 0, 235, 139, 154, 112, 151, 98, 108, 0, - 137, 181, 211, 215, 0, 0, 0, 120, 0, 213, - 191, 252, 0, 193, 212, 159, 241, 204, 251, 261, - 262, 238, 259, 270, 228, 101, 237, 249, 117, 223, - 0, 0, 0, 103, 247, 234, 170, 148, 149, 102, - 0, 209, 125, 133, 122, 183, 244, 245, 121, 273, - 109, 258, 105, 110, 257, 177, 240, 248, 171, 164, - 104, 246, 169, 163, 153, 129, 141, 201, 161, 202, - 142, 174, 173, 175, 0, 0, 0, 232, 255, 274, - 114, 0, 239, 266, 269, 0, 205, 115, 134, 128, - 200, 132, 156, 265, 267, 268, 176, 111, 144, 229, - 152, 160, 208, 272, 190, 214, 118, 254, 230, 0, + 0, 0, 0, 0, 0, 0, 0, 99, 100, 107, + 113, 119, 123, 127, 130, 136, 140, 143, 145, 146, + 147, 150, 162, 165, 166, 167, 168, 178, 179, 180, + 182, 185, 186, 187, 188, 189, 192, 194, 195, 196, + 197, 198, 199, 207, 210, 216, 217, 218, 219, 220, + 221, 222, 225, 226, 227, 228, 234, 237, 243, 244, + 254, 261, 264, 138, 251, 265, 184, 0, 0, 0, + 0, 0, 0, 0, 0, 126, 0, 0, 0, 0, + 0, 155, 0, 0, 0, 224, 0, 158, 0, 0, + 232, 172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 97, 106, - 157, 271, 206, 131, 256, 0, 0, 124, 0, 0, + 94, 95, 96, 0, 0, 998, 0, 0, 999, 0, + 0, 116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 99, 100, 107, 113, 119, 123, 127, 130, 136, 140, - 143, 145, 146, 147, 150, 162, 165, 166, 167, 168, - 178, 179, 180, 182, 185, 186, 187, 188, 189, 192, - 194, 195, 196, 197, 198, 199, 207, 210, 216, 217, - 218, 219, 220, 221, 222, 224, 225, 226, 227, 233, - 236, 242, 243, 253, 260, 263, 138, 250, 264, 184, - 0, 0, 0, 0, 0, 0, 0, 0, 126, 0, - 0, 0, 0, 0, 155, 0, 0, 0, 158, 0, - 0, 231, 172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 94, 95, 96, 0, 1031, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 135, + 0, 0, 0, 293, 0, 0, 0, 0, 203, 0, + 236, 139, 154, 112, 151, 98, 108, 0, 137, 181, + 211, 215, 0, 0, 0, 120, 0, 213, 191, 253, + 0, 193, 212, 159, 242, 204, 252, 262, 263, 239, + 260, 271, 229, 101, 238, 250, 117, 223, 0, 0, + 0, 103, 248, 235, 170, 148, 149, 102, 0, 209, + 125, 133, 122, 183, 245, 246, 121, 274, 109, 259, + 105, 110, 258, 177, 241, 249, 171, 164, 104, 247, + 169, 163, 153, 129, 141, 201, 161, 202, 142, 174, + 173, 175, 0, 0, 0, 233, 256, 275, 114, 0, + 240, 267, 270, 0, 205, 115, 134, 128, 200, 132, + 156, 266, 268, 269, 176, 111, 144, 230, 152, 160, + 208, 273, 190, 214, 118, 255, 231, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 97, 106, 157, 272, + 206, 131, 257, 0, 0, 124, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 99, 100, + 107, 113, 119, 123, 127, 130, 136, 140, 143, 145, + 146, 147, 150, 162, 165, 166, 167, 168, 178, 179, + 180, 182, 185, 186, 187, 188, 189, 192, 194, 195, + 196, 197, 198, 199, 207, 210, 216, 217, 218, 219, + 220, 221, 222, 225, 226, 227, 228, 234, 237, 243, + 244, 254, 261, 264, 138, 251, 265, 184, 0, 0, + 0, 0, 0, 0, 0, 0, 126, 0, 790, 0, + 0, 0, 155, 0, 0, 0, 224, 0, 158, 0, + 0, 232, 172, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 94, 95, 96, 0, 789, 0, 0, 0, 0, 0, 0, 116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 135, 0, 0, 0, 292, 0, 0, 0, 0, 203, - 0, 235, 139, 154, 112, 151, 98, 108, 0, 137, + 135, 0, 0, 0, 293, 0, 0, 0, 0, 203, + 0, 236, 139, 154, 112, 151, 98, 108, 0, 137, 181, 211, 215, 0, 0, 0, 120, 0, 213, 191, - 252, 0, 193, 212, 159, 241, 204, 251, 261, 262, - 238, 259, 270, 228, 101, 237, 249, 117, 223, 0, - 0, 0, 103, 247, 234, 170, 148, 149, 102, 0, - 209, 125, 133, 122, 183, 244, 245, 121, 273, 109, - 258, 105, 110, 257, 177, 240, 248, 171, 164, 104, - 246, 169, 163, 153, 129, 141, 201, 161, 202, 142, - 174, 173, 175, 0, 0, 0, 232, 255, 274, 114, - 0, 239, 266, 269, 0, 205, 115, 134, 128, 200, - 132, 156, 265, 267, 268, 176, 111, 144, 229, 152, - 160, 208, 272, 190, 214, 118, 254, 230, 0, 0, + 253, 0, 193, 212, 159, 242, 204, 252, 262, 263, + 239, 260, 271, 229, 101, 238, 250, 117, 223, 0, + 0, 0, 103, 248, 235, 170, 148, 149, 102, 0, + 209, 125, 133, 122, 183, 245, 246, 121, 274, 109, + 259, 105, 110, 258, 177, 241, 249, 171, 164, 104, + 247, 169, 163, 153, 129, 141, 201, 161, 202, 142, + 174, 173, 175, 0, 0, 0, 233, 256, 275, 114, + 0, 240, 267, 270, 0, 205, 115, 134, 128, 200, + 132, 156, 266, 268, 269, 176, 111, 144, 230, 152, + 160, 208, 273, 190, 214, 118, 255, 231, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, 106, 157, - 271, 206, 131, 256, 0, 0, 124, 0, 0, 0, + 272, 206, 131, 257, 0, 0, 124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 99, 100, 107, 113, 119, 123, 127, 130, 136, 140, 143, 145, 146, 147, 150, 162, 165, 166, 167, 168, 178, 179, 180, 182, 185, 186, 187, 188, 189, 192, 194, 195, 196, 197, 198, 199, 207, 210, 216, 217, 218, - 219, 220, 221, 222, 224, 225, 226, 227, 233, 236, - 242, 243, 253, 260, 263, 138, 250, 264, 184, 0, + 219, 220, 221, 222, 225, 226, 227, 228, 234, 237, + 243, 244, 254, 261, 264, 138, 251, 265, 184, 0, 0, 0, 0, 0, 0, 0, 0, 126, 0, 0, - 0, 0, 0, 155, 0, 0, 0, 158, 0, 0, - 231, 172, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 155, 0, 0, 0, 224, 0, 158, + 0, 0, 232, 172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 94, 95, 96, 0, 756, 0, 0, 0, 0, 0, - 0, 116, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 413, 94, 95, 96, 0, 0, 0, 0, 0, + 0, 0, 0, 116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 135, - 0, 0, 0, 292, 0, 0, 0, 0, 203, 0, - 235, 139, 154, 112, 151, 98, 108, 0, 137, 181, - 211, 215, 0, 0, 0, 120, 0, 213, 191, 252, - 0, 193, 212, 159, 241, 204, 251, 261, 262, 238, - 259, 270, 228, 101, 237, 249, 117, 223, 0, 0, - 0, 103, 247, 234, 170, 148, 149, 102, 0, 209, - 125, 133, 122, 183, 244, 245, 121, 273, 109, 258, - 105, 110, 257, 177, 240, 248, 171, 164, 104, 246, - 169, 163, 153, 129, 141, 201, 161, 202, 142, 174, - 173, 175, 0, 0, 0, 232, 255, 274, 114, 0, - 239, 266, 269, 0, 205, 115, 134, 128, 200, 132, - 156, 265, 267, 268, 176, 111, 144, 229, 152, 160, - 208, 272, 190, 214, 118, 254, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 97, 106, 157, 271, - 206, 131, 256, 0, 0, 124, 0, 0, 0, 0, + 0, 135, 0, 0, 0, 293, 0, 0, 0, 0, + 203, 0, 236, 139, 154, 112, 151, 98, 108, 0, + 137, 181, 211, 215, 0, 0, 0, 120, 0, 213, + 191, 253, 0, 193, 212, 159, 242, 204, 252, 262, + 263, 239, 260, 271, 229, 101, 238, 250, 117, 223, + 0, 0, 0, 103, 248, 235, 170, 148, 149, 102, + 0, 209, 125, 133, 122, 183, 245, 246, 121, 274, + 109, 259, 105, 110, 258, 177, 241, 249, 171, 164, + 104, 247, 169, 163, 153, 129, 141, 201, 161, 202, + 142, 174, 173, 175, 0, 0, 0, 233, 256, 275, + 114, 0, 240, 267, 270, 0, 205, 115, 134, 128, + 200, 132, 156, 266, 268, 269, 176, 111, 144, 230, + 152, 160, 208, 273, 190, 214, 118, 255, 231, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 99, 100, - 107, 113, 119, 123, 127, 130, 136, 140, 143, 145, - 146, 147, 150, 162, 165, 166, 167, 168, 178, 179, - 180, 182, 185, 186, 187, 188, 189, 192, 194, 195, - 196, 197, 198, 199, 207, 210, 216, 217, 218, 219, - 220, 221, 222, 224, 225, 226, 227, 233, 236, 242, - 243, 253, 260, 263, 138, 250, 264, 770, 0, 0, - 0, 0, 0, 0, 184, 0, 0, 0, 0, 0, - 0, 0, 0, 126, 0, 0, 0, 0, 0, 155, - 0, 0, 0, 158, 0, 0, 231, 172, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 97, 106, + 157, 272, 206, 131, 257, 0, 0, 124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 94, 95, 96, 0, - 0, 0, 0, 0, 0, 0, 0, 116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 99, 100, 107, 113, 119, 123, 127, 130, 136, 140, + 143, 145, 146, 147, 150, 162, 165, 166, 167, 168, + 178, 179, 180, 182, 185, 186, 187, 188, 189, 192, + 194, 195, 196, 197, 198, 199, 207, 210, 216, 217, + 218, 219, 220, 221, 222, 225, 226, 227, 228, 234, + 237, 243, 244, 254, 261, 264, 138, 251, 265, 184, + 0, 0, 0, 0, 0, 0, 0, 0, 126, 0, + 0, 0, 0, 0, 155, 0, 0, 0, 224, 0, + 158, 0, 0, 232, 172, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 59, 0, 0, 94, 95, 96, 0, 0, 0, 0, + 0, 0, 0, 0, 116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 135, 0, 0, 0, 292, - 0, 0, 0, 0, 203, 0, 235, 139, 154, 112, - 151, 98, 108, 0, 137, 181, 211, 215, 0, 0, - 0, 120, 0, 213, 191, 252, 0, 193, 212, 159, - 241, 204, 251, 261, 262, 238, 259, 270, 228, 101, - 237, 249, 117, 223, 0, 0, 0, 103, 247, 234, - 170, 148, 149, 102, 0, 209, 125, 133, 122, 183, - 244, 245, 121, 273, 109, 258, 105, 110, 257, 177, - 240, 248, 171, 164, 104, 246, 169, 163, 153, 129, - 141, 201, 161, 202, 142, 174, 173, 175, 0, 0, - 0, 232, 255, 274, 114, 0, 239, 266, 269, 0, - 205, 115, 134, 128, 200, 132, 156, 265, 267, 268, - 176, 111, 144, 229, 152, 160, 208, 272, 190, 214, - 118, 254, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 97, 106, 157, 271, 206, 131, 256, 0, - 0, 124, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 135, 0, 0, 0, 293, 0, 0, 0, + 0, 203, 0, 236, 139, 154, 112, 151, 98, 108, + 0, 137, 181, 211, 215, 0, 0, 0, 120, 0, + 213, 191, 253, 0, 193, 212, 159, 242, 204, 252, + 262, 263, 239, 260, 271, 229, 101, 238, 250, 117, + 223, 0, 0, 0, 103, 248, 235, 170, 148, 149, + 102, 0, 209, 125, 133, 122, 183, 245, 246, 121, + 274, 109, 259, 105, 110, 258, 177, 241, 249, 171, + 164, 104, 247, 169, 163, 153, 129, 141, 201, 161, + 202, 142, 174, 173, 175, 0, 0, 0, 233, 256, + 275, 114, 0, 240, 267, 270, 0, 205, 115, 134, + 128, 200, 132, 156, 266, 268, 269, 176, 111, 144, + 230, 152, 160, 208, 273, 190, 214, 118, 255, 231, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, + 106, 157, 272, 206, 131, 257, 0, 0, 124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 99, 100, 107, 113, 119, 123, - 127, 130, 136, 140, 143, 145, 146, 147, 150, 162, - 165, 166, 167, 168, 178, 179, 180, 182, 185, 186, - 187, 188, 189, 192, 194, 195, 196, 197, 198, 199, - 207, 210, 216, 217, 218, 219, 220, 221, 222, 224, - 225, 226, 227, 233, 236, 242, 243, 253, 260, 263, - 138, 250, 264, 184, 0, 0, 0, 0, 0, 0, - 0, 760, 126, 0, 0, 0, 0, 0, 155, 0, - 0, 0, 158, 0, 0, 231, 172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 94, 95, 96, 0, 0, + 0, 99, 100, 107, 113, 119, 123, 127, 130, 136, + 140, 143, 145, 146, 147, 150, 162, 165, 166, 167, + 168, 178, 179, 180, 182, 185, 186, 187, 188, 189, + 192, 194, 195, 196, 197, 198, 199, 207, 210, 216, + 217, 218, 219, 220, 221, 222, 225, 226, 227, 228, + 234, 237, 243, 244, 254, 261, 264, 138, 251, 265, + 184, 0, 0, 0, 0, 0, 0, 0, 0, 126, + 0, 0, 0, 0, 0, 155, 0, 0, 0, 224, + 0, 158, 0, 0, 232, 172, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 94, 95, 96, 0, 1035, 0, + 0, 0, 0, 0, 0, 116, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 135, 0, 0, 0, 293, 0, 0, + 0, 0, 203, 0, 236, 139, 154, 112, 151, 98, + 108, 0, 137, 181, 211, 215, 0, 0, 0, 120, + 0, 213, 191, 253, 0, 193, 212, 159, 242, 204, + 252, 262, 263, 239, 260, 271, 229, 101, 238, 250, + 117, 223, 0, 0, 0, 103, 248, 235, 170, 148, + 149, 102, 0, 209, 125, 133, 122, 183, 245, 246, + 121, 274, 109, 259, 105, 110, 258, 177, 241, 249, + 171, 164, 104, 247, 169, 163, 153, 129, 141, 201, + 161, 202, 142, 174, 173, 175, 0, 0, 0, 233, + 256, 275, 114, 0, 240, 267, 270, 0, 205, 115, + 134, 128, 200, 132, 156, 266, 268, 269, 176, 111, + 144, 230, 152, 160, 208, 273, 190, 214, 118, 255, + 231, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 97, 106, 157, 272, 206, 131, 257, 0, 0, 124, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 99, 100, 107, 113, 119, 123, 127, 130, + 136, 140, 143, 145, 146, 147, 150, 162, 165, 166, + 167, 168, 178, 179, 180, 182, 185, 186, 187, 188, + 189, 192, 194, 195, 196, 197, 198, 199, 207, 210, + 216, 217, 218, 219, 220, 221, 222, 225, 226, 227, + 228, 234, 237, 243, 244, 254, 261, 264, 138, 251, + 265, 184, 0, 0, 0, 0, 0, 0, 0, 0, + 126, 0, 0, 0, 0, 0, 155, 0, 0, 0, + 224, 0, 158, 0, 0, 232, 172, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 94, 95, 96, 0, 758, 0, 0, 0, 0, 0, 0, 116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 135, 0, 0, 0, 292, 0, - 0, 0, 0, 203, 0, 235, 139, 154, 112, 151, + 0, 0, 0, 0, 135, 0, 0, 0, 293, 0, + 0, 0, 0, 203, 0, 236, 139, 154, 112, 151, 98, 108, 0, 137, 181, 211, 215, 0, 0, 0, - 120, 0, 213, 191, 252, 0, 193, 212, 159, 241, - 204, 251, 261, 262, 238, 259, 270, 228, 101, 237, - 249, 117, 223, 0, 0, 0, 103, 247, 234, 170, - 148, 149, 102, 0, 209, 125, 133, 122, 183, 244, - 245, 121, 273, 109, 258, 105, 110, 257, 177, 240, - 248, 171, 164, 104, 246, 169, 163, 153, 129, 141, + 120, 0, 213, 191, 253, 0, 193, 212, 159, 242, + 204, 252, 262, 263, 239, 260, 271, 229, 101, 238, + 250, 117, 223, 0, 0, 0, 103, 248, 235, 170, + 148, 149, 102, 0, 209, 125, 133, 122, 183, 245, + 246, 121, 274, 109, 259, 105, 110, 258, 177, 241, + 249, 171, 164, 104, 247, 169, 163, 153, 129, 141, 201, 161, 202, 142, 174, 173, 175, 0, 0, 0, - 232, 255, 274, 114, 0, 239, 266, 269, 0, 205, - 115, 134, 128, 200, 132, 156, 265, 267, 268, 176, - 111, 144, 229, 152, 160, 208, 272, 190, 214, 118, - 254, 230, 0, 0, 0, 0, 0, 0, 0, 0, + 233, 256, 275, 114, 0, 240, 267, 270, 0, 205, + 115, 134, 128, 200, 132, 156, 266, 268, 269, 176, + 111, 144, 230, 152, 160, 208, 273, 190, 214, 118, + 255, 231, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 97, 106, 157, 271, 206, 131, 256, 0, 0, + 0, 97, 106, 157, 272, 206, 131, 257, 0, 0, 124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 99, 100, 107, 113, 119, 123, 127, 130, 136, 140, 143, 145, 146, 147, 150, 162, 165, 166, 167, 168, 178, 179, 180, 182, 185, 186, 187, 188, 189, 192, 194, 195, 196, 197, 198, 199, 207, - 210, 216, 217, 218, 219, 220, 221, 222, 224, 225, - 226, 227, 233, 236, 242, 243, 253, 260, 263, 138, - 250, 264, 184, 0, 0, 0, 0, 0, 0, 0, - 0, 126, 0, 0, 0, 0, 0, 155, 0, 0, - 0, 158, 0, 0, 231, 172, 0, 0, 0, 0, + 210, 216, 217, 218, 219, 220, 221, 222, 225, 226, + 227, 228, 234, 237, 243, 244, 254, 261, 264, 138, + 251, 265, 772, 0, 0, 0, 0, 0, 0, 184, + 0, 0, 0, 0, 0, 0, 0, 0, 126, 0, + 0, 0, 0, 0, 155, 0, 0, 0, 224, 0, + 158, 0, 0, 232, 172, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 94, 95, 96, 0, 0, 0, 0, + 0, 0, 0, 0, 116, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 94, 95, 96, 0, 637, 0, + 0, 0, 135, 0, 0, 0, 293, 0, 0, 0, + 0, 203, 0, 236, 139, 154, 112, 151, 98, 108, + 0, 137, 181, 211, 215, 0, 0, 0, 120, 0, + 213, 191, 253, 0, 193, 212, 159, 242, 204, 252, + 262, 263, 239, 260, 271, 229, 101, 238, 250, 117, + 223, 0, 0, 0, 103, 248, 235, 170, 148, 149, + 102, 0, 209, 125, 133, 122, 183, 245, 246, 121, + 274, 109, 259, 105, 110, 258, 177, 241, 249, 171, + 164, 104, 247, 169, 163, 153, 129, 141, 201, 161, + 202, 142, 174, 173, 175, 0, 0, 0, 233, 256, + 275, 114, 0, 240, 267, 270, 0, 205, 115, 134, + 128, 200, 132, 156, 266, 268, 269, 176, 111, 144, + 230, 152, 160, 208, 273, 190, 214, 118, 255, 231, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, + 106, 157, 272, 206, 131, 257, 0, 0, 124, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 99, 100, 107, 113, 119, 123, 127, 130, 136, + 140, 143, 145, 146, 147, 150, 162, 165, 166, 167, + 168, 178, 179, 180, 182, 185, 186, 187, 188, 189, + 192, 194, 195, 196, 197, 198, 199, 207, 210, 216, + 217, 218, 219, 220, 221, 222, 225, 226, 227, 228, + 234, 237, 243, 244, 254, 261, 264, 138, 251, 265, + 184, 0, 0, 0, 0, 0, 0, 0, 762, 126, + 0, 0, 0, 0, 0, 155, 0, 0, 0, 224, + 0, 158, 0, 0, 232, 172, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 94, 95, 96, 0, 0, 0, 0, 0, 0, 0, 0, 116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 135, 0, 0, 0, 292, 0, 0, - 0, 0, 203, 0, 235, 139, 154, 112, 151, 98, + 0, 0, 0, 135, 0, 0, 0, 293, 0, 0, + 0, 0, 203, 0, 236, 139, 154, 112, 151, 98, 108, 0, 137, 181, 211, 215, 0, 0, 0, 120, - 0, 213, 191, 252, 0, 193, 212, 159, 241, 204, - 251, 261, 262, 238, 259, 270, 228, 101, 237, 249, - 117, 223, 0, 0, 0, 103, 247, 234, 170, 148, - 149, 102, 0, 209, 125, 133, 122, 183, 244, 245, - 121, 273, 109, 258, 105, 110, 257, 177, 240, 248, - 171, 164, 104, 246, 169, 163, 153, 129, 141, 201, - 161, 202, 142, 174, 173, 175, 0, 0, 0, 232, - 255, 274, 114, 0, 239, 266, 269, 0, 205, 115, - 134, 128, 200, 132, 156, 265, 267, 268, 176, 111, - 144, 229, 152, 160, 208, 272, 190, 214, 118, 254, - 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 213, 191, 253, 0, 193, 212, 159, 242, 204, + 252, 262, 263, 239, 260, 271, 229, 101, 238, 250, + 117, 223, 0, 0, 0, 103, 248, 235, 170, 148, + 149, 102, 0, 209, 125, 133, 122, 183, 245, 246, + 121, 274, 109, 259, 105, 110, 258, 177, 241, 249, + 171, 164, 104, 247, 169, 163, 153, 129, 141, 201, + 161, 202, 142, 174, 173, 175, 0, 0, 0, 233, + 256, 275, 114, 0, 240, 267, 270, 0, 205, 115, + 134, 128, 200, 132, 156, 266, 268, 269, 176, 111, + 144, 230, 152, 160, 208, 273, 190, 214, 118, 255, + 231, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 97, 106, 157, 271, 206, 131, 256, 0, 0, 124, + 97, 106, 157, 272, 206, 131, 257, 0, 0, 124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 99, 100, 107, 113, 119, 123, 127, 130, 136, 140, 143, 145, 146, 147, 150, 162, 165, 166, 167, 168, 178, 179, 180, 182, 185, 186, 187, 188, 189, 192, 194, 195, 196, 197, 198, 199, 207, 210, - 216, 217, 218, 219, 220, 221, 222, 224, 225, 226, - 227, 233, 236, 242, 243, 253, 260, 263, 138, 250, - 264, 184, 0, 0, 0, 0, 0, 0, 0, 0, + 216, 217, 218, 219, 220, 221, 222, 225, 226, 227, + 228, 234, 237, 243, 244, 254, 261, 264, 138, 251, + 265, 184, 0, 0, 0, 0, 0, 0, 0, 0, 126, 0, 0, 0, 0, 0, 155, 0, 0, 0, - 158, 0, 0, 231, 172, 0, 0, 0, 0, 0, + 224, 0, 158, 0, 0, 232, 172, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 94, 95, 96, 0, 639, + 0, 0, 0, 0, 0, 0, 116, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 135, 0, 0, 0, 293, 0, + 0, 0, 0, 203, 0, 236, 139, 154, 112, 151, + 98, 108, 0, 137, 181, 211, 215, 0, 0, 0, + 120, 0, 213, 191, 253, 0, 193, 212, 159, 242, + 204, 252, 262, 263, 239, 260, 271, 229, 101, 238, + 250, 117, 223, 0, 0, 0, 103, 248, 235, 170, + 148, 149, 102, 0, 209, 125, 133, 122, 183, 245, + 246, 121, 274, 109, 259, 105, 110, 258, 177, 241, + 249, 171, 164, 104, 247, 169, 163, 153, 129, 141, + 201, 161, 202, 142, 174, 173, 175, 0, 0, 0, + 233, 256, 275, 114, 0, 240, 267, 270, 0, 205, + 115, 134, 128, 200, 132, 156, 266, 268, 269, 176, + 111, 144, 230, 152, 160, 208, 273, 190, 214, 118, + 255, 231, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 97, 106, 157, 272, 206, 131, 257, 0, 0, + 124, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 99, 100, 107, 113, 119, 123, 127, + 130, 136, 140, 143, 145, 146, 147, 150, 162, 165, + 166, 167, 168, 178, 179, 180, 182, 185, 186, 187, + 188, 189, 192, 194, 195, 196, 197, 198, 199, 207, + 210, 216, 217, 218, 219, 220, 221, 222, 225, 226, + 227, 228, 234, 237, 243, 244, 254, 261, 264, 138, + 251, 265, 184, 0, 0, 0, 0, 0, 0, 0, + 0, 126, 0, 0, 0, 0, 0, 155, 0, 0, + 0, 224, 0, 158, 0, 0, 232, 172, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 94, 95, 96, 0, + 0, 0, 0, 0, 0, 0, 0, 116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 94, 95, 96, 0, 0, 0, 0, - 0, 0, 0, 0, 116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 567, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 135, 0, 0, 0, 293, + 0, 0, 0, 0, 203, 0, 236, 139, 154, 112, + 151, 98, 108, 0, 137, 181, 211, 215, 0, 0, + 0, 120, 0, 213, 191, 253, 0, 193, 212, 159, + 242, 204, 252, 262, 263, 239, 260, 271, 229, 101, + 238, 250, 117, 223, 0, 0, 0, 103, 248, 235, + 170, 148, 149, 102, 0, 209, 125, 133, 122, 183, + 245, 246, 121, 274, 109, 259, 105, 110, 258, 177, + 241, 249, 171, 164, 104, 247, 169, 163, 153, 129, + 141, 201, 161, 202, 142, 174, 173, 175, 0, 0, + 0, 233, 256, 275, 114, 0, 240, 267, 270, 0, + 205, 115, 134, 128, 200, 132, 156, 266, 268, 269, + 176, 111, 144, 230, 152, 160, 208, 273, 190, 214, + 118, 255, 231, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 97, 106, 157, 272, 206, 131, 257, 0, + 0, 124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 329, 0, 135, 0, 0, 0, 292, 0, 0, 0, - 0, 203, 0, 235, 139, 154, 112, 151, 98, 108, - 0, 137, 181, 211, 215, 0, 0, 0, 120, 0, - 213, 191, 252, 0, 193, 212, 159, 241, 204, 251, - 261, 262, 238, 259, 270, 228, 101, 237, 249, 117, - 223, 0, 0, 0, 103, 247, 234, 170, 148, 149, - 102, 0, 209, 125, 133, 122, 183, 244, 245, 121, - 273, 109, 258, 105, 110, 257, 177, 240, 248, 171, - 164, 104, 246, 169, 163, 153, 129, 141, 201, 161, - 202, 142, 174, 173, 175, 0, 0, 0, 232, 255, - 274, 114, 0, 239, 266, 269, 0, 205, 115, 134, - 128, 200, 132, 156, 265, 267, 268, 176, 111, 144, - 229, 152, 160, 208, 272, 190, 214, 118, 254, 230, + 0, 0, 0, 0, 99, 100, 107, 113, 119, 123, + 127, 130, 136, 140, 143, 145, 146, 147, 150, 162, + 165, 166, 167, 168, 178, 179, 180, 182, 185, 186, + 187, 188, 189, 192, 194, 195, 196, 197, 198, 199, + 207, 210, 216, 217, 218, 219, 220, 221, 222, 225, + 226, 227, 228, 234, 237, 243, 244, 254, 261, 264, + 138, 251, 265, 184, 0, 0, 0, 0, 0, 0, + 0, 0, 126, 0, 0, 0, 0, 0, 155, 0, + 0, 0, 224, 0, 158, 0, 0, 232, 172, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 94, 95, 96, + 0, 0, 0, 0, 0, 0, 0, 0, 116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, - 106, 157, 271, 206, 131, 256, 0, 0, 124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 99, 100, 107, 113, 119, 123, 127, 130, 136, - 140, 143, 145, 146, 147, 150, 162, 165, 166, 167, - 168, 178, 179, 180, 182, 185, 186, 187, 188, 189, - 192, 194, 195, 196, 197, 198, 199, 207, 210, 216, - 217, 218, 219, 220, 221, 222, 224, 225, 226, 227, - 233, 236, 242, 243, 253, 260, 263, 328, 250, 264, - 184, 0, 0, 0, 0, 0, 0, 0, 0, 126, - 0, 0, 0, 0, 0, 155, 0, 0, 0, 158, - 0, 0, 231, 172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 94, 95, 96, 0, 0, 0, 0, 0, - 0, 0, 0, 116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 330, 0, 135, 0, 0, 0, + 293, 0, 0, 0, 0, 203, 0, 236, 139, 154, + 112, 151, 98, 108, 0, 137, 181, 211, 215, 0, + 0, 0, 120, 0, 213, 191, 253, 0, 193, 212, + 159, 242, 204, 252, 262, 263, 239, 260, 271, 229, + 101, 238, 250, 117, 223, 0, 0, 0, 103, 248, + 235, 170, 148, 149, 102, 0, 209, 125, 133, 122, + 183, 245, 246, 121, 274, 109, 259, 105, 110, 258, + 177, 241, 249, 171, 164, 104, 247, 169, 163, 153, + 129, 141, 201, 161, 202, 142, 174, 173, 175, 0, + 0, 0, 233, 256, 275, 114, 0, 240, 267, 270, + 0, 205, 115, 134, 128, 200, 132, 156, 266, 268, + 269, 176, 111, 144, 230, 152, 160, 208, 273, 190, + 214, 118, 255, 231, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 97, 106, 157, 272, 206, 131, 257, + 0, 0, 124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 99, 100, 107, 113, 119, + 123, 127, 130, 136, 140, 143, 145, 146, 147, 150, + 162, 165, 166, 167, 168, 178, 179, 180, 182, 185, + 186, 187, 188, 189, 192, 194, 195, 196, 197, 198, + 199, 207, 210, 216, 217, 218, 219, 220, 221, 222, + 225, 226, 227, 228, 234, 237, 243, 244, 254, 261, + 264, 329, 251, 265, 184, 0, 0, 0, 0, 0, + 0, 0, 0, 126, 0, 0, 0, 0, 0, 155, + 0, 0, 0, 224, 0, 158, 0, 0, 232, 172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 94, 95, + 96, 0, 0, 0, 0, 0, 0, 0, 0, 116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 135, 0, 287, 0, 292, 0, 0, 0, 0, - 203, 0, 235, 139, 154, 112, 151, 98, 108, 0, - 137, 181, 211, 215, 0, 0, 0, 120, 0, 213, - 191, 252, 0, 193, 212, 159, 241, 204, 251, 261, - 262, 238, 259, 270, 228, 101, 237, 249, 117, 223, - 0, 0, 0, 103, 247, 234, 170, 148, 149, 102, - 0, 209, 125, 133, 122, 183, 244, 245, 121, 273, - 109, 258, 105, 110, 257, 177, 240, 248, 171, 164, - 104, 246, 169, 163, 153, 129, 141, 201, 161, 202, - 142, 174, 173, 175, 0, 0, 0, 232, 255, 274, - 114, 0, 239, 266, 269, 0, 205, 115, 134, 128, - 200, 132, 156, 265, 267, 268, 176, 111, 144, 229, - 152, 160, 208, 272, 190, 214, 118, 254, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 97, 106, - 157, 271, 206, 131, 256, 0, 0, 124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 99, 100, 107, 113, 119, 123, 127, 130, 136, 140, - 143, 145, 146, 147, 150, 162, 165, 166, 167, 168, - 178, 179, 180, 182, 185, 186, 187, 188, 189, 192, - 194, 195, 196, 197, 198, 199, 207, 210, 216, 217, - 218, 219, 220, 221, 222, 224, 225, 226, 227, 233, - 236, 242, 243, 253, 260, 263, 138, 250, 264, 184, - 0, 0, 0, 0, 0, 0, 0, 0, 126, 0, - 0, 0, 0, 0, 155, 0, 0, 0, 158, 0, - 0, 231, 172, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 135, 0, 288, + 0, 293, 0, 0, 0, 0, 203, 0, 236, 139, + 154, 112, 151, 98, 108, 0, 137, 181, 211, 215, + 0, 0, 0, 120, 0, 213, 191, 253, 0, 193, + 212, 159, 242, 204, 252, 262, 263, 239, 260, 271, + 229, 101, 238, 250, 117, 223, 0, 0, 0, 103, + 248, 235, 170, 148, 149, 102, 0, 209, 125, 133, + 122, 183, 245, 246, 121, 274, 109, 259, 105, 110, + 258, 177, 241, 249, 171, 164, 104, 247, 169, 163, + 153, 129, 141, 201, 161, 202, 142, 174, 173, 175, + 0, 0, 0, 233, 256, 275, 114, 0, 240, 267, + 270, 0, 205, 115, 134, 128, 200, 132, 156, 266, + 268, 269, 176, 111, 144, 230, 152, 160, 208, 273, + 190, 214, 118, 255, 231, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 94, 95, 96, 0, 0, 0, 0, 0, 0, - 0, 0, 116, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 97, 106, 157, 272, 206, 131, + 257, 0, 0, 124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 99, 100, 107, 113, + 119, 123, 127, 130, 136, 140, 143, 145, 146, 147, + 150, 162, 165, 166, 167, 168, 178, 179, 180, 182, + 185, 186, 187, 188, 189, 192, 194, 195, 196, 197, + 198, 199, 207, 210, 216, 217, 218, 219, 220, 221, + 222, 225, 226, 227, 228, 234, 237, 243, 244, 254, + 261, 264, 138, 251, 265, 184, 0, 0, 0, 0, + 0, 0, 0, 0, 126, 0, 0, 0, 0, 0, + 155, 0, 0, 0, 224, 0, 158, 0, 0, 232, + 172, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, + 95, 96, 0, 0, 0, 0, 0, 0, 0, 0, + 116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 135, 0, 0, 0, 292, 0, 0, 0, 0, 203, - 0, 235, 139, 154, 112, 151, 98, 108, 0, 137, - 181, 211, 215, 0, 0, 0, 120, 0, 213, 191, - 252, 0, 193, 212, 159, 241, 204, 251, 261, 262, - 238, 259, 270, 228, 101, 237, 249, 117, 223, 0, - 0, 0, 103, 247, 234, 170, 148, 149, 102, 0, - 209, 125, 133, 122, 183, 244, 245, 121, 273, 109, - 258, 105, 110, 257, 177, 240, 248, 171, 164, 104, - 246, 169, 163, 153, 129, 141, 201, 161, 202, 142, - 174, 173, 175, 0, 0, 0, 232, 255, 274, 114, - 0, 239, 266, 269, 0, 205, 115, 134, 128, 200, - 132, 156, 265, 267, 268, 176, 111, 144, 229, 152, - 160, 208, 272, 190, 214, 118, 254, 230, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 135, 0, + 0, 0, 293, 0, 0, 0, 0, 203, 0, 236, + 139, 154, 112, 151, 98, 108, 0, 137, 181, 211, + 215, 0, 0, 0, 120, 0, 213, 191, 253, 0, + 193, 212, 159, 242, 204, 252, 262, 263, 239, 260, + 271, 229, 101, 238, 250, 117, 223, 0, 0, 0, + 103, 248, 235, 170, 148, 149, 102, 0, 209, 125, + 133, 122, 183, 245, 246, 121, 274, 109, 259, 105, + 110, 258, 177, 241, 249, 171, 164, 104, 247, 169, + 163, 153, 129, 141, 201, 161, 202, 142, 174, 173, + 175, 0, 0, 0, 233, 256, 275, 114, 0, 240, + 267, 270, 0, 205, 115, 134, 128, 200, 132, 156, + 266, 268, 269, 176, 111, 144, 230, 152, 160, 208, + 273, 190, 214, 118, 255, 231, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 97, 106, 157, - 271, 206, 131, 256, 0, 0, 124, 0, 0, 0, + 0, 0, 0, 0, 0, 97, 106, 157, 272, 206, + 131, 257, 0, 0, 124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 99, - 100, 107, 113, 119, 123, 127, 130, 136, 140, 143, - 145, 146, 147, 150, 162, 165, 166, 167, 168, 178, - 179, 180, 182, 185, 186, 187, 188, 189, 192, 194, - 195, 196, 197, 198, 199, 207, 210, 216, 217, 218, - 219, 220, 221, 222, 224, 225, 226, 227, 233, 236, - 242, 243, 253, 260, 263, 138, 250, 264, + 0, 0, 0, 0, 0, 0, 0, 99, 100, 107, + 113, 119, 123, 127, 130, 136, 140, 143, 145, 146, + 147, 150, 162, 165, 166, 167, 168, 178, 179, 180, + 182, 185, 186, 187, 188, 189, 192, 194, 195, 196, + 197, 198, 199, 207, 210, 216, 217, 218, 219, 220, + 221, 222, 225, 226, 227, 228, 234, 237, 243, 244, + 254, 261, 264, 138, 251, 265, } var yyPact = [...]int{ - 2663, -1000, -279, 1029, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 975, 806, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, 318, 12335, -33, - 134, 10, 17241, 133, 1673, 17590, -1000, 22, -1000, 14, - 17590, 18, 16892, -1000, -1000, -84, -85, -1000, 10241, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, 794, 968, 955, - 970, 705, 1082, -1000, 8832, 8832, 105, 105, 105, 7436, - -1000, -1000, 355, 17590, 128, 17590, -154, 106, 106, 106, + 234, -1000, -276, 1046, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 993, 819, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, 305, 12489, -27, + 153, 1, 18125, 152, 1555, 18476, -1000, 27, -1000, 14, + 18476, 23, 17774, -1000, -1000, -75, -77, -1000, 10383, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, 809, 967, 972, + 990, 669, 1129, -1000, 8966, 8966, 119, 119, 119, 7562, + -1000, -1000, 17423, 18476, 149, 18476, -150, 117, 117, 117, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, @@ -2739,25 +2831,25 @@ var yyPact = [...]int{ -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, 127, 17590, 621, 621, 248, - 474, 17590, 94, 621, 94, 94, 94, 17590, -1000, 175, - -1000, -1000, -1000, 17590, 621, 909, 352, 70, 215, 215, - 215, -1000, 191, -1000, 4895, 35, 38, -45, 989, 30, - -24, -1000, 352, 4895, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, 116, -1000, -1000, 17590, 16543, 145, 272, -1000, - -1000, -1000, -1000, -1000, -1000, 587, 577, -1000, 10241, 1718, - 706, 706, -1000, -1000, 149, -1000, -1000, 11288, 11288, 11288, - 11288, 11288, 11288, 11288, 11288, 11288, 11288, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, 706, 171, -1000, 9892, 706, 706, 706, 706, 706, - 706, 706, 706, 10241, 706, 706, 706, 706, 706, 706, - 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, - -1000, -1000, 975, -1000, 806, -1000, -1000, -1000, 944, 10241, - 10241, 975, -1000, 894, 8832, -1000, -1000, 950, -1000, -1000, - -1000, -1000, 367, 1009, -1000, 11986, 169, 1007, 16194, -1000, - 14791, 15845, 744, 7073, -131, -1000, -1000, -1000, 270, 14093, - -1000, -1000, -1000, 908, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, 138, 18476, 566, 566, + 275, 509, 18476, 110, 566, 110, 110, 110, 18476, -1000, + 203, -1000, -1000, -1000, 18476, 566, 912, 318, 57, 238, + 238, 238, -1000, 197, -1000, 5007, 34, 41, -74, 1010, + 37, -21, -1000, 318, 5007, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, 124, -1000, -1000, 18476, 17072, 136, 281, + -1000, -1000, -1000, -1000, -1000, -1000, 647, 537, -1000, 10383, + 863, 567, 567, -1000, -1000, 173, -1000, -1000, 11436, 11436, + 11436, 11436, 11436, 11436, 11436, 11436, 11436, 11436, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, 567, 200, -1000, 10032, 567, 567, 567, 567, + 567, 567, 567, 567, 10383, 567, 567, 567, 567, 567, + 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, + 567, -1000, -1000, 993, -1000, 819, -1000, -1000, -1000, 919, + 10383, 10383, 993, -1000, 888, 8966, -1000, -1000, 1107, -1000, + -1000, -1000, -1000, 363, 1024, -1000, 12138, 194, 1021, 16721, + -1000, 15310, 16370, 762, 7197, -121, -1000, -1000, -1000, 278, + 14608, -1000, -1000, -1000, 911, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, @@ -2768,189 +2860,191 @@ var yyPact = [...]int{ -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, 697, 17590, -1000, 335, -1000, 621, - 4895, 120, 621, 287, 621, 17590, 17590, 4895, 4895, 4895, - 43, 77, 67, 17590, 472, 737, 113, 17590, 946, 843, - 17590, 621, 621, -1000, 6347, -1000, 4895, 352, -1000, 451, - 10241, 4895, 4895, 4895, 17590, 4895, 4895, -1000, 449, -1000, - -1000, 346, -1000, -1000, -1000, -1000, -1000, -1000, 4895, 4895, - 336, 1003, 336, -1000, -1000, -1000, -1000, 10241, 215, -1000, - 842, -1000, -1000, 17, -1000, -1000, -1000, -1000, -1000, 1029, - -1000, -1000, -1000, -134, -1000, -1000, 10241, 10241, 10241, 10241, - 419, 214, 11288, 516, 326, 11288, 11288, 11288, 11288, 11288, - 11288, 11288, 11288, 11288, 11288, 11288, 11288, 11288, 11288, 11288, - 560, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 621, - -1000, 1001, 624, 624, 186, 186, 186, 186, 186, 186, - 186, 186, 186, 11637, 7785, 6347, 705, 675, 975, 8832, - 8832, 10241, 10241, 9530, 9181, 8832, 939, 233, 577, 17590, - -1000, -1000, 10939, -1000, -1000, -1000, -1000, -1000, 507, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, 17590, 17590, 8832, 8832, - 8832, 8832, 8832, 955, 705, 950, -1000, 1023, 208, 553, - 717, -1000, 573, 955, 13744, 724, -1000, 950, -1000, -1000, - -1000, 17590, -1000, -1000, 15489, -1000, -1000, 5984, 17590, 60, - 17590, -1000, 767, 832, -1000, -1000, -1000, 954, 13046, 13395, - 17590, 736, 731, -1000, -1000, 166, 6710, -131, -1000, 6710, - 695, -1000, -127, -115, 8134, 179, -1000, -1000, -1000, -1000, - 4532, 582, 567, 299, -74, -1000, -1000, -1000, 749, -1000, - 749, 749, 749, 749, -44, -44, -44, -44, -1000, -1000, - -1000, -1000, -1000, 810, 802, -1000, 749, 749, 749, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, 795, 795, 795, - 781, 781, 820, -1000, 17590, 4895, 945, 4895, -1000, 87, - -1000, -1000, -1000, 17590, 17590, 17590, 17590, 17590, 141, -1000, - 17590, 17590, 708, -1000, 17590, 4895, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, 577, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, 17590, -1000, -1000, -1000, -1000, 352, 17590, 17590, - 17590, 352, 577, -1000, 17590, 17590, -1000, -1000, -1000, -1000, - -1000, 577, 214, 348, 236, -1000, -1000, 372, -1000, -1000, - 1946, -1000, -1000, -1000, -1000, 516, 11288, 11288, 11288, 284, - 1946, 2071, 845, 714, 186, 297, 297, 195, 195, 195, - 195, 195, 454, 454, -1000, -1000, -1000, 507, -1000, -1000, - -1000, 507, 8832, 8832, 707, 706, 164, -1000, 794, -1000, - -1000, 955, 665, 665, 530, 562, 279, 997, 665, 274, - 991, 665, 665, 8832, -1000, -1000, 282, -1000, 10241, 507, - -1000, 162, -1000, 353, 703, 699, 665, 507, 507, 665, - 665, 944, -1000, -1000, 890, 10241, 10241, 10241, -1000, -1000, - -1000, 944, 980, -1000, 900, 899, 988, 8832, 14791, 950, - -1000, -1000, -1000, 160, 988, 710, 706, -1000, 17590, 14791, - 14791, 14791, 14791, 14791, -1000, 865, 864, -1000, 856, 855, - 881, 17590, -1000, 673, 705, 13046, 184, 706, -1000, 15140, - -1000, -1000, 60, 685, 14791, 17590, -1000, -1000, 14791, 17590, - 5621, -1000, 695, -131, -135, -1000, -1000, -1000, -1000, 577, - -1000, 605, 692, 4169, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, 786, 621, -1000, 933, 224, 213, 621, 931, -1000, - -1000, -1000, 911, -1000, 251, -76, -1000, -1000, 405, -44, - -44, -1000, -1000, 179, 907, 179, 179, 179, 448, 448, - -1000, -1000, -1000, -1000, 404, -1000, -1000, -1000, 402, -1000, - 841, 17590, 4895, -1000, -1000, -1000, -1000, 201, 201, 229, + -1000, -1000, -1000, -1000, -1000, -1000, 737, 18476, -1000, 321, + -1000, 566, 5007, 127, 566, 324, 566, 18476, 18476, 5007, + 5007, 5007, 50, 84, 75, 18476, 504, 761, 122, 18476, + 962, 837, 18476, 566, 566, -1000, 6467, -1000, 5007, 318, + -1000, 503, 10383, 5007, 5007, 5007, 18476, 5007, 5007, -1000, + 500, -1000, -1000, 339, -1000, -1000, -1000, -1000, -1000, -1000, + 5007, 5007, 317, 1020, 317, -1000, -1000, -1000, -1000, 10383, + 238, -1000, 832, -1000, -1000, 22, -1000, -1000, -1000, -1000, + -1000, 1046, -1000, -1000, -1000, -122, -1000, -1000, 10383, 10383, + 10383, 10383, 398, 240, 11436, 440, 344, 11436, 11436, 11436, + 11436, 11436, 11436, 11436, 11436, 11436, 11436, 11436, 11436, 11436, + 11436, 11436, 520, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, 566, -1000, 1044, 657, 657, 204, 204, 204, 204, + 204, 204, 204, 204, 204, 11787, 7913, 6467, 669, 714, + 993, 8966, 8966, 10383, 10383, 9668, 9317, 8966, 925, 301, + 537, 18476, -1000, -1000, 11085, -1000, -1000, -1000, -1000, -1000, + 526, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 18476, 18476, + 8966, 8966, 8966, 8966, 8966, 972, 669, 1107, 956, 1037, + 223, 617, 760, -1000, 588, 972, 14257, 688, -1000, 1107, + -1000, -1000, -1000, 18476, -1000, -1000, 16012, -1000, -1000, 6102, + 18476, 65, 18476, -1000, 775, 1011, -1000, -1000, -1000, 964, + 13555, 13906, 18476, 771, 748, -1000, -1000, 193, 6832, -121, + -1000, 6832, 716, -1000, -114, -106, 8264, 184, -1000, -1000, + -1000, -1000, 4642, 12840, 558, 383, -63, -1000, -1000, -1000, + 781, -1000, 781, 781, 781, 781, -12, -12, -12, -12, + -1000, -1000, -1000, -1000, -1000, 811, 805, -1000, 781, 781, + 781, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 801, + 801, 801, 786, 786, 814, -1000, 18476, 5007, 961, 5007, + -1000, 88, -1000, -1000, -1000, 18476, 18476, 18476, 18476, 18476, + 160, -1000, 18476, 18476, 758, -1000, 18476, 5007, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, 537, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, 18476, -1000, -1000, -1000, -1000, 318, + 18476, 18476, 18476, 318, 537, -1000, 18476, 18476, -1000, -1000, + -1000, -1000, -1000, 537, 240, 294, 285, -1000, -1000, 385, + -1000, -1000, 2226, -1000, -1000, -1000, -1000, 440, 11436, 11436, + 11436, 444, 2226, 2117, 1142, 889, 204, 453, 453, 243, + 243, 243, 243, 243, 535, 535, -1000, -1000, -1000, 526, + -1000, -1000, -1000, 526, 8966, 8966, 744, 567, 190, -1000, + 809, -1000, -1000, 972, 704, 704, 530, 370, 298, 1019, + 704, 296, 1017, 704, 704, 8966, -1000, -1000, 359, -1000, + 10383, 526, -1000, 188, -1000, 1792, 743, 720, 704, 526, + 526, 704, 704, 919, -1000, -1000, 901, -1000, 884, 10383, + 10383, 10383, -1000, -1000, -1000, 919, 992, -1000, 895, 892, + 1000, 8966, 15310, 1107, -1000, -1000, -1000, 186, 1000, 764, + 567, -1000, 18476, 15310, 15310, 15310, 15310, 15310, -1000, 861, + 854, -1000, 860, 848, 872, 18476, -1000, 706, 669, 13555, + 181, 567, -1000, 15661, -1000, -1000, 65, 624, 15310, 18476, + -1000, -1000, 15310, 18476, 5737, -1000, 716, -121, -99, -1000, + -1000, -1000, -1000, 537, -1000, 592, 708, 4277, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, 795, 566, -1000, 949, 239, + 210, 566, 948, -1000, -1000, -1000, 915, -1000, 332, -69, + -1000, -1000, 414, -12, -12, -1000, -1000, 184, 910, 184, + 184, 184, 492, 492, -1000, -1000, -1000, -1000, 405, -1000, + -1000, -1000, 404, -1000, 831, 18476, 5007, -1000, -1000, -1000, + -1000, 314, 314, 247, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, 64, 689, -1000, -1000, -1000, + -1000, -15, 44, 121, -1000, 5007, -1000, 317, -1000, -1000, + -1000, 317, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 444, + 2226, 1957, -1000, 11436, 11436, -1000, -1000, 704, 704, 8966, + 6467, 993, 919, -1000, -1000, 106, 520, 106, 11436, 11436, + -1000, 11436, 11436, -1000, -163, 695, 312, -1000, 10383, 621, + -1000, 6467, -1000, 11436, 11436, -1000, -1000, -1000, -1000, -1000, + -1000, 898, 882, 537, 537, -1000, -1000, 18476, -1000, -1000, + -1000, -1000, 997, 10383, -1000, 701, -1000, 5372, 972, 829, + 18476, 567, 1046, 13555, 18476, 603, -1000, 277, 1011, 818, + 826, 687, -1000, -1000, -1000, -1000, 852, -1000, 851, -1000, + -1000, -1000, -1000, -1000, 669, -1000, 147, 146, 142, 18476, + -1000, 1000, 15310, 589, -1000, 589, -1000, 179, -1000, -1000, + -1000, -130, -117, -1000, -1000, -1000, 4642, -1000, 4642, 18476, + 79, -1000, 566, 566, -1000, -1000, -1000, 789, 825, 11436, + -1000, -1000, -1000, 538, 184, 184, -1000, 322, -1000, -1000, + -1000, 697, -1000, 690, 656, 682, 18476, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, 59, 816, -1000, -1000, -1000, -1000, -7, 42, 111, - -1000, 4895, -1000, 336, -1000, -1000, -1000, 336, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, 284, 1946, 2039, -1000, 11288, - 11288, -1000, -1000, 665, 665, 8832, 6347, 975, 944, -1000, - -1000, 104, 560, 104, 11288, 11288, -1000, 11288, 11288, -1000, - -166, 730, 225, -1000, 10241, 538, -1000, 6347, -1000, 11288, - 11288, -1000, -1000, -1000, -1000, -1000, -1000, 882, 577, 577, - -1000, -1000, 17590, -1000, -1000, -1000, -1000, 984, 10241, -1000, - 690, -1000, 5258, 955, 838, 17590, 706, 1029, 13046, 17590, - 725, -1000, 258, 832, 815, 837, 869, -1000, -1000, -1000, - -1000, 858, -1000, 854, -1000, -1000, -1000, -1000, -1000, 705, - -1000, 124, 123, 122, 17590, -1000, 988, 14791, 701, -1000, - 701, -1000, 159, -1000, -1000, -1000, -136, -121, -1000, -1000, - -1000, 4532, -1000, 4532, 17590, 75, -1000, 621, 621, -1000, - -1000, -1000, 783, 836, 11288, -1000, -1000, -1000, 536, 179, - 179, -1000, 260, -1000, -1000, -1000, 659, -1000, 649, 663, - 646, 17590, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, 17590, -1000, -1000, -1000, -1000, -1000, 17590, -172, 621, - 17590, 17590, 17590, 17590, -1000, 352, 352, -1000, 11288, 1946, - 1946, -1000, -1000, 507, -1000, 955, -1000, 507, 749, 749, - -1000, 749, 781, -1000, 749, -11, 749, -27, 507, 507, - 1876, 1858, 1843, 401, 706, -161, -1000, 577, 10241, -1000, - 1599, 1569, -1000, -1000, 981, 963, 577, -1000, -1000, -1000, - 937, 606, 531, -1000, -1000, 8483, 644, 152, 640, -1000, - 975, 17590, 10241, -1000, -1000, 10241, 769, -1000, 10241, -1000, - -1000, -1000, 975, 706, 706, 706, 640, 975, 701, -1000, - -1000, 196, -1000, -1000, -1000, 4169, -1000, 636, -1000, 749, - -1000, -1000, -1000, 17590, -67, 1021, 1946, -1000, -1000, -1000, - -1000, -1000, -44, 433, -44, 400, -1000, 376, 4895, -1000, - -1000, -1000, -1000, 941, -1000, 6347, -1000, -1000, 748, 817, - -1000, -1000, -1000, -1000, 1946, -1000, 944, -1000, -1000, 126, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 11288, 11288, - 11288, 11288, 11288, 955, 432, 577, 11288, 11288, -1000, 10241, - 10241, 916, -1000, 706, -1000, 805, 17590, 17590, -1000, 17590, - 955, -1000, 577, 577, 17590, 577, 14442, 17590, 17590, 12684, - 955, -1000, 172, 17590, -1000, 626, -1000, 199, -1000, -81, - 179, -1000, 179, 534, 523, -1000, 706, 591, -1000, 244, - 17590, 17590, -1000, -1000, -1000, 353, 353, 353, 353, 64, - 507, -1000, 353, 353, 577, 587, 1017, -1000, 706, 1029, - 147, -1000, -1000, -1000, 619, 615, -1000, 615, 615, 184, - -1000, 172, -1000, 621, 230, 424, -1000, 72, 17590, 358, - 915, -1000, 914, -1000, -1000, -1000, -1000, -1000, 58, 6347, - 4532, 570, -1000, -1000, -1000, -1000, -1000, 507, 57, -176, - -1000, -1000, -1000, 17590, 531, 17590, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, 373, -1000, -1000, 17590, -1000, -1000, 422, - -1000, -1000, 555, -1000, 17590, -1000, -1000, 816, -1000, 878, - -170, -180, 425, -1000, -1000, 747, -1000, -1000, 58, 898, - -172, -1000, 846, -1000, 17590, -1000, 54, -1000, -173, 541, - 50, -177, 831, 706, -182, 830, -1000, 995, 10590, -1000, - -1000, 1013, 204, 204, 353, 507, -1000, -1000, -1000, 81, - 406, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, 18476, -1000, -1000, -1000, + -1000, -1000, 18476, -169, 566, 18476, 18476, 18476, 18476, -1000, + 318, 318, -1000, 11436, 2226, 2226, -1000, -1000, 526, -1000, + 972, -1000, 526, 781, 781, -1000, 781, 786, -1000, 781, + 6, 781, 5, 526, 526, 2065, 1995, 1872, 1857, 567, + -158, -1000, 537, 10383, -1000, 1815, 1664, 491, -1000, -1000, + 995, 989, 537, -1000, -1000, -1000, 952, 634, 571, -1000, + -1000, 8615, 659, 170, 643, -1000, 993, 18476, 10383, -1000, + -1000, 10383, 785, -1000, 10383, -1000, -1000, -1000, 993, 567, + 567, 567, 643, 993, 589, -1000, -1000, 196, -1000, -1000, + -1000, 4277, -1000, 626, -1000, 781, -1000, 948, -1000, -1000, + 18476, -45, 1036, 2226, -1000, -1000, -1000, -1000, -1000, -12, + 460, -12, 401, -1000, 399, 5007, -1000, -1000, -1000, -1000, + 954, -1000, 6467, -1000, -1000, 777, 772, -1000, -1000, -1000, + -1000, 2226, -1000, 919, -1000, -1000, 137, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, 11436, 11436, 11436, 11436, 11436, + 972, 458, 537, 11436, 11436, -1000, -1000, 10383, 10383, 923, + -1000, 567, -1000, 812, 18476, 18476, -1000, 18476, 972, -1000, + 537, 537, 18476, 537, 14959, 18476, 18476, 13191, 972, -1000, + 177, 18476, -1000, 615, -1000, 206, -1000, -78, 184, -1000, + 184, 536, 534, -1000, 567, 653, -1000, 266, 18476, 18476, + -1000, -1000, -1000, 1792, 1792, 1792, 1792, 67, 526, -1000, + 1792, 1792, 537, 647, 1032, -1000, 567, 1046, 148, -1000, + -1000, -1000, 610, 601, -1000, 601, 601, 181, -1000, 177, + -1000, 566, 248, 429, -1000, 71, 18476, 345, 921, -1000, + 920, -1000, -1000, -1000, -1000, -1000, 63, 6467, 4642, 599, + -1000, -1000, -1000, -1000, -1000, 526, 60, -173, -1000, -1000, + -1000, 18476, 571, 18476, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, 374, -1000, -1000, 18476, -1000, -1000, 426, -1000, -1000, + 577, -1000, 18476, -1000, -1000, 689, -1000, 881, -167, -177, + 531, -1000, -1000, 773, -1000, -1000, 63, 891, -169, -1000, + 868, -1000, 18476, -1000, 56, -1000, -170, 562, 54, -175, + 824, 567, -182, 822, -1000, 1014, 10734, -1000, -1000, 1027, + 201, 201, 1792, 526, -1000, -1000, -1000, 85, 395, -1000, + -1000, -1000, -1000, -1000, -1000, } var yyPgo = [...]int{ - 0, 1306, 1305, 32, 68, 71, 1304, 1303, 1301, 1300, - 94, 92, 91, 1299, 1297, 1296, 1295, 1291, 1290, 1289, - 1285, 1284, 1280, 1279, 1277, 1275, 1274, 1272, 1268, 1267, - 1266, 1265, 1264, 93, 1263, 1262, 1261, 1257, 77, 1256, - 1253, 1249, 1248, 1247, 37, 81, 48, 64, 1246, 61, - 465, 1245, 38, 70, 67, 1244, 34, 1243, 1242, 99, - 1241, 1240, 55, 1239, 1237, 2478, 1236, 49, 1233, 12, - 114, 1232, 1231, 1230, 1229, 89, 481, 1228, 1227, 14, - 1226, 1224, 95, 1221, 63, 28, 16, 18, 24, 1218, - 72, 1217, 7, 1216, 65, 1214, 1212, 1211, 1208, 30, - 1207, 60, 1206, 19, 26, 1201, 8, 54, 35, 21, - 9, 1199, 1198, 20, 82, 47, 73, 1197, 1191, 1190, - 569, 1184, 1182, 58, 1181, 1180, 1179, 40, 78, 96, - 492, 1178, 1177, 1176, 1175, 1172, 44, 1004, 1791, 17, - 88, 1166, 1165, 1164, 2710, 41, 56, 25, 1162, 1136, - 1135, 66, 57, 42, 410, 1133, 36, 1131, 1130, 1128, - 1124, 1123, 1122, 1121, 352, 1120, 1108, 1106, 106, 23, - 69, 27, 1105, 1101, 1100, 1099, 62, 75, 1098, 1096, - 50, 1095, 1094, 29, 1092, 1082, 1075, 1074, 1072, 31, - 6, 1070, 15, 1069, 11, 1065, 22, 1064, 13, 1059, - 10, 1056, 3, 0, 1053, 5, 52, 1, 1051, 2, - 1049, 1046, 1044, 1694, 4, 74, 1042, 85, + 0, 1312, 1311, 25, 71, 70, 1310, 1309, 1308, 1306, + 105, 99, 97, 1305, 1304, 1302, 1301, 1300, 1299, 1298, + 1297, 1296, 1295, 1285, 1283, 1279, 1274, 1273, 1272, 1271, + 1269, 1261, 1244, 92, 1242, 1241, 1239, 1238, 81, 1236, + 1235, 1233, 1232, 1230, 41, 82, 59, 68, 1229, 64, + 1303, 1228, 38, 72, 67, 1227, 44, 1225, 1223, 89, + 1222, 1220, 63, 1213, 1212, 47, 1211, 58, 1210, 12, + 40, 1207, 1206, 1204, 1203, 101, 2134, 1202, 1201, 15, + 1199, 1196, 103, 1194, 73, 29, 11, 19, 22, 1190, + 66, 1189, 6, 1188, 69, 1186, 1185, 1184, 1183, 33, + 1182, 65, 1181, 28, 1180, 24, 1177, 10, 57, 54, + 20, 7, 1173, 1172, 16, 87, 60, 74, 1171, 1170, + 1168, 574, 1166, 1164, 55, 1160, 1159, 1158, 34, 79, + 111, 412, 1157, 1155, 1149, 1148, 1146, 52, 835, 1808, + 18, 77, 1145, 1144, 1140, 2767, 42, 61, 17, 1139, + 1138, 1137, 36, 85, 49, 424, 1135, 37, 1134, 1133, + 1132, 1131, 1128, 1127, 1126, 23, 1125, 1123, 1122, 30, + 13, 75, 31, 1119, 1117, 1116, 1112, 48, 76, 1111, + 1110, 50, 1109, 1100, 27, 1098, 1096, 1093, 1092, 1091, + 35, 21, 1090, 14, 1084, 9, 1080, 32, 1078, 4, + 1075, 8, 1074, 3, 0, 1073, 5, 56, 1, 1069, + 2, 1064, 1054, 1053, 1436, 681, 78, 1052, 96, } var yyR1 = [...]int{ - 0, 211, 212, 212, 1, 1, 1, 1, 1, 1, + 0, 212, 213, 213, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 203, 203, 203, 21, 3, 3, 3, 3, 2, 2, + 204, 204, 204, 21, 3, 3, 3, 3, 2, 2, 8, 9, 4, 5, 5, 10, 10, 37, 37, 11, - 12, 12, 12, 12, 215, 215, 59, 59, 60, 60, - 107, 107, 13, 14, 14, 116, 116, 115, 115, 115, - 117, 117, 117, 117, 154, 154, 15, 15, 15, 15, - 15, 15, 15, 205, 205, 204, 202, 202, 201, 201, - 200, 22, 185, 187, 187, 186, 186, 186, 186, 177, - 157, 157, 157, 157, 160, 160, 158, 158, 158, 158, - 158, 158, 158, 158, 158, 159, 159, 159, 159, 159, - 161, 161, 161, 161, 161, 162, 162, 162, 162, 162, - 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, - 163, 163, 163, 163, 163, 163, 163, 163, 176, 176, - 164, 164, 170, 170, 171, 171, 171, 173, 173, 174, - 174, 131, 131, 131, 166, 166, 167, 167, 172, 172, - 168, 168, 168, 169, 169, 169, 175, 175, 175, 175, - 175, 165, 165, 178, 178, 195, 195, 194, 194, 194, - 184, 184, 191, 191, 191, 191, 191, 181, 181, 181, - 182, 182, 180, 180, 183, 183, 193, 193, 192, 179, - 179, 196, 196, 196, 196, 208, 209, 207, 207, 207, - 207, 207, 188, 188, 188, 189, 189, 189, 190, 190, - 190, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 206, 206, - 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, - 206, 206, 199, 197, 197, 198, 198, 17, 23, 23, + 12, 12, 12, 12, 216, 216, 59, 59, 60, 60, + 108, 108, 13, 14, 14, 117, 117, 116, 116, 116, + 118, 118, 118, 118, 155, 155, 15, 15, 15, 15, + 15, 15, 15, 206, 206, 205, 203, 203, 202, 202, + 201, 22, 186, 188, 188, 187, 187, 187, 187, 178, + 158, 158, 158, 158, 161, 161, 159, 159, 159, 159, + 159, 159, 159, 159, 159, 160, 160, 160, 160, 160, + 162, 162, 162, 162, 162, 163, 163, 163, 163, 163, + 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, + 164, 164, 164, 164, 164, 164, 164, 164, 177, 177, + 165, 165, 171, 171, 172, 172, 172, 174, 174, 175, + 175, 132, 132, 132, 167, 167, 168, 168, 173, 173, + 169, 169, 169, 170, 170, 170, 176, 176, 176, 176, + 176, 166, 166, 179, 179, 196, 196, 195, 195, 195, + 185, 185, 192, 192, 192, 192, 192, 182, 182, 182, + 183, 183, 181, 181, 184, 184, 194, 194, 193, 180, + 180, 197, 197, 197, 197, 209, 210, 208, 208, 208, + 208, 208, 189, 189, 189, 190, 190, 190, 191, 191, + 191, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 207, 207, + 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, + 207, 207, 200, 198, 198, 199, 199, 17, 23, 23, 18, 18, 18, 18, 18, 19, 19, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 124, 124, - 210, 210, 126, 126, 122, 122, 125, 125, 123, 123, - 123, 127, 127, 127, 128, 128, 155, 155, 155, 26, - 26, 28, 28, 29, 30, 30, 149, 149, 150, 150, + 25, 25, 25, 25, 25, 25, 25, 25, 125, 125, + 211, 211, 127, 127, 123, 123, 126, 126, 124, 124, + 124, 128, 128, 128, 129, 129, 156, 156, 156, 26, + 26, 28, 28, 29, 30, 30, 150, 150, 151, 151, 31, 32, 36, 36, 36, 36, 36, 36, 39, 39, 39, 7, 7, 7, 7, 35, 35, 35, 6, 6, - 27, 27, 27, 27, 20, 216, 33, 34, 34, 38, + 27, 27, 27, 27, 20, 217, 33, 34, 34, 38, 38, 38, 40, 40, 40, 43, 43, 43, 46, 46, 48, 48, 48, 48, 48, 49, 49, 49, 49, 49, - 49, 45, 45, 47, 47, 47, 47, 141, 141, 141, - 140, 140, 51, 51, 52, 52, 53, 53, 54, 54, - 54, 91, 68, 68, 106, 106, 108, 108, 55, 55, - 55, 55, 56, 56, 57, 57, 58, 58, 148, 148, - 147, 147, 147, 146, 146, 61, 61, 61, 63, 62, + 49, 45, 45, 47, 47, 47, 47, 142, 142, 142, + 141, 141, 51, 51, 52, 52, 53, 53, 54, 54, + 54, 91, 68, 68, 107, 107, 109, 109, 55, 55, + 55, 55, 56, 56, 57, 57, 58, 58, 149, 149, + 148, 148, 148, 147, 147, 61, 61, 61, 63, 62, 62, 62, 62, 64, 64, 66, 66, 65, 65, 67, 69, 69, 69, 69, 69, 70, 70, 50, 50, 50, - 50, 50, 50, 50, 50, 119, 119, 72, 72, 71, + 50, 50, 50, 50, 50, 120, 120, 72, 72, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 83, 83, 83, 83, 83, 83, 73, 73, 73, 73, 73, 73, 73, 44, 44, 84, 84, 84, 90, 85, 85, @@ -2960,36 +3054,22 @@ var yyR1 = [...]int{ 76, 76, 76, 76, 80, 80, 80, 80, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 79, 79, 79, 79, 79, 79, 79, 79, 79, - 79, 79, 79, 79, 79, 79, 79, 217, 217, 82, + 79, 79, 79, 79, 79, 79, 79, 218, 218, 82, 81, 81, 81, 81, 81, 81, 81, 42, 42, 42, - 42, 42, 153, 153, 156, 156, 156, 156, 156, 156, - 156, 156, 156, 156, 156, 156, 156, 95, 95, 41, + 42, 42, 154, 154, 157, 157, 157, 157, 157, 157, + 157, 157, 157, 157, 157, 157, 157, 95, 95, 41, 41, 93, 93, 94, 96, 96, 92, 92, 92, 75, 75, 75, 75, 75, 75, 75, 75, 77, 77, 77, 97, 97, 98, 98, 99, 99, 100, 100, 101, 102, - 102, 102, 103, 103, 103, 103, 104, 104, 104, 74, - 74, 74, 74, 105, 105, 105, 105, 109, 109, 86, - 86, 88, 88, 87, 89, 110, 110, 113, 111, 111, - 114, 114, 114, 114, 114, 112, 112, 112, 143, 143, - 143, 118, 118, 129, 129, 130, 130, 120, 120, 132, - 132, 132, 132, 132, 132, 132, 132, 132, 132, 121, - 121, 121, 133, 133, 133, 134, 134, 135, 135, 135, - 142, 142, 138, 138, 139, 139, 144, 144, 145, 145, - 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, - 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, - 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, - 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, - 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, - 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, - 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, - 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, - 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, - 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, - 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, - 136, 136, 136, 136, 136, 136, 136, 136, 136, 137, - 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, - 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, - 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, + 102, 102, 103, 103, 103, 103, 105, 105, 105, 104, + 104, 74, 74, 74, 74, 106, 106, 106, 106, 110, + 110, 86, 86, 88, 88, 87, 89, 111, 111, 114, + 112, 112, 115, 115, 115, 115, 115, 113, 113, 113, + 144, 144, 144, 119, 119, 130, 130, 131, 131, 121, + 121, 133, 133, 133, 133, 133, 133, 133, 133, 133, + 133, 122, 122, 122, 134, 134, 134, 135, 135, 136, + 136, 136, 143, 143, 139, 139, 140, 140, 145, 145, + 146, 146, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, @@ -3001,18 +3081,32 @@ var yyR1 = [...]int{ 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, - 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, - 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, - 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, - 137, 137, 137, 137, 137, 137, 137, 137, 213, 214, - 151, 152, 152, 152, + 137, 137, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 214, 215, 152, 153, 153, 153, } var yyR2 = [...]int{ 0, 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, 0, - 1, 1, 1, 2, 4, 6, 6, 7, 4, 6, + 1, 1, 1, 2, 5, 6, 6, 7, 4, 6, 5, 7, 8, 1, 3, 7, 8, 1, 1, 9, 9, 8, 7, 7, 1, 1, 1, 3, 1, 3, 0, 4, 3, 5, 4, 1, 3, 3, 2, 2, @@ -3072,15 +3166,14 @@ var yyR2 = [...]int{ 2, 1, 2, 4, 0, 2, 1, 3, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 0, 3, 0, 2, 0, 3, 1, 3, 2, 0, - 1, 1, 0, 2, 4, 4, 0, 2, 4, 2, - 1, 5, 4, 1, 3, 3, 5, 0, 5, 1, - 3, 1, 2, 3, 1, 1, 3, 3, 1, 3, - 3, 3, 3, 3, 2, 1, 2, 1, 1, 1, - 1, 1, 1, 0, 2, 0, 3, 0, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, - 2, 3, 0, 1, 1, 1, 1, 0, 1, 1, - 0, 2, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 0, 2, 4, 4, 0, 2, 4, 0, + 4, 2, 1, 5, 4, 1, 3, 3, 5, 0, + 5, 1, 3, 1, 2, 3, 1, 1, 3, 3, + 1, 3, 3, 3, 3, 3, 2, 1, 2, 1, + 1, 1, 1, 1, 1, 0, 2, 0, 3, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 0, 2, 3, 0, 1, 1, 1, 1, 0, + 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -3110,357 +3203,360 @@ var yyR2 = [...]int{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 0, 0, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 0, 0, 1, 1, } var yyChk = [...]int{ - -1000, -211, -1, -3, -8, -9, -10, -11, -12, -13, + -1000, -212, -1, -3, -8, -9, -10, -11, -12, -13, -14, -15, -16, -17, -18, -19, -24, -25, -26, -28, - -29, -30, -31, -32, -6, -27, -20, -21, -4, -213, - 6, 7, 8, -37, 10, 11, 31, -22, 124, 125, - 127, 126, 160, 128, 153, 54, 174, 175, 177, 178, - 179, 180, -39, 158, 159, 32, 33, 130, 35, 58, - 9, 267, 155, 154, 26, -212, 369, -38, 5, -99, - 16, -3, -33, -216, -33, -33, -33, -33, -33, -33, - -185, -187, 58, 97, -135, 134, 78, 259, 131, 132, - 138, -138, -203, -137, 61, 62, 63, 277, 146, 309, - 310, 174, 188, 182, 209, 201, 278, 311, 147, 199, - 202, 246, 144, 312, 229, 236, 72, 177, 255, 313, - 156, 197, 193, 314, 286, 191, 28, 315, 238, 214, - 316, 282, 240, 192, 237, 130, 317, 149, 365, 142, - 318, 215, 219, 319, 247, 320, 321, 322, 186, 187, - 323, 145, 249, 213, 143, 34, 241, 279, 38, 164, - 250, 217, 324, 212, 208, 325, 326, 327, 328, 211, - 185, 207, 42, 221, 220, 222, 245, 204, 329, 330, - 331, 150, 332, 194, 19, 333, 334, 335, 336, 337, - 253, 159, 338, 162, 339, 340, 341, 342, 343, 344, - 239, 216, 218, 139, 166, 235, 281, 345, 251, 190, - 346, 151, 163, 158, 254, 152, 347, 348, 349, 350, - 351, 352, 353, 178, 354, 355, 356, 357, 173, 248, - 257, 41, 226, 358, 184, 141, 359, 175, 170, 231, - 205, 165, 360, 361, 195, 196, 210, 183, 206, 176, - 366, 167, 160, 362, 256, 227, 283, 203, 200, 171, - 363, 168, 169, 364, 367, 242, 232, 243, 244, 233, - 172, 280, 252, 198, 228, -121, 134, 259, 131, 233, - 280, 132, 132, 133, 134, 259, 131, 132, -65, -144, - -203, -137, 134, 132, 115, 202, 246, 124, 230, 241, - 242, 238, -126, 239, 166, -155, 132, -122, 229, 232, - 233, 172, -210, -203, 240, 248, 247, 234, 244, 243, - -144, 176, -149, 181, -138, 179, -65, -36, 365, 128, - -151, -151, 231, 231, -151, -85, -50, -71, 81, -76, - 30, 24, -75, -72, -92, -89, -90, 115, 116, 118, - 117, 119, 104, 105, 112, 82, 120, -80, -78, -79, - -81, 65, 64, 73, 66, 67, 68, 69, 74, 75, - 76, -138, -144, -87, -213, 48, 49, 268, 269, 270, - 271, 276, 272, 84, 37, 258, 266, 265, 264, 262, - 263, 260, 261, 274, 275, 137, 259, 131, 110, 267, - -203, -137, -5, -4, -213, 6, 21, 22, -103, 18, - 17, -214, 60, -40, -48, 43, 44, -49, 22, 36, - 47, 45, -34, -47, 106, -50, -144, -47, -120, 136, - -120, -120, -111, -154, 176, -114, 248, 247, -139, -112, - -138, -136, 246, 202, 245, 129, 284, 80, 23, 25, - 224, 83, 115, 17, 84, 114, 268, 124, 52, 285, - 260, 261, 258, 270, 271, 259, 230, 30, 11, 287, - 26, 154, 22, 36, 108, 126, 87, 88, 157, 24, - 155, 76, 290, 20, 55, 12, 14, 291, 292, 15, - 137, 136, 99, 133, 50, 9, 120, 27, 96, 46, - 293, 29, 294, 295, 296, 297, 48, 97, 18, 262, - 263, 32, 298, 276, 161, 110, 53, 39, 81, 299, - 300, 74, 301, 77, 56, 78, 16, 51, 302, 303, - 304, 305, 98, 127, 267, 49, 306, 131, 6, 273, - 31, 153, 47, 307, 132, 86, 274, 275, 135, 75, - 5, 138, 33, 10, 54, 57, 264, 265, 266, 37, - 85, 13, 308, 79, -186, 97, -177, -203, -65, 133, - -65, 267, -130, 137, -130, -130, 132, -65, -203, -203, - 124, 126, 129, 56, 65, -23, -65, -129, 137, -203, - -129, -129, -129, -65, 121, -65, -203, 31, -127, 97, - 13, 259, -203, 166, 132, 167, 134, -128, 97, -128, - -128, -181, 133, 34, 145, -152, -213, -139, 170, 171, - 170, -125, -124, 236, 237, 231, 235, 13, 171, 231, - 169, -127, -152, 135, -138, -35, -138, 65, -7, -3, - -11, -10, -12, 89, -151, -151, 59, 80, 78, 79, - 96, -50, -73, 99, 81, 97, 98, 83, 101, 100, - 111, 104, 105, 106, 107, 108, 109, 110, 102, 103, - 114, 89, 90, 91, 92, 93, 94, 95, -119, -213, - -90, -213, 122, 123, -76, -76, -76, -76, -76, -76, - -76, -76, -76, -76, -213, 121, -2, -85, -4, -213, - -213, -213, -213, -213, -213, -213, -213, -95, -50, -213, - -217, -82, -213, -217, -82, -217, -82, -217, -213, -217, - -82, -217, -82, -217, -217, -82, -213, -213, -213, -213, - -213, -213, -213, -99, -3, -33, -104, 20, 32, -50, - -100, -101, -50, -99, 39, -45, -47, -49, 43, 44, - 71, 12, -141, -140, 23, -138, 65, 121, 12, -66, - 27, -65, -52, -53, -54, -55, -68, -91, -213, -65, - 12, -59, -60, -65, -67, -144, 59, 176, -114, -154, - -116, -115, 249, 251, 89, -143, -138, 65, 30, 31, - 60, 59, -65, -157, -160, -162, -161, -163, -158, -159, - 199, 200, 115, 203, 205, 206, 207, 208, 209, 210, - 211, 212, 213, 214, 31, 156, 195, 196, 197, 198, - 215, 216, 217, 218, 219, 220, 221, 222, 182, 201, - 278, 183, 184, 185, 186, 187, 188, 190, 191, 192, - 193, 194, -203, -152, 134, -203, 81, -203, -65, -65, - -152, -152, -152, 168, 168, 132, 132, 173, -65, 65, - 59, 135, -59, 24, 56, -65, -203, -203, -145, -144, - -136, -152, -127, 65, -50, -152, -152, -152, -65, -152, - -152, 65, -182, 12, 99, -152, -152, -123, 12, 99, - 12, -123, -50, -128, 56, -150, 179, 213, 366, 367, - 368, -50, -50, -50, -50, -83, 74, 81, 75, 76, - -76, -84, -87, -90, 70, 99, 97, 98, 83, -76, - -76, -76, -76, -76, -76, -76, -76, -76, -76, -76, - -76, -76, -76, -76, -153, -203, 65, -203, -75, -75, - -138, -46, 22, 36, -45, -139, -145, -136, -38, -214, - -214, -99, -45, -45, -50, -50, -92, 65, -45, -92, - 65, -45, -45, -43, 22, 36, -93, -94, 85, -92, - -138, -144, -214, -76, -138, -138, -45, -46, -46, -45, - -45, -103, -214, 10, 99, 59, 19, 59, -102, 25, - 26, -103, -77, -138, 66, 69, -51, 59, 12, -49, - -65, -140, 106, -145, -65, -107, 162, -65, 31, 59, - -61, -63, -62, -64, 46, 50, 52, 47, 48, 49, - 53, -148, 23, -52, -3, -213, -147, 162, -146, 23, - -144, 65, -65, -59, -215, 59, 12, 57, -215, 59, - 121, -114, -116, 59, 250, 252, 253, 56, 77, -50, - -169, 114, -188, -189, -190, -139, 65, 66, -177, -178, - -179, -191, 148, -196, 139, 141, 138, -180, 149, 133, - 29, 60, -131, 74, 81, -173, 227, -164, 58, -164, - -164, -164, -164, -168, 202, -168, -168, -168, 58, 58, - -164, -164, -164, -170, 58, -170, -170, -171, 58, -171, - -142, 57, -65, -152, 24, -152, -132, 129, 126, 127, - -199, 125, 224, 202, 72, 30, 16, 268, 162, 283, - -203, 163, -65, -65, -65, -65, -65, 129, 126, -65, - -65, -65, -152, -65, -127, -144, -144, -65, -127, -65, - -138, 74, 75, 76, -84, -76, -76, -76, -44, 157, - 80, -214, -214, -45, -45, -213, 121, -5, -103, -214, - -214, 59, 57, 23, 12, 12, -214, 12, 12, -214, - -214, -45, -96, -94, 87, -50, -214, 121, -214, 59, - 59, -214, -214, -214, -214, -214, -104, 41, -50, -50, - -101, -104, -118, 20, 12, 37, 37, -70, 13, -47, - -52, -49, 121, -70, -74, 31, 37, -3, -213, -213, - -110, -113, -92, -53, -54, -54, -53, -54, 46, 46, - 46, 51, 46, 51, 46, -62, -144, -214, -214, -3, - -69, 54, 136, 55, -213, -146, -107, 57, -52, -65, - -52, -67, -144, 106, -115, -117, 254, 251, 257, -203, - 65, 59, -190, 89, 58, -203, 29, -180, -180, -183, - -203, -183, 29, -166, 30, 74, -174, 228, 66, -168, - -168, -169, 31, -169, -169, -169, -176, 65, -176, 66, - 66, 56, -138, -152, -151, -206, 144, 140, 148, 149, - 142, 61, 62, 63, 133, 29, 139, 141, 162, 138, - -206, -133, -134, 135, 23, 133, 29, 162, -205, 57, - 168, 224, 168, 135, -152, -123, -123, -44, 80, -76, - -76, -214, -214, -46, -139, -99, -104, -156, 115, 199, - 156, 197, 193, 213, 204, 226, 195, 227, -153, -156, - -76, -76, -76, -76, 277, -99, 88, -50, 86, -139, - -76, -76, 42, -65, -97, 14, -50, 106, -103, -109, - 56, -110, -86, -88, -87, -213, -105, -138, -108, -138, - -70, 59, 89, -57, -56, 56, 57, -58, 56, -56, - 46, 46, -214, 133, 133, 133, -108, -70, -52, -70, - -70, 121, 251, 255, 256, -189, -190, -193, -192, -138, - -196, -183, -183, 58, -167, 56, -76, 60, -169, -169, - -203, 115, 60, 59, 60, 59, 60, 59, -65, -151, - -151, -65, -151, -138, -202, 280, -204, -203, -138, -138, - -138, -65, -127, -127, -76, -214, -103, -214, -164, -164, - -164, -171, -164, 187, -164, 187, -214, -214, 20, 20, - 20, 20, -213, -41, 273, -50, 59, 59, -98, 15, - 17, 28, -109, 59, -214, -214, 59, 121, -214, 59, - -99, -113, -50, -50, 58, -50, -213, -213, -213, -214, - -99, -70, 60, 59, -164, -106, -138, -172, 224, 10, - -168, 65, -168, 66, 66, -152, 27, -201, -200, -139, - 58, 57, -104, -168, -203, -76, -76, -76, -76, -76, - -103, 65, -76, -76, -50, -85, 29, -88, 37, -3, - -138, -138, -138, -103, -106, -106, -214, -106, -106, -147, - -103, -195, -194, 57, 143, 72, -192, 60, 59, -175, - 139, 29, 138, -79, -169, -169, 60, 60, -213, 59, - 89, -106, -65, -214, -214, -214, -214, -42, 99, 280, - -214, -214, -214, 10, -86, 121, 60, -214, -214, -214, - -69, -194, -203, -184, 89, 65, 151, -138, -165, 72, - 29, 29, -197, -198, 162, -200, -190, 60, -214, 278, - 53, 281, -110, -138, 66, -65, 65, -214, 59, -138, - -205, 42, 279, 282, 58, -198, 37, -202, 42, -106, - 164, 280, 60, 165, 281, -208, -209, 56, -213, 282, - -209, 56, 11, 10, -76, 161, -207, 152, 147, 150, - 31, -207, -214, -214, 146, 30, 74, + -29, -30, -31, -32, -6, -27, -20, -21, -4, -214, + 6, 7, 8, -37, 10, 11, 31, -22, 126, 127, + 129, 128, 162, 130, 155, 56, 176, 177, 179, 180, + 181, 182, -39, 160, 161, 32, 33, 132, 35, 60, + 9, 269, 157, 156, 26, -213, 371, -38, 5, -99, + 16, -3, -33, -217, -33, -33, -33, -33, -33, -33, + -186, -188, 60, 99, -136, 136, 80, 261, 133, 134, + 140, -139, -204, -138, 63, 64, 65, 279, 148, 311, + 312, 176, 190, 184, 211, 203, 280, 313, 149, 201, + 204, 248, 146, 314, 231, 238, 74, 179, 257, 315, + 158, 199, 195, 316, 288, 193, 28, 317, 240, 216, + 318, 284, 242, 194, 239, 132, 319, 151, 367, 144, + 320, 217, 221, 321, 249, 322, 323, 324, 188, 189, + 325, 147, 251, 215, 145, 34, 243, 281, 40, 166, + 252, 219, 326, 214, 210, 327, 328, 329, 330, 213, + 187, 209, 44, 223, 222, 224, 247, 206, 331, 332, + 333, 152, 334, 196, 19, 335, 336, 337, 338, 339, + 255, 161, 340, 164, 341, 342, 343, 344, 345, 346, + 241, 218, 220, 141, 168, 237, 283, 347, 253, 192, + 348, 153, 165, 160, 256, 154, 349, 350, 351, 352, + 353, 354, 355, 180, 38, 356, 357, 358, 359, 175, + 250, 259, 43, 228, 360, 186, 143, 361, 177, 172, + 233, 207, 167, 362, 363, 197, 198, 212, 185, 208, + 178, 368, 169, 162, 364, 258, 229, 285, 205, 202, + 173, 365, 170, 171, 366, 369, 244, 234, 245, 246, + 235, 174, 282, 254, 200, 230, -122, 136, 261, 133, + 235, 282, 134, 134, 135, 136, 261, 133, 134, -65, + -145, -204, -138, 136, 134, 117, 204, 248, 126, 232, + 243, 244, 240, -127, 241, 168, -156, 134, -123, 231, + 234, 235, 174, -211, -204, 242, 250, 249, 236, 246, + 245, -145, 178, -150, 183, -139, 181, -65, -36, 367, + 130, -152, -152, 233, 233, -152, -85, -50, -71, 83, + -76, 30, 24, -75, -72, -92, -89, -90, 117, 118, + 120, 119, 121, 106, 107, 114, 84, 122, -80, -78, + -79, -81, 67, 66, 75, 68, 69, 70, 71, 76, + 77, 78, -139, -145, -87, -214, 50, 51, 270, 271, + 272, 273, 278, 274, 86, 39, 260, 268, 267, 266, + 264, 265, 262, 263, 276, 277, 139, 261, 133, 112, + 269, -204, -138, -5, -4, -214, 6, 21, 22, -103, + 18, 17, -215, 62, -40, -48, 45, 46, -49, 22, + 36, 49, 47, -34, -47, 108, -50, -145, -47, -121, + 138, -121, -121, -112, -155, 178, -115, 250, 249, -140, + -113, -139, -137, 248, 204, 247, 131, 286, 82, 23, + 25, 226, 85, 117, 17, 86, 116, 270, 126, 54, + 287, 262, 263, 260, 272, 273, 261, 232, 30, 11, + 289, 26, 156, 22, 36, 110, 128, 89, 90, 159, + 24, 157, 78, 292, 20, 57, 12, 14, 293, 294, + 15, 139, 138, 101, 135, 52, 9, 122, 27, 98, + 48, 295, 29, 296, 297, 298, 299, 50, 99, 18, + 264, 265, 32, 300, 278, 163, 112, 55, 41, 83, + 301, 302, 76, 303, 79, 58, 80, 16, 53, 37, + 304, 305, 306, 307, 100, 129, 269, 51, 308, 133, + 6, 275, 31, 155, 49, 309, 134, 88, 276, 277, + 137, 77, 5, 140, 33, 10, 56, 59, 266, 267, + 268, 39, 87, 13, 310, 81, -187, 99, -178, -139, + -65, 135, -65, 269, -131, 139, -131, -131, 134, -65, + -204, -204, 126, 128, 131, 58, 67, -23, -65, -130, + 139, -204, -130, -130, -130, -65, 123, -65, -204, 31, + -128, 99, 13, 261, -204, 168, 134, 169, 136, -129, + 99, -129, -129, -182, 135, 34, 147, -153, -214, -140, + 172, 173, 172, -126, -125, 238, 239, 233, 237, 13, + 173, 233, 171, -128, -153, 137, -139, -35, -139, 67, + -7, -3, -11, -10, -12, 91, -152, -152, 61, 82, + 80, 81, 98, -50, -73, 101, 83, 99, 100, 85, + 103, 102, 113, 106, 107, 108, 109, 110, 111, 112, + 104, 105, 116, 91, 92, 93, 94, 95, 96, 97, + -120, -214, -90, -214, 124, 125, -76, -76, -76, -76, + -76, -76, -76, -76, -76, -76, -214, 123, -2, -85, + -4, -214, -214, -214, -214, -214, -214, -214, -214, -95, + -50, -214, -218, -82, -214, -218, -82, -218, -82, -218, + -214, -218, -82, -218, -82, -218, -218, -82, -214, -214, + -214, -214, -214, -214, -214, -99, -3, -33, -105, 20, + 32, -50, -100, -101, -50, -99, 41, -45, -47, -49, + 45, 46, 73, 12, -142, -141, 23, -139, 67, 123, + 12, -66, 27, -65, -52, -53, -54, -55, -68, -91, + -214, -65, 12, -59, -60, -65, -67, -145, 61, 178, + -115, -155, -117, -116, 251, 253, 91, -144, -139, 67, + 30, 31, 62, 61, -65, -158, -161, -163, -162, -164, + -159, -160, 201, 202, 117, 205, 207, 208, 209, 210, + 211, 212, 213, 214, 215, 216, 31, 158, 197, 198, + 199, 200, 217, 218, 219, 220, 221, 222, 223, 224, + 184, 203, 280, 185, 186, 187, 188, 189, 190, 192, + 193, 194, 195, 196, -204, -153, 136, -204, 83, -204, + -65, -65, -153, -153, -153, 170, 170, 134, 134, 175, + -65, 67, 61, 137, -59, 24, 58, -65, -204, -204, + -146, -145, -137, -153, -128, 67, -50, -153, -153, -153, + -65, -153, -153, 67, -183, 12, 101, -153, -153, -124, + 12, 101, 12, -124, -50, -129, 58, -151, 181, 215, + 368, 369, 370, -50, -50, -50, -50, -83, 76, 83, + 77, 78, -76, -84, -87, -90, 72, 101, 99, 100, + 85, -76, -76, -76, -76, -76, -76, -76, -76, -76, + -76, -76, -76, -76, -76, -76, -154, -204, 67, -204, + -75, -75, -139, -46, 22, 36, -45, -140, -146, -137, + -38, -215, -215, -99, -45, -45, -50, -50, -92, 67, + -45, -92, 67, -45, -45, -43, 22, 36, -93, -94, + 87, -92, -139, -145, -215, -76, -139, -139, -45, -46, + -46, -45, -45, -103, -215, -104, 27, 10, 101, 61, + 19, 61, -102, 25, 26, -103, -77, -139, 68, 71, + -51, 61, 12, -49, -65, -141, 108, -146, -65, -108, + 164, -65, 31, 61, -61, -63, -62, -64, 48, 52, + 54, 49, 50, 51, 55, -149, 23, -52, -3, -214, + -148, 164, -147, 23, -145, 67, -65, -59, -216, 61, + 12, 59, -216, 61, 123, -115, -117, 61, 252, 254, + 255, 58, 79, -50, -170, 116, -189, -190, -191, -140, + 67, 68, -178, -179, -180, -192, 150, -197, 141, 143, + 140, -181, 151, 135, 29, 62, -132, 76, 83, -174, + 229, -165, 60, -165, -165, -165, -165, -169, 204, -169, + -169, -169, 60, 60, -165, -165, -165, -171, 60, -171, + -171, -172, 60, -172, -143, 59, -65, -153, 24, -153, + -133, 131, 128, 129, -200, 127, 226, 204, 74, 30, + 16, 270, 164, 285, -204, 165, -65, -65, -65, -65, + -65, 131, 128, -65, -65, -65, -153, -65, -128, -145, + -145, -65, -128, -65, -139, 76, 77, 78, -84, -76, + -76, -76, -44, 159, 82, -215, -215, -45, -45, -214, + 123, -5, -103, -215, -215, 61, 59, 23, 12, 12, + -215, 12, 12, -215, -215, -45, -96, -94, 89, -50, + -215, 123, -215, 61, 61, -215, -215, -215, -215, -215, + -105, 37, 43, -50, -50, -101, -105, -119, 20, 12, + 39, 39, -70, 13, -47, -52, -49, 123, -70, -74, + 31, 39, -3, -214, -214, -111, -114, -92, -53, -54, + -54, -53, -54, 48, 48, 48, 53, 48, 53, 48, + -62, -145, -215, -215, -3, -69, 56, 138, 57, -214, + -147, -108, 59, -52, -65, -52, -67, -145, 108, -116, + -118, 256, 253, 259, -204, 67, 61, -191, 91, 60, + -204, 29, -181, -181, -184, -204, -184, 29, -167, 30, + 76, -175, 230, 68, -169, -169, -170, 31, -170, -170, + -170, -177, 67, -177, 68, 68, 58, -139, -153, -152, + -207, 146, 142, 150, 151, 144, 63, 64, 65, 135, + 29, 141, 143, 164, 140, -207, -134, -135, 137, 23, + 135, 29, 164, -206, 59, 170, 226, 170, 137, -153, + -124, -124, -44, 82, -76, -76, -215, -215, -46, -140, + -99, -105, -157, 117, 201, 158, 199, 195, 215, 206, + 228, 197, 229, -154, -157, -76, -76, -76, -76, 279, + -99, 90, -50, 88, -140, -76, -76, 38, 44, -65, + -97, 14, -50, 108, -103, -110, 58, -111, -86, -88, + -87, -214, -106, -139, -109, -139, -70, 61, 91, -57, + -56, 58, 59, -58, 58, -56, 48, 48, -215, 135, + 135, 135, -109, -70, -52, -70, -70, 123, 253, 257, + 258, -190, -191, -194, -193, -139, -197, 151, -184, -184, + 60, -168, 58, -76, 62, -170, -170, -204, 117, 62, + 61, 62, 61, 62, 61, -65, -152, -152, -65, -152, + -139, -203, 282, -205, -204, -139, -139, -139, -65, -128, + -128, -76, -215, -103, -215, -165, -165, -165, -172, -165, + 189, -165, 189, -215, -215, 20, 20, 20, 20, -214, + -41, 275, -50, 61, 61, 67, -98, 15, 17, 28, + -110, 61, -215, -215, 61, 123, -215, 61, -99, -114, + -50, -50, 60, -50, -214, -214, -214, -215, -99, -70, + 62, 61, -165, -107, -139, -173, 226, 10, -169, 67, + -169, 68, 68, -153, 27, -202, -201, -140, 60, 59, + -105, -169, -204, -76, -76, -76, -76, -76, -103, 67, + -76, -76, -50, -85, 29, -88, 39, -3, -139, -139, + -139, -103, -107, -107, -215, -107, -107, -148, -103, -196, + -195, 59, 145, 74, -193, 62, 61, -176, 141, 29, + 140, -79, -170, -170, 62, 62, -214, 61, 91, -107, + -65, -215, -215, -215, -215, -42, 101, 282, -215, -215, + -215, 10, -86, 123, 62, -215, -215, -215, -69, -195, + -204, -185, 91, 67, 153, -139, -166, 74, 29, 29, + -198, -199, 164, -201, -191, 62, -215, 280, 55, 283, + -111, -139, 68, -65, 67, -215, 61, -139, -206, 44, + 281, 284, 60, -199, 39, -203, 44, -107, 166, 282, + 62, 167, 283, -209, -210, 58, -214, 284, -210, 58, + 11, 10, -76, 163, -208, 154, 149, 152, 31, -208, + -215, -215, 148, 30, 76, } var yyDef = [...]int{ 29, -2, 2, 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, 624, 0, - 365, 365, 365, 365, 365, 365, 365, 0, 697, 689, + 365, 365, 365, 365, 365, 365, 365, 0, 699, 691, 0, 0, 0, 0, -2, 330, 331, 0, 333, -2, - 0, 0, 342, 1010, 1010, 0, 0, 1010, 0, 1008, + 0, 0, 342, 1014, 1014, 0, 0, 1014, 0, 1012, 47, 48, 348, 349, 350, 1, 3, 0, 369, 632, - 0, 0, -2, 367, 0, 0, 677, 677, 677, 0, - 76, 77, 0, 0, 0, 993, 0, 675, 675, 675, - 698, 699, 702, 703, 30, 31, 32, 829, 830, 831, - 832, 833, 834, 835, 836, 837, 838, 839, 840, 841, - 842, 843, 844, 845, 846, 847, 848, 849, 850, 851, - 852, 853, 854, 855, 856, 857, 858, 859, 860, 861, - 862, 863, 864, 865, 866, 867, 868, 869, 870, 871, - 872, 873, 874, 875, 876, 877, 878, 879, 880, 881, - 882, 883, 884, 885, 886, 887, 888, 889, 890, 891, - 892, 893, 894, 895, 896, 897, 898, 899, 900, 901, - 902, 903, 904, 905, 906, 907, 908, 909, 910, 911, - 912, 913, 914, 915, 916, 917, 918, 919, 920, 921, - 922, 923, 924, 925, 926, 927, 928, 929, 930, 931, - 932, 933, 934, 935, 936, 937, 938, 939, 940, 941, - 942, 943, 944, 945, 946, 947, 948, 949, 950, 951, - 952, 953, 954, 955, 956, 957, 958, 959, 960, 961, - 962, 963, 964, 965, 966, 967, 968, 969, 970, 971, - 972, 973, 974, 975, 976, 977, 978, 979, 980, 981, - 982, 983, 984, 985, 986, 987, 988, 989, 990, 991, - 992, 994, 995, 996, 997, 998, 999, 1000, 1001, 1002, - 1003, 1004, 1005, 1006, 1007, 0, 0, 0, 0, 0, - 0, 0, 673, 0, 673, 673, 673, 0, 276, 447, - 706, 707, 993, 0, 0, 0, 321, 0, 324, 324, - 324, 290, 0, 292, 1011, 0, 0, 0, 299, 0, - 0, 305, 321, 1011, 313, 327, 328, 315, 310, 311, - 329, 332, 0, 337, 340, 0, 355, 0, 870, 347, - 360, 361, 1010, 1010, 364, 33, 498, 457, 0, 463, - 465, 0, 500, 501, 502, 503, 504, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 530, 531, 532, - 533, 609, 610, 611, 612, 613, 614, 615, 616, 467, - 468, 606, 0, 654, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 597, 0, 567, 567, 567, 567, 567, - 567, 567, 567, 0, 0, 0, 0, 0, 0, 0, - -2, -2, 624, 43, 0, 365, 370, 371, 636, 0, - 0, 624, 1009, 0, 0, -2, -2, 381, 387, 388, - 389, 390, 366, 0, 393, 397, 0, 0, 0, 678, - 0, 0, 62, 0, 981, 658, -2, -2, 0, 0, - 704, 705, -2, 842, -2, 710, 711, 712, 713, 714, - 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, - 725, 726, 727, 728, 729, 730, 731, 732, 733, 734, - 735, 736, 737, 738, 739, 740, 741, 742, 743, 744, - 745, 746, 747, 748, 749, 750, 751, 752, 753, 754, - 755, 756, 757, 758, 759, 760, 761, 762, 763, 764, - 765, 766, 767, 768, 769, 770, 771, 772, 773, 774, - 775, 776, 777, 778, 779, 780, 781, 782, 783, 784, - 785, 786, 787, 788, 789, 790, 791, 792, 793, 794, - 795, 796, 797, 798, 799, 800, 801, 802, 803, 804, - 805, 806, 807, 808, 809, 810, 811, 812, 813, 814, - 815, 816, 817, 818, 819, 820, 821, 822, 823, 824, - 825, 826, 827, 828, 0, 0, 95, 0, 93, 0, - 1011, 0, 0, 0, 0, 0, 0, 1011, 1011, 1011, - 0, 0, 0, 0, 690, 267, 0, 0, 0, 0, - 0, 0, 0, 275, 0, 277, 1011, 321, 280, 0, - 0, 1011, 1011, 1011, 0, 1011, 1011, 287, 0, 288, - 289, 0, 197, 198, 199, 293, 1012, 1013, 1011, 1011, - 318, 0, 318, 316, 317, 308, 309, 0, 324, 302, - 303, 306, 307, 338, 341, 358, 356, 357, 359, 351, - 352, 353, 354, 0, 362, 363, 0, 0, 0, 0, - 0, 461, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 485, 486, 487, 488, 489, 490, 491, 464, 0, - 478, 0, 0, 0, 520, 521, 522, 523, 524, 525, - 526, 527, 528, 0, 378, 0, 0, 0, 624, 0, - 0, 0, 0, 0, 0, 0, 375, 0, 598, 0, - 551, 559, 0, 552, 560, 553, 561, 554, 0, 555, - 562, 556, 563, 557, 558, 564, 0, 0, 0, 378, - 378, 0, 0, 632, 0, 380, 34, 0, 0, 633, - 625, 626, 629, 632, 0, 402, 391, 382, 385, 386, - 368, 0, 394, 398, 0, 400, 401, 0, 0, 60, - 0, 446, 0, 404, 406, 407, 408, 428, 0, 430, - 0, 0, 0, 56, 58, 447, 0, 981, 664, 0, - 64, 65, 0, 0, 0, 173, 668, 669, 670, 666, - 222, 0, 0, 161, 157, 101, 102, 103, 150, 105, - 150, 150, 150, 150, 170, 170, 170, 170, 133, 134, - 135, 136, 137, 0, 0, 120, 150, 150, 150, 124, - 140, 141, 142, 143, 144, 145, 146, 147, 106, 107, - 108, 109, 110, 111, 112, 113, 114, 152, 152, 152, - 154, 154, 700, 79, 0, 1011, 0, 1011, 91, 0, - 236, 238, 239, 0, 0, 0, 0, 0, 0, 691, - 0, 0, 270, 674, 0, 1011, 273, 274, 448, 708, - 709, 278, 279, 322, 323, 281, 282, 283, 284, 285, - 286, 325, 0, 200, 201, 294, 298, 321, 0, 0, - 0, 321, 300, 301, 0, 0, 339, 343, 344, 345, - 346, 499, 458, 459, 460, 462, 479, 0, 481, 483, - 469, 470, 494, 495, 496, 0, 0, 0, 0, 492, - 474, 0, 505, 506, 507, 508, 509, 510, 511, 512, - 513, 514, 515, 516, 519, 582, 583, 0, 517, 518, - 529, 0, 0, 0, 379, 607, 0, -2, 0, 497, - 653, 632, 0, 0, 0, 0, 502, 609, 0, 502, - 609, 0, 0, 0, 376, 377, 604, 601, 0, 0, - 606, 0, 568, 0, 0, 0, 0, 0, 0, 0, - 0, 636, 44, 637, 0, 0, 0, 0, 628, 630, - 631, 636, 0, 617, 0, 0, 455, 0, 0, 383, - 40, 399, 395, 0, 455, 0, 0, 445, 0, 0, - 0, 0, 0, 0, 435, 0, 0, 438, 0, 0, - 0, 0, 429, 0, 0, 0, 450, 925, 431, 0, - 433, 434, -2, 0, 0, 0, 54, 55, 0, 0, - 0, 659, 63, 0, 0, 68, 69, 660, 661, 662, - 663, 0, 92, 223, 225, 228, 229, 230, 96, 97, - 98, 0, 0, 210, 0, 0, 204, 204, 0, 202, - 203, 94, 164, 162, 0, 159, 158, 104, 0, 170, - 170, 127, 128, 173, 0, 173, 173, 173, 0, 0, - 121, 122, 123, 115, 0, 116, 117, 118, 0, 119, - 0, 0, 1011, 81, 676, 82, 1010, 0, 0, 692, - 237, 679, 680, 681, 682, 683, 684, 685, 686, 687, - 688, 0, 83, 241, 243, 242, 246, 0, 0, 0, - 268, 1011, 272, 318, 295, 319, 320, 318, 297, 304, - 335, 480, 482, 484, 471, 492, 475, 0, 472, 0, - 0, 466, 534, 0, 0, 378, 0, 624, 636, 538, - 539, 0, 0, 0, 0, 0, 575, 0, 0, 576, - 0, 624, 0, 602, 0, 0, 550, 0, 569, 0, - 0, 570, 571, 572, 573, 574, 36, 0, 634, 635, - 627, 35, 0, 671, 672, 618, 619, 620, 0, 392, - 403, 384, 0, 632, 647, 0, 0, 640, 0, 0, - 455, 655, 0, 405, 424, 426, 0, 421, 436, 437, - 439, 0, 441, 0, 443, 444, 409, 410, 411, 0, - 412, 0, 0, 0, 0, 432, 455, 0, 455, 57, - 455, 59, 0, 449, 66, 67, 0, 0, 73, 174, - 175, 0, 226, 0, 0, 0, 192, 204, 204, 195, - 205, 196, 0, 166, 0, 163, 100, 160, 0, 173, - 173, 129, 0, 130, 131, 132, 0, 148, 0, 0, - 0, 0, 701, 80, 231, 1010, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, - 1010, 0, 1010, 693, 694, 695, 696, 0, 86, 0, - 0, 0, 0, 0, 271, 321, 321, 473, 0, 493, - 476, 535, 536, 0, 608, 632, 38, 0, 150, 150, - 587, 150, 154, 590, 150, 592, 150, 595, 0, 0, - 0, 0, 0, 0, 0, 599, 549, 605, 0, 607, - 0, 0, 638, 37, 622, 0, 456, 396, 41, 45, - 0, 647, 639, 649, 651, 0, 0, 643, 0, 416, - 624, 0, 0, 418, 425, 0, 0, 419, 0, 420, - 440, 442, -2, 0, 0, 0, 0, 624, 455, 52, - 53, 0, 70, 71, 72, 224, 227, 0, 206, 150, - 209, 193, 194, 0, 168, 0, 165, 151, 125, 126, - 171, 172, 170, 0, 170, 0, 155, 0, 1011, 232, - 233, 234, 235, 0, 240, 0, 84, 85, 0, 0, - 245, 269, 291, 296, 477, 537, 636, 540, 584, 170, - 588, 589, 591, 593, 594, 596, 542, 541, 0, 0, - 0, 0, 0, 632, 0, 603, 0, 0, 42, 0, - 0, 0, 46, 0, 652, 0, 0, 0, 61, 0, - 632, 656, 657, 422, 0, 427, 0, 0, 0, 430, - 632, 51, 184, 0, 208, 0, 414, 176, 169, 0, - 173, 149, 173, 0, 0, 78, 0, 87, 88, 0, - 0, 0, 39, 585, 586, 0, 0, 0, 0, 577, - 0, 600, 0, 0, 623, 621, 0, 650, 0, 642, - 645, 644, 417, 49, 0, 0, 452, 0, 0, 450, - 50, 183, 185, 0, 190, 0, 207, 0, 0, 181, - 0, 178, 180, 167, 138, 139, 153, 156, 0, 0, - 0, 0, 247, 543, 545, 544, 546, 0, 0, 0, - 548, 565, 566, 0, 641, 0, 423, 451, 453, 454, - 413, 186, 187, 0, 191, 189, 0, 415, 99, 0, - 177, 179, 0, 263, 0, 89, 90, 83, 547, 0, - 0, 0, 648, 646, 188, 0, 182, 262, 0, 0, - 86, 578, 0, 581, 0, 264, 0, 244, 579, 0, - 0, 0, 211, 0, 0, 212, 213, 0, 0, 580, - 214, 0, 0, 0, 0, 0, 215, 217, 218, 0, - 0, 216, 265, 266, 219, 220, 221, + 0, 0, -2, 367, 0, 0, 679, 679, 679, 0, + 76, 77, 0, 0, 0, 997, 0, 677, 677, 677, + 700, 701, 704, 705, 30, 31, 32, 832, 833, 834, + 835, 836, 837, 838, 839, 840, 841, 842, 843, 844, + 845, 846, 847, 848, 849, 850, 851, 852, 853, 854, + 855, 856, 857, 858, 859, 860, 861, 862, 863, 864, + 865, 866, 867, 868, 869, 870, 871, 872, 873, 874, + 875, 876, 877, 878, 879, 880, 881, 882, 883, 884, + 885, 886, 887, 888, 889, 890, 891, 892, 893, 894, + 895, 896, 897, 898, 899, 900, 901, 902, 903, 904, + 905, 906, 907, 908, 909, 910, 911, 912, 913, 914, + 915, 916, 917, 918, 919, 920, 921, 922, 923, 924, + 925, 926, 927, 928, 929, 930, 931, 932, 933, 934, + 935, 936, 937, 938, 939, 940, 941, 942, 943, 944, + 945, 946, 947, 948, 949, 950, 951, 952, 953, 954, + 955, 956, 957, 958, 959, 960, 961, 962, 963, 964, + 965, 966, 967, 968, 969, 970, 971, 972, 973, 974, + 975, 976, 977, 978, 979, 980, 981, 982, 983, 984, + 985, 986, 987, 988, 989, 990, 991, 992, 993, 994, + 995, 996, 998, 999, 1000, 1001, 1002, 1003, 1004, 1005, + 1006, 1007, 1008, 1009, 1010, 1011, 0, 0, 0, 0, + 0, 0, 0, 675, 0, 675, 675, 675, 0, 276, + 447, 708, 709, 997, 0, 0, 0, 321, 0, 324, + 324, 324, 290, 0, 292, 1015, 0, 0, 0, 299, + 0, 0, 305, 321, 1015, 313, 327, 328, 315, 310, + 311, 329, 332, 0, 337, 340, 0, 355, 0, 873, + 347, 360, 361, 1014, 1014, 364, 33, 498, 457, 0, + 463, 465, 0, 500, 501, 502, 503, 504, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 530, 531, + 532, 533, 609, 610, 611, 612, 613, 614, 615, 616, + 467, 468, 606, 0, 656, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 597, 0, 567, 567, 567, 567, + 567, 567, 567, 567, 0, 0, 0, 0, 0, 0, + 0, -2, -2, 624, 43, 0, 365, 370, 371, 636, + 0, 0, 624, 1013, 0, 0, -2, -2, 381, 387, + 388, 389, 390, 366, 0, 393, 397, 0, 0, 0, + 680, 0, 0, 62, 0, 985, 660, -2, -2, 0, + 0, 706, 707, -2, 845, -2, 712, 713, 714, 715, + 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, + 726, 727, 728, 729, 730, 731, 732, 733, 734, 735, + 736, 737, 738, 739, 740, 741, 742, 743, 744, 745, + 746, 747, 748, 749, 750, 751, 752, 753, 754, 755, + 756, 757, 758, 759, 760, 761, 762, 763, 764, 765, + 766, 767, 768, 769, 770, 771, 772, 773, 774, 775, + 776, 777, 778, 779, 780, 781, 782, 783, 784, 785, + 786, 787, 788, 789, 790, 791, 792, 793, 794, 795, + 796, 797, 798, 799, 800, 801, 802, 803, 804, 805, + 806, 807, 808, 809, 810, 811, 812, 813, 814, 815, + 816, 817, 818, 819, 820, 821, 822, 823, 824, 825, + 826, 827, 828, 829, 830, 831, 0, 0, 95, 0, + 93, 0, 1015, 0, 0, 0, 0, 0, 0, 1015, + 1015, 1015, 0, 0, 0, 0, 692, 267, 0, 0, + 0, 0, 0, 0, 0, 275, 0, 277, 1015, 321, + 280, 0, 0, 1015, 1015, 1015, 0, 1015, 1015, 287, + 0, 288, 289, 0, 197, 198, 199, 293, 1016, 1017, + 1015, 1015, 318, 0, 318, 316, 317, 308, 309, 0, + 324, 302, 303, 306, 307, 338, 341, 358, 356, 357, + 359, 351, 352, 353, 354, 0, 362, 363, 0, 0, + 0, 0, 0, 461, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 485, 486, 487, 488, 489, 490, 491, + 464, 0, 478, 0, 0, 0, 520, 521, 522, 523, + 524, 525, 526, 527, 528, 0, 378, 0, 0, 0, + 624, 0, 0, 0, 0, 0, 0, 0, 375, 0, + 598, 0, 551, 559, 0, 552, 560, 553, 561, 554, + 0, 555, 562, 556, 563, 557, 558, 564, 0, 0, + 0, 378, 378, 0, 0, 632, 0, 380, 639, 0, + 0, 633, 625, 626, 629, 632, 0, 402, 391, 382, + 385, 386, 368, 0, 394, 398, 0, 400, 401, 0, + 0, 60, 0, 446, 0, 404, 406, 407, 408, 428, + 0, 430, 0, 0, 0, 56, 58, 447, 0, 985, + 666, 0, 64, 65, 0, 0, 0, 173, 670, 671, + 672, 668, 222, 0, 0, 161, 157, 101, 102, 103, + 150, 105, 150, 150, 150, 150, 170, 170, 170, 170, + 133, 134, 135, 136, 137, 0, 0, 120, 150, 150, + 150, 124, 140, 141, 142, 143, 144, 145, 146, 147, + 106, 107, 108, 109, 110, 111, 112, 113, 114, 152, + 152, 152, 154, 154, 702, 79, 0, 1015, 0, 1015, + 91, 0, 236, 238, 239, 0, 0, 0, 0, 0, + 0, 693, 0, 0, 270, 676, 0, 1015, 273, 274, + 448, 710, 711, 278, 279, 322, 323, 281, 282, 283, + 284, 285, 286, 325, 0, 200, 201, 294, 298, 321, + 0, 0, 0, 321, 300, 301, 0, 0, 339, 343, + 344, 345, 346, 499, 458, 459, 460, 462, 479, 0, + 481, 483, 469, 470, 494, 495, 496, 0, 0, 0, + 0, 492, 474, 0, 505, 506, 507, 508, 509, 510, + 511, 512, 513, 514, 515, 516, 519, 582, 583, 0, + 517, 518, 529, 0, 0, 0, 379, 607, 0, -2, + 0, 497, 655, 632, 0, 0, 0, 0, 502, 609, + 0, 502, 609, 0, 0, 0, 376, 377, 604, 601, + 0, 0, 606, 0, 568, 0, 0, 0, 0, 0, + 0, 0, 0, 636, 44, 34, 0, 637, 0, 0, + 0, 0, 628, 630, 631, 636, 0, 617, 0, 0, + 455, 0, 0, 383, 40, 399, 395, 0, 455, 0, + 0, 445, 0, 0, 0, 0, 0, 0, 435, 0, + 0, 438, 0, 0, 0, 0, 429, 0, 0, 0, + 450, 928, 431, 0, 433, 434, -2, 0, 0, 0, + 54, 55, 0, 0, 0, 661, 63, 0, 0, 68, + 69, 662, 663, 664, 665, 0, 92, 223, 225, 228, + 229, 230, 96, 97, 98, 0, 0, 210, 938, 971, + 204, 204, 872, 202, 203, 94, 164, 162, 0, 159, + 158, 104, 0, 170, 170, 127, 128, 173, 0, 173, + 173, 173, 0, 0, 121, 122, 123, 115, 0, 116, + 117, 118, 0, 119, 0, 0, 1015, 81, 678, 82, + 1014, 0, 0, 694, 237, 681, 682, 683, 684, 685, + 686, 687, 688, 689, 690, 0, 83, 241, 243, 242, + 246, 0, 0, 0, 268, 1015, 272, 318, 295, 319, + 320, 318, 297, 304, 335, 480, 482, 484, 471, 492, + 475, 0, 472, 0, 0, 466, 534, 0, 0, 378, + 0, 624, 636, 538, 539, 0, 0, 0, 0, 0, + 575, 0, 0, 576, 0, 624, 0, 602, 0, 0, + 550, 0, 569, 0, 0, 570, 571, 572, 573, 574, + 36, 0, 0, 634, 635, 627, 35, 0, 673, 674, + 618, 619, 620, 0, 392, 403, 384, 0, 632, 649, + 0, 0, 642, 0, 0, 455, 657, 0, 405, 424, + 426, 0, 421, 436, 437, 439, 0, 441, 0, 443, + 444, 409, 410, 411, 0, 412, 0, 0, 0, 0, + 432, 455, 0, 455, 57, 455, 59, 0, 449, 66, + 67, 0, 0, 73, 174, 175, 0, 226, 0, 0, + 0, 192, 204, 204, 195, 205, 196, 0, 166, 0, + 163, 100, 160, 0, 173, 173, 129, 0, 130, 131, + 132, 0, 148, 0, 0, 0, 0, 703, 80, 231, + 1014, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 1014, 0, 1014, 695, 696, + 697, 698, 0, 86, 0, 0, 0, 0, 0, 271, + 321, 321, 473, 0, 493, 476, 535, 536, 0, 608, + 632, 38, 0, 150, 150, 587, 150, 154, 590, 150, + 592, 150, 595, 0, 0, 0, 0, 0, 0, 0, + 599, 549, 605, 0, 607, 0, 0, 0, 638, 37, + 622, 0, 456, 396, 41, 45, 0, 649, 641, 651, + 653, 0, 0, 645, 0, 416, 624, 0, 0, 418, + 425, 0, 0, 419, 0, 420, 440, 442, -2, 0, + 0, 0, 0, 624, 455, 52, 53, 0, 70, 71, + 72, 224, 227, 0, 206, 150, 209, 0, 193, 194, + 0, 168, 0, 165, 151, 125, 126, 171, 172, 170, + 0, 170, 0, 155, 0, 1015, 232, 233, 234, 235, + 0, 240, 0, 84, 85, 0, 0, 245, 269, 291, + 296, 477, 537, 636, 540, 584, 170, 588, 589, 591, + 593, 594, 596, 542, 541, 0, 0, 0, 0, 0, + 632, 0, 603, 0, 0, 640, 42, 0, 0, 0, + 46, 0, 654, 0, 0, 0, 61, 0, 632, 658, + 659, 422, 0, 427, 0, 0, 0, 430, 632, 51, + 184, 0, 208, 0, 414, 176, 169, 0, 173, 149, + 173, 0, 0, 78, 0, 87, 88, 0, 0, 0, + 39, 585, 586, 0, 0, 0, 0, 577, 0, 600, + 0, 0, 623, 621, 0, 652, 0, 644, 647, 646, + 417, 49, 0, 0, 452, 0, 0, 450, 50, 183, + 185, 0, 190, 0, 207, 0, 0, 181, 0, 178, + 180, 167, 138, 139, 153, 156, 0, 0, 0, 0, + 247, 543, 545, 544, 546, 0, 0, 0, 548, 565, + 566, 0, 643, 0, 423, 451, 453, 454, 413, 186, + 187, 0, 191, 189, 0, 415, 99, 0, 177, 179, + 0, 263, 0, 89, 90, 83, 547, 0, 0, 0, + 650, 648, 188, 0, 182, 262, 0, 0, 86, 578, + 0, 581, 0, 264, 0, 244, 579, 0, 0, 0, + 211, 0, 0, 212, 213, 0, 0, 580, 214, 0, + 0, 0, 0, 0, 215, 217, 218, 0, 0, 216, + 265, 266, 219, 220, 221, } var yyTok1 = [...]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, 82, 3, 3, 3, 109, 101, 3, - 58, 60, 106, 104, 59, 105, 121, 107, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 369, - 90, 89, 91, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 84, 3, 3, 3, 111, 103, 3, + 60, 62, 108, 106, 61, 107, 123, 109, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 371, + 92, 91, 93, 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, 111, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 113, 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, 100, 3, 112, + 3, 3, 3, 3, 102, 3, 114, } var yyTok2 = [...]int{ @@ -3469,12 +3565,12 @@ var yyTok2 = [...]int{ 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, 61, 62, 63, 64, + 52, 53, 54, 55, 56, 57, 58, 59, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, - 75, 76, 77, 78, 79, 80, 81, 83, 84, 85, - 86, 87, 88, 92, 93, 94, 95, 96, 97, 98, - 99, 102, 103, 108, 110, 113, 114, 115, 116, 117, - 118, 119, 120, 122, 123, 124, 125, 126, 127, 128, + 75, 76, 77, 78, 79, 80, 81, 82, 83, 85, + 86, 87, 88, 89, 90, 94, 95, 96, 97, 98, + 99, 100, 101, 104, 105, 110, 112, 115, 116, 117, + 118, 119, 120, 121, 122, 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, @@ -3510,7 +3606,8 @@ var yyTok3 = [...]int{ 57675, 350, 57676, 351, 57677, 352, 57678, 353, 57679, 354, 57680, 355, 57681, 356, 57682, 357, 57683, 358, 57684, 359, 57685, 360, 57686, 361, 57687, 362, 57688, 363, 57689, 364, - 57690, 365, 57691, 366, 57692, 367, 57693, 368, 0, + 57690, 365, 57691, 366, 57692, 367, 57693, 368, 57694, 369, + 57695, 370, 0, } var yyErrorMessages = [...]struct { @@ -3852,87 +3949,88 @@ yydefault: case 1: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:359 +//line sql.y:361 { setParseTree(yylex, yyDollar[1].statement) } case 2: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:364 +//line sql.y:366 { } case 3: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:365 +//line sql.y:367 { } case 4: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:369 +//line sql.y:371 { yyVAL.statement = yyDollar[1].selStmt } case 29: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:397 +//line sql.y:399 { setParseTree(yylex, nil) } case 30: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:403 +//line sql.y:405 { yyVAL.colIdent = NewColIdentWithAt(string(yyDollar[1].bytes), NoAt) } case 31: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:407 +//line sql.y:409 { yyVAL.colIdent = NewColIdentWithAt(string(yyDollar[1].bytes), SingleAt) } case 32: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:411 +//line sql.y:413 { yyVAL.colIdent = NewColIdentWithAt(string(yyDollar[1].bytes), DoubleAt) } case 33: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:417 +//line sql.y:419 { yyVAL.statement = &OtherAdmin{} } case 34: - yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:423 + yyDollar = yyS[yypt-5 : yypt+1] +//line sql.y:425 { sel := yyDollar[1].selStmt.(*Select) sel.OrderBy = yyDollar[2].orderBy sel.Limit = yyDollar[3].limit sel.Lock = yyDollar[4].lock + sel.IntoOutfileS3 = yyDollar[5].str yyVAL.selStmt = sel } case 35: yyDollar = yyS[yypt-6 : yypt+1] -//line sql.y:431 +//line sql.y:434 { yyVAL.selStmt = &Union{FirstStatement: &ParenSelect{Select: yyDollar[2].selStmt}, OrderBy: yyDollar[4].orderBy, Limit: yyDollar[5].limit, Lock: yyDollar[6].lock} } case 36: yyDollar = yyS[yypt-6 : yypt+1] -//line sql.y:435 +//line sql.y:438 { yyVAL.selStmt = Unionize(yyDollar[1].selStmt, yyDollar[3].selStmt, yyDollar[2].unionType, yyDollar[4].orderBy, yyDollar[5].limit, yyDollar[6].lock) } case 37: yyDollar = yyS[yypt-7 : yypt+1] -//line sql.y:439 +//line sql.y:442 { yyVAL.selStmt = NewSelect(Comments(yyDollar[2].bytes2), SelectExprs{Nextval{Expr: yyDollar[5].expr}}, []string{yyDollar[3].str} /*options*/, TableExprs{&AliasedTableExpr{Expr: yyDollar[7].tableName}}, nil /*where*/, nil /*groupBy*/, nil /*having*/) } case 38: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:462 +//line sql.y:465 { sel := yyDollar[1].selStmt.(*Select) sel.OrderBy = yyDollar[2].orderBy @@ -3942,43 +4040,43 @@ yydefault: } case 39: yyDollar = yyS[yypt-6 : yypt+1] -//line sql.y:470 +//line sql.y:473 { yyVAL.selStmt = Unionize(yyDollar[1].selStmt, yyDollar[3].selStmt, yyDollar[2].unionType, yyDollar[4].orderBy, yyDollar[5].limit, yyDollar[6].lock) } case 40: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:476 +//line sql.y:479 { yyVAL.statement = &Stream{Comments: Comments(yyDollar[2].bytes2), SelectExpr: yyDollar[3].selectExpr, Table: yyDollar[5].tableName} } case 41: yyDollar = yyS[yypt-7 : yypt+1] -//line sql.y:482 +//line sql.y:485 { yyVAL.statement = &VStream{Comments: Comments(yyDollar[2].bytes2), SelectExpr: yyDollar[3].selectExpr, Table: yyDollar[5].tableName, Where: NewWhere(WhereClause, yyDollar[6].expr), Limit: yyDollar[7].limit} } case 42: yyDollar = yyS[yypt-8 : yypt+1] -//line sql.y:490 +//line sql.y:493 { yyVAL.selStmt = NewSelect(Comments(yyDollar[2].bytes2), yyDollar[4].selectExprs /*SelectExprs*/, yyDollar[3].strs /*options*/, yyDollar[5].tableExprs /*from*/, NewWhere(WhereClause, yyDollar[6].expr), GroupBy(yyDollar[7].exprs), NewWhere(HavingClause, yyDollar[8].expr)) } case 43: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:496 +//line sql.y:499 { yyVAL.selStmt = yyDollar[1].selStmt } case 44: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:500 +//line sql.y:503 { yyVAL.selStmt = &ParenSelect{Select: yyDollar[2].selStmt} } case 45: yyDollar = yyS[yypt-7 : yypt+1] -//line sql.y:507 +//line sql.y:510 { // insert_data returns a *Insert pre-filled with Columns & Values ins := yyDollar[6].ins @@ -3992,7 +4090,7 @@ yydefault: } case 46: yyDollar = yyS[yypt-8 : yypt+1] -//line sql.y:519 +//line sql.y:522 { cols := make(Columns, 0, len(yyDollar[7].updateExprs)) vals := make(ValTuple, 0, len(yyDollar[8].updateExprs)) @@ -4004,186 +4102,186 @@ yydefault: } case 47: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:531 +//line sql.y:534 { yyVAL.insertAction = InsertAct } case 48: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:535 +//line sql.y:538 { yyVAL.insertAction = ReplaceAct } case 49: yyDollar = yyS[yypt-9 : yypt+1] -//line sql.y:541 +//line sql.y:544 { yyVAL.statement = &Update{Comments: Comments(yyDollar[2].bytes2), Ignore: yyDollar[3].ignore, TableExprs: yyDollar[4].tableExprs, Exprs: yyDollar[6].updateExprs, Where: NewWhere(WhereClause, yyDollar[7].expr), OrderBy: yyDollar[8].orderBy, Limit: yyDollar[9].limit} } case 50: yyDollar = yyS[yypt-9 : yypt+1] -//line sql.y:547 +//line sql.y:550 { yyVAL.statement = &Delete{Comments: Comments(yyDollar[2].bytes2), Ignore: yyDollar[3].ignore, TableExprs: TableExprs{&AliasedTableExpr{Expr: yyDollar[5].tableName}}, Partitions: yyDollar[6].partitions, Where: NewWhere(WhereClause, yyDollar[7].expr), OrderBy: yyDollar[8].orderBy, Limit: yyDollar[9].limit} } case 51: yyDollar = yyS[yypt-8 : yypt+1] -//line sql.y:551 +//line sql.y:554 { yyVAL.statement = &Delete{Comments: Comments(yyDollar[2].bytes2), Ignore: yyDollar[3].ignore, Targets: yyDollar[5].tableNames, TableExprs: yyDollar[7].tableExprs, Where: NewWhere(WhereClause, yyDollar[8].expr)} } case 52: yyDollar = yyS[yypt-7 : yypt+1] -//line sql.y:555 +//line sql.y:558 { yyVAL.statement = &Delete{Comments: Comments(yyDollar[2].bytes2), Ignore: yyDollar[3].ignore, Targets: yyDollar[4].tableNames, TableExprs: yyDollar[6].tableExprs, Where: NewWhere(WhereClause, yyDollar[7].expr)} } case 53: yyDollar = yyS[yypt-7 : yypt+1] -//line sql.y:559 +//line sql.y:562 { yyVAL.statement = &Delete{Comments: Comments(yyDollar[2].bytes2), Ignore: yyDollar[3].ignore, Targets: yyDollar[4].tableNames, TableExprs: yyDollar[6].tableExprs, Where: NewWhere(WhereClause, yyDollar[7].expr)} } case 54: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:564 +//line sql.y:567 { } case 55: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:565 +//line sql.y:568 { } case 56: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:569 +//line sql.y:572 { yyVAL.tableNames = TableNames{yyDollar[1].tableName} } case 57: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:573 +//line sql.y:576 { yyVAL.tableNames = append(yyVAL.tableNames, yyDollar[3].tableName) } case 58: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:579 +//line sql.y:582 { yyVAL.tableNames = TableNames{yyDollar[1].tableName} } case 59: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:583 +//line sql.y:586 { yyVAL.tableNames = append(yyVAL.tableNames, yyDollar[3].tableName) } case 60: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:588 +//line sql.y:591 { yyVAL.partitions = nil } case 61: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:592 +//line sql.y:595 { yyVAL.partitions = yyDollar[3].partitions } case 62: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:598 +//line sql.y:601 { yyVAL.statement = &Set{Comments: Comments(yyDollar[2].bytes2), Exprs: yyDollar[3].setExprs} } case 63: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:604 +//line sql.y:607 { yyVAL.statement = &SetTransaction{Comments: Comments(yyDollar[2].bytes2), Scope: yyDollar[3].scope, Characteristics: yyDollar[5].characteristics} } case 64: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:608 +//line sql.y:611 { yyVAL.statement = &SetTransaction{Comments: Comments(yyDollar[2].bytes2), Characteristics: yyDollar[4].characteristics, Scope: ImplicitScope} } case 65: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:614 +//line sql.y:617 { yyVAL.characteristics = []Characteristic{yyDollar[1].characteristic} } case 66: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:618 +//line sql.y:621 { yyVAL.characteristics = append(yyVAL.characteristics, yyDollar[3].characteristic) } case 67: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:624 +//line sql.y:627 { yyVAL.characteristic = yyDollar[3].isolationLevel } case 68: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:628 +//line sql.y:631 { yyVAL.characteristic = ReadWrite } case 69: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:632 +//line sql.y:635 { yyVAL.characteristic = ReadOnly } case 70: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:638 +//line sql.y:641 { yyVAL.isolationLevel = RepeatableRead } case 71: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:642 +//line sql.y:645 { yyVAL.isolationLevel = ReadCommitted } case 72: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:646 +//line sql.y:649 { yyVAL.isolationLevel = ReadUncommitted } case 73: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:650 +//line sql.y:653 { yyVAL.isolationLevel = Serializable } case 74: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:656 +//line sql.y:659 { yyVAL.scope = SessionScope } case 75: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:660 +//line sql.y:663 { yyVAL.scope = GlobalScope } case 76: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:666 +//line sql.y:669 { yyDollar[1].ddl.TableSpec = yyDollar[2].TableSpec yyVAL.statement = yyDollar[1].ddl } case 77: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:671 +//line sql.y:674 { // Create table [name] like [name] yyDollar[1].ddl.OptLike = yyDollar[2].optLike @@ -4191,139 +4289,139 @@ yydefault: } case 78: yyDollar = yyS[yypt-8 : yypt+1] -//line sql.y:677 +//line sql.y:680 { // Change this to an alter statement yyVAL.statement = &DDL{Action: AlterDDLAction, Table: yyDollar[7].tableName} } case 79: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:682 +//line sql.y:685 { yyVAL.statement = &DDL{Action: CreateDDLAction, Table: yyDollar[3].tableName.ToViewName()} } case 80: yyDollar = yyS[yypt-6 : yypt+1] -//line sql.y:686 +//line sql.y:689 { yyVAL.statement = &DDL{Action: CreateDDLAction, Table: yyDollar[5].tableName.ToViewName()} } case 81: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:690 +//line sql.y:693 { yyVAL.statement = &DBDDL{Action: CreateDBDDLAction, DBName: string(yyDollar[4].colIdent.String()), IfNotExists: yyDollar[3].boolean} } case 82: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:694 +//line sql.y:697 { yyVAL.statement = &DBDDL{Action: CreateDBDDLAction, DBName: string(yyDollar[4].colIdent.String()), IfNotExists: yyDollar[3].boolean} } case 83: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:699 +//line sql.y:702 { yyVAL.colIdent = NewColIdent("") } case 84: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:703 +//line sql.y:706 { yyVAL.colIdent = yyDollar[2].colIdent } case 85: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:709 +//line sql.y:712 { yyVAL.colIdent = yyDollar[1].colIdent } case 86: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:714 +//line sql.y:717 { var v []VindexParam yyVAL.vindexParams = v } case 87: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:719 +//line sql.y:722 { yyVAL.vindexParams = yyDollar[2].vindexParams } case 88: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:725 +//line sql.y:728 { yyVAL.vindexParams = make([]VindexParam, 0, 4) yyVAL.vindexParams = append(yyVAL.vindexParams, yyDollar[1].vindexParam) } case 89: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:730 +//line sql.y:733 { yyVAL.vindexParams = append(yyVAL.vindexParams, yyDollar[3].vindexParam) } case 90: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:736 +//line sql.y:739 { yyVAL.vindexParam = VindexParam{Key: yyDollar[1].colIdent, Val: yyDollar[3].str} } case 91: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:742 +//line sql.y:745 { yyVAL.ddl = &DDL{Action: CreateDDLAction, Table: yyDollar[4].tableName} setDDL(yylex, yyVAL.ddl) } case 92: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:749 +//line sql.y:752 { yyVAL.TableSpec = yyDollar[2].TableSpec yyVAL.TableSpec.Options = yyDollar[4].str } case 93: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:756 +//line sql.y:759 { yyVAL.optLike = &OptLike{LikeTable: yyDollar[2].tableName} } case 94: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:760 +//line sql.y:763 { yyVAL.optLike = &OptLike{LikeTable: yyDollar[3].tableName} } case 95: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:766 +//line sql.y:769 { yyVAL.TableSpec = &TableSpec{} yyVAL.TableSpec.AddColumn(yyDollar[1].columnDefinition) } case 96: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:771 +//line sql.y:774 { yyVAL.TableSpec.AddColumn(yyDollar[3].columnDefinition) } case 97: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:775 +//line sql.y:778 { yyVAL.TableSpec.AddIndex(yyDollar[3].indexDefinition) } case 98: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:779 +//line sql.y:782 { yyVAL.TableSpec.AddConstraint(yyDollar[3].constraintDefinition) } case 99: yyDollar = yyS[yypt-8 : yypt+1] -//line sql.y:785 +//line sql.y:788 { yyDollar[2].columnType.NotNull = yyDollar[3].boolean yyDollar[2].columnType.Default = yyDollar[4].optVal @@ -4335,7 +4433,7 @@ yydefault: } case 100: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:796 +//line sql.y:799 { yyVAL.columnType = yyDollar[1].columnType yyVAL.columnType.Unsigned = yyDollar[2].boolean @@ -4343,74 +4441,74 @@ yydefault: } case 104: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:807 +//line sql.y:810 { yyVAL.columnType = yyDollar[1].columnType yyVAL.columnType.Length = yyDollar[2].literal } case 105: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:812 +//line sql.y:815 { yyVAL.columnType = yyDollar[1].columnType } case 106: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:818 +//line sql.y:821 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 107: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:822 +//line sql.y:825 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 108: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:826 +//line sql.y:829 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 109: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:830 +//line sql.y:833 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 110: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:834 +//line sql.y:837 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 111: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:838 +//line sql.y:841 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 112: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:842 +//line sql.y:845 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 113: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:846 +//line sql.y:849 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 114: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:850 +//line sql.y:853 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 115: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:856 +//line sql.y:859 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} yyVAL.columnType.Length = yyDollar[2].LengthScaleOption.Length @@ -4418,7 +4516,7 @@ yydefault: } case 116: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:862 +//line sql.y:865 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} yyVAL.columnType.Length = yyDollar[2].LengthScaleOption.Length @@ -4426,7 +4524,7 @@ yydefault: } case 117: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:868 +//line sql.y:871 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} yyVAL.columnType.Length = yyDollar[2].LengthScaleOption.Length @@ -4434,7 +4532,7 @@ yydefault: } case 118: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:874 +//line sql.y:877 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} yyVAL.columnType.Length = yyDollar[2].LengthScaleOption.Length @@ -4442,7 +4540,7 @@ yydefault: } case 119: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:880 +//line sql.y:883 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} yyVAL.columnType.Length = yyDollar[2].LengthScaleOption.Length @@ -4450,206 +4548,206 @@ yydefault: } case 120: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:888 +//line sql.y:891 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 121: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:892 +//line sql.y:895 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].literal} } case 122: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:896 +//line sql.y:899 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].literal} } case 123: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:900 +//line sql.y:903 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].literal} } case 124: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:904 +//line sql.y:907 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 125: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:910 +//line sql.y:913 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].literal, Charset: yyDollar[3].str, Collate: yyDollar[4].str} } case 126: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:914 +//line sql.y:917 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].literal, Charset: yyDollar[3].str, Collate: yyDollar[4].str} } case 127: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:918 +//line sql.y:921 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].literal} } case 128: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:922 +//line sql.y:925 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].literal} } case 129: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:926 +//line sql.y:929 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes), Charset: yyDollar[2].str, Collate: yyDollar[3].str} } case 130: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:930 +//line sql.y:933 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes), Charset: yyDollar[2].str, Collate: yyDollar[3].str} } case 131: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:934 +//line sql.y:937 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes), Charset: yyDollar[2].str, Collate: yyDollar[3].str} } case 132: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:938 +//line sql.y:941 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes), Charset: yyDollar[2].str, Collate: yyDollar[3].str} } case 133: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:942 +//line sql.y:945 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 134: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:946 +//line sql.y:949 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 135: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:950 +//line sql.y:953 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 136: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:954 +//line sql.y:957 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 137: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:958 +//line sql.y:961 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 138: yyDollar = yyS[yypt-6 : yypt+1] -//line sql.y:962 +//line sql.y:965 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes), EnumValues: yyDollar[3].strs, Charset: yyDollar[5].str, Collate: yyDollar[6].str} } case 139: yyDollar = yyS[yypt-6 : yypt+1] -//line sql.y:967 +//line sql.y:970 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes), EnumValues: yyDollar[3].strs, Charset: yyDollar[5].str, Collate: yyDollar[6].str} } case 140: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:973 +//line sql.y:976 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 141: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:977 +//line sql.y:980 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 142: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:981 +//line sql.y:984 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 143: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:985 +//line sql.y:988 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 144: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:989 +//line sql.y:992 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 145: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:993 +//line sql.y:996 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 146: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:997 +//line sql.y:1000 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 147: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1001 +//line sql.y:1004 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 148: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1007 +//line sql.y:1010 { yyVAL.strs = make([]string, 0, 4) yyVAL.strs = append(yyVAL.strs, "'"+string(yyDollar[1].bytes)+"'") } case 149: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1012 +//line sql.y:1015 { yyVAL.strs = append(yyDollar[1].strs, "'"+string(yyDollar[3].bytes)+"'") } case 150: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1017 +//line sql.y:1020 { yyVAL.literal = nil } case 151: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1021 +//line sql.y:1024 { yyVAL.literal = NewIntLiteral(yyDollar[2].bytes) } case 152: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1026 +//line sql.y:1029 { yyVAL.LengthScaleOption = LengthScaleOption{} } case 153: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:1030 +//line sql.y:1033 { yyVAL.LengthScaleOption = LengthScaleOption{ Length: NewIntLiteral(yyDollar[2].bytes), @@ -4658,13 +4756,13 @@ yydefault: } case 154: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1038 +//line sql.y:1041 { yyVAL.LengthScaleOption = LengthScaleOption{} } case 155: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1042 +//line sql.y:1045 { yyVAL.LengthScaleOption = LengthScaleOption{ Length: NewIntLiteral(yyDollar[2].bytes), @@ -4672,7 +4770,7 @@ yydefault: } case 156: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:1048 +//line sql.y:1051 { yyVAL.LengthScaleOption = LengthScaleOption{ Length: NewIntLiteral(yyDollar[2].bytes), @@ -4681,508 +4779,508 @@ yydefault: } case 157: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1056 +//line sql.y:1059 { yyVAL.boolean = false } case 158: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1060 +//line sql.y:1063 { yyVAL.boolean = true } case 159: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1065 +//line sql.y:1068 { yyVAL.boolean = false } case 160: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1069 +//line sql.y:1072 { yyVAL.boolean = true } case 161: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1075 +//line sql.y:1078 { yyVAL.boolean = false } case 162: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1079 +//line sql.y:1082 { yyVAL.boolean = false } case 163: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1083 +//line sql.y:1086 { yyVAL.boolean = true } case 164: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1088 +//line sql.y:1091 { yyVAL.optVal = nil } case 165: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1092 +//line sql.y:1095 { yyVAL.optVal = yyDollar[2].expr } case 166: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1097 +//line sql.y:1100 { yyVAL.optVal = nil } case 167: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1101 +//line sql.y:1104 { yyVAL.optVal = yyDollar[3].expr } case 168: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1106 +//line sql.y:1109 { yyVAL.boolean = false } case 169: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1110 +//line sql.y:1113 { yyVAL.boolean = true } case 170: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1115 +//line sql.y:1118 { yyVAL.str = "" } case 171: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1119 +//line sql.y:1122 { yyVAL.str = string(yyDollar[3].colIdent.String()) } case 172: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1123 +//line sql.y:1126 { yyVAL.str = string(yyDollar[3].bytes) } case 173: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1128 +//line sql.y:1131 { yyVAL.str = "" } case 174: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1132 +//line sql.y:1135 { yyVAL.str = string(yyDollar[2].colIdent.String()) } case 175: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1136 +//line sql.y:1139 { yyVAL.str = string(yyDollar[2].bytes) } case 176: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1141 +//line sql.y:1144 { yyVAL.colKeyOpt = colKeyNone } case 177: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1145 +//line sql.y:1148 { yyVAL.colKeyOpt = colKeyPrimary } case 178: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1149 +//line sql.y:1152 { yyVAL.colKeyOpt = colKey } case 179: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1153 +//line sql.y:1156 { yyVAL.colKeyOpt = colKeyUniqueKey } case 180: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1157 +//line sql.y:1160 { yyVAL.colKeyOpt = colKeyUnique } case 181: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1162 +//line sql.y:1165 { yyVAL.literal = nil } case 182: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1166 +//line sql.y:1169 { yyVAL.literal = NewStrLiteral(yyDollar[2].bytes) } case 183: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:1172 +//line sql.y:1175 { yyVAL.indexDefinition = &IndexDefinition{Info: yyDollar[1].indexInfo, Columns: yyDollar[3].indexColumns, Options: yyDollar[5].indexOptions} } case 184: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1176 +//line sql.y:1179 { yyVAL.indexDefinition = &IndexDefinition{Info: yyDollar[1].indexInfo, Columns: yyDollar[3].indexColumns} } case 185: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1182 +//line sql.y:1185 { yyVAL.indexOptions = []*IndexOption{yyDollar[1].indexOption} } case 186: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1186 +//line sql.y:1189 { yyVAL.indexOptions = append(yyVAL.indexOptions, yyDollar[2].indexOption) } case 187: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1192 +//line sql.y:1195 { yyVAL.indexOption = &IndexOption{Name: string(yyDollar[1].bytes), Using: string(yyDollar[2].colIdent.String())} } case 188: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1196 +//line sql.y:1199 { // should not be string yyVAL.indexOption = &IndexOption{Name: string(yyDollar[1].bytes), Value: NewIntLiteral(yyDollar[3].bytes)} } case 189: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1201 +//line sql.y:1204 { yyVAL.indexOption = &IndexOption{Name: string(yyDollar[1].bytes), Value: NewStrLiteral(yyDollar[2].bytes)} } case 190: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1207 +//line sql.y:1210 { yyVAL.str = "" } case 191: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1211 +//line sql.y:1214 { yyVAL.str = string(yyDollar[1].bytes) } case 192: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1217 +//line sql.y:1220 { yyVAL.indexInfo = &IndexInfo{Type: string(yyDollar[1].bytes) + " " + string(yyDollar[2].bytes), Name: NewColIdent("PRIMARY"), Primary: true, Unique: true} } case 193: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1221 +//line sql.y:1224 { yyVAL.indexInfo = &IndexInfo{Type: string(yyDollar[1].bytes) + " " + string(yyDollar[2].str), Name: NewColIdent(yyDollar[3].str), Spatial: true, Unique: false} } case 194: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1225 +//line sql.y:1228 { yyVAL.indexInfo = &IndexInfo{Type: string(yyDollar[1].bytes) + " " + string(yyDollar[2].str), Name: NewColIdent(yyDollar[3].str), Unique: true} } case 195: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1229 +//line sql.y:1232 { yyVAL.indexInfo = &IndexInfo{Type: string(yyDollar[1].bytes), Name: NewColIdent(yyDollar[2].str), Unique: true} } case 196: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1233 +//line sql.y:1236 { yyVAL.indexInfo = &IndexInfo{Type: string(yyDollar[1].str), Name: NewColIdent(yyDollar[2].str), Unique: false} } case 197: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1239 +//line sql.y:1242 { yyVAL.str = string(yyDollar[1].bytes) } case 198: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1243 +//line sql.y:1246 { yyVAL.str = string(yyDollar[1].bytes) } case 199: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1247 +//line sql.y:1250 { yyVAL.str = string(yyDollar[1].bytes) } case 200: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1254 +//line sql.y:1257 { yyVAL.str = string(yyDollar[1].bytes) } case 201: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1258 +//line sql.y:1261 { yyVAL.str = string(yyDollar[1].bytes) } case 202: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1264 +//line sql.y:1267 { yyVAL.str = string(yyDollar[1].bytes) } case 203: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1268 +//line sql.y:1271 { yyVAL.str = string(yyDollar[1].bytes) } case 204: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1273 +//line sql.y:1276 { yyVAL.str = "" } case 205: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1277 +//line sql.y:1280 { yyVAL.str = string(yyDollar[1].colIdent.String()) } case 206: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1283 +//line sql.y:1286 { yyVAL.indexColumns = []*IndexColumn{yyDollar[1].indexColumn} } case 207: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1287 +//line sql.y:1290 { yyVAL.indexColumns = append(yyVAL.indexColumns, yyDollar[3].indexColumn) } case 208: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1293 +//line sql.y:1296 { yyVAL.indexColumn = &IndexColumn{Column: yyDollar[1].colIdent, Length: yyDollar[2].literal} } case 209: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1299 +//line sql.y:1302 { yyVAL.constraintDefinition = &ConstraintDefinition{Name: string(yyDollar[2].colIdent.String()), Details: yyDollar[3].constraintInfo} } case 210: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1303 +//line sql.y:1306 { yyVAL.constraintDefinition = &ConstraintDefinition{Details: yyDollar[1].constraintInfo} } case 211: yyDollar = yyS[yypt-10 : yypt+1] -//line sql.y:1310 +//line sql.y:1313 { yyVAL.constraintInfo = &ForeignKeyDefinition{Source: yyDollar[4].columns, ReferencedTable: yyDollar[7].tableName, ReferencedColumns: yyDollar[9].columns} } case 212: yyDollar = yyS[yypt-11 : yypt+1] -//line sql.y:1314 +//line sql.y:1317 { yyVAL.constraintInfo = &ForeignKeyDefinition{Source: yyDollar[4].columns, ReferencedTable: yyDollar[7].tableName, ReferencedColumns: yyDollar[9].columns, OnDelete: yyDollar[11].ReferenceAction} } case 213: yyDollar = yyS[yypt-11 : yypt+1] -//line sql.y:1318 +//line sql.y:1321 { yyVAL.constraintInfo = &ForeignKeyDefinition{Source: yyDollar[4].columns, ReferencedTable: yyDollar[7].tableName, ReferencedColumns: yyDollar[9].columns, OnUpdate: yyDollar[11].ReferenceAction} } case 214: yyDollar = yyS[yypt-12 : yypt+1] -//line sql.y:1322 +//line sql.y:1325 { yyVAL.constraintInfo = &ForeignKeyDefinition{Source: yyDollar[4].columns, ReferencedTable: yyDollar[7].tableName, ReferencedColumns: yyDollar[9].columns, OnDelete: yyDollar[11].ReferenceAction, OnUpdate: yyDollar[12].ReferenceAction} } case 215: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1328 +//line sql.y:1331 { yyVAL.ReferenceAction = yyDollar[3].ReferenceAction } case 216: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1334 +//line sql.y:1337 { yyVAL.ReferenceAction = yyDollar[3].ReferenceAction } case 217: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1340 +//line sql.y:1343 { yyVAL.ReferenceAction = Restrict } case 218: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1344 +//line sql.y:1347 { yyVAL.ReferenceAction = Cascade } case 219: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1348 +//line sql.y:1351 { yyVAL.ReferenceAction = NoAction } case 220: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1352 +//line sql.y:1355 { yyVAL.ReferenceAction = SetDefault } case 221: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1356 +//line sql.y:1359 { yyVAL.ReferenceAction = SetNull } case 222: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1361 +//line sql.y:1364 { yyVAL.str = "" } case 223: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1365 +//line sql.y:1368 { yyVAL.str = " " + string(yyDollar[1].str) } case 224: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1369 +//line sql.y:1372 { yyVAL.str = string(yyDollar[1].str) + ", " + string(yyDollar[3].str) } case 225: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1377 +//line sql.y:1380 { yyVAL.str = yyDollar[1].str } case 226: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1381 +//line sql.y:1384 { yyVAL.str = yyDollar[1].str + " " + yyDollar[2].str } case 227: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1385 +//line sql.y:1388 { yyVAL.str = yyDollar[1].str + "=" + yyDollar[3].str } case 228: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1391 +//line sql.y:1394 { yyVAL.str = yyDollar[1].colIdent.String() } case 229: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1395 +//line sql.y:1398 { yyVAL.str = "'" + string(yyDollar[1].bytes) + "'" } case 230: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1399 +//line sql.y:1402 { yyVAL.str = string(yyDollar[1].bytes) } case 231: yyDollar = yyS[yypt-6 : yypt+1] -//line sql.y:1405 +//line sql.y:1408 { yyVAL.statement = &DDL{Action: AlterDDLAction, OnlineHint: yyDollar[2].OnlineDDLHint, Table: yyDollar[4].tableName} } case 232: yyDollar = yyS[yypt-7 : yypt+1] -//line sql.y:1409 +//line sql.y:1412 { yyVAL.statement = &DDL{Action: AlterDDLAction, OnlineHint: yyDollar[2].OnlineDDLHint, Table: yyDollar[4].tableName} } case 233: yyDollar = yyS[yypt-7 : yypt+1] -//line sql.y:1413 +//line sql.y:1416 { yyVAL.statement = &DDL{Action: AlterDDLAction, OnlineHint: yyDollar[2].OnlineDDLHint, Table: yyDollar[4].tableName} } case 234: yyDollar = yyS[yypt-7 : yypt+1] -//line sql.y:1417 +//line sql.y:1420 { // Change this to a rename statement yyVAL.statement = &DDL{Action: RenameDDLAction, FromTables: TableNames{yyDollar[4].tableName}, ToTables: TableNames{yyDollar[7].tableName}} } case 235: yyDollar = yyS[yypt-7 : yypt+1] -//line sql.y:1422 +//line sql.y:1425 { // Rename an index can just be an alter yyVAL.statement = &DDL{Action: AlterDDLAction, OnlineHint: yyDollar[2].OnlineDDLHint, Table: yyDollar[4].tableName} } case 236: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1427 +//line sql.y:1430 { yyVAL.statement = &DDL{Action: AlterDDLAction, Table: yyDollar[3].tableName.ToViewName()} } case 237: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:1431 +//line sql.y:1434 { yyVAL.statement = &DDL{Action: AlterDDLAction, OnlineHint: yyDollar[2].OnlineDDLHint, Table: yyDollar[4].tableName, PartitionSpec: yyDollar[5].partSpec} } case 238: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1435 +//line sql.y:1438 { yyVAL.statement = &DBDDL{Action: AlterDBDDLAction, DBName: string(yyDollar[3].colIdent.String())} } case 239: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1439 +//line sql.y:1442 { yyVAL.statement = &DBDDL{Action: AlterDBDDLAction, DBName: string(yyDollar[3].colIdent.String())} } case 240: yyDollar = yyS[yypt-7 : yypt+1] -//line sql.y:1443 +//line sql.y:1446 { yyVAL.statement = &DDL{ Action: CreateVindexDDLAction, @@ -5196,7 +5294,7 @@ yydefault: } case 241: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:1455 +//line sql.y:1458 { yyVAL.statement = &DDL{ Action: DropVindexDDLAction, @@ -5208,19 +5306,19 @@ yydefault: } case 242: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:1465 +//line sql.y:1468 { yyVAL.statement = &DDL{Action: AddVschemaTableDDLAction, Table: yyDollar[5].tableName} } case 243: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:1469 +//line sql.y:1472 { yyVAL.statement = &DDL{Action: DropVschemaTableDDLAction, Table: yyDollar[5].tableName} } case 244: yyDollar = yyS[yypt-12 : yypt+1] -//line sql.y:1473 +//line sql.y:1476 { yyVAL.statement = &DDL{ Action: AddColVindexDDLAction, @@ -5235,7 +5333,7 @@ yydefault: } case 245: yyDollar = yyS[yypt-7 : yypt+1] -//line sql.y:1486 +//line sql.y:1489 { yyVAL.statement = &DDL{ Action: DropColVindexDDLAction, @@ -5247,13 +5345,13 @@ yydefault: } case 246: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:1496 +//line sql.y:1499 { yyVAL.statement = &DDL{Action: AddSequenceDDLAction, Table: yyDollar[5].tableName} } case 247: yyDollar = yyS[yypt-9 : yypt+1] -//line sql.y:1500 +//line sql.y:1503 { yyVAL.statement = &DDL{ Action: AddAutoIncDDLAction, @@ -5266,49 +5364,49 @@ yydefault: } case 262: yyDollar = yyS[yypt-7 : yypt+1] -//line sql.y:1529 +//line sql.y:1532 { yyVAL.partSpec = &PartitionSpec{Action: ReorganizeAction, Name: yyDollar[3].colIdent, Definitions: yyDollar[6].partDefs} } case 263: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1535 +//line sql.y:1538 { yyVAL.partDefs = []*PartitionDefinition{yyDollar[1].partDef} } case 264: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1539 +//line sql.y:1542 { yyVAL.partDefs = append(yyDollar[1].partDefs, yyDollar[3].partDef) } case 265: yyDollar = yyS[yypt-8 : yypt+1] -//line sql.y:1545 +//line sql.y:1548 { yyVAL.partDef = &PartitionDefinition{Name: yyDollar[2].colIdent, Limit: yyDollar[7].expr} } case 266: yyDollar = yyS[yypt-8 : yypt+1] -//line sql.y:1549 +//line sql.y:1552 { yyVAL.partDef = &PartitionDefinition{Name: yyDollar[2].colIdent, Maxvalue: true} } case 267: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1555 +//line sql.y:1558 { yyVAL.statement = yyDollar[3].ddl } case 268: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1561 +//line sql.y:1564 { yyVAL.ddl = &DDL{Action: RenameDDLAction, FromTables: TableNames{yyDollar[1].tableName}, ToTables: TableNames{yyDollar[3].tableName}} } case 269: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:1565 +//line sql.y:1568 { yyVAL.ddl = yyDollar[1].ddl yyVAL.ddl.FromTables = append(yyVAL.ddl.FromTables, yyDollar[3].tableName) @@ -5316,177 +5414,177 @@ yydefault: } case 270: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1573 +//line sql.y:1576 { yyVAL.statement = &DDL{Action: DropDDLAction, FromTables: yyDollar[4].tableNames, IfExists: yyDollar[3].boolean} } case 271: yyDollar = yyS[yypt-6 : yypt+1] -//line sql.y:1577 +//line sql.y:1580 { // Change this to an alter statement yyVAL.statement = &DDL{Action: AlterDDLAction, Table: yyDollar[5].tableName} } case 272: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:1582 +//line sql.y:1585 { yyVAL.statement = &DDL{Action: DropDDLAction, FromTables: TableNames{yyDollar[4].tableName.ToViewName()}, IfExists: yyDollar[3].boolean} } case 273: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1586 +//line sql.y:1589 { yyVAL.statement = &DBDDL{Action: DropDBDDLAction, DBName: string(yyDollar[4].colIdent.String()), IfExists: yyDollar[3].boolean} } case 274: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1590 +//line sql.y:1593 { yyVAL.statement = &DBDDL{Action: DropDBDDLAction, DBName: string(yyDollar[4].colIdent.String()), IfExists: yyDollar[3].boolean} } case 275: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1596 +//line sql.y:1599 { yyVAL.statement = &DDL{Action: TruncateDDLAction, Table: yyDollar[3].tableName} } case 276: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1600 +//line sql.y:1603 { yyVAL.statement = &DDL{Action: TruncateDDLAction, Table: yyDollar[2].tableName} } case 277: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1605 +//line sql.y:1608 { yyVAL.statement = &OtherRead{} } case 278: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1611 +//line sql.y:1614 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes) + " " + string(yyDollar[3].colIdent.String()), Scope: ImplicitScope} } case 279: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1616 +//line sql.y:1619 { showTablesOpt := &ShowTablesOpt{Filter: yyDollar[4].showFilter} yyVAL.statement = &Show{Type: CharsetStr, ShowTablesOpt: showTablesOpt, Scope: ImplicitScope} } case 280: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1621 +//line sql.y:1624 { showTablesOpt := &ShowTablesOpt{Filter: yyDollar[3].showFilter} yyVAL.statement = &Show{Type: string(yyDollar[2].bytes), ShowTablesOpt: showTablesOpt, Scope: ImplicitScope} } case 281: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1626 +//line sql.y:1629 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes) + " " + string(yyDollar[3].bytes), Scope: ImplicitScope} } case 282: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1631 +//line sql.y:1634 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes) + " " + string(yyDollar[3].colIdent.String()), Scope: ImplicitScope} } case 283: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1635 +//line sql.y:1638 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes) + " " + string(yyDollar[3].bytes), Scope: ImplicitScope} } case 284: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1639 +//line sql.y:1642 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes) + " " + string(yyDollar[3].bytes), Table: yyDollar[4].tableName, Scope: ImplicitScope} } case 285: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1643 +//line sql.y:1646 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes) + " " + string(yyDollar[3].bytes), Scope: ImplicitScope} } case 286: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1647 +//line sql.y:1650 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes) + " " + string(yyDollar[3].bytes), Scope: ImplicitScope} } case 287: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1651 +//line sql.y:1654 { showTablesOpt := &ShowTablesOpt{Filter: yyDollar[3].showFilter} yyVAL.statement = &Show{Type: string(yyDollar[2].bytes), ShowTablesOpt: showTablesOpt, Scope: ImplicitScope} } case 288: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1656 +//line sql.y:1659 { showTablesOpt := &ShowTablesOpt{Filter: yyDollar[3].showFilter} yyVAL.statement = &Show{Type: string(yyDollar[2].bytes), ShowTablesOpt: showTablesOpt, Scope: ImplicitScope} } case 289: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1661 +//line sql.y:1664 { showTablesOpt := &ShowTablesOpt{Filter: yyDollar[3].showFilter} yyVAL.statement = &Show{Type: string(yyDollar[2].bytes), ShowTablesOpt: showTablesOpt, Scope: ImplicitScope} } case 290: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1666 +//line sql.y:1669 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes), Scope: ImplicitScope} } case 291: yyDollar = yyS[yypt-7 : yypt+1] -//line sql.y:1670 +//line sql.y:1673 { showTablesOpt := &ShowTablesOpt{DbName: yyDollar[6].str, Filter: yyDollar[7].showFilter} yyVAL.statement = &Show{Extended: string(yyDollar[2].str), Type: string(yyDollar[3].str), ShowTablesOpt: showTablesOpt, OnTable: yyDollar[5].tableName, Scope: ImplicitScope} } case 292: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1675 +//line sql.y:1678 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes), Scope: ImplicitScope} } case 293: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1679 +//line sql.y:1682 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes), Scope: ImplicitScope} } case 294: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1683 +//line sql.y:1686 { yyVAL.statement = &Show{Scope: yyDollar[2].scope, Type: string(yyDollar[3].bytes)} } case 295: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:1687 +//line sql.y:1690 { yyVAL.statement = &ShowTableStatus{DatabaseName: yyDollar[4].str, Filter: yyDollar[5].showFilter} } case 296: yyDollar = yyS[yypt-7 : yypt+1] -//line sql.y:1691 +//line sql.y:1694 { showTablesOpt := &ShowTablesOpt{Full: yyDollar[2].str, DbName: yyDollar[6].str, Filter: yyDollar[7].showFilter} yyVAL.statement = &Show{Type: string(yyDollar[3].str), ShowTablesOpt: showTablesOpt, OnTable: yyDollar[5].tableName, Scope: ImplicitScope} } case 297: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:1696 +//line sql.y:1699 { // this is ugly, but I couldn't find a better way for now if yyDollar[3].str == "processlist" { @@ -5498,56 +5596,56 @@ yydefault: } case 298: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1706 +//line sql.y:1709 { yyVAL.statement = &Show{Scope: yyDollar[2].scope, Type: string(yyDollar[3].bytes)} } case 299: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1710 +//line sql.y:1713 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes), Scope: ImplicitScope} } case 300: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1714 +//line sql.y:1717 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes), ShowCollationFilterOpt: yyDollar[4].expr, Scope: ImplicitScope} } case 301: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1718 +//line sql.y:1721 { showTablesOpt := &ShowTablesOpt{Filter: yyDollar[4].showFilter} yyVAL.statement = &Show{Scope: VitessMetadataScope, Type: string(yyDollar[3].bytes), ShowTablesOpt: showTablesOpt} } case 302: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1723 +//line sql.y:1726 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes) + " " + string(yyDollar[3].bytes), Scope: ImplicitScope} } case 303: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1727 +//line sql.y:1730 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes) + " " + string(yyDollar[3].bytes), Scope: ImplicitScope} } case 304: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:1731 +//line sql.y:1734 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes) + " " + string(yyDollar[3].bytes), OnTable: yyDollar[5].tableName, Scope: ImplicitScope} } case 305: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1735 +//line sql.y:1738 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes), Scope: ImplicitScope} } case 306: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1740 +//line sql.y:1743 { // This should probably be a different type (ShowVitessTopoOpt), but // just getting the thing working for now @@ -5556,806 +5654,806 @@ yydefault: } case 307: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1754 +//line sql.y:1757 { yyVAL.statement = &Show{Type: string(yyDollar[2].colIdent.String()), Scope: ImplicitScope} } case 308: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1760 +//line sql.y:1763 { yyVAL.str = string(yyDollar[1].bytes) } case 309: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1764 +//line sql.y:1767 { yyVAL.str = string(yyDollar[1].bytes) } case 310: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1770 +//line sql.y:1773 { yyVAL.str = string(yyDollar[1].bytes) } case 311: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1774 +//line sql.y:1777 { yyVAL.str = string(yyDollar[1].bytes) } case 312: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1780 +//line sql.y:1783 { yyVAL.str = "" } case 313: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1784 +//line sql.y:1787 { yyVAL.str = "extended " } case 314: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1790 +//line sql.y:1793 { yyVAL.str = "" } case 315: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1794 +//line sql.y:1797 { yyVAL.str = "full " } case 316: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1800 +//line sql.y:1803 { yyVAL.str = string(yyDollar[1].bytes) } case 317: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1804 +//line sql.y:1807 { yyVAL.str = string(yyDollar[1].bytes) } case 318: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1810 +//line sql.y:1813 { yyVAL.str = "" } case 319: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1814 +//line sql.y:1817 { yyVAL.str = yyDollar[2].tableIdent.v } case 320: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1818 +//line sql.y:1821 { yyVAL.str = yyDollar[2].tableIdent.v } case 321: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1824 +//line sql.y:1827 { yyVAL.showFilter = nil } case 322: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1828 +//line sql.y:1831 { yyVAL.showFilter = &ShowFilter{Like: string(yyDollar[2].bytes)} } case 323: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1832 +//line sql.y:1835 { yyVAL.showFilter = &ShowFilter{Filter: yyDollar[2].expr} } case 324: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1838 +//line sql.y:1841 { yyVAL.showFilter = nil } case 325: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1842 +//line sql.y:1845 { yyVAL.showFilter = &ShowFilter{Like: string(yyDollar[2].bytes)} } case 326: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1848 +//line sql.y:1851 { yyVAL.scope = ImplicitScope } case 327: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1852 +//line sql.y:1855 { yyVAL.scope = SessionScope } case 328: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1856 +//line sql.y:1859 { yyVAL.scope = GlobalScope } case 329: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1862 +//line sql.y:1865 { yyVAL.statement = &Use{DBName: yyDollar[2].tableIdent} } case 330: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1866 +//line sql.y:1869 { yyVAL.statement = &Use{DBName: TableIdent{v: ""}} } case 331: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1872 +//line sql.y:1875 { yyVAL.statement = &Begin{} } case 332: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1876 +//line sql.y:1879 { yyVAL.statement = &Begin{} } case 333: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1882 +//line sql.y:1885 { yyVAL.statement = &Commit{} } case 334: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1888 +//line sql.y:1891 { yyVAL.statement = &Rollback{} } case 335: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:1892 +//line sql.y:1895 { yyVAL.statement = &SRollback{Name: yyDollar[5].colIdent} } case 336: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1897 +//line sql.y:1900 { yyVAL.empty = struct{}{} } case 337: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1899 +//line sql.y:1902 { yyVAL.empty = struct{}{} } case 338: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1902 +//line sql.y:1905 { yyVAL.empty = struct{}{} } case 339: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1904 +//line sql.y:1907 { yyVAL.empty = struct{}{} } case 340: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1909 +//line sql.y:1912 { yyVAL.statement = &Savepoint{Name: yyDollar[2].colIdent} } case 341: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1915 +//line sql.y:1918 { yyVAL.statement = &Release{Name: yyDollar[3].colIdent} } case 342: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1920 +//line sql.y:1923 { yyVAL.explainType = EmptyType } case 343: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1924 +//line sql.y:1927 { yyVAL.explainType = JSONType } case 344: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1928 +//line sql.y:1931 { yyVAL.explainType = TreeType } case 345: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1932 +//line sql.y:1935 { yyVAL.explainType = VitessType } case 346: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1936 +//line sql.y:1939 { yyVAL.explainType = TraditionalType } case 347: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1940 +//line sql.y:1943 { yyVAL.explainType = AnalyzeType } case 348: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1946 +//line sql.y:1949 { yyVAL.bytes = yyDollar[1].bytes } case 349: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1950 +//line sql.y:1953 { yyVAL.bytes = yyDollar[1].bytes } case 350: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1954 +//line sql.y:1957 { yyVAL.bytes = yyDollar[1].bytes } case 351: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1960 +//line sql.y:1963 { yyVAL.statement = yyDollar[1].selStmt } case 352: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1964 +//line sql.y:1967 { yyVAL.statement = yyDollar[1].statement } case 353: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1968 +//line sql.y:1971 { yyVAL.statement = yyDollar[1].statement } case 354: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1972 +//line sql.y:1975 { yyVAL.statement = yyDollar[1].statement } case 355: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1977 +//line sql.y:1980 { yyVAL.str = "" } case 356: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1981 +//line sql.y:1984 { yyVAL.str = "" } case 357: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1985 +//line sql.y:1988 { yyVAL.str = "" } case 358: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1991 +//line sql.y:1994 { yyVAL.statement = &OtherRead{} } case 359: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1995 +//line sql.y:1998 { yyVAL.statement = &Explain{Type: yyDollar[2].explainType, Statement: yyDollar[3].statement} } case 360: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2001 +//line sql.y:2004 { yyVAL.statement = &OtherAdmin{} } case 361: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2005 +//line sql.y:2008 { yyVAL.statement = &OtherAdmin{} } case 362: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2009 +//line sql.y:2012 { yyVAL.statement = &OtherAdmin{} } case 363: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2013 +//line sql.y:2016 { yyVAL.statement = &OtherAdmin{} } case 364: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2019 +//line sql.y:2022 { yyVAL.statement = &DDL{Action: FlushDDLAction} } case 365: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2023 +//line sql.y:2026 { setAllowComments(yylex, true) } case 366: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2027 +//line sql.y:2030 { yyVAL.bytes2 = yyDollar[2].bytes2 setAllowComments(yylex, false) } case 367: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2033 +//line sql.y:2036 { yyVAL.bytes2 = nil } case 368: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2037 +//line sql.y:2040 { yyVAL.bytes2 = append(yyDollar[1].bytes2, yyDollar[2].bytes) } case 369: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2043 +//line sql.y:2046 { yyVAL.unionType = UnionBasic } case 370: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2047 +//line sql.y:2050 { yyVAL.unionType = UnionAll } case 371: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2051 +//line sql.y:2054 { yyVAL.unionType = UnionDistinct } case 372: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2056 +//line sql.y:2059 { yyVAL.str = "" } case 373: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2060 +//line sql.y:2063 { yyVAL.str = SQLNoCacheStr } case 374: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2064 +//line sql.y:2067 { yyVAL.str = SQLCacheStr } case 375: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2069 +//line sql.y:2072 { yyVAL.boolean = false } case 376: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2073 +//line sql.y:2076 { yyVAL.boolean = true } case 377: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2077 +//line sql.y:2080 { yyVAL.boolean = true } case 378: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2082 +//line sql.y:2085 { yyVAL.selectExprs = nil } case 379: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2086 +//line sql.y:2089 { yyVAL.selectExprs = yyDollar[1].selectExprs } case 380: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2091 +//line sql.y:2094 { yyVAL.strs = nil } case 381: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2095 +//line sql.y:2098 { yyVAL.strs = []string{yyDollar[1].str} } case 382: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2099 +//line sql.y:2102 { // TODO: This is a hack since I couldn't get it to work in a nicer way. I got 'conflicts: 8 shift/reduce' yyVAL.strs = []string{yyDollar[1].str, yyDollar[2].str} } case 383: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2103 +//line sql.y:2106 { yyVAL.strs = []string{yyDollar[1].str, yyDollar[2].str, yyDollar[3].str} } case 384: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2107 +//line sql.y:2110 { yyVAL.strs = []string{yyDollar[1].str, yyDollar[2].str, yyDollar[3].str, yyDollar[4].str} } case 385: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2113 +//line sql.y:2116 { yyVAL.str = SQLNoCacheStr } case 386: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2117 +//line sql.y:2120 { yyVAL.str = SQLCacheStr } case 387: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2121 +//line sql.y:2124 { yyVAL.str = DistinctStr } case 388: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2125 +//line sql.y:2128 { yyVAL.str = DistinctStr } case 389: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2129 +//line sql.y:2132 { yyVAL.str = StraightJoinHint } case 390: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2133 +//line sql.y:2136 { yyVAL.str = SQLCalcFoundRowsStr } case 391: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2139 +//line sql.y:2142 { yyVAL.selectExprs = SelectExprs{yyDollar[1].selectExpr} } case 392: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2143 +//line sql.y:2146 { yyVAL.selectExprs = append(yyVAL.selectExprs, yyDollar[3].selectExpr) } case 393: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2149 +//line sql.y:2152 { yyVAL.selectExpr = &StarExpr{} } case 394: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2153 +//line sql.y:2156 { yyVAL.selectExpr = &AliasedExpr{Expr: yyDollar[1].expr, As: yyDollar[2].colIdent} } case 395: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2157 +//line sql.y:2160 { yyVAL.selectExpr = &StarExpr{TableName: TableName{Name: yyDollar[1].tableIdent}} } case 396: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:2161 +//line sql.y:2164 { yyVAL.selectExpr = &StarExpr{TableName: TableName{Qualifier: yyDollar[1].tableIdent, Name: yyDollar[3].tableIdent}} } case 397: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2166 +//line sql.y:2169 { yyVAL.colIdent = ColIdent{} } case 398: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2170 +//line sql.y:2173 { yyVAL.colIdent = yyDollar[1].colIdent } case 399: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2174 +//line sql.y:2177 { yyVAL.colIdent = yyDollar[2].colIdent } case 401: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2181 +//line sql.y:2184 { yyVAL.colIdent = NewColIdent(string(yyDollar[1].bytes)) } case 402: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2186 +//line sql.y:2189 { yyVAL.tableExprs = TableExprs{&AliasedTableExpr{Expr: TableName{Name: NewTableIdent("dual")}}} } case 403: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2190 +//line sql.y:2193 { yyVAL.tableExprs = yyDollar[2].tableExprs } case 404: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2196 +//line sql.y:2199 { yyVAL.tableExprs = TableExprs{yyDollar[1].tableExpr} } case 405: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2200 +//line sql.y:2203 { yyVAL.tableExprs = append(yyVAL.tableExprs, yyDollar[3].tableExpr) } case 408: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2210 +//line sql.y:2213 { yyVAL.tableExpr = yyDollar[1].aliasedTableName } case 409: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2214 +//line sql.y:2217 { yyVAL.tableExpr = &AliasedTableExpr{Expr: yyDollar[1].subquery, As: yyDollar[3].tableIdent} } case 410: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2218 +//line sql.y:2221 { yyVAL.tableExpr = &ParenTableExpr{Exprs: yyDollar[2].tableExprs} } case 411: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2224 +//line sql.y:2227 { yyVAL.subquery = &Subquery{yyDollar[2].selStmt} } case 412: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2230 +//line sql.y:2233 { yyVAL.aliasedTableName = &AliasedTableExpr{Expr: yyDollar[1].tableName, As: yyDollar[2].tableIdent, Hints: yyDollar[3].indexHints} } case 413: yyDollar = yyS[yypt-7 : yypt+1] -//line sql.y:2234 +//line sql.y:2237 { yyVAL.aliasedTableName = &AliasedTableExpr{Expr: yyDollar[1].tableName, Partitions: yyDollar[4].partitions, As: yyDollar[6].tableIdent, Hints: yyDollar[7].indexHints} } case 414: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2240 +//line sql.y:2243 { yyVAL.columns = Columns{yyDollar[1].colIdent} } case 415: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2244 +//line sql.y:2247 { yyVAL.columns = append(yyVAL.columns, yyDollar[3].colIdent) } case 416: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2250 +//line sql.y:2253 { yyVAL.partitions = Partitions{yyDollar[1].colIdent} } case 417: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2254 +//line sql.y:2257 { yyVAL.partitions = append(yyVAL.partitions, yyDollar[3].colIdent) } case 418: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2267 +//line sql.y:2270 { yyVAL.tableExpr = &JoinTableExpr{LeftExpr: yyDollar[1].tableExpr, Join: yyDollar[2].joinType, RightExpr: yyDollar[3].tableExpr, Condition: yyDollar[4].joinCondition} } case 419: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2271 +//line sql.y:2274 { yyVAL.tableExpr = &JoinTableExpr{LeftExpr: yyDollar[1].tableExpr, Join: yyDollar[2].joinType, RightExpr: yyDollar[3].tableExpr, Condition: yyDollar[4].joinCondition} } case 420: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2275 +//line sql.y:2278 { yyVAL.tableExpr = &JoinTableExpr{LeftExpr: yyDollar[1].tableExpr, Join: yyDollar[2].joinType, RightExpr: yyDollar[3].tableExpr, Condition: yyDollar[4].joinCondition} } case 421: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2279 +//line sql.y:2282 { yyVAL.tableExpr = &JoinTableExpr{LeftExpr: yyDollar[1].tableExpr, Join: yyDollar[2].joinType, RightExpr: yyDollar[3].tableExpr} } case 422: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2285 +//line sql.y:2288 { yyVAL.joinCondition = JoinCondition{On: yyDollar[2].expr} } case 423: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2287 +//line sql.y:2290 { yyVAL.joinCondition = JoinCondition{Using: yyDollar[3].columns} } case 424: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2291 +//line sql.y:2294 { yyVAL.joinCondition = JoinCondition{} } case 425: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2293 +//line sql.y:2296 { yyVAL.joinCondition = yyDollar[1].joinCondition } case 426: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2297 +//line sql.y:2300 { yyVAL.joinCondition = JoinCondition{} } case 427: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2299 +//line sql.y:2302 { yyVAL.joinCondition = JoinCondition{On: yyDollar[2].expr} } case 428: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2302 +//line sql.y:2305 { yyVAL.empty = struct{}{} } case 429: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2304 +//line sql.y:2307 { yyVAL.empty = struct{}{} } case 430: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2307 +//line sql.y:2310 { yyVAL.tableIdent = NewTableIdent("") } case 431: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2311 +//line sql.y:2314 { yyVAL.tableIdent = yyDollar[1].tableIdent } case 432: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2315 +//line sql.y:2318 { yyVAL.tableIdent = yyDollar[2].tableIdent } case 434: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2322 +//line sql.y:2325 { yyVAL.tableIdent = NewTableIdent(string(yyDollar[1].bytes)) } case 435: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2328 +//line sql.y:2331 { yyVAL.joinType = NormalJoinType } case 436: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2332 +//line sql.y:2335 { yyVAL.joinType = NormalJoinType } case 437: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2336 +//line sql.y:2339 { yyVAL.joinType = NormalJoinType } case 438: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2342 +//line sql.y:2345 { yyVAL.joinType = StraightJoinType } case 439: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2348 +//line sql.y:2351 { yyVAL.joinType = LeftJoinType } case 440: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2352 +//line sql.y:2355 { yyVAL.joinType = LeftJoinType } case 441: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2356 +//line sql.y:2359 { yyVAL.joinType = RightJoinType } case 442: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2360 +//line sql.y:2363 { yyVAL.joinType = RightJoinType } case 443: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2366 +//line sql.y:2369 { yyVAL.joinType = NaturalJoinType } case 444: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2370 +//line sql.y:2373 { if yyDollar[2].joinType == LeftJoinType { yyVAL.joinType = NaturalLeftJoinType @@ -6365,487 +6463,487 @@ yydefault: } case 445: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2380 +//line sql.y:2383 { yyVAL.tableName = yyDollar[2].tableName } case 446: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2384 +//line sql.y:2387 { yyVAL.tableName = yyDollar[1].tableName } case 447: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2390 +//line sql.y:2393 { yyVAL.tableName = TableName{Name: yyDollar[1].tableIdent} } case 448: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2394 +//line sql.y:2397 { yyVAL.tableName = TableName{Qualifier: yyDollar[1].tableIdent, Name: yyDollar[3].tableIdent} } case 449: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2400 +//line sql.y:2403 { yyVAL.tableName = TableName{Name: yyDollar[1].tableIdent} } case 450: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2405 +//line sql.y:2408 { yyVAL.indexHints = nil } case 451: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:2409 +//line sql.y:2412 { yyVAL.indexHints = &IndexHints{Type: UseOp, Indexes: yyDollar[4].columns} } case 452: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2413 +//line sql.y:2416 { yyVAL.indexHints = &IndexHints{Type: UseOp} } case 453: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:2417 +//line sql.y:2420 { yyVAL.indexHints = &IndexHints{Type: IgnoreOp, Indexes: yyDollar[4].columns} } case 454: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:2421 +//line sql.y:2424 { yyVAL.indexHints = &IndexHints{Type: ForceOp, Indexes: yyDollar[4].columns} } case 455: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2426 +//line sql.y:2429 { yyVAL.expr = nil } case 456: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2430 +//line sql.y:2433 { yyVAL.expr = yyDollar[2].expr } case 457: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2436 +//line sql.y:2439 { yyVAL.expr = yyDollar[1].expr } case 458: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2440 +//line sql.y:2443 { yyVAL.expr = &AndExpr{Left: yyDollar[1].expr, Right: yyDollar[3].expr} } case 459: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2444 +//line sql.y:2447 { yyVAL.expr = &OrExpr{Left: yyDollar[1].expr, Right: yyDollar[3].expr} } case 460: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2448 +//line sql.y:2451 { yyVAL.expr = &XorExpr{Left: yyDollar[1].expr, Right: yyDollar[3].expr} } case 461: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2452 +//line sql.y:2455 { yyVAL.expr = &NotExpr{Expr: yyDollar[2].expr} } case 462: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2456 +//line sql.y:2459 { yyVAL.expr = &IsExpr{Operator: yyDollar[3].isExprOperator, Expr: yyDollar[1].expr} } case 463: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2460 +//line sql.y:2463 { yyVAL.expr = yyDollar[1].expr } case 464: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2464 +//line sql.y:2467 { yyVAL.expr = &Default{ColName: yyDollar[2].str} } case 465: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2470 +//line sql.y:2473 { yyVAL.str = "" } case 466: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2474 +//line sql.y:2477 { yyVAL.str = string(yyDollar[2].colIdent.String()) } case 467: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2480 +//line sql.y:2483 { yyVAL.boolVal = BoolVal(true) } case 468: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2484 +//line sql.y:2487 { yyVAL.boolVal = BoolVal(false) } case 469: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2490 +//line sql.y:2493 { yyVAL.expr = &ComparisonExpr{Left: yyDollar[1].expr, Operator: yyDollar[2].comparisonExprOperator, Right: yyDollar[3].expr} } case 470: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2494 +//line sql.y:2497 { yyVAL.expr = &ComparisonExpr{Left: yyDollar[1].expr, Operator: InOp, Right: yyDollar[3].colTuple} } case 471: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2498 +//line sql.y:2501 { yyVAL.expr = &ComparisonExpr{Left: yyDollar[1].expr, Operator: NotInOp, Right: yyDollar[4].colTuple} } case 472: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2502 +//line sql.y:2505 { yyVAL.expr = &ComparisonExpr{Left: yyDollar[1].expr, Operator: LikeOp, Right: yyDollar[3].expr, Escape: yyDollar[4].expr} } case 473: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:2506 +//line sql.y:2509 { yyVAL.expr = &ComparisonExpr{Left: yyDollar[1].expr, Operator: NotLikeOp, Right: yyDollar[4].expr, Escape: yyDollar[5].expr} } case 474: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2510 +//line sql.y:2513 { yyVAL.expr = &ComparisonExpr{Left: yyDollar[1].expr, Operator: RegexpOp, Right: yyDollar[3].expr} } case 475: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2514 +//line sql.y:2517 { yyVAL.expr = &ComparisonExpr{Left: yyDollar[1].expr, Operator: NotRegexpOp, Right: yyDollar[4].expr} } case 476: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:2518 +//line sql.y:2521 { yyVAL.expr = &RangeCond{Left: yyDollar[1].expr, Operator: BetweenOp, From: yyDollar[3].expr, To: yyDollar[5].expr} } case 477: yyDollar = yyS[yypt-6 : yypt+1] -//line sql.y:2522 +//line sql.y:2525 { yyVAL.expr = &RangeCond{Left: yyDollar[1].expr, Operator: NotBetweenOp, From: yyDollar[4].expr, To: yyDollar[6].expr} } case 478: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2526 +//line sql.y:2529 { yyVAL.expr = &ExistsExpr{Subquery: yyDollar[2].subquery} } case 479: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2532 +//line sql.y:2535 { yyVAL.isExprOperator = IsNullOp } case 480: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2536 +//line sql.y:2539 { yyVAL.isExprOperator = IsNotNullOp } case 481: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2540 +//line sql.y:2543 { yyVAL.isExprOperator = IsTrueOp } case 482: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2544 +//line sql.y:2547 { yyVAL.isExprOperator = IsNotTrueOp } case 483: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2548 +//line sql.y:2551 { yyVAL.isExprOperator = IsFalseOp } case 484: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2552 +//line sql.y:2555 { yyVAL.isExprOperator = IsNotFalseOp } case 485: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2558 +//line sql.y:2561 { yyVAL.comparisonExprOperator = EqualOp } case 486: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2562 +//line sql.y:2565 { yyVAL.comparisonExprOperator = LessThanOp } case 487: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2566 +//line sql.y:2569 { yyVAL.comparisonExprOperator = GreaterThanOp } case 488: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2570 +//line sql.y:2573 { yyVAL.comparisonExprOperator = LessEqualOp } case 489: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2574 +//line sql.y:2577 { yyVAL.comparisonExprOperator = GreaterEqualOp } case 490: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2578 +//line sql.y:2581 { yyVAL.comparisonExprOperator = NotEqualOp } case 491: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2582 +//line sql.y:2585 { yyVAL.comparisonExprOperator = NullSafeEqualOp } case 492: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2587 +//line sql.y:2590 { yyVAL.expr = nil } case 493: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2591 +//line sql.y:2594 { yyVAL.expr = yyDollar[2].expr } case 494: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2597 +//line sql.y:2600 { yyVAL.colTuple = yyDollar[1].valTuple } case 495: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2601 +//line sql.y:2604 { yyVAL.colTuple = yyDollar[1].subquery } case 496: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2605 +//line sql.y:2608 { yyVAL.colTuple = ListArg(yyDollar[1].bytes) } case 497: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2611 +//line sql.y:2614 { yyVAL.subquery = &Subquery{yyDollar[2].selStmt} } case 498: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2617 +//line sql.y:2620 { yyVAL.exprs = Exprs{yyDollar[1].expr} } case 499: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2621 +//line sql.y:2624 { yyVAL.exprs = append(yyDollar[1].exprs, yyDollar[3].expr) } case 500: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2627 +//line sql.y:2630 { yyVAL.expr = yyDollar[1].expr } case 501: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2631 +//line sql.y:2634 { yyVAL.expr = yyDollar[1].boolVal } case 502: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2635 +//line sql.y:2638 { yyVAL.expr = yyDollar[1].colName } case 503: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2639 +//line sql.y:2642 { yyVAL.expr = yyDollar[1].expr } case 504: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2643 +//line sql.y:2646 { yyVAL.expr = yyDollar[1].subquery } case 505: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2647 +//line sql.y:2650 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: BitAndOp, Right: yyDollar[3].expr} } case 506: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2651 +//line sql.y:2654 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: BitOrOp, Right: yyDollar[3].expr} } case 507: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2655 +//line sql.y:2658 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: BitXorOp, Right: yyDollar[3].expr} } case 508: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2659 +//line sql.y:2662 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: PlusOp, Right: yyDollar[3].expr} } case 509: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2663 +//line sql.y:2666 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: MinusOp, Right: yyDollar[3].expr} } case 510: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2667 +//line sql.y:2670 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: MultOp, Right: yyDollar[3].expr} } case 511: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2671 +//line sql.y:2674 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: DivOp, Right: yyDollar[3].expr} } case 512: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2675 +//line sql.y:2678 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: IntDivOp, Right: yyDollar[3].expr} } case 513: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2679 +//line sql.y:2682 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: ModOp, Right: yyDollar[3].expr} } case 514: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2683 +//line sql.y:2686 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: ModOp, Right: yyDollar[3].expr} } case 515: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2687 +//line sql.y:2690 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: ShiftLeftOp, Right: yyDollar[3].expr} } case 516: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2691 +//line sql.y:2694 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: ShiftRightOp, Right: yyDollar[3].expr} } case 517: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2695 +//line sql.y:2698 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].colName, Operator: JSONExtractOp, Right: yyDollar[3].expr} } case 518: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2699 +//line sql.y:2702 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].colName, Operator: JSONUnquoteExtractOp, Right: yyDollar[3].expr} } case 519: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2703 +//line sql.y:2706 { yyVAL.expr = &CollateExpr{Expr: yyDollar[1].expr, Charset: yyDollar[3].str} } case 520: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2707 +//line sql.y:2710 { yyVAL.expr = &UnaryExpr{Operator: BinaryOp, Expr: yyDollar[2].expr} } case 521: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2711 +//line sql.y:2714 { yyVAL.expr = &UnaryExpr{Operator: UBinaryOp, Expr: yyDollar[2].expr} } case 522: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2715 +//line sql.y:2718 { yyVAL.expr = &UnaryExpr{Operator: Utf8Op, Expr: yyDollar[2].expr} } case 523: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2719 +//line sql.y:2722 { yyVAL.expr = &UnaryExpr{Operator: Utf8mb4Op, Expr: yyDollar[2].expr} } case 524: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2723 +//line sql.y:2726 { yyVAL.expr = &UnaryExpr{Operator: Latin1Op, Expr: yyDollar[2].expr} } case 525: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2727 +//line sql.y:2730 { if num, ok := yyDollar[2].expr.(*Literal); ok && num.Type == IntVal { yyVAL.expr = num @@ -6855,7 +6953,7 @@ yydefault: } case 526: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2735 +//line sql.y:2738 { if num, ok := yyDollar[2].expr.(*Literal); ok && num.Type == IntVal { // Handle double negative @@ -6871,19 +6969,19 @@ yydefault: } case 527: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2749 +//line sql.y:2752 { yyVAL.expr = &UnaryExpr{Operator: TildaOp, Expr: yyDollar[2].expr} } case 528: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2753 +//line sql.y:2756 { yyVAL.expr = &UnaryExpr{Operator: BangOp, Expr: yyDollar[2].expr} } case 529: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2757 +//line sql.y:2760 { // This rule prevents the usage of INTERVAL // as a function. If support is needed for that, @@ -6893,325 +6991,325 @@ yydefault: } case 534: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2775 +//line sql.y:2778 { yyVAL.expr = &FuncExpr{Name: yyDollar[1].colIdent, Exprs: yyDollar[3].selectExprs} } case 535: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:2779 +//line sql.y:2782 { yyVAL.expr = &FuncExpr{Name: yyDollar[1].colIdent, Distinct: true, Exprs: yyDollar[4].selectExprs} } case 536: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:2783 +//line sql.y:2786 { yyVAL.expr = &FuncExpr{Name: yyDollar[1].colIdent, Distinct: true, Exprs: yyDollar[4].selectExprs} } case 537: yyDollar = yyS[yypt-6 : yypt+1] -//line sql.y:2787 +//line sql.y:2790 { yyVAL.expr = &FuncExpr{Qualifier: yyDollar[1].tableIdent, Name: yyDollar[3].colIdent, Exprs: yyDollar[5].selectExprs} } case 538: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2797 +//line sql.y:2800 { yyVAL.expr = &FuncExpr{Name: NewColIdent("left"), Exprs: yyDollar[3].selectExprs} } case 539: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2801 +//line sql.y:2804 { yyVAL.expr = &FuncExpr{Name: NewColIdent("right"), Exprs: yyDollar[3].selectExprs} } case 540: yyDollar = yyS[yypt-6 : yypt+1] -//line sql.y:2805 +//line sql.y:2808 { yyVAL.expr = &ConvertExpr{Expr: yyDollar[3].expr, Type: yyDollar[5].convertType} } case 541: yyDollar = yyS[yypt-6 : yypt+1] -//line sql.y:2809 +//line sql.y:2812 { yyVAL.expr = &ConvertExpr{Expr: yyDollar[3].expr, Type: yyDollar[5].convertType} } case 542: yyDollar = yyS[yypt-6 : yypt+1] -//line sql.y:2813 +//line sql.y:2816 { yyVAL.expr = &ConvertUsingExpr{Expr: yyDollar[3].expr, Type: yyDollar[5].str} } case 543: yyDollar = yyS[yypt-8 : yypt+1] -//line sql.y:2817 +//line sql.y:2820 { yyVAL.expr = &SubstrExpr{Name: yyDollar[3].colName, From: yyDollar[5].expr, To: yyDollar[7].expr} } case 544: yyDollar = yyS[yypt-8 : yypt+1] -//line sql.y:2821 +//line sql.y:2824 { yyVAL.expr = &SubstrExpr{Name: yyDollar[3].colName, From: yyDollar[5].expr, To: yyDollar[7].expr} } case 545: yyDollar = yyS[yypt-8 : yypt+1] -//line sql.y:2825 +//line sql.y:2828 { yyVAL.expr = &SubstrExpr{StrVal: NewStrLiteral(yyDollar[3].bytes), From: yyDollar[5].expr, To: yyDollar[7].expr} } case 546: yyDollar = yyS[yypt-8 : yypt+1] -//line sql.y:2829 +//line sql.y:2832 { yyVAL.expr = &SubstrExpr{StrVal: NewStrLiteral(yyDollar[3].bytes), From: yyDollar[5].expr, To: yyDollar[7].expr} } case 547: yyDollar = yyS[yypt-9 : yypt+1] -//line sql.y:2833 +//line sql.y:2836 { yyVAL.expr = &MatchExpr{Columns: yyDollar[3].selectExprs, Expr: yyDollar[7].expr, Option: yyDollar[8].matchExprOption} } case 548: yyDollar = yyS[yypt-8 : yypt+1] -//line sql.y:2837 +//line sql.y:2840 { yyVAL.expr = &GroupConcatExpr{Distinct: yyDollar[3].boolean, Exprs: yyDollar[4].selectExprs, OrderBy: yyDollar[5].orderBy, Separator: yyDollar[6].str, Limit: yyDollar[7].limit} } case 549: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:2841 +//line sql.y:2844 { yyVAL.expr = &CaseExpr{Expr: yyDollar[2].expr, Whens: yyDollar[3].whens, Else: yyDollar[4].expr} } case 550: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2845 +//line sql.y:2848 { yyVAL.expr = &ValuesFuncExpr{Name: yyDollar[3].colName} } case 551: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2855 +//line sql.y:2858 { yyVAL.expr = &FuncExpr{Name: NewColIdent("current_timestamp")} } case 552: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2859 +//line sql.y:2862 { yyVAL.expr = &FuncExpr{Name: NewColIdent("utc_timestamp")} } case 553: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2863 +//line sql.y:2866 { yyVAL.expr = &FuncExpr{Name: NewColIdent("utc_time")} } case 554: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2868 +//line sql.y:2871 { yyVAL.expr = &FuncExpr{Name: NewColIdent("utc_date")} } case 555: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2873 +//line sql.y:2876 { yyVAL.expr = &FuncExpr{Name: NewColIdent("localtime")} } case 556: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2878 +//line sql.y:2881 { yyVAL.expr = &FuncExpr{Name: NewColIdent("localtimestamp")} } case 557: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2884 +//line sql.y:2887 { yyVAL.expr = &FuncExpr{Name: NewColIdent("current_date")} } case 558: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2889 +//line sql.y:2892 { yyVAL.expr = &FuncExpr{Name: NewColIdent("current_time")} } case 559: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2894 +//line sql.y:2897 { yyVAL.expr = &CurTimeFuncExpr{Name: NewColIdent("current_timestamp"), Fsp: yyDollar[2].expr} } case 560: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2898 +//line sql.y:2901 { yyVAL.expr = &CurTimeFuncExpr{Name: NewColIdent("utc_timestamp"), Fsp: yyDollar[2].expr} } case 561: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2902 +//line sql.y:2905 { yyVAL.expr = &CurTimeFuncExpr{Name: NewColIdent("utc_time"), Fsp: yyDollar[2].expr} } case 562: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2907 +//line sql.y:2910 { yyVAL.expr = &CurTimeFuncExpr{Name: NewColIdent("localtime"), Fsp: yyDollar[2].expr} } case 563: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2912 +//line sql.y:2915 { yyVAL.expr = &CurTimeFuncExpr{Name: NewColIdent("localtimestamp"), Fsp: yyDollar[2].expr} } case 564: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2917 +//line sql.y:2920 { yyVAL.expr = &CurTimeFuncExpr{Name: NewColIdent("current_time"), Fsp: yyDollar[2].expr} } case 565: yyDollar = yyS[yypt-8 : yypt+1] -//line sql.y:2921 +//line sql.y:2924 { yyVAL.expr = &TimestampFuncExpr{Name: string("timestampadd"), Unit: yyDollar[3].colIdent.String(), Expr1: yyDollar[5].expr, Expr2: yyDollar[7].expr} } case 566: yyDollar = yyS[yypt-8 : yypt+1] -//line sql.y:2925 +//line sql.y:2928 { yyVAL.expr = &TimestampFuncExpr{Name: string("timestampdiff"), Unit: yyDollar[3].colIdent.String(), Expr1: yyDollar[5].expr, Expr2: yyDollar[7].expr} } case 569: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2935 +//line sql.y:2938 { yyVAL.expr = yyDollar[2].expr } case 570: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2945 +//line sql.y:2948 { yyVAL.expr = &FuncExpr{Name: NewColIdent("if"), Exprs: yyDollar[3].selectExprs} } case 571: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2949 +//line sql.y:2952 { yyVAL.expr = &FuncExpr{Name: NewColIdent("database"), Exprs: yyDollar[3].selectExprs} } case 572: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2953 +//line sql.y:2956 { yyVAL.expr = &FuncExpr{Name: NewColIdent("schema"), Exprs: yyDollar[3].selectExprs} } case 573: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2957 +//line sql.y:2960 { yyVAL.expr = &FuncExpr{Name: NewColIdent("mod"), Exprs: yyDollar[3].selectExprs} } case 574: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2961 +//line sql.y:2964 { yyVAL.expr = &FuncExpr{Name: NewColIdent("replace"), Exprs: yyDollar[3].selectExprs} } case 575: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2965 +//line sql.y:2968 { yyVAL.expr = &FuncExpr{Name: NewColIdent("substr"), Exprs: yyDollar[3].selectExprs} } case 576: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2969 +//line sql.y:2972 { yyVAL.expr = &FuncExpr{Name: NewColIdent("substr"), Exprs: yyDollar[3].selectExprs} } case 577: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2975 +//line sql.y:2978 { yyVAL.matchExprOption = NoOption } case 578: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2979 +//line sql.y:2982 { yyVAL.matchExprOption = BooleanModeOpt } case 579: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2983 +//line sql.y:2986 { yyVAL.matchExprOption = NaturalLanguageModeOpt } case 580: yyDollar = yyS[yypt-7 : yypt+1] -//line sql.y:2987 +//line sql.y:2990 { yyVAL.matchExprOption = NaturalLanguageModeWithQueryExpansionOpt } case 581: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2991 +//line sql.y:2994 { yyVAL.matchExprOption = QueryExpansionOpt } case 582: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2997 +//line sql.y:3000 { yyVAL.str = string(yyDollar[1].colIdent.String()) } case 583: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3001 +//line sql.y:3004 { yyVAL.str = string(yyDollar[1].bytes) } case 584: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3007 +//line sql.y:3010 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].literal} } case 585: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3011 +//line sql.y:3014 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].literal, Charset: yyDollar[3].str, Operator: CharacterSetOp} } case 586: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3015 +//line sql.y:3018 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].literal, Charset: string(yyDollar[3].colIdent.String())} } case 587: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3019 +//line sql.y:3022 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes)} } case 588: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3023 +//line sql.y:3026 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].literal} } case 589: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3027 +//line sql.y:3030 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes)} yyVAL.convertType.Length = yyDollar[2].LengthScaleOption.Length @@ -7219,169 +7317,169 @@ yydefault: } case 590: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3033 +//line sql.y:3036 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes)} } case 591: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3037 +//line sql.y:3040 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].literal} } case 592: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3041 +//line sql.y:3044 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes)} } case 593: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3045 +//line sql.y:3048 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes)} } case 594: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3049 +//line sql.y:3052 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].literal} } case 595: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3053 +//line sql.y:3056 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes)} } case 596: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3057 +//line sql.y:3060 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes)} } case 597: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3062 +//line sql.y:3065 { yyVAL.expr = nil } case 598: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3066 +//line sql.y:3069 { yyVAL.expr = yyDollar[1].expr } case 599: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3071 +//line sql.y:3074 { yyVAL.str = string("") } case 600: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3075 +//line sql.y:3078 { yyVAL.str = " separator '" + string(yyDollar[2].bytes) + "'" } case 601: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3081 +//line sql.y:3084 { yyVAL.whens = []*When{yyDollar[1].when} } case 602: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3085 +//line sql.y:3088 { yyVAL.whens = append(yyDollar[1].whens, yyDollar[2].when) } case 603: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:3091 +//line sql.y:3094 { yyVAL.when = &When{Cond: yyDollar[2].expr, Val: yyDollar[4].expr} } case 604: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3096 +//line sql.y:3099 { yyVAL.expr = nil } case 605: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3100 +//line sql.y:3103 { yyVAL.expr = yyDollar[2].expr } case 606: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3106 +//line sql.y:3109 { yyVAL.colName = &ColName{Name: yyDollar[1].colIdent} } case 607: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3110 +//line sql.y:3113 { yyVAL.colName = &ColName{Qualifier: TableName{Name: yyDollar[1].tableIdent}, Name: yyDollar[3].colIdent} } case 608: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:3114 +//line sql.y:3117 { yyVAL.colName = &ColName{Qualifier: TableName{Qualifier: yyDollar[1].tableIdent, Name: yyDollar[3].tableIdent}, Name: yyDollar[5].colIdent} } case 609: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3120 +//line sql.y:3123 { yyVAL.expr = NewStrLiteral(yyDollar[1].bytes) } case 610: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3124 +//line sql.y:3127 { yyVAL.expr = NewHexLiteral(yyDollar[1].bytes) } case 611: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3128 +//line sql.y:3131 { yyVAL.expr = NewBitLiteral(yyDollar[1].bytes) } case 612: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3132 +//line sql.y:3135 { yyVAL.expr = NewIntLiteral(yyDollar[1].bytes) } case 613: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3136 +//line sql.y:3139 { yyVAL.expr = NewFloatLiteral(yyDollar[1].bytes) } case 614: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3140 +//line sql.y:3143 { yyVAL.expr = NewHexNumLiteral(yyDollar[1].bytes) } case 615: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3144 +//line sql.y:3147 { yyVAL.expr = NewArgument(yyDollar[1].bytes) } case 616: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3148 +//line sql.y:3151 { yyVAL.expr = &NullVal{} } case 617: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3154 +//line sql.y:3157 { // TODO(sougou): Deprecate this construct. if yyDollar[1].colIdent.Lowered() != "value" { @@ -7392,223 +7490,235 @@ yydefault: } case 618: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3163 +//line sql.y:3166 { yyVAL.expr = NewIntLiteral(yyDollar[1].bytes) } case 619: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3167 +//line sql.y:3170 { yyVAL.expr = NewArgument(yyDollar[1].bytes) } case 620: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3172 +//line sql.y:3175 { yyVAL.exprs = nil } case 621: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3176 +//line sql.y:3179 { yyVAL.exprs = yyDollar[3].exprs } case 622: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3181 +//line sql.y:3184 { yyVAL.expr = nil } case 623: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3185 +//line sql.y:3188 { yyVAL.expr = yyDollar[2].expr } case 624: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3190 +//line sql.y:3193 { yyVAL.orderBy = nil } case 625: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3194 +//line sql.y:3197 { yyVAL.orderBy = yyDollar[3].orderBy } case 626: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3200 +//line sql.y:3203 { yyVAL.orderBy = OrderBy{yyDollar[1].order} } case 627: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3204 +//line sql.y:3207 { yyVAL.orderBy = append(yyDollar[1].orderBy, yyDollar[3].order) } case 628: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3210 +//line sql.y:3213 { yyVAL.order = &Order{Expr: yyDollar[1].expr, Direction: yyDollar[2].orderDirection} } case 629: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3215 +//line sql.y:3218 { yyVAL.orderDirection = AscOrder } case 630: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3219 +//line sql.y:3222 { yyVAL.orderDirection = AscOrder } case 631: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3223 +//line sql.y:3226 { yyVAL.orderDirection = DescOrder } case 632: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3228 +//line sql.y:3231 { yyVAL.limit = nil } case 633: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3232 +//line sql.y:3235 { yyVAL.limit = &Limit{Rowcount: yyDollar[2].expr} } case 634: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:3236 +//line sql.y:3239 { yyVAL.limit = &Limit{Offset: yyDollar[2].expr, Rowcount: yyDollar[4].expr} } case 635: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:3240 +//line sql.y:3243 { yyVAL.limit = &Limit{Offset: yyDollar[4].expr, Rowcount: yyDollar[2].expr} } case 636: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3245 +//line sql.y:3248 { yyVAL.lock = NoLock } case 637: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3249 +//line sql.y:3252 { yyVAL.lock = ForUpdateLock } case 638: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:3253 +//line sql.y:3256 { yyVAL.lock = ShareModeLock } case 639: + yyDollar = yyS[yypt-0 : yypt+1] +//line sql.y:3261 + { + yyVAL.str = "" + } + case 640: + yyDollar = yyS[yypt-4 : yypt+1] +//line sql.y:3265 + { + yyVAL.str = string(yyDollar[4].bytes) + } + case 641: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3266 +//line sql.y:3278 { yyVAL.ins = &Insert{Rows: yyDollar[2].values} } - case 640: + case 642: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3270 +//line sql.y:3282 { yyVAL.ins = &Insert{Rows: yyDollar[1].selStmt} } - case 641: + case 643: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:3274 +//line sql.y:3286 { yyVAL.ins = &Insert{Columns: yyDollar[2].columns, Rows: yyDollar[5].values} } - case 642: + case 644: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:3278 +//line sql.y:3290 { yyVAL.ins = &Insert{Columns: yyDollar[2].columns, Rows: yyDollar[4].selStmt} } - case 643: + case 645: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3284 +//line sql.y:3296 { yyVAL.columns = Columns{yyDollar[1].colIdent} } - case 644: + case 646: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3288 +//line sql.y:3300 { yyVAL.columns = Columns{yyDollar[3].colIdent} } - case 645: + case 647: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3292 +//line sql.y:3304 { yyVAL.columns = append(yyVAL.columns, yyDollar[3].colIdent) } - case 646: + case 648: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:3296 +//line sql.y:3308 { yyVAL.columns = append(yyVAL.columns, yyDollar[5].colIdent) } - case 647: + case 649: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3301 +//line sql.y:3313 { yyVAL.updateExprs = nil } - case 648: + case 650: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:3305 +//line sql.y:3317 { yyVAL.updateExprs = yyDollar[5].updateExprs } - case 649: + case 651: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3311 +//line sql.y:3323 { yyVAL.values = Values{yyDollar[1].valTuple} } - case 650: + case 652: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3315 +//line sql.y:3327 { yyVAL.values = append(yyDollar[1].values, yyDollar[3].valTuple) } - case 651: + case 653: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3321 +//line sql.y:3333 { yyVAL.valTuple = yyDollar[1].valTuple } - case 652: + case 654: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3325 +//line sql.y:3337 { yyVAL.valTuple = ValTuple{} } - case 653: + case 655: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3331 +//line sql.y:3343 { yyVAL.valTuple = ValTuple(yyDollar[2].exprs) } - case 654: + case 656: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3337 +//line sql.y:3349 { if len(yyDollar[1].valTuple) == 1 { yyVAL.expr = yyDollar[1].valTuple[0] @@ -7616,342 +7726,342 @@ yydefault: yyVAL.expr = yyDollar[1].valTuple } } - case 655: + case 657: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3347 +//line sql.y:3359 { yyVAL.updateExprs = UpdateExprs{yyDollar[1].updateExpr} } - case 656: + case 658: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3351 +//line sql.y:3363 { yyVAL.updateExprs = append(yyDollar[1].updateExprs, yyDollar[3].updateExpr) } - case 657: + case 659: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3357 +//line sql.y:3369 { yyVAL.updateExpr = &UpdateExpr{Name: yyDollar[1].colName, Expr: yyDollar[3].expr} } - case 658: + case 660: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3363 +//line sql.y:3375 { yyVAL.setExprs = SetExprs{yyDollar[1].setExpr} } - case 659: + case 661: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3367 +//line sql.y:3379 { yyVAL.setExprs = append(yyDollar[1].setExprs, yyDollar[3].setExpr) } - case 660: + case 662: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3373 +//line sql.y:3385 { yyVAL.setExpr = &SetExpr{Name: yyDollar[1].colIdent, Scope: ImplicitScope, Expr: NewStrLiteral([]byte("on"))} } - case 661: + case 663: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3377 +//line sql.y:3389 { yyVAL.setExpr = &SetExpr{Name: yyDollar[1].colIdent, Scope: ImplicitScope, Expr: NewStrLiteral([]byte("off"))} } - case 662: + case 664: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3381 +//line sql.y:3393 { yyVAL.setExpr = &SetExpr{Name: yyDollar[1].colIdent, Scope: ImplicitScope, Expr: yyDollar[3].expr} } - case 663: + case 665: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3385 +//line sql.y:3397 { yyVAL.setExpr = &SetExpr{Name: NewColIdent(string(yyDollar[1].bytes)), Scope: ImplicitScope, Expr: yyDollar[2].expr} } - case 664: + case 666: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3389 +//line sql.y:3401 { yyDollar[2].setExpr.Scope = yyDollar[1].scope yyVAL.setExpr = yyDollar[2].setExpr } - case 666: + case 668: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3397 +//line sql.y:3409 { yyVAL.bytes = []byte("charset") } - case 668: + case 670: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3404 +//line sql.y:3416 { yyVAL.expr = NewStrLiteral([]byte(yyDollar[1].colIdent.String())) } - case 669: + case 671: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3408 +//line sql.y:3420 { yyVAL.expr = NewStrLiteral(yyDollar[1].bytes) } - case 670: + case 672: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3412 +//line sql.y:3424 { yyVAL.expr = &Default{} } - case 673: + case 675: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3421 +//line sql.y:3433 { yyVAL.boolean = false } - case 674: + case 676: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3423 +//line sql.y:3435 { yyVAL.boolean = true } - case 675: + case 677: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3426 +//line sql.y:3438 { yyVAL.boolean = false } - case 676: + case 678: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3428 +//line sql.y:3440 { yyVAL.boolean = true } - case 677: + case 679: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3431 +//line sql.y:3443 { yyVAL.ignore = false } - case 678: - yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3433 - { - yyVAL.ignore = true - } - case 679: - yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3437 - { - yyVAL.empty = struct{}{} - } case 680: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3439 +//line sql.y:3445 { - yyVAL.empty = struct{}{} + yyVAL.ignore = true } case 681: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3441 +//line sql.y:3449 { yyVAL.empty = struct{}{} } case 682: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3443 +//line sql.y:3451 { yyVAL.empty = struct{}{} } case 683: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3445 +//line sql.y:3453 { yyVAL.empty = struct{}{} } case 684: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3447 +//line sql.y:3455 { yyVAL.empty = struct{}{} } case 685: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3449 +//line sql.y:3457 { yyVAL.empty = struct{}{} } case 686: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3451 +//line sql.y:3459 { yyVAL.empty = struct{}{} } case 687: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3453 +//line sql.y:3461 { yyVAL.empty = struct{}{} } case 688: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3455 +//line sql.y:3463 { yyVAL.empty = struct{}{} } case 689: + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:3465 + { + yyVAL.empty = struct{}{} + } + case 690: + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:3467 + { + yyVAL.empty = struct{}{} + } + case 691: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3459 +//line sql.y:3471 { yyVAL.OnlineDDLHint = &OnlineDDLHint{} } - case 690: + case 692: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3463 +//line sql.y:3475 { yyVAL.OnlineDDLHint = &OnlineDDLHint{ Strategy: DDLStrategy(yyDollar[2].bytes), } } - case 691: + case 693: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3469 +//line sql.y:3481 { yyVAL.OnlineDDLHint = &OnlineDDLHint{ Strategy: DDLStrategy(yyDollar[2].bytes), Options: string(yyDollar[3].bytes), } } - case 692: + case 694: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3477 +//line sql.y:3489 { yyVAL.empty = struct{}{} } - case 693: + case 695: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3479 +//line sql.y:3491 { yyVAL.empty = struct{}{} } - case 694: + case 696: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3481 +//line sql.y:3493 { yyVAL.empty = struct{}{} } - case 695: + case 697: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3485 +//line sql.y:3497 { yyVAL.empty = struct{}{} } - case 696: + case 698: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3487 +//line sql.y:3499 { yyVAL.empty = struct{}{} } - case 697: + case 699: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3490 +//line sql.y:3502 { yyVAL.empty = struct{}{} } - case 698: + case 700: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3492 +//line sql.y:3504 { yyVAL.empty = struct{}{} } - case 699: + case 701: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3494 +//line sql.y:3506 { yyVAL.empty = struct{}{} } - case 700: + case 702: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3497 +//line sql.y:3509 { yyVAL.colIdent = ColIdent{} } - case 701: + case 703: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3499 +//line sql.y:3511 { yyVAL.colIdent = yyDollar[2].colIdent } - case 702: + case 704: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3503 +//line sql.y:3515 { yyVAL.colIdent = yyDollar[1].colIdent } - case 703: + case 705: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3507 +//line sql.y:3519 { yyVAL.colIdent = NewColIdent(string(yyDollar[1].bytes)) } - case 705: + case 707: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3514 +//line sql.y:3526 { yyVAL.colIdent = NewColIdent(string(yyDollar[1].bytes)) } - case 706: + case 708: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3520 +//line sql.y:3532 { yyVAL.tableIdent = NewTableIdent(string(yyDollar[1].colIdent.String())) } - case 707: + case 709: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3524 +//line sql.y:3536 { yyVAL.tableIdent = NewTableIdent(string(yyDollar[1].bytes)) } - case 709: + case 711: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3531 +//line sql.y:3543 { yyVAL.tableIdent = NewTableIdent(string(yyDollar[1].bytes)) } - case 1008: + case 1012: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3855 +//line sql.y:3869 { if incNesting(yylex) { yylex.Error("max nesting level reached") return 1 } } - case 1009: + case 1013: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3864 +//line sql.y:3878 { decNesting(yylex) } - case 1010: + case 1014: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3869 +//line sql.y:3883 { skipToEnd(yylex) } - case 1011: + case 1015: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3874 +//line sql.y:3888 { skipToEnd(yylex) } - case 1012: + case 1016: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3878 +//line sql.y:3892 { skipToEnd(yylex) } - case 1013: + case 1017: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3882 +//line sql.y:3896 { skipToEnd(yylex) } diff --git a/go/vt/sqlparser/sql.y b/go/vt/sqlparser/sql.y index 6fca092c9e9..cec79e0dc08 100644 --- a/go/vt/sqlparser/sql.y +++ b/go/vt/sqlparser/sql.y @@ -138,6 +138,7 @@ func skipToEnd(yylex interface{}) { %token SELECT STREAM VSTREAM INSERT UPDATE DELETE FROM WHERE GROUP HAVING ORDER BY LIMIT OFFSET FOR %token ALL DISTINCT AS EXISTS ASC DESC INTO DUPLICATE KEY DEFAULT SET LOCK UNLOCK KEYS DO %token DISTINCTROW +%token OUTFILE S3 %token VALUES LAST_INSERT_ID %token NEXT VALUE SHARE MODE %token SQL_NO_CACHE SQL_CACHE SQL_CALC_FOUND_ROWS @@ -287,6 +288,7 @@ func skipToEnd(yylex interface{}) { %type order %type asc_desc_opt %type limit_opt +%type into_outfile_s3_opt %type lock_opt %type ins_column_list column_list %type opt_partition_clause partition_list @@ -419,12 +421,13 @@ do_statement: } select_statement: - base_select order_by_opt limit_opt lock_opt + base_select order_by_opt limit_opt lock_opt into_outfile_s3_opt { sel := $1.(*Select) sel.OrderBy = $2 sel.Limit = $3 sel.Lock = $4 + sel.IntoOutfileS3 = $5 $$ = sel } | openb select_statement closeb order_by_opt limit_opt lock_opt @@ -781,7 +784,7 @@ table_column_list: } column_definition: - id_or_var column_type null_opt column_default_opt on_update_opt auto_increment_opt column_key_opt column_comment_opt + sql_id column_type null_opt column_default_opt on_update_opt auto_increment_opt column_key_opt column_comment_opt { $2.NotNull = $3 $2.Default = $4 @@ -3254,6 +3257,15 @@ lock_opt: $$ = ShareModeLock } +into_outfile_s3_opt: + { + $$ = "" + } +| INTO OUTFILE S3 STRING + { + $$ = string($4) + } + // insert_data expands all combinations into a single rule. // This avoids a shift/reduce conflict while encountering the // following two possible constructs: @@ -3625,6 +3637,7 @@ reserved_keyword: | OR | ORDER | OUTER +| OUTFILE | OVER | PERCENT_RANK | RANK @@ -3797,6 +3810,7 @@ non_reserved_keyword: | REUSE | ROLE | ROLLBACK +| S3 | SECONDARY | SECONDARY_ENGINE | SECONDARY_LOAD diff --git a/go/vt/sqlparser/token.go b/go/vt/sqlparser/token.go index b9a444334db..0a85de06902 100644 --- a/go/vt/sqlparser/token.go +++ b/go/vt/sqlparser/token.go @@ -292,7 +292,7 @@ var keywords = map[string]int{ "order": ORDER, "out": UNUSED, "outer": OUTER, - "outfile": UNUSED, + "outfile": OUTFILE, "partition": PARTITION, "plugins": PLUGINS, "point": POINT, @@ -324,6 +324,7 @@ var keywords = map[string]int{ "right": RIGHT, "rlike": REGEXP, "rollback": ROLLBACK, + "s3": S3, "savepoint": SAVEPOINT, "schema": SCHEMA, "second_microsecond": UNUSED, diff --git a/go/vt/vtgate/planbuilder/select.go b/go/vt/vtgate/planbuilder/select.go index 49e49b7ef04..24e72e731f0 100644 --- a/go/vt/vtgate/planbuilder/select.go +++ b/go/vt/vtgate/planbuilder/select.go @@ -39,6 +39,10 @@ func buildSelectPlan(query string) func(sqlparser.Statement, ContextVSchema) (en return func(stmt sqlparser.Statement, vschema ContextVSchema) (engine.Primitive, error) { sel := stmt.(*sqlparser.Select) + if sel.IntoOutfileS3 != "" { + return nil, vterrors.Errorf(vtrpcpb.Code_UNIMPLEMENTED, "unsupported: non bypass query with into outfile s3") + } + p, err := handleDualSelects(sel, vschema) if err != nil { return nil, err @@ -114,6 +118,10 @@ func (pb *primitiveBuilder) processSelect(sel *sqlparser.Select, outer *symtab, return nil } } + // Into Outfile is not supported in subquery. + if sel.IntoOutfileS3 != "" && (outer != nil || query == "") { + return mysql.NewSQLError(mysql.ERCantUseOptionHere, "42000", "Incorrect usage/placement of 'INTO OUTFILE S3'") + } if err := pb.processTableExprs(sel.From); err != nil { return err diff --git a/go/vt/vtgate/planbuilder/testdata/bypass_cases.txt b/go/vt/vtgate/planbuilder/testdata/bypass_cases.txt index 4d4136851d9..be8e010a78f 100644 --- a/go/vt/vtgate/planbuilder/testdata/bypass_cases.txt +++ b/go/vt/vtgate/planbuilder/testdata/bypass_cases.txt @@ -87,3 +87,38 @@ "SingleShardOnly": false } } + +# bypass query for into outfile s3 +"select count(*), col from unsharded into outfile S3 'x.txt'" +{ + "QueryType": "SELECT", + "Original": "select count(*), col from unsharded into outfile S3 'x.txt'", + "Instructions": { + "OperatorType": "Send", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "TargetDestination": "Shard(-80)", + "IsDML": false, + "Query": "select count(*), col from unsharded into outfile s3 'x.txt'", + "SingleShardOnly": false + } +} + +"select * from user into outfile S3 'x.txt'" +{ + "QueryType": "SELECT", + "Original": "select * from user into outfile S3 'x.txt'", + "Instructions": { + "OperatorType": "Send", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "TargetDestination": "Shard(-80)", + "IsDML": false, + "Query": "select * from user into outfile s3 'x.txt'", + "SingleShardOnly": false + } +} diff --git a/go/vt/vtgate/planbuilder/testdata/unsupported_cases.txt b/go/vt/vtgate/planbuilder/testdata/unsupported_cases.txt index 3f851250904..a9314784fe2 100644 --- a/go/vt/vtgate/planbuilder/testdata/unsupported_cases.txt +++ b/go/vt/vtgate/planbuilder/testdata/unsupported_cases.txt @@ -435,3 +435,15 @@ # set with DEFAULT - reserved connection "set sql_mode = default" "DEFAULT not supported for @@sql_mode" + +# Union after storing result in outfile +"select id from user into outfile s3 'out_file_name' union all select id from music" +"Incorrect usage/placement of 'INTO OUTFILE S3' (errno 1234) (sqlstate 42000)" + +# Into outfile s3 in sub-query +"select id from (select id from user into outfile s3 'inner_outfile') as t2" +"Incorrect usage/placement of 'INTO OUTFILE S3' (errno 1234) (sqlstate 42000)" + +# Multi shard query using into outfile s3 +"select * from user order by id limit 100 into outfile s3 'out_file_name'" +"unsupported: non bypass query with into outfile s3" diff --git a/go/vt/vttablet/tabletmanager/vreplication/controller.go b/go/vt/vttablet/tabletmanager/vreplication/controller.go index cb0e722c299..512eca415a8 100644 --- a/go/vt/vttablet/tabletmanager/vreplication/controller.go +++ b/go/vt/vttablet/tabletmanager/vreplication/controller.go @@ -150,6 +150,7 @@ func (ct *controller) run(ctx context.Context) { default: } log.Errorf("stream %v: %v, retrying after %v", ct.id, err, *retryDelay) + ct.blpStats.ErrorCounts.Add([]string{"Stream Error"}, 1) timer := time.NewTimer(*retryDelay) select { case <-ctx.Done(): @@ -192,6 +193,7 @@ func (ct *controller) runBlp(ctx context.Context) (err error) { log.Infof("trying to find a tablet eligible for vreplication. stream id: %v", ct.id) tablet, err = ct.tabletPicker.PickForStreaming(ctx) if err != nil { + ct.blpStats.ErrorCounts.Add([]string{"No Source Tablet Found"}, 1) return err } log.Infof("found a tablet eligible for vreplication. stream id: %v tablet: %s", ct.id, tablet.Alias.String()) @@ -203,6 +205,7 @@ func (ct *controller) runBlp(ctx context.Context) (err error) { // Table names can have search patterns. Resolve them against the schema. tables, err := mysqlctl.ResolveTables(ctx, ct.mysqld, dbClient.DBName(), ct.source.Tables) if err != nil { + ct.blpStats.ErrorCounts.Add([]string{"Invalid Source"}, 1) return vterrors.Wrap(err, "failed to resolve table names") } @@ -241,6 +244,7 @@ func (ct *controller) runBlp(ctx context.Context) (err error) { vr := newVReplicator(ct.id, &ct.source, vsClient, ct.blpStats, dbClient, ct.mysqld, ct.vre) return vr.Replicate(ctx) } + ct.blpStats.ErrorCounts.Add([]string{"Invalid Source"}, 1) return fmt.Errorf("missing source") } diff --git a/go/vt/vttablet/tabletmanager/vreplication/stats.go b/go/vt/vttablet/tabletmanager/vreplication/stats.go index 90e32c7684b..2a218d98a91 100644 --- a/go/vt/vttablet/tabletmanager/vreplication/stats.go +++ b/go/vt/vttablet/tabletmanager/vreplication/stats.go @@ -252,6 +252,21 @@ func (st *vrStats) register() { } return result }) + stats.NewCountersFuncWithMultiLabels( + "VReplicationErrors", + "Errors during vreplication", + []string{"workflow", "type"}, + func() map[string]int64 { + st.mu.Lock() + defer st.mu.Unlock() + result := make(map[string]int64) + for _, ct := range st.controllers { + for key, val := range ct.blpStats.ErrorCounts.Counts() { + result[fmt.Sprintf("%d_%s", ct.id, key)] = val + } + } + return result + }) } func (st *vrStats) numControllers() int64 { diff --git a/go/vt/vttablet/tabletmanager/vreplication/vplayer.go b/go/vt/vttablet/tabletmanager/vreplication/vplayer.go index ad3ef6f388c..cdfb62ed718 100644 --- a/go/vt/vttablet/tabletmanager/vreplication/vplayer.go +++ b/go/vt/vttablet/tabletmanager/vreplication/vplayer.go @@ -103,6 +103,7 @@ func (vp *vplayer) play(ctx context.Context) error { plan, err := buildReplicatorPlan(vp.vr.source.Filter, vp.vr.pkInfoMap, vp.copyState) if err != nil { + vp.vr.stats.ErrorCounts.Add([]string{"Plan"}, 1) return err } vp.replicatorPlan = plan @@ -366,6 +367,8 @@ func (vp *vplayer) applyEvents(ctx context.Context, relay *relayLog) error { } } if err := vp.applyEvent(ctx, event, mustSave); err != nil { + vp.vr.stats.ErrorCounts.Add([]string{"Apply"}, 1) + log.Errorf("Error applying event: %s", err.Error()) return err } } diff --git a/go/vt/vttablet/tabletmanager/vreplication/vreplicator.go b/go/vt/vttablet/tabletmanager/vreplication/vreplicator.go index 105492a4790..48135c99109 100644 --- a/go/vt/vttablet/tabletmanager/vreplication/vreplicator.go +++ b/go/vt/vttablet/tabletmanager/vreplication/vreplicator.go @@ -121,6 +121,7 @@ func newVReplicator(id uint32, source *binlogdatapb.BinlogSource, sourceVStreame func (vr *vreplicator) Replicate(ctx context.Context) error { err := vr.replicate(ctx) if err != nil { + log.Errorf("Replicate error: %s", err.Error()) if err := vr.setMessage(err.Error()); err != nil { log.Errorf("Failed to set error state: %v", err) } @@ -165,10 +166,12 @@ func (vr *vreplicator) replicate(ctx context.Context) error { return err } if err := newVCopier(vr).copyNext(ctx, settings); err != nil { + vr.stats.ErrorCounts.Add([]string{"Copy"}, 1) return err } case settings.StartPos.IsZero(): if err := newVCopier(vr).initTablesForCopy(ctx); err != nil { + vr.stats.ErrorCounts.Add([]string{"Copy"}, 1) return err } default: @@ -180,6 +183,7 @@ func (vr *vreplicator) replicate(ctx context.Context) error { return vr.setState(binlogplayer.BlpStopped, "Stopped after copy.") } if err := vr.setState(binlogplayer.BlpRunning, ""); err != nil { + vr.stats.ErrorCounts.Add([]string{"Replicate"}, 1) return err } return newVPlayer(vr, settings, nil, mysql.Position{}, "replicate").play(ctx) diff --git a/go/vt/vttablet/tabletserver/binlog_watcher.go b/go/vt/vttablet/tabletserver/binlog_watcher.go index c0e7a0a22a0..ceb7aa0fcbf 100644 --- a/go/vt/vttablet/tabletserver/binlog_watcher.go +++ b/go/vt/vttablet/tabletserver/binlog_watcher.go @@ -51,7 +51,7 @@ func NewBinlogWatcher(env tabletenv.Env, vs VStreamer, config *tabletenv.TabletC return &BinlogWatcher{ env: env, vs: vs, - watchReplication: config.WatchReplication, + watchReplication: config.WatchReplication || config.TrackSchemaVersions, } } @@ -94,7 +94,7 @@ func (blw *BinlogWatcher) process(ctx context.Context) { err := blw.vs.Stream(ctx, "current", nil, filter, func(events []*binlogdatapb.VEvent) error { return nil }) - log.Infof("ReplicatinWatcher VStream ended: %v, retrying in 5 seconds", err) + log.Infof("ReplicationWatcher VStream ended: %v, retrying in 5 seconds", err) select { case <-ctx.Done(): return diff --git a/go/vt/vttablet/tabletserver/schema/engine.go b/go/vt/vttablet/tabletserver/schema/engine.go index cdbcb635d9a..702a21e0617 100644 --- a/go/vt/vttablet/tabletserver/schema/engine.go +++ b/go/vt/vttablet/tabletserver/schema/engine.go @@ -363,6 +363,9 @@ func (se *Engine) reload(ctx context.Context) error { se.tables[k] = t } se.lastChange = curTime + if len(created) > 0 || len(altered) > 0 || len(dropped) > 0 { + log.Infof("schema engine created %v, altered %v, dropped %v", created, altered, dropped) + } se.broadcast(created, altered, dropped) return nil } @@ -415,6 +418,7 @@ func (se *Engine) RegisterVersionEvent() error { func (se *Engine) GetTableForPos(tableName sqlparser.TableIdent, gtid string) (*binlogdatapb.MinimalTable, error) { mt, err := se.historian.GetTableForPos(tableName, gtid) if err != nil { + log.Infof("GetTableForPos returned error: %s", err.Error()) return nil, err } if mt != nil { @@ -424,6 +428,7 @@ func (se *Engine) GetTableForPos(tableName sqlparser.TableIdent, gtid string) (* defer se.mu.Unlock() st, ok := se.tables[tableName.String()] if !ok { + log.Infof("table %v not found in vttablet schema: current tables", tableName.String(), se.tables) return nil, fmt.Errorf("table %v not found in vttablet schema", tableName.String()) } return newMinimalTable(st), nil diff --git a/go/vt/vttablet/tabletserver/state_manager.go b/go/vt/vttablet/tabletserver/state_manager.go index dca164ede23..4a43be11efa 100644 --- a/go/vt/vttablet/tabletserver/state_manager.go +++ b/go/vt/vttablet/tabletserver/state_manager.go @@ -537,11 +537,12 @@ func (sm *stateManager) setTimeBomb() chan struct{} { func (sm *stateManager) setState(tabletType topodatapb.TabletType, state servingState) { sm.mu.Lock() defer sm.mu.Unlock() - if tabletType == topodatapb.TabletType_UNKNOWN { tabletType = sm.wantTabletType } - log.Infof("TabletServer transition: %v -> %v", sm.stateStringLocked(sm.target.TabletType, sm.state), sm.stateStringLocked(tabletType, state)) + log.Infof("TabletServer transition: %v -> %v for tablet %s:%s/%s", + sm.stateStringLocked(sm.target.TabletType, sm.state), sm.stateStringLocked(tabletType, state), + sm.target.Cell, sm.target.Keyspace, sm.target.Shard) sm.handleGracePeriod(tabletType) sm.target.TabletType = tabletType if sm.state == StateNotConnected { diff --git a/go/vt/vttablet/tabletserver/tx_pool.go b/go/vt/vttablet/tabletserver/tx_pool.go index ecfbde88ce2..50b4852ee4a 100644 --- a/go/vt/vttablet/tabletserver/tx_pool.go +++ b/go/vt/vttablet/tabletserver/tx_pool.go @@ -140,6 +140,9 @@ func (tp *TxPool) transactionKiller() { if conn.IsTainted() && conn.IsInTransaction() { tp.env.Stats().KillCounters.Add("Transactions", 1) } + if conn.IsInTransaction() { + tp.txComplete(conn, tx.TxKill) + } conn.Releasef("exceeded timeout: %v", tp.Timeout()) } } @@ -236,6 +239,13 @@ func (tp *TxPool) Begin(ctx context.Context, options *querypb.ExecuteOptions, re return nil, "", vterrors.Errorf(vtrpcpb.Code_RESOURCE_EXHAUSTED, "per-user transaction pool connection limit exceeded") } conn, err = tp.createConn(ctx, options) + defer func() { + if err != nil { + // The transaction limiter frees transactions on rollback or commit. If we fail to create the transaction, + // release immediately since there will be no rollback or commit. + tp.limiter.Release(immediateCaller, effectiveCaller) + } + }() } if err != nil { return nil, "", err diff --git a/go/vt/vttablet/tabletserver/tx_pool_test.go b/go/vt/vttablet/tabletserver/tx_pool_test.go index 0eff2c06d84..53f49da52d8 100644 --- a/go/vt/vttablet/tabletserver/tx_pool_test.go +++ b/go/vt/vttablet/tabletserver/tx_pool_test.go @@ -19,9 +19,11 @@ package tabletserver import ( "context" "fmt" + "sync" "testing" "time" + "vitess.io/vitess/go/vt/callerid" vtrpcpb "vitess.io/vitess/go/vt/proto/vtrpc" "vitess.io/vitess/go/vt/vterrors" @@ -30,8 +32,6 @@ import ( "github.com/stretchr/testify/require" - "vitess.io/vitess/go/vt/vttablet/tabletserver/txlimiter" - "vitess.io/vitess/go/mysql/fakesqldb" "vitess.io/vitess/go/sqltypes" "vitess.io/vitess/go/vt/vttablet/tabletserver/tabletenv" @@ -40,7 +40,7 @@ import ( ) func TestTxPoolExecuteCommit(t *testing.T) { - db, txPool, closer := setup(t) + db, txPool, _, closer := setup(t) defer closer() sql := "select 'this is a query'" @@ -74,7 +74,7 @@ func TestTxPoolExecuteCommit(t *testing.T) { } func TestTxPoolExecuteRollback(t *testing.T) { - db, txPool, closer := setup(t) + db, txPool, _, closer := setup(t) defer closer() conn, _, err := txPool.Begin(ctx, &querypb.ExecuteOptions{}, false, 0, nil) @@ -92,7 +92,7 @@ func TestTxPoolExecuteRollback(t *testing.T) { } func TestTxPoolExecuteRollbackOnClosedConn(t *testing.T) { - db, txPool, closer := setup(t) + db, txPool, _, closer := setup(t) defer closer() conn, _, err := txPool.Begin(ctx, &querypb.ExecuteOptions{}, false, 0, nil) @@ -109,7 +109,7 @@ func TestTxPoolExecuteRollbackOnClosedConn(t *testing.T) { } func TestTxPoolRollbackNonBusy(t *testing.T) { - db, txPool, closer := setup(t) + db, txPool, _, closer := setup(t) defer closer() // start two transactions, and mark one of them as unused @@ -135,7 +135,7 @@ func TestTxPoolRollbackNonBusy(t *testing.T) { } func TestTxPoolTransactionIsolation(t *testing.T) { - db, txPool, closer := setup(t) + db, txPool, _, closer := setup(t) defer closer() c2, _, err := txPool.Begin(ctx, &querypb.ExecuteOptions{TransactionIsolation: querypb.ExecuteOptions_READ_COMMITTED}, false, 0, nil) @@ -146,7 +146,7 @@ func TestTxPoolTransactionIsolation(t *testing.T) { } func TestTxPoolAutocommit(t *testing.T) { - db, txPool, closer := setup(t) + db, txPool, _, closer := setup(t) defer closer() // Start a transaction with autocommit. This will ensure that the executor does not send begin/commit statements @@ -192,7 +192,7 @@ func TestTxPoolBeginWithPoolConnectionError_Errno2006_Transient(t *testing.T) { func primeTxPoolWithConnection(t *testing.T) (*fakesqldb.DB, *TxPool) { t.Helper() db := fakesqldb.New(t) - txPool := newTxPool() + txPool, _ := newTxPool() // Set the capacity to 1 to ensure that the db connection is reused. txPool.scp.conns.SetCapacity(1) txPool.Open(db.ConnParams(), db.ConnParams(), db.ConnParams()) @@ -209,17 +209,42 @@ func primeTxPoolWithConnection(t *testing.T) (*fakesqldb.DB, *TxPool) { } func TestTxPoolBeginWithError(t *testing.T) { - db, txPool, closer := setup(t) + db, txPool, limiter, closer := setup(t) defer closer() db.AddRejectedQuery("begin", errRejected) - _, _, err := txPool.Begin(ctx, &querypb.ExecuteOptions{}, false, 0, nil) + + im := &querypb.VTGateCallerID{ + Username: "user", + } + ef := &vtrpcpb.CallerID{ + Principal: "principle", + } + + ctxWithCallerId := callerid.NewContext(ctx, ef, im) + _, _, err := txPool.Begin(ctxWithCallerId, &querypb.ExecuteOptions{}, false, 0, nil) require.Error(t, err) require.Contains(t, err.Error(), "error: rejected") require.Equal(t, vtrpcpb.Code_UNKNOWN, vterrors.Code(err), "wrong error code for Begin error") + + // Regression test for #6727: make sure the tx limiter is decremented if grabbing a connection + // errors for whatever reason. + require.Equal(t, + []fakeLimiterEntry{ + { + immediate: im, + effective: ef, + isRelease: false, + }, + { + immediate: im, + effective: ef, + isRelease: true, + }, + }, limiter.Actions()) } func TestTxPoolBeginWithPreQueryError(t *testing.T) { - db, txPool, closer := setup(t) + db, txPool, _, closer := setup(t) defer closer() db.AddRejectedQuery("pre_query", errRejected) _, _, err := txPool.Begin(ctx, &querypb.ExecuteOptions{}, false, 0, []string{"pre_query"}) @@ -230,7 +255,7 @@ func TestTxPoolBeginWithPreQueryError(t *testing.T) { func TestTxPoolCancelledContextError(t *testing.T) { // given - db, txPool, closer := setup(t) + db, txPool, _, closer := setup(t) defer closer() ctx, cancel := context.WithCancel(ctx) cancel() @@ -251,7 +276,7 @@ func TestTxPoolWaitTimeoutError(t *testing.T) { env.Config().TxPool.MaxWaiters = 0 env.Config().TxPool.TimeoutSeconds = 1 // given - db, txPool, closer := setupWithEnv(t, env) + db, txPool, _, closer := setupWithEnv(t, env) defer closer() // lock the only connection in the pool. @@ -272,7 +297,7 @@ func TestTxPoolWaitTimeoutError(t *testing.T) { func TestTxPoolRollbackFailIsPassedThrough(t *testing.T) { sql := "alter table test_table add test_column int" - db, txPool, closer := setup(t) + db, txPool, _, closer := setup(t) defer closer() db.AddRejectedQuery("rollback", errRejected) @@ -291,7 +316,7 @@ func TestTxPoolRollbackFailIsPassedThrough(t *testing.T) { } func TestTxPoolGetConnRecentlyRemovedTransaction(t *testing.T) { - db, txPool, _ := setup(t) + db, txPool, _, _ := setup(t) defer db.Close() conn1, _, _ := txPool.Begin(ctx, &querypb.ExecuteOptions{}, false, 0, nil) id := conn1.ID() @@ -312,7 +337,7 @@ func TestTxPoolGetConnRecentlyRemovedTransaction(t *testing.T) { assertErrorMatch(id, "pool closed") - txPool = newTxPool() + txPool, _ = newTxPool() txPool.Open(db.ConnParams(), db.ConnParams(), db.ConnParams()) conn1, _, _ = txPool.Begin(ctx, &querypb.ExecuteOptions{}, false, 0, nil) @@ -324,7 +349,7 @@ func TestTxPoolGetConnRecentlyRemovedTransaction(t *testing.T) { assertErrorMatch(id, "transaction committed") - txPool = newTxPool() + txPool, _ = newTxPool() txPool.SetTimeout(1 * time.Millisecond) txPool.Open(db.ConnParams(), db.ConnParams(), db.ConnParams()) defer txPool.Close() @@ -338,7 +363,7 @@ func TestTxPoolGetConnRecentlyRemovedTransaction(t *testing.T) { } func TestTxPoolCloseKillsStrayTransactions(t *testing.T) { - _, txPool, closer := setup(t) + _, txPool, _, closer := setup(t) defer closer() startingStray := txPool.env.Stats().InternalErrors.Counts()["StrayTransactions"] @@ -354,13 +379,59 @@ func TestTxPoolCloseKillsStrayTransactions(t *testing.T) { require.Equal(t, 0, txPool.scp.Capacity()) } -func newTxPool() *TxPool { +func TestTxTimeoutKillsTransactions(t *testing.T) { + env := newEnv("TabletServerTest") + env.Config().TxPool.Size = 1 + env.Config().TxPool.MaxWaiters = 0 + env.Config().Oltp.TxTimeoutSeconds = 1 + _, txPool, limiter, closer := setupWithEnv(t, env) + defer closer() + startingKills := txPool.env.Stats().KillCounters.Counts()["Transactions"] + + im := &querypb.VTGateCallerID{ + Username: "user", + } + ef := &vtrpcpb.CallerID{ + Principal: "principle", + } + + ctxWithCallerId := callerid.NewContext(ctx, ef, im) + + // Start transaction. + conn, _, err := txPool.Begin(ctxWithCallerId, &querypb.ExecuteOptions{}, false, 0, nil) + require.NoError(t, err) + conn.Unlock() + + // Let it time out and get killed by the tx killer. + time.Sleep(1200 * time.Millisecond) + + // Verify that the tx killer rand. + require.Equal(t, int64(1), txPool.env.Stats().KillCounters.Counts()["Transactions"]-startingKills) + + // Regression test for #6727: make sure the tx limiter is decremented when the tx killer closes + // a transaction. + require.Equal(t, + []fakeLimiterEntry{ + { + immediate: im, + effective: ef, + isRelease: false, + }, + { + immediate: im, + effective: ef, + isRelease: true, + }, + }, limiter.Actions()) +} + +func newTxPool() (*TxPool, *fakeLimiter) { return newTxPoolWithEnv(newEnv("TabletServerTest")) } -func newTxPoolWithEnv(env tabletenv.Env) *TxPool { - limiter := &txlimiter.TxAllowAll{} - return NewTxPool(env, limiter) +func newTxPoolWithEnv(env tabletenv.Env) (*TxPool, *fakeLimiter) { + limiter := &fakeLimiter{} + return NewTxPool(env, limiter), limiter } func newEnv(exporterName string) tabletenv.Env { @@ -376,27 +447,67 @@ func newEnv(exporterName string) tabletenv.Env { return env } -func setup(t *testing.T) (*fakesqldb.DB, *TxPool, func()) { +type fakeLimiterEntry struct { + immediate *querypb.VTGateCallerID + effective *vtrpcpb.CallerID + isRelease bool +} + +type fakeLimiter struct { + actions []fakeLimiterEntry + mu sync.Mutex +} + +func (fl *fakeLimiter) Get(immediate *querypb.VTGateCallerID, effective *vtrpcpb.CallerID) bool { + fl.mu.Lock() + defer fl.mu.Unlock() + fl.actions = append(fl.actions, fakeLimiterEntry{ + immediate: immediate, + effective: effective, + isRelease: false, + }) + return true +} + +func (fl *fakeLimiter) Release(immediate *querypb.VTGateCallerID, effective *vtrpcpb.CallerID) { + fl.mu.Lock() + defer fl.mu.Unlock() + fl.actions = append(fl.actions, fakeLimiterEntry{ + immediate: immediate, + effective: effective, + isRelease: true, + }) +} + +func (fl *fakeLimiter) Actions() []fakeLimiterEntry { + fl.mu.Lock() + defer fl.mu.Unlock() + result := make([]fakeLimiterEntry, len(fl.actions)) + copy(result, fl.actions) + return result +} + +func setup(t *testing.T) (*fakesqldb.DB, *TxPool, *fakeLimiter, func()) { db := fakesqldb.New(t) db.AddQueryPattern(".*", &sqltypes.Result{}) - txPool := newTxPool() + txPool, limiter := newTxPool() txPool.Open(db.ConnParams(), db.ConnParams(), db.ConnParams()) - return db, txPool, func() { + return db, txPool, limiter, func() { txPool.Close() db.Close() } } -func setupWithEnv(t *testing.T, env tabletenv.Env) (*fakesqldb.DB, *TxPool, func()) { +func setupWithEnv(t *testing.T, env tabletenv.Env) (*fakesqldb.DB, *TxPool, *fakeLimiter, func()) { db := fakesqldb.New(t) db.AddQueryPattern(".*", &sqltypes.Result{}) - txPool := newTxPoolWithEnv(env) + txPool, limiter := newTxPoolWithEnv(env) txPool.Open(db.ConnParams(), db.ConnParams(), db.ConnParams()) - return db, txPool, func() { + return db, txPool, limiter, func() { txPool.Close() db.Close() } diff --git a/go/vt/vttablet/tabletserver/vstreamer/copy.go b/go/vt/vttablet/tabletserver/vstreamer/copy.go index 8cc08f7a329..a02d273b87b 100644 --- a/go/vt/vttablet/tabletserver/vstreamer/copy.go +++ b/go/vt/vttablet/tabletserver/vstreamer/copy.go @@ -37,6 +37,7 @@ func (uvs *uvstreamer) copy(ctx context.Context) error { tableName := uvs.tablesToCopy[0] log.V(2).Infof("Copystate not empty starting catchupAndCopy on table %s", tableName) if err := uvs.catchupAndCopy(ctx, tableName); err != nil { + uvs.vse.errorCounts.Add("Copy", 1) return err } } @@ -50,6 +51,7 @@ func (uvs *uvstreamer) catchupAndCopy(ctx context.Context, tableName string) err if !uvs.pos.IsZero() { if err := uvs.catchup(ctx); err != nil { log.Infof("catchupAndCopy: catchup returned %v", err) + uvs.vse.errorCounts.Add("Catchup", 1) return err } } @@ -265,6 +267,7 @@ func (uvs *uvstreamer) copyTable(ctx context.Context, tableName string) error { return nil }) if err != nil { + uvs.vse.errorCounts.Add("StreamRows", 1) return err } diff --git a/go/vt/vttablet/tabletserver/vstreamer/engine.go b/go/vt/vttablet/tabletserver/vstreamer/engine.go index 532a2e48ef0..5ddc4ecaeaf 100644 --- a/go/vt/vttablet/tabletserver/vstreamer/engine.go +++ b/go/vt/vttablet/tabletserver/vstreamer/engine.go @@ -73,14 +73,17 @@ type Engine struct { vschemaUpdates *stats.Counter // vstreamer metrics - vstreamerPhaseTimings *servenv.TimingsWrapper - vstreamerEventsStreamed *stats.Counter - vstreamerPacketSize *stats.GaugeFunc - vstreamerNumPackets *stats.Counter - resultStreamerNumRows *stats.Counter - resultStreamerNumPackets *stats.Counter - rowStreamerNumRows *stats.Counter - rowStreamerNumPackets *stats.Counter + vstreamerPhaseTimings *servenv.TimingsWrapper + vstreamerEventsStreamed *stats.Counter + vstreamerPacketSize *stats.GaugeFunc + vstreamerNumPackets *stats.Counter + resultStreamerNumRows *stats.Counter + resultStreamerNumPackets *stats.Counter + rowStreamerNumRows *stats.Counter + rowStreamerNumPackets *stats.Counter + errorCounts *stats.CountersWithSingleLabel + vstreamersCreated *stats.Counter + vstreamersEndedWithErrors *stats.Counter } // NewEngine creates a new Engine. @@ -102,14 +105,17 @@ func NewEngine(env tabletenv.Env, ts srvtopo.Server, se *schema.Engine, cell str vschemaErrors: env.Exporter().NewCounter("VSchemaErrors", "Count of VSchema errors"), vschemaUpdates: env.Exporter().NewCounter("VSchemaUpdates", "Count of VSchema updates. Does not include errors"), - vstreamerPhaseTimings: env.Exporter().NewTimings("VStreamerPhaseTiming", "Time taken for different phases during vstream copy", "phase-timing"), - vstreamerEventsStreamed: env.Exporter().NewCounter("VStreamerEventsStreamed", "Count of events streamed in VStream API"), - vstreamerPacketSize: env.Exporter().NewGaugeFunc("VStreamPacketSize", "Max packet size for sending vstreamer events", getPacketSize), - vstreamerNumPackets: env.Exporter().NewCounter("VStreamerNumPackets", "Number of packets in vstreamer"), - resultStreamerNumPackets: env.Exporter().NewCounter("ResultStreamerNumPackets", "Number of packets in result streamer"), - resultStreamerNumRows: env.Exporter().NewCounter("ResultStreamerNumRows", "Number of rows sent in result streamer"), - rowStreamerNumPackets: env.Exporter().NewCounter("RowStreamerNumPackets", "Number of packets in row streamer"), - rowStreamerNumRows: env.Exporter().NewCounter("RowStreamerNumRows", "Number of rows sent in row streamer"), + vstreamerPhaseTimings: env.Exporter().NewTimings("VStreamerPhaseTiming", "Time taken for different phases during vstream copy", "phase-timing"), + vstreamerEventsStreamed: env.Exporter().NewCounter("VStreamerEventsStreamed", "Count of events streamed in VStream API"), + vstreamerPacketSize: env.Exporter().NewGaugeFunc("VStreamPacketSize", "Max packet size for sending vstreamer events", getPacketSize), + vstreamerNumPackets: env.Exporter().NewCounter("VStreamerNumPackets", "Number of packets in vstreamer"), + resultStreamerNumPackets: env.Exporter().NewCounter("ResultStreamerNumPackets", "Number of packets in result streamer"), + resultStreamerNumRows: env.Exporter().NewCounter("ResultStreamerNumRows", "Number of rows sent in result streamer"), + rowStreamerNumPackets: env.Exporter().NewCounter("RowStreamerNumPackets", "Number of packets in row streamer"), + rowStreamerNumRows: env.Exporter().NewCounter("RowStreamerNumRows", "Number of rows sent in row streamer"), + vstreamersCreated: env.Exporter().NewCounter("VStreamersCreated", "Count of vstreamers created"), + vstreamersEndedWithErrors: env.Exporter().NewCounter("VStreamersEndedWithErrors", "Count of vstreamers that ended with errors"), + errorCounts: env.Exporter().NewCountersWithSingleLabel("VStreamerErrors", "Tracks errors in vstreamer", "type", "Catchup", "Copy", "Send", "TablePlan"), } env.Exporter().HandleFunc("/debug/tablet_vschema", vse.ServeHTTP) return vse diff --git a/go/vt/vttablet/tabletserver/vstreamer/planbuilder.go b/go/vt/vttablet/tabletserver/vstreamer/planbuilder.go index f593dbb1cf8..a61ce1bf1ba 100644 --- a/go/vt/vttablet/tabletserver/vstreamer/planbuilder.go +++ b/go/vt/vttablet/tabletserver/vstreamer/planbuilder.go @@ -308,9 +308,11 @@ func buildREPlan(ti *Table, vschema *localVSchema, filter string) (*Plan, error) func buildTablePlan(ti *Table, vschema *localVSchema, query string) (*Plan, error) { sel, fromTable, err := analyzeSelect(query) if err != nil { + log.Errorf("%s", err.Error()) return nil, err } if fromTable.String() != ti.Name { + log.Errorf("unsupported: select expression table %v does not match the table entry name %s", sqlparser.String(fromTable), ti.Name) return nil, fmt.Errorf("unsupported: select expression table %v does not match the table entry name %s", sqlparser.String(fromTable), ti.Name) } @@ -318,9 +320,11 @@ func buildTablePlan(ti *Table, vschema *localVSchema, query string) (*Plan, erro Table: ti, } if err := plan.analyzeWhere(vschema, sel.Where); err != nil { + log.Errorf("%s", err.Error()) return nil, err } if err := plan.analyzeExprs(vschema, sel.SelectExprs); err != nil { + log.Errorf("%s", err.Error()) return nil, err } diff --git a/go/vt/vttablet/tabletserver/vstreamer/rowstreamer.go b/go/vt/vttablet/tabletserver/vstreamer/rowstreamer.go index 56d02f74ffc..4e8d921b823 100644 --- a/go/vt/vttablet/tabletserver/vstreamer/rowstreamer.go +++ b/go/vt/vttablet/tabletserver/vstreamer/rowstreamer.go @@ -93,11 +93,9 @@ func (rs *rowStreamer) Stream() error { if err := rs.se.Open(); err != nil { return err } - if err := rs.buildPlan(); err != nil { return err } - conn, err := snapshotConnect(rs.ctx, rs.cp) if err != nil { return err @@ -130,6 +128,7 @@ func (rs *rowStreamer) buildPlan() error { // filtering will work. rs.plan, err = buildTablePlan(ti, rs.vschema, rs.query) if err != nil { + log.Errorf("%s", err.Error()) return err } rs.pkColumns, err = buildPKColumns(st) @@ -140,7 +139,6 @@ func (rs *rowStreamer) buildPlan() error { if err != nil { return err } - log.Infof("Rowstreamer, table plan %v, pkColumns %v, fields %v", rs.plan, rs.pkColumns, rs.plan.fields()) return err } diff --git a/go/vt/vttablet/tabletserver/vstreamer/uvstreamer.go b/go/vt/vttablet/tabletserver/vstreamer/uvstreamer.go index 6ed3db5bf29..b3caa498fab 100644 --- a/go/vt/vttablet/tabletserver/vstreamer/uvstreamer.go +++ b/go/vt/vttablet/tabletserver/vstreamer/uvstreamer.go @@ -286,6 +286,9 @@ func (uvs *uvstreamer) send2(evs []*binlogdatapb.VEvent) error { } } } + if err != nil { + uvs.vse.errorCounts.Add("Send", 1) + } return err } @@ -298,7 +301,7 @@ func (uvs *uvstreamer) sendEventsForCurrentPos() error { Type: binlogdatapb.VEventType_OTHER, }} if err := uvs.send(evs); err != nil { - return wrapError(err, uvs.pos) + return wrapError(err, uvs.pos, uvs.vse) } return nil } @@ -320,6 +323,7 @@ func (uvs *uvstreamer) setStreamStartPosition() error { return vterrors.Wrap(err, "could not decode position") } if !curPos.AtLeast(pos) { + uvs.vse.errorCounts.Add("GTIDSet Mismatch", 1) return fmt.Errorf("GTIDSet Mismatch: requested source position:%v, current target vrep position: %v", mysql.EncodePosition(pos), mysql.EncodePosition(curPos)) } uvs.pos = pos @@ -362,6 +366,7 @@ func (uvs *uvstreamer) Stream() error { log.Info("TablePKs is not nil: starting vs.copy()") if err := uvs.copy(uvs.ctx); err != nil { log.Infof("uvstreamer.Stream() copy returned with err %s", err) + uvs.vse.errorCounts.Add("Copy", 1) return err } uvs.sendTestEvent("Copy Done") diff --git a/go/vt/vttablet/tabletserver/vstreamer/uvstreamer_test.go b/go/vt/vttablet/tabletserver/vstreamer/uvstreamer_test.go index c9cf44a6c55..1d3f3e7e044 100644 --- a/go/vt/vttablet/tabletserver/vstreamer/uvstreamer_test.go +++ b/go/vt/vttablet/tabletserver/vstreamer/uvstreamer_test.go @@ -308,8 +308,6 @@ func resetMetrics(t *testing.T) { engine.resultStreamerNumRows.Reset() engine.rowStreamerNumRows.Reset() engine.vstreamerPhaseTimings.Reset() - engine.vstreamerPhaseTimings.Reset() - engine.vstreamerPhaseTimings.Reset() } func validateMetrics(t *testing.T) { diff --git a/go/vt/vttablet/tabletserver/vstreamer/vstreamer.go b/go/vt/vttablet/tabletserver/vstreamer/vstreamer.go index cfe453298ca..6d387beee85 100644 --- a/go/vt/vttablet/tabletserver/vstreamer/vstreamer.go +++ b/go/vt/vttablet/tabletserver/vstreamer/vstreamer.go @@ -147,9 +147,12 @@ func (vs *vstreamer) Stream() error { //defer vs.cancel() ctx := context.Background() defer ctx.Done() + vs.vse.vstreamersCreated.Add(1) log.Infof("Starting Stream() with startPos %s", vs.startPos) pos, err := mysql.DecodePosition(vs.startPos) if err != nil { + vs.vse.errorCounts.Add("StreamRows", 1) + vs.vse.vstreamersEndedWithErrors.Add(1) return err } vs.pos = pos @@ -161,21 +164,21 @@ func (vs *vstreamer) replicate(ctx context.Context) error { // Ensure se is Open. If vttablet came up in a non_serving role, // the schema engine may not have been initialized. if err := vs.se.Open(); err != nil { - return wrapError(err, vs.pos) + return wrapError(err, vs.pos, vs.vse) } conn, err := binlog.NewBinlogConnection(vs.cp) if err != nil { - return wrapError(err, vs.pos) + return wrapError(err, vs.pos, vs.vse) } defer conn.Close() events, err := conn.StartBinlogDumpFromPosition(vs.ctx, vs.pos) if err != nil { - return wrapError(err, vs.pos) + return wrapError(err, vs.pos, vs.vse) } err = vs.parseEvents(vs.ctx, events) - return wrapError(err, vs.pos) + return wrapError(err, vs.pos, vs.vse) } // parseEvents parses and sends events. @@ -252,6 +255,7 @@ func (vs *vstreamer) parseEvents(ctx context.Context, events <-chan mysql.Binlog case binlogdatapb.VEventType_SAVEPOINT: bufferedEvents = append(bufferedEvents, vevent) default: + vs.vse.errorCounts.Add("BufferAndTransmit", 1) return fmt.Errorf("unexpected event: %v", vevent) } return nil @@ -280,6 +284,7 @@ func (vs *vstreamer) parseEvents(ctx context.Context, events <-chan mysql.Binlog } vevents, err := vs.parseEvent(ev) if err != nil { + vs.vse.errorCounts.Add("ParseEvent", 1) return err } for _, vevent := range vevents { @@ -287,6 +292,7 @@ func (vs *vstreamer) parseEvents(ctx context.Context, events <-chan mysql.Binlog if err == io.EOF { return nil } + vs.vse.errorCounts.Add("BufferAndTransmit", 1) return fmt.Errorf("error sending event: %v", err) } } @@ -308,6 +314,7 @@ func (vs *vstreamer) parseEvents(ctx context.Context, events <-chan mysql.Binlog if err == io.EOF { return nil } + vs.vse.errorCounts.Add("Send", 1) return fmt.Errorf("error sending event: %v", err) } } @@ -503,6 +510,7 @@ func (vs *vstreamer) parseEvent(ev mysql.BinlogEvent) ([]*binlogdatapb.VEvent, e vevent, err := vs.buildTablePlan(id, tm) if err != nil { + vs.vse.errorCounts.Add("TablePlan", 1) return nil, err } if vevent != nil { @@ -538,7 +546,6 @@ func (vs *vstreamer) parseEvent(ev mysql.BinlogEvent) ([]*binlogdatapb.VEvent, e if err != nil { return nil, err } - } for _, vevent := range vevents { vevent.Timestamp = int64(ev.Timestamp()) @@ -807,8 +814,10 @@ func (vs *vstreamer) extractRowAndFilter(plan *streamerPlan, data []byte, dataCo return plan.filter(values) } -func wrapError(err error, stopPos mysql.Position) error { +func wrapError(err error, stopPos mysql.Position, vse *Engine) error { if err != nil { + vse.vstreamersEndedWithErrors.Add(1) + vse.errorCounts.Add("StreamEnded", 1) err = fmt.Errorf("stream (at source tablet) error @ %v: %v", stopPos, err) log.Error(err) return err diff --git a/go/vt/wrangler/fake_dbclient_test.go b/go/vt/wrangler/fake_dbclient_test.go index 6c05ff5015e..11fee5d68fa 100644 --- a/go/vt/wrangler/fake_dbclient_test.go +++ b/go/vt/wrangler/fake_dbclient_test.go @@ -21,6 +21,8 @@ import ( "regexp" "testing" + "github.com/stretchr/testify/assert" + "vitess.io/vitess/go/sqltypes" ) @@ -44,7 +46,7 @@ type dbResult struct { func (dbrs *dbResults) next(query string) (*sqltypes.Result, error) { if dbrs.exhausted() { - return nil, fmt.Errorf("query results exhausted: %s", query) + return nil, fmt.Errorf("code executed this query, but the test did not expect it: %s", query) } i := dbrs.index dbrs.index++ @@ -127,6 +129,9 @@ func (dc *fakeDBClient) Close() { // ExecuteFetch is part of the DBClient interface func (dc *fakeDBClient) ExecuteFetch(query string, maxrows int) (qr *sqltypes.Result, err error) { + if testMode == "debug" { + fmt.Printf("ExecuteFetch: %s\n", query) + } if dbrs := dc.queries[query]; dbrs != nil { return dbrs.next(query) } @@ -145,12 +150,12 @@ func (dc *fakeDBClient) verifyQueries(t *testing.T) { t.Helper() for query, dbrs := range dc.queries { if !dbrs.exhausted() { - t.Errorf("query: %v has unreturned results", query) + assert.FailNow(t, "expected query: %v did not get executed during the test", query) } } for query, dbrs := range dc.queriesRE { if !dbrs.exhausted() { - t.Errorf("query: %v has unreturned results", query) + assert.FailNow(t, "expected regex query: %v did not get executed during the test", query) } } } diff --git a/go/vt/wrangler/keyspace.go b/go/vt/wrangler/keyspace.go index 3846f443ca1..6d59cbc60d9 100644 --- a/go/vt/wrangler/keyspace.go +++ b/go/vt/wrangler/keyspace.go @@ -113,16 +113,27 @@ func (wr *Wrangler) validateNewWorkflow(ctx context.Context, keyspace, workflow allErrors.RecordError(vterrors.Wrap(err, "validateWorkflowName.GetTablet")) return } - - query := fmt.Sprintf("select 1 from _vt.vreplication where db_name=%s and workflow=%s", encodeString(master.DbName()), encodeString(workflow)) - p3qr, err := wr.tmc.VReplicationExec(ctx, master.Tablet, query) - if err != nil { - allErrors.RecordError(vterrors.Wrap(err, "validateWorkflowName.VReplicationExec")) - return - } - if len(p3qr.Rows) != 0 { - allErrors.RecordError(fmt.Errorf("workflow %s already exists in keyspace %s", workflow, keyspace)) - return + validations := []struct { + query string + msg string + }{{ + fmt.Sprintf("select 1 from _vt.vreplication where db_name=%s and workflow=%s", encodeString(master.DbName()), encodeString(workflow)), + fmt.Sprintf("workflow %s already exists in keyspace %s on tablet %d", workflow, keyspace, master.Alias.Uid), + }, { + fmt.Sprintf("select 1 from _vt.vreplication where db_name=%s and message='FROZEN'", encodeString(master.DbName())), + fmt.Sprintf("workflow %s.%s is in a frozen state on tablet %d, please review and delete it before resharding", + keyspace, workflow, master.Alias.Uid), + }} + for _, validation := range validations { + p3qr, err := wr.tmc.VReplicationExec(ctx, master.Tablet, validation.query) + if err != nil { + allErrors.RecordError(vterrors.Wrap(err, "validateWorkflowName.VReplicationExec")) + return + } + if p3qr != nil && len(p3qr.Rows) != 0 { + allErrors.RecordError(vterrors.Wrap(fmt.Errorf(validation.msg), "validateWorkflowName.VReplicationExec")) + return + } } }(si) } diff --git a/go/vt/wrangler/materializer.go b/go/vt/wrangler/materializer.go index 90002612d00..01bfed3082a 100644 --- a/go/vt/wrangler/materializer.go +++ b/go/vt/wrangler/materializer.go @@ -18,12 +18,16 @@ package wrangler import ( "fmt" + "hash/fnv" + "math" + "sort" "strings" "sync" "text/template" "vitess.io/vitess/go/vt/log" "vitess.io/vitess/go/vt/mysqlctl/tmutils" + querypb "vitess.io/vitess/go/vt/proto/query" "vitess.io/vitess/go/vt/vtgate/evalengine" "github.com/golang/protobuf/proto" @@ -60,27 +64,36 @@ const ( // MoveTables initiates moving table(s) over to another keyspace func (wr *Wrangler) MoveTables(ctx context.Context, workflow, sourceKeyspace, targetKeyspace, tableSpecs, cell, tabletTypes string) error { var tables []string + var err error + var vschema *vschemapb.Keyspace + vschema, err = wr.ts.GetVSchema(ctx, targetKeyspace) if strings.HasPrefix(tableSpecs, "{") { + if vschema.Tables == nil { + vschema.Tables = make(map[string]*vschemapb.Table) + } wrap := fmt.Sprintf(`{"tables": %s}`, tableSpecs) ks := &vschemapb.Keyspace{} if err := json2.Unmarshal([]byte(wrap), ks); err != nil { return err } - var err error - vschema, err = wr.ts.GetVSchema(ctx, targetKeyspace) if err != nil { return err } - if vschema.Tables == nil { - vschema.Tables = make(map[string]*vschemapb.Table) - } for table, vtab := range ks.Tables { vschema.Tables[table] = vtab tables = append(tables, table) } } else { tables = strings.Split(tableSpecs, ",") + if !vschema.Sharded { + if vschema.Tables == nil { + vschema.Tables = make(map[string]*vschemapb.Table) + } + for _, table := range tables { + vschema.Tables[table] = &vschemapb.Table{} + } + } } // Save routing rules before vschema. If we save vschema first, and routing rules @@ -122,7 +135,76 @@ func (wr *Wrangler) MoveTables(ctx context.Context, workflow, sourceKeyspace, ta CreateDdl: createDDLAsCopy, }) } - return wr.Materialize(ctx, ms) + mz, err := wr.prepareMaterializerStreams(ctx, ms) + if err != nil { + return err + } + tabletShards, err := wr.collectTargetStreams(ctx, mz) + if err != nil { + return err + } + + migrationID, err := getMigrationID(targetKeyspace, tabletShards) + if err != nil { + return err + } + + exists, tablets, err := wr.checkIfPreviousJournalExists(ctx, mz, migrationID) + if err != nil { + return err + } + if exists { + wr.Logger().Errorf("Found a previous journal entry for %d", migrationID) + msg := fmt.Sprintf("found an entry from a previous run for migration id %d in _vt.resharding_journal of tablets %s,", + migrationID, strings.Join(tablets, ",")) + msg += fmt.Sprintf("please review and delete it before proceeding and restart the workflow using the Workflow %s.%s start", + workflow, targetKeyspace) + return fmt.Errorf(msg) + } + return mz.startStreams(ctx) +} + +func (wr *Wrangler) checkIfPreviousJournalExists(ctx context.Context, mz *materializer, migrationID int64) (bool, []string, error) { + forAllSources := func(f func(*topo.ShardInfo) error) error { + var wg sync.WaitGroup + allErrors := &concurrency.AllErrorRecorder{} + for _, sourceShard := range mz.sourceShards { + wg.Add(1) + go func(sourceShard *topo.ShardInfo) { + defer wg.Done() + + if err := f(sourceShard); err != nil { + allErrors.RecordError(err) + } + }(sourceShard) + } + wg.Wait() + return allErrors.AggrError(vterrors.Aggregate) + } + + var mu sync.Mutex + var exists bool + var tablets []string + err := forAllSources(func(si *topo.ShardInfo) error { + tablet, err := wr.ts.GetTablet(ctx, si.MasterAlias) + if err != nil { + return err + } + if tablet == nil { + return nil + } + _, exists, err = wr.checkIfJournalExistsOnTablet(ctx, tablet.Tablet, migrationID) + if err != nil { + return err + } + if exists { + mu.Lock() + defer mu.Unlock() + tablets = append(tablets, tablet.AliasString()) + } + return nil + }) + return exists, tablets, err } // CreateLookupVindex creates a lookup vindex and sets up the backfill. @@ -533,23 +615,77 @@ func (wr *Wrangler) ExternalizeVindex(ctx context.Context, qualifiedVindexName s return wr.ts.SaveVSchema(ctx, sourceKeyspace, sourceVSchema) } -// Materialize performs the steps needed to materialize a list of tables based on the materialization specs. -func (wr *Wrangler) Materialize(ctx context.Context, ms *vtctldatapb.MaterializeSettings) error { +// +func (wr *Wrangler) collectTargetStreams(ctx context.Context, mz *materializer) ([]string, error) { + var shardTablets []string + var mu sync.Mutex + err := mz.forAllTargets(func(target *topo.ShardInfo) error { + var qrproto *querypb.QueryResult + var id int64 + var err error + targetMaster, err := mz.wr.ts.GetTablet(ctx, target.MasterAlias) + if err != nil { + return vterrors.Wrapf(err, "GetTablet(%v) failed", target.MasterAlias) + } + query := fmt.Sprintf("select id from _vt.vreplication where db_name=%s and workflow=%s", encodeString(targetMaster.DbName()), encodeString(mz.ms.Workflow)) + if qrproto, err = mz.wr.tmc.VReplicationExec(ctx, targetMaster.Tablet, query); err != nil { + return vterrors.Wrapf(err, "VReplicationExec(%v, %s)", targetMaster.Tablet, query) + } + qr := sqltypes.Proto3ToResult(qrproto) + for i := 0; i < len(qr.Rows); i++ { + id, err = evalengine.ToInt64(qr.Rows[i][0]) + if err != nil { + return err + } + mu.Lock() + shardTablets = append(shardTablets, fmt.Sprintf("%s:%d", target.ShardName(), id)) + mu.Unlock() + } + return nil + }) + if err != nil { + return nil, err + } + return shardTablets, nil +} + +// getMigrationID produces a reproducible hash based on the input parameters. +func getMigrationID(targetKeyspace string, shardTablets []string) (int64, error) { + sort.Strings(shardTablets) + hasher := fnv.New64() + hasher.Write([]byte(targetKeyspace)) + for _, str := range shardTablets { + hasher.Write([]byte(str)) + } + // Convert to int64 after dropping the highest bit. + return int64(hasher.Sum64() & math.MaxInt64), nil +} + +func (wr *Wrangler) prepareMaterializerStreams(ctx context.Context, ms *vtctldatapb.MaterializeSettings) (*materializer, error) { if err := wr.validateNewWorkflow(ctx, ms.TargetKeyspace, ms.Workflow); err != nil { - return err + return nil, err } mz, err := wr.buildMaterializer(ctx, ms) if err != nil { - return err + return nil, err } if err := mz.deploySchema(ctx); err != nil { - return err + return nil, err } inserts, err := mz.generateInserts(ctx) if err != nil { - return err + return nil, err } if err := mz.createStreams(ctx, inserts); err != nil { + return nil, err + } + return mz, nil +} + +// Materialize performs the steps needed to materialize a list of tables based on the materialization specs. +func (wr *Wrangler) Materialize(ctx context.Context, ms *vtctldatapb.MaterializeSettings) error { + mz, err := wr.prepareMaterializerStreams(ctx, ms) + if err != nil { return err } return mz.startStreams(ctx) @@ -598,13 +734,11 @@ func (mz *materializer) getSourceTableDDLs(ctx context.Context) (map[string]stri return nil, fmt.Errorf("source shard must have a master for copying schema: %v", mz.sourceShards[0].ShardName()) } - log.Infof("getting table schemas from source master %v...", sourceMaster) var err error sourceSchema, err := mz.wr.GetSchema(ctx, sourceMaster, allTables, nil, false) if err != nil { return nil, err } - log.Infof("got table schemas from source master %v.", sourceMaster) for _, td := range sourceSchema.TableDefinitions { sourceDDLs[td.Name] = td.Schema @@ -620,12 +754,10 @@ func (mz *materializer) deploySchema(ctx context.Context) error { allTables := []string{"/.*/"} hasTargetTable := map[string]bool{} - log.Infof("getting table schemas from target master %v...", target.MasterAlias) targetSchema, err := mz.wr.GetSchema(ctx, target.MasterAlias, allTables, nil, false) if err != nil { return err } - log.Infof("got table schemas from target master %v.", target.MasterAlias) for _, td := range targetSchema.TableDefinitions { hasTargetTable[td.Name] = true @@ -696,7 +828,6 @@ func (mz *materializer) deploySchema(ctx context.Context) error { if len(applyDDLs) > 0 { sql := strings.Join(applyDDLs, ";\n") - log.Infof("applying schema to target tablet %v, sql: %s", target.MasterAlias, sql) _, err = mz.wr.tmc.ApplySchema(ctx, targetTablet.Tablet, &tmutils.SchemaChange{ SQL: sql, Force: false, @@ -705,7 +836,6 @@ func (mz *materializer) deploySchema(ctx context.Context) error { if err != nil { return err } - log.Infof("applied schema to target tablet %v.", target.MasterAlias) } return nil diff --git a/go/vt/wrangler/materializer_env_test.go b/go/vt/wrangler/materializer_env_test.go index 3142b0d0326..9d759251fd4 100644 --- a/go/vt/wrangler/materializer_env_test.go +++ b/go/vt/wrangler/materializer_env_test.go @@ -267,7 +267,7 @@ func (tmc *testMaterializerTMClient) verifyQueries(t *testing.T) { for _, qr := range qrs { list = append(list, qr.query) } - t.Errorf("tablet %v: has unreturned results: %v", tabletID, list) + t.Errorf("tablet %v: found queries that were expected but never got executed by the test: %v", tabletID, list) } } } diff --git a/go/vt/wrangler/materializer_test.go b/go/vt/wrangler/materializer_test.go index 12882b0d8b0..922fbf9da29 100644 --- a/go/vt/wrangler/materializer_test.go +++ b/go/vt/wrangler/materializer_test.go @@ -22,7 +22,6 @@ import ( "testing" "github.com/golang/protobuf/proto" - "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "golang.org/x/net/context" "vitess.io/vitess/go/sqltypes" @@ -37,6 +36,9 @@ import ( ) const mzUpdateQuery = "update _vt.vreplication set state='Running' where db_name='vt_targetks' and workflow='workflow'" +const mzSelectIDQuery = "select id from _vt.vreplication where db_name='vt_targetks' and workflow='workflow'" +const mzSelectFrozenQuery = "select 1 from _vt.vreplication where db_name='vt_targetks' and message='FROZEN'" +const mzCheckJournal = "/select val from _vt.resharding_journal where id=" func TestMigrateTables(t *testing.T) { ms := &vtctldatapb.MaterializeSettings{ @@ -51,22 +53,25 @@ func TestMigrateTables(t *testing.T) { env := newTestMaterializerEnv(t, ms, []string{"0"}, []string{"0"}) defer env.close() + env.tmc.expectVRQuery(100, mzCheckJournal, &sqltypes.Result{}) + env.tmc.expectVRQuery(200, mzSelectFrozenQuery, &sqltypes.Result{}) env.tmc.expectVRQuery(200, insertPrefix, &sqltypes.Result{}) + env.tmc.expectVRQuery(200, mzSelectIDQuery, &sqltypes.Result{}) env.tmc.expectVRQuery(200, mzUpdateQuery, &sqltypes.Result{}) ctx := context.Background() err := env.wr.MoveTables(ctx, "workflow", "sourceks", "targetks", "t1", "", "") - assert.NoError(t, err) + require.NoError(t, err) vschema, err := env.wr.ts.GetSrvVSchema(ctx, env.cell) - assert.NoError(t, err) + require.NoError(t, err) got := fmt.Sprintf("%v", vschema) want := []string{ - `keyspaces: > keyspaces: >`, + `keyspaces: > keyspaces: > > >`, `rules:`, `rules:`, } for _, wantstr := range want { - assert.Contains(t, got, wantstr) + require.Contains(t, got, wantstr) } } @@ -83,22 +88,25 @@ func TestMigrateVSchema(t *testing.T) { env := newTestMaterializerEnv(t, ms, []string{"0"}, []string{"0"}) defer env.close() + env.tmc.expectVRQuery(100, mzCheckJournal, &sqltypes.Result{}) + env.tmc.expectVRQuery(200, mzSelectFrozenQuery, &sqltypes.Result{}) env.tmc.expectVRQuery(200, insertPrefix, &sqltypes.Result{}) + env.tmc.expectVRQuery(200, mzSelectIDQuery, &sqltypes.Result{}) env.tmc.expectVRQuery(200, mzUpdateQuery, &sqltypes.Result{}) ctx := context.Background() err := env.wr.MoveTables(ctx, "workflow", "sourceks", "targetks", `{"t1":{}}`, "", "") - assert.NoError(t, err) + require.NoError(t, err) vschema, err := env.wr.ts.GetSrvVSchema(ctx, env.cell) - assert.NoError(t, err) + require.NoError(t, err) got := fmt.Sprintf("%v", vschema) want := []string{`keyspaces: >`, - `keyspaces: > > >`, + `keyspaces: > keyspaces: > > >`, `rules:`, `rules:`, } for _, wantstr := range want { - assert.Contains(t, got, wantstr) + require.Contains(t, got, wantstr) } } @@ -174,6 +182,8 @@ func TestCreateLookupVindexFull(t *testing.T) { t.Fatal(err) } + env.tmc.expectVRQuery(100, mzCheckJournal, &sqltypes.Result{}) + env.tmc.expectVRQuery(200, mzSelectFrozenQuery, &sqltypes.Result{}) env.tmc.expectVRQuery(200, "/CREATE TABLE `lkp`", &sqltypes.Result{}) env.tmc.expectVRQuery(200, insertPrefix, &sqltypes.Result{}) env.tmc.expectVRQuery(200, "update _vt.vreplication set state='Running' where db_name='vt_targetks' and workflow='lkp_vdx'", &sqltypes.Result{}) @@ -213,7 +223,7 @@ func TestCreateLookupVindexFull(t *testing.T) { } vschema, err := env.topoServ.GetVSchema(ctx, ms.SourceKeyspace) require.NoError(t, err) - assert.Equal(t, wantvschema, vschema) + require.Equal(t, wantvschema, vschema) wantvschema = &vschemapb.Keyspace{ Tables: map[string]*vschemapb.Table{ @@ -222,7 +232,7 @@ func TestCreateLookupVindexFull(t *testing.T) { } vschema, err = env.topoServ.GetVSchema(ctx, ms.TargetKeyspace) require.NoError(t, err) - assert.Equal(t, wantvschema, vschema) + require.Equal(t, wantvschema, vschema) } func TestCreateLookupVindexCreateDDL(t *testing.T) { @@ -438,7 +448,7 @@ func TestCreateLookupVindexCreateDDL(t *testing.T) { require.NoError(t, err) want := strings.Split(tcase.out, "\n") got := strings.Split(outms.TableSettings[0].CreateDdl, "\n") - assert.Equal(t, want, got, tcase.description) + require.Equal(t, want, got, tcase.description) } } @@ -911,7 +921,7 @@ func TestCreateLookupVindexTargetVSchema(t *testing.T) { continue } require.NoError(t, err) - assert.Equal(t, tcase.out, got, tcase.description) + require.Equal(t, tcase.out, got, tcase.description) } } @@ -1410,7 +1420,7 @@ func TestExternalizeVindex(t *testing.T) { outvschema, err := env.topoServ.GetVSchema(context.Background(), ms.SourceKeyspace) require.NoError(t, err) vindexName := strings.Split(tcase.input, ".")[1] - assert.NotContains(t, outvschema.Vindexes[vindexName].Params, "write_only", tcase.input) + require.NotContains(t, outvschema.Vindexes[vindexName].Params, "write_only", tcase.input) } } @@ -1440,6 +1450,7 @@ func TestMaterializerOneToOne(t *testing.T) { env := newTestMaterializerEnv(t, ms, []string{"0"}, []string{"0"}) defer env.close() + env.tmc.expectVRQuery(200, mzSelectFrozenQuery, &sqltypes.Result{}) env.tmc.expectVRQuery( 200, insertPrefix+ @@ -1458,7 +1469,7 @@ func TestMaterializerOneToOne(t *testing.T) { env.tmc.expectVRQuery(200, mzUpdateQuery, &sqltypes.Result{}) err := env.wr.Materialize(context.Background(), ms) - assert.NoError(t, err) + require.NoError(t, err) env.tmc.verifyQueries(t) } @@ -1480,6 +1491,7 @@ func TestMaterializerManyToOne(t *testing.T) { env := newTestMaterializerEnv(t, ms, []string{"-80", "80-"}, []string{"0"}) defer env.close() + env.tmc.expectVRQuery(200, mzSelectFrozenQuery, &sqltypes.Result{}) env.tmc.expectVRQuery( 200, insertPrefix+ @@ -1492,7 +1504,7 @@ func TestMaterializerManyToOne(t *testing.T) { env.tmc.expectVRQuery(200, mzUpdateQuery, &sqltypes.Result{}) err := env.wr.Materialize(context.Background(), ms) - assert.NoError(t, err) + require.NoError(t, err) env.tmc.verifyQueries(t) } @@ -1531,6 +1543,8 @@ func TestMaterializerOneToMany(t *testing.T) { t.Fatal(err) } + env.tmc.expectVRQuery(200, mzSelectFrozenQuery, &sqltypes.Result{}) + env.tmc.expectVRQuery(210, mzSelectFrozenQuery, &sqltypes.Result{}) env.tmc.expectVRQuery( 200, insertPrefix+ @@ -1547,7 +1561,7 @@ func TestMaterializerOneToMany(t *testing.T) { env.tmc.expectVRQuery(210, mzUpdateQuery, &sqltypes.Result{}) err := env.wr.Materialize(context.Background(), ms) - assert.NoError(t, err) + require.NoError(t, err) env.tmc.verifyQueries(t) } @@ -1586,6 +1600,8 @@ func TestMaterializerManyToMany(t *testing.T) { t.Fatal(err) } + env.tmc.expectVRQuery(200, mzSelectFrozenQuery, &sqltypes.Result{}) + env.tmc.expectVRQuery(210, mzSelectFrozenQuery, &sqltypes.Result{}) env.tmc.expectVRQuery( 200, insertPrefix+ @@ -1604,7 +1620,7 @@ func TestMaterializerManyToMany(t *testing.T) { env.tmc.expectVRQuery(210, mzUpdateQuery, &sqltypes.Result{}) err := env.wr.Materialize(context.Background(), ms) - assert.NoError(t, err) + require.NoError(t, err) env.tmc.verifyQueries(t) } @@ -1646,6 +1662,8 @@ func TestMaterializerMulticolumnVindex(t *testing.T) { t.Fatal(err) } + env.tmc.expectVRQuery(200, mzSelectFrozenQuery, &sqltypes.Result{}) + env.tmc.expectVRQuery(210, mzSelectFrozenQuery, &sqltypes.Result{}) env.tmc.expectVRQuery( 200, insertPrefix+ @@ -1662,7 +1680,7 @@ func TestMaterializerMulticolumnVindex(t *testing.T) { env.tmc.expectVRQuery(210, mzUpdateQuery, &sqltypes.Result{}) err := env.wr.Materialize(context.Background(), ms) - assert.NoError(t, err) + require.NoError(t, err) env.tmc.verifyQueries(t) } @@ -1686,6 +1704,7 @@ func TestMaterializerDeploySchema(t *testing.T) { delete(env.tmc.schema, "targetks.t2") + env.tmc.expectVRQuery(200, mzSelectFrozenQuery, &sqltypes.Result{}) env.tmc.expectVRQuery(200, `t2ddl`, &sqltypes.Result{}) env.tmc.expectVRQuery( 200, @@ -1697,7 +1716,7 @@ func TestMaterializerDeploySchema(t *testing.T) { env.tmc.expectVRQuery(200, mzUpdateQuery, &sqltypes.Result{}) err := env.wr.Materialize(context.Background(), ms) - assert.NoError(t, err) + require.NoError(t, err) env.tmc.verifyQueries(t) require.Equal(t, env.tmc.getSchemaRequestCount(100), 1) require.Equal(t, env.tmc.getSchemaRequestCount(200), 1) @@ -1723,6 +1742,7 @@ func TestMaterializerCopySchema(t *testing.T) { delete(env.tmc.schema, "targetks.t1") + env.tmc.expectVRQuery(200, mzSelectFrozenQuery, &sqltypes.Result{}) env.tmc.expectVRQuery(200, `t1_schema`, &sqltypes.Result{}) env.tmc.expectVRQuery( 200, @@ -1734,7 +1754,7 @@ func TestMaterializerCopySchema(t *testing.T) { env.tmc.expectVRQuery(200, mzUpdateQuery, &sqltypes.Result{}) err := env.wr.Materialize(context.Background(), ms) - assert.NoError(t, err) + require.NoError(t, err) env.tmc.verifyQueries(t) require.Equal(t, env.tmc.getSchemaRequestCount(100), 1) require.Equal(t, env.tmc.getSchemaRequestCount(200), 1) @@ -1779,6 +1799,8 @@ func TestMaterializerExplicitColumns(t *testing.T) { t.Fatal(err) } + env.tmc.expectVRQuery(200, mzSelectFrozenQuery, &sqltypes.Result{}) + env.tmc.expectVRQuery(210, mzSelectFrozenQuery, &sqltypes.Result{}) env.tmc.expectVRQuery( 200, insertPrefix+ @@ -1795,7 +1817,7 @@ func TestMaterializerExplicitColumns(t *testing.T) { env.tmc.expectVRQuery(210, mzUpdateQuery, &sqltypes.Result{}) err := env.wr.Materialize(context.Background(), ms) - assert.NoError(t, err) + require.NoError(t, err) env.tmc.verifyQueries(t) } @@ -1837,6 +1859,8 @@ func TestMaterializerRenamedColumns(t *testing.T) { t.Fatal(err) } + env.tmc.expectVRQuery(200, mzSelectFrozenQuery, &sqltypes.Result{}) + env.tmc.expectVRQuery(210, mzSelectFrozenQuery, &sqltypes.Result{}) env.tmc.expectVRQuery( 200, insertPrefix+ @@ -1853,7 +1877,7 @@ func TestMaterializerRenamedColumns(t *testing.T) { env.tmc.expectVRQuery(210, mzUpdateQuery, &sqltypes.Result{}) err := env.wr.Materialize(context.Background(), ms) - assert.NoError(t, err) + require.NoError(t, err) env.tmc.verifyQueries(t) } @@ -1876,11 +1900,12 @@ func TestMaterializerStopAfterCopy(t *testing.T) { env := newTestMaterializerEnv(t, ms, []string{"0"}, []string{"0"}) defer env.close() + env.tmc.expectVRQuery(200, mzSelectFrozenQuery, &sqltypes.Result{}) env.tmc.expectVRQuery(200, insertPrefix+`.*stop_after_copy:true`, &sqltypes.Result{}) env.tmc.expectVRQuery(200, mzUpdateQuery, &sqltypes.Result{}) err := env.wr.Materialize(context.Background(), ms) - assert.NoError(t, err) + require.NoError(t, err) env.tmc.verifyQueries(t) } @@ -1905,8 +1930,10 @@ func TestMaterializerNoTargetVSchema(t *testing.T) { if err := env.topoServ.SaveVSchema(context.Background(), "targetks", vs); err != nil { t.Fatal(err) } + env.tmc.expectVRQuery(200, mzSelectFrozenQuery, &sqltypes.Result{}) + env.tmc.expectVRQuery(210, mzSelectFrozenQuery, &sqltypes.Result{}) err := env.wr.Materialize(context.Background(), ms) - assert.EqualError(t, err, "table t1 not found in vschema for keyspace targetks") + require.EqualError(t, err, "table t1 not found in vschema for keyspace targetks") } func TestMaterializerNoDDL(t *testing.T) { @@ -1925,8 +1952,9 @@ func TestMaterializerNoDDL(t *testing.T) { delete(env.tmc.schema, "targetks.t1") + env.tmc.expectVRQuery(200, mzSelectFrozenQuery, &sqltypes.Result{}) err := env.wr.Materialize(context.Background(), ms) - assert.EqualError(t, err, "target table t1 does not exist and there is no create ddl defined") + require.EqualError(t, err, "target table t1 does not exist and there is no create ddl defined") require.Equal(t, env.tmc.getSchemaRequestCount(100), 0) require.Equal(t, env.tmc.getSchemaRequestCount(200), 1) @@ -1974,8 +2002,9 @@ func TestMaterializerNoSourceMaster(t *testing.T) { env.expectValidation() + env.tmc.expectVRQuery(200, mzSelectFrozenQuery, &sqltypes.Result{}) err := env.wr.Materialize(context.Background(), ms) - assert.EqualError(t, err, "source shard must have a master for copying schema: 0") + require.EqualError(t, err, "source shard must have a master for copying schema: 0") } func TestMaterializerTableMismatchNonCopy(t *testing.T) { @@ -1994,8 +2023,9 @@ func TestMaterializerTableMismatchNonCopy(t *testing.T) { delete(env.tmc.schema, "targetks.t1") + env.tmc.expectVRQuery(200, mzSelectFrozenQuery, &sqltypes.Result{}) err := env.wr.Materialize(context.Background(), ms) - assert.EqualError(t, err, "target table t1 does not exist and there is no create ddl defined") + require.EqualError(t, err, "target table t1 does not exist and there is no create ddl defined") } func TestMaterializerTableMismatchCopy(t *testing.T) { @@ -2014,8 +2044,9 @@ func TestMaterializerTableMismatchCopy(t *testing.T) { delete(env.tmc.schema, "targetks.t1") + env.tmc.expectVRQuery(200, mzSelectFrozenQuery, &sqltypes.Result{}) err := env.wr.Materialize(context.Background(), ms) - assert.EqualError(t, err, "source and target table names must match for copying schema: t2 vs t1") + require.EqualError(t, err, "source and target table names must match for copying schema: t2 vs t1") } func TestMaterializerNoSourceTable(t *testing.T) { @@ -2035,8 +2066,9 @@ func TestMaterializerNoSourceTable(t *testing.T) { delete(env.tmc.schema, "targetks.t1") delete(env.tmc.schema, "sourceks.t1") + env.tmc.expectVRQuery(200, mzSelectFrozenQuery, &sqltypes.Result{}) err := env.wr.Materialize(context.Background(), ms) - assert.EqualError(t, err, "source table t1 does not exist") + require.EqualError(t, err, "source table t1 does not exist") } func TestMaterializerSyntaxError(t *testing.T) { @@ -2053,8 +2085,9 @@ func TestMaterializerSyntaxError(t *testing.T) { env := newTestMaterializerEnv(t, ms, []string{"0"}, []string{"0"}) defer env.close() + env.tmc.expectVRQuery(200, mzSelectFrozenQuery, &sqltypes.Result{}) err := env.wr.Materialize(context.Background(), ms) - assert.EqualError(t, err, "syntax error at position 4 near 'bad'") + require.EqualError(t, err, "syntax error at position 4 near 'bad'") } func TestMaterializerNotASelect(t *testing.T) { @@ -2071,8 +2104,9 @@ func TestMaterializerNotASelect(t *testing.T) { env := newTestMaterializerEnv(t, ms, []string{"0"}, []string{"0"}) defer env.close() + env.tmc.expectVRQuery(200, mzSelectFrozenQuery, &sqltypes.Result{}) err := env.wr.Materialize(context.Background(), ms) - assert.EqualError(t, err, "unrecognized statement: update t1 set val=1") + require.EqualError(t, err, "unrecognized statement: update t1 set val=1") } func TestMaterializerNoGoodVindex(t *testing.T) { @@ -2110,8 +2144,10 @@ func TestMaterializerNoGoodVindex(t *testing.T) { t.Fatal(err) } + env.tmc.expectVRQuery(200, mzSelectFrozenQuery, &sqltypes.Result{}) + env.tmc.expectVRQuery(210, mzSelectFrozenQuery, &sqltypes.Result{}) err := env.wr.Materialize(context.Background(), ms) - assert.EqualError(t, err, "could not find a vindex to compute keyspace id for table t1") + require.EqualError(t, err, "could not find a vindex to compute keyspace id for table t1") } func TestMaterializerComplexVindexExpression(t *testing.T) { @@ -2149,8 +2185,10 @@ func TestMaterializerComplexVindexExpression(t *testing.T) { t.Fatal(err) } + env.tmc.expectVRQuery(200, mzSelectFrozenQuery, &sqltypes.Result{}) + env.tmc.expectVRQuery(210, mzSelectFrozenQuery, &sqltypes.Result{}) err := env.wr.Materialize(context.Background(), ms) - assert.EqualError(t, err, "vindex column cannot be a complex expression: a + b as c1") + require.EqualError(t, err, "vindex column cannot be a complex expression: a + b as c1") } func TestMaterializerNoVindexInExpression(t *testing.T) { @@ -2188,8 +2226,10 @@ func TestMaterializerNoVindexInExpression(t *testing.T) { t.Fatal(err) } + env.tmc.expectVRQuery(200, mzSelectFrozenQuery, &sqltypes.Result{}) + env.tmc.expectVRQuery(210, mzSelectFrozenQuery, &sqltypes.Result{}) err := env.wr.Materialize(context.Background(), ms) - assert.EqualError(t, err, "could not find vindex column c1") + require.EqualError(t, err, "could not find vindex column c1") } func TestStripConstraints(t *testing.T) { diff --git a/go/vt/wrangler/resharder.go b/go/vt/wrangler/resharder.go index 131f2fadc63..321bcaa53a2 100644 --- a/go/vt/wrangler/resharder.go +++ b/go/vt/wrangler/resharder.go @@ -63,7 +63,6 @@ func (wr *Wrangler) Reshard(ctx context.Context, keyspace, workflow string, sour if err := wr.validateNewWorkflow(ctx, keyspace, workflow); err != nil { return err } - rs, err := wr.buildResharder(ctx, keyspace, workflow, sources, targets, cell, tabletTypes) if err != nil { return vterrors.Wrap(err, "buildResharder") @@ -79,6 +78,7 @@ func (wr *Wrangler) Reshard(ctx context.Context, keyspace, workflow string, sour if err := rs.startStreams(ctx); err != nil { return vterrors.Wrap(err, "startStream") } + return nil } @@ -162,7 +162,7 @@ func (rs *resharder) readRefStreams(ctx context.Context) error { err := rs.forAll(rs.sourceShards, func(source *topo.ShardInfo) error { sourceMaster := rs.sourceMasters[source.ShardName()] - query := fmt.Sprintf("select workflow, source, cell, tablet_types from _vt.vreplication where db_name=%s", encodeString(sourceMaster.DbName())) + query := fmt.Sprintf("select workflow, source, cell, tablet_types from _vt.vreplication where db_name=%s and message != 'FROZEN'", encodeString(sourceMaster.DbName())) p3qr, err := rs.wr.tmc.VReplicationExec(ctx, sourceMaster.Tablet, query) if err != nil { return vterrors.Wrapf(err, "VReplicationExec(%v, %s)", sourceMaster.Tablet, query) @@ -185,6 +185,7 @@ func (rs *resharder) readRefStreams(ctx context.Context) error { } } for _, row := range qr.Rows { + workflow := row[0].ToString() if workflow == "" { return fmt.Errorf("VReplication streams must have named workflows for migration: shard: %s:%s", source.Keyspace(), source.ShardName()) diff --git a/go/vt/wrangler/resharder_env_test.go b/go/vt/wrangler/resharder_env_test.go index dfdb156cc33..709ca04a9a5 100644 --- a/go/vt/wrangler/resharder_env_test.go +++ b/go/vt/wrangler/resharder_env_test.go @@ -19,6 +19,8 @@ package wrangler import ( "fmt" "regexp" + "runtime/debug" + "strings" "sync" "testing" @@ -45,6 +47,10 @@ type testResharderEnv struct { tmc *testResharderTMClient } +var ( + testMode = "" //"debug" +) + //---------------------------------------------- // testResharderEnv @@ -79,6 +85,7 @@ func (env *testResharderEnv) expectValidation() { tabletID := int(tablet.Alias.Uid) // wr.validateNewWorkflow env.tmc.expectVRQuery(tabletID, fmt.Sprintf("select 1 from _vt.vreplication where db_name='vt_%s' and workflow='%s'", env.keyspace, env.workflow), &sqltypes.Result{}) + env.tmc.expectVRQuery(tabletID, rsSelectFrozenQuery, &sqltypes.Result{}) if tabletID >= 200 { // validateTargets @@ -92,7 +99,7 @@ func (env *testResharderEnv) expectNoRefStream() { tabletID := int(tablet.Alias.Uid) if tabletID < 200 { // readRefStreams - env.tmc.expectVRQuery(tabletID, fmt.Sprintf("select workflow, source, cell, tablet_types from _vt.vreplication where db_name='vt_%s'", env.keyspace), &sqltypes.Result{}) + env.tmc.expectVRQuery(tabletID, fmt.Sprintf("select workflow, source, cell, tablet_types from _vt.vreplication where db_name='vt_%s' and message != 'FROZEN'", env.keyspace), &sqltypes.Result{}) } } } @@ -177,9 +184,14 @@ func (tmc *testResharderTMClient) expectVRQuery(tabletID int, query string, resu func (tmc *testResharderTMClient) VReplicationExec(ctx context.Context, tablet *topodatapb.Tablet, query string) (*querypb.QueryResult, error) { tmc.mu.Lock() defer tmc.mu.Unlock() - + if testMode == "debug" { + fmt.Printf("Got: %d:%s\n", tablet.Alias.Uid, query) + } qrs := tmc.vrQueries[int(tablet.Alias.Uid)] if len(qrs) == 0 { + if testMode == "debug" { + fmt.Printf("Want: %d:%s, Stack:\n%v\n", tablet.Alias.Uid, query, debug.Stack()) + } return nil, fmt.Errorf("tablet %v does not expect any more queries: %s", tablet, query) } matched := false @@ -212,7 +224,7 @@ func (tmc *testResharderTMClient) verifyQueries(t *testing.T) { for _, qr := range qrs { list = append(list, qr.query) } - t.Errorf("tablet %v: has unreturned results: %v", tabletID, list) + t.Errorf("tablet %v: following queries were not run during the test: \n%v", tabletID, strings.Join(list, "\n")) } } } diff --git a/go/vt/wrangler/resharder_test.go b/go/vt/wrangler/resharder_test.go index f6ee5d7c5b8..886aa8dbbcb 100644 --- a/go/vt/wrangler/resharder_test.go +++ b/go/vt/wrangler/resharder_test.go @@ -32,6 +32,7 @@ import ( "vitess.io/vitess/go/vt/vtgate/vindexes" ) +const rsSelectFrozenQuery = "select 1 from _vt.vreplication where db_name='vt_ks' and message='FROZEN'" const insertPrefix = `/insert into _vt.vreplication\(workflow, source, pos, max_tps, max_replication_lag, cell, tablet_types, time_updated, transaction_timestamp, state, db_name\) values ` const eol = "$" @@ -109,7 +110,6 @@ func TestResharderOneToMany(t *testing.T) { }) env.close() } - } func TestResharderManyToOne(t *testing.T) { @@ -281,7 +281,7 @@ func TestResharderOneRefStream(t *testing.T) { "varchar|varchar|varchar|varchar"), fmt.Sprintf("t1|%v|cell1|master,replica", bls), ) - env.tmc.expectVRQuery(100, fmt.Sprintf("select workflow, source, cell, tablet_types from _vt.vreplication where db_name='vt_%s'", env.keyspace), result) + env.tmc.expectVRQuery(100, fmt.Sprintf("select workflow, source, cell, tablet_types from _vt.vreplication where db_name='vt_%s' and message != 'FROZEN'", env.keyspace), result) refRow := `\('t1', 'keyspace:\\"ks1\\" shard:\\"0\\" filter: > ', '', [0-9]*, [0-9]*, 'cell1', 'master,replica', [0-9]*, 0, 'Stopped', 'vt_ks'\)` env.tmc.expectVRQuery( @@ -359,7 +359,7 @@ func TestResharderNoRefStream(t *testing.T) { "varchar|varchar|varchar|varchar"), fmt.Sprintf("t1|%v|cell1|master,replica", bls), ) - env.tmc.expectVRQuery(100, fmt.Sprintf("select workflow, source, cell, tablet_types from _vt.vreplication where db_name='vt_%s'", env.keyspace), result) + env.tmc.expectVRQuery(100, fmt.Sprintf("select workflow, source, cell, tablet_types from _vt.vreplication where db_name='vt_%s' and message != 'FROZEN'", env.keyspace), result) env.tmc.expectVRQuery( 200, @@ -451,8 +451,11 @@ func TestResharderDupWorkflow(t *testing.T) { ) env.tmc.expectVRQuery(210, fmt.Sprintf("select 1 from _vt.vreplication where db_name='vt_%s' and workflow='%s'", env.keyspace, env.workflow), result) + env.tmc.expectVRQuery(200, rsSelectFrozenQuery, &sqltypes.Result{}) + env.tmc.expectVRQuery(100, rsSelectFrozenQuery, &sqltypes.Result{}) + err := env.wr.Reshard(context.Background(), env.keyspace, env.workflow, env.sources, env.targets, true, "", "") - assert.EqualError(t, err, "workflow resharderTest already exists in keyspace ks") + assert.EqualError(t, err, "validateWorkflowName.VReplicationExec: workflow resharderTest already exists in keyspace ks on tablet 210") env.tmc.verifyQueries(t) } @@ -473,18 +476,27 @@ func TestResharderServingState(t *testing.T) { env.tmc.expectVRQuery(100, fmt.Sprintf("select 1 from _vt.vreplication where db_name='vt_%s' and workflow='%s'", env.keyspace, env.workflow), &sqltypes.Result{}) env.tmc.expectVRQuery(200, fmt.Sprintf("select 1 from _vt.vreplication where db_name='vt_%s' and workflow='%s'", env.keyspace, env.workflow), &sqltypes.Result{}) env.tmc.expectVRQuery(210, fmt.Sprintf("select 1 from _vt.vreplication where db_name='vt_%s' and workflow='%s'", env.keyspace, env.workflow), &sqltypes.Result{}) + env.tmc.expectVRQuery(100, rsSelectFrozenQuery, &sqltypes.Result{}) + env.tmc.expectVRQuery(200, rsSelectFrozenQuery, &sqltypes.Result{}) + env.tmc.expectVRQuery(210, rsSelectFrozenQuery, &sqltypes.Result{}) err := env.wr.Reshard(context.Background(), env.keyspace, env.workflow, []string{"-80"}, nil, true, "", "") assert.EqualError(t, err, "buildResharder: source shard -80 is not in serving state") env.tmc.expectVRQuery(100, fmt.Sprintf("select 1 from _vt.vreplication where db_name='vt_%s' and workflow='%s'", env.keyspace, env.workflow), &sqltypes.Result{}) env.tmc.expectVRQuery(200, fmt.Sprintf("select 1 from _vt.vreplication where db_name='vt_%s' and workflow='%s'", env.keyspace, env.workflow), &sqltypes.Result{}) env.tmc.expectVRQuery(210, fmt.Sprintf("select 1 from _vt.vreplication where db_name='vt_%s' and workflow='%s'", env.keyspace, env.workflow), &sqltypes.Result{}) + env.tmc.expectVRQuery(100, rsSelectFrozenQuery, &sqltypes.Result{}) + env.tmc.expectVRQuery(200, rsSelectFrozenQuery, &sqltypes.Result{}) + env.tmc.expectVRQuery(210, rsSelectFrozenQuery, &sqltypes.Result{}) err = env.wr.Reshard(context.Background(), env.keyspace, env.workflow, []string{"0"}, []string{"0"}, true, "", "") assert.EqualError(t, err, "buildResharder: target shard 0 is in serving state") env.tmc.expectVRQuery(100, fmt.Sprintf("select 1 from _vt.vreplication where db_name='vt_%s' and workflow='%s'", env.keyspace, env.workflow), &sqltypes.Result{}) env.tmc.expectVRQuery(200, fmt.Sprintf("select 1 from _vt.vreplication where db_name='vt_%s' and workflow='%s'", env.keyspace, env.workflow), &sqltypes.Result{}) env.tmc.expectVRQuery(210, fmt.Sprintf("select 1 from _vt.vreplication where db_name='vt_%s' and workflow='%s'", env.keyspace, env.workflow), &sqltypes.Result{}) + env.tmc.expectVRQuery(100, rsSelectFrozenQuery, &sqltypes.Result{}) + env.tmc.expectVRQuery(200, rsSelectFrozenQuery, &sqltypes.Result{}) + env.tmc.expectVRQuery(210, rsSelectFrozenQuery, &sqltypes.Result{}) err = env.wr.Reshard(context.Background(), env.keyspace, env.workflow, []string{"0"}, []string{"-80"}, true, "", "") assert.EqualError(t, err, "buildResharder: ValidateForReshard: source and target keyranges don't match: - vs -80") } @@ -512,9 +524,11 @@ func TestResharderTargetAlreadyResharding(t *testing.T) { "int64"), "1", ) + env.tmc.expectVRQuery(200, rsSelectFrozenQuery, &sqltypes.Result{}) + env.tmc.expectVRQuery(210, rsSelectFrozenQuery, &sqltypes.Result{}) env.tmc.expectVRQuery(200, fmt.Sprintf("select 1 from _vt.vreplication where db_name='vt_%s'", env.keyspace), result) env.tmc.expectVRQuery(210, fmt.Sprintf("select 1 from _vt.vreplication where db_name='vt_%s'", env.keyspace), &sqltypes.Result{}) - + env.tmc.expectVRQuery(100, rsSelectFrozenQuery, &sqltypes.Result{}) err := env.wr.Reshard(context.Background(), env.keyspace, env.workflow, env.sources, env.targets, true, "", "") assert.EqualError(t, err, "buildResharder: validateTargets: some streams already exist in the target shards, please clean them up and retry the command") env.tmc.verifyQueries(t) @@ -561,7 +575,7 @@ func TestResharderUnnamedStream(t *testing.T) { "varchar|varchar|varchar|varchar"), fmt.Sprintf("|%v|cell1|master,replica", bls), ) - env.tmc.expectVRQuery(100, fmt.Sprintf("select workflow, source, cell, tablet_types from _vt.vreplication where db_name='vt_%s'", env.keyspace), result) + env.tmc.expectVRQuery(100, fmt.Sprintf("select workflow, source, cell, tablet_types from _vt.vreplication where db_name='vt_%s' and message != 'FROZEN'", env.keyspace), result) err := env.wr.Reshard(context.Background(), env.keyspace, env.workflow, env.sources, env.targets, true, "", "") assert.EqualError(t, err, "buildResharder: readRefStreams: VReplication streams must have named workflows for migration: shard: ks:0") @@ -609,7 +623,7 @@ func TestResharderMismatchedRefStreams(t *testing.T) { "varchar|varchar|varchar|varchar"), fmt.Sprintf("t1|%v|cell1|master,replica", bls1), ) - env.tmc.expectVRQuery(100, fmt.Sprintf("select workflow, source, cell, tablet_types from _vt.vreplication where db_name='vt_%s'", env.keyspace), result1) + env.tmc.expectVRQuery(100, fmt.Sprintf("select workflow, source, cell, tablet_types from _vt.vreplication where db_name='vt_%s' and message != 'FROZEN'", env.keyspace), result1) bls2 := &binlogdatapb.BinlogSource{ Keyspace: "ks2", Shard: "0", @@ -625,7 +639,7 @@ func TestResharderMismatchedRefStreams(t *testing.T) { fmt.Sprintf("t1|%v|cell1|master,replica", bls1), fmt.Sprintf("t1|%v|cell1|master,replica", bls2), ) - env.tmc.expectVRQuery(110, fmt.Sprintf("select workflow, source, cell, tablet_types from _vt.vreplication where db_name='vt_%s'", env.keyspace), result2) + env.tmc.expectVRQuery(110, fmt.Sprintf("select workflow, source, cell, tablet_types from _vt.vreplication where db_name='vt_%s' and message != 'FROZEN'", env.keyspace), result2) err := env.wr.Reshard(context.Background(), env.keyspace, env.workflow, env.sources, env.targets, true, "", "") want := "buildResharder: readRefStreams: streams are mismatched across source shards" @@ -665,7 +679,7 @@ func TestResharderTableNotInVSchema(t *testing.T) { "varchar|varchar|varchar|varchar"), fmt.Sprintf("t1|%v|cell1|master,replica", bls), ) - env.tmc.expectVRQuery(100, fmt.Sprintf("select workflow, source, cell, tablet_types from _vt.vreplication where db_name='vt_%s'", env.keyspace), result) + env.tmc.expectVRQuery(100, fmt.Sprintf("select workflow, source, cell, tablet_types from _vt.vreplication where db_name='vt_%s' and message != 'FROZEN'", env.keyspace), result) err := env.wr.Reshard(context.Background(), env.keyspace, env.workflow, env.sources, env.targets, true, "", "") assert.EqualError(t, err, "buildResharder: readRefStreams: blsIsReference: table t1 not found in vschema") @@ -729,7 +743,7 @@ func TestResharderMixedTablesOrder1(t *testing.T) { "varchar|varchar|varchar|varchar"), fmt.Sprintf("t1t2|%v|cell1|master,replica", bls), ) - env.tmc.expectVRQuery(100, fmt.Sprintf("select workflow, source, cell, tablet_types from _vt.vreplication where db_name='vt_%s'", env.keyspace), result) + env.tmc.expectVRQuery(100, fmt.Sprintf("select workflow, source, cell, tablet_types from _vt.vreplication where db_name='vt_%s' and message != 'FROZEN'", env.keyspace), result) err := env.wr.Reshard(context.Background(), env.keyspace, env.workflow, env.sources, env.targets, true, "", "") want := "buildResharder: readRefStreams: blsIsReference: cannot reshard streams with a mix of reference and sharded tables" @@ -796,7 +810,7 @@ func TestResharderMixedTablesOrder2(t *testing.T) { "varchar|varchar|varchar|varchar"), fmt.Sprintf("t1t2|%v|cell1|master,replica", bls), ) - env.tmc.expectVRQuery(100, fmt.Sprintf("select workflow, source, cell, tablet_types from _vt.vreplication where db_name='vt_%s'", env.keyspace), result) + env.tmc.expectVRQuery(100, fmt.Sprintf("select workflow, source, cell, tablet_types from _vt.vreplication where db_name='vt_%s' and message != 'FROZEN'", env.keyspace), result) err := env.wr.Reshard(context.Background(), env.keyspace, env.workflow, env.sources, env.targets, true, "", "") want := "buildResharder: readRefStreams: blsIsReference: cannot reshard streams with a mix of reference and sharded tables" diff --git a/go/vt/wrangler/stream_migrater_test.go b/go/vt/wrangler/stream_migrater_test.go index b850ce3c2e0..80b9857466b 100644 --- a/go/vt/wrangler/stream_migrater_test.go +++ b/go/vt/wrangler/stream_migrater_test.go @@ -39,18 +39,21 @@ func TestStreamMigrateMainflow(t *testing.T) { tme := newTestShardMigrater(ctx, t, []string{"-40", "40-"}, []string{"-80", "80-"}) defer tme.stopTablets(t) + tme.expectNoPreviousJournals() + // Migrate reads _, err := tme.wr.SwitchReads(ctx, tme.targetKeyspace, "test", topodatapb.TabletType_RDONLY, nil, DirectionForward, false) if err != nil { t.Fatal(err) } + + tme.expectCheckJournals() _, err = tme.wr.SwitchReads(ctx, tme.targetKeyspace, "test", topodatapb.TabletType_REPLICA, nil, DirectionForward, false) if err != nil { t.Fatal(err) } tme.expectCheckJournals() - stopStreams := func() { // sm.stopStreams->sm.readSourceStreams->readTabletStreams('Stopped') tme.dbSourceClients[0].addQuery("select id, workflow, source, pos from _vt.vreplication where db_name='vt_ks' and workflow != 'test_reverse' and state = 'Stopped' and message != 'FROZEN'", &sqltypes.Result{}, nil) @@ -108,6 +111,7 @@ func TestStreamMigrateMainflow(t *testing.T) { sourceRows[i]...), nil) } + } stopStreams() @@ -189,11 +193,13 @@ func TestStreamMigrateTwoStreams(t *testing.T) { tme := newTestShardMigrater(ctx, t, []string{"-40", "40-"}, []string{"-80", "80-"}) defer tme.stopTablets(t) + tme.expectNoPreviousJournals() // Migrate reads _, err := tme.wr.SwitchReads(ctx, tme.targetKeyspace, "test", topodatapb.TabletType_RDONLY, nil, DirectionForward, false) if err != nil { t.Fatal(err) } + tme.expectNoPreviousJournals() _, err = tme.wr.SwitchReads(ctx, tme.targetKeyspace, "test", topodatapb.TabletType_REPLICA, nil, DirectionForward, false) if err != nil { t.Fatal(err) @@ -356,11 +362,13 @@ func TestStreamMigrateOneToMany(t *testing.T) { tme := newTestShardMigrater(ctx, t, []string{"0"}, []string{"-80", "80-"}) defer tme.stopTablets(t) + tme.expectNoPreviousJournals() // Migrate reads _, err := tme.wr.SwitchReads(ctx, tme.targetKeyspace, "test", topodatapb.TabletType_RDONLY, nil, DirectionForward, false) if err != nil { t.Fatal(err) } + tme.expectNoPreviousJournals() _, err = tme.wr.SwitchReads(ctx, tme.targetKeyspace, "test", topodatapb.TabletType_REPLICA, nil, DirectionForward, false) if err != nil { t.Fatal(err) @@ -487,11 +495,13 @@ func TestStreamMigrateManyToOne(t *testing.T) { tme := newTestShardMigrater(ctx, t, []string{"-80", "80-"}, []string{"-"}) defer tme.stopTablets(t) + tme.expectNoPreviousJournals() // Migrate reads _, err := tme.wr.SwitchReads(ctx, tme.targetKeyspace, "test", topodatapb.TabletType_RDONLY, nil, DirectionForward, false) if err != nil { t.Fatal(err) } + tme.expectNoPreviousJournals() _, err = tme.wr.SwitchReads(ctx, tme.targetKeyspace, "test", topodatapb.TabletType_REPLICA, nil, DirectionForward, false) if err != nil { t.Fatal(err) @@ -620,11 +630,13 @@ func TestStreamMigrateSyncSuccess(t *testing.T) { tme := newTestShardMigrater(ctx, t, []string{"-40", "40-"}, []string{"-80", "80-"}) defer tme.stopTablets(t) + tme.expectNoPreviousJournals() // Migrate reads _, err := tme.wr.SwitchReads(ctx, tme.targetKeyspace, "test", topodatapb.TabletType_RDONLY, nil, DirectionForward, false) if err != nil { t.Fatal(err) } + tme.expectNoPreviousJournals() _, err = tme.wr.SwitchReads(ctx, tme.targetKeyspace, "test", topodatapb.TabletType_REPLICA, nil, DirectionForward, false) if err != nil { t.Fatal(err) @@ -810,11 +822,13 @@ func TestStreamMigrateSyncFail(t *testing.T) { tme := newTestShardMigrater(ctx, t, []string{"-40", "40-"}, []string{"-80", "80-"}) defer tme.stopTablets(t) + tme.expectNoPreviousJournals() // Migrate reads _, err := tme.wr.SwitchReads(ctx, tme.targetKeyspace, "test", topodatapb.TabletType_RDONLY, nil, DirectionForward, false) if err != nil { t.Fatal(err) } + tme.expectNoPreviousJournals() _, err = tme.wr.SwitchReads(ctx, tme.targetKeyspace, "test", topodatapb.TabletType_REPLICA, nil, DirectionForward, false) if err != nil { t.Fatal(err) @@ -930,11 +944,13 @@ func TestStreamMigrateCancel(t *testing.T) { tme := newTestShardMigrater(ctx, t, []string{"-40", "40-"}, []string{"-80", "80-"}) defer tme.stopTablets(t) + tme.expectNoPreviousJournals() // Migrate reads _, err := tme.wr.SwitchReads(ctx, tme.targetKeyspace, "test", topodatapb.TabletType_RDONLY, nil, DirectionForward, false) if err != nil { t.Fatal(err) } + tme.expectNoPreviousJournals() _, err = tme.wr.SwitchReads(ctx, tme.targetKeyspace, "test", topodatapb.TabletType_REPLICA, nil, DirectionForward, false) if err != nil { t.Fatal(err) @@ -1033,11 +1049,13 @@ func TestStreamMigrateStoppedStreams(t *testing.T) { tme := newTestShardMigrater(ctx, t, []string{"0"}, []string{"-80", "80-"}) defer tme.stopTablets(t) + tme.expectNoPreviousJournals() // Migrate reads _, err := tme.wr.SwitchReads(ctx, tme.targetKeyspace, "test", topodatapb.TabletType_RDONLY, nil, DirectionForward, false) if err != nil { t.Fatal(err) } + tme.expectNoPreviousJournals() _, err = tme.wr.SwitchReads(ctx, tme.targetKeyspace, "test", topodatapb.TabletType_REPLICA, nil, DirectionForward, false) if err != nil { t.Fatal(err) @@ -1090,11 +1108,13 @@ func TestStreamMigrateCancelWithStoppedStreams(t *testing.T) { tme := newTestShardMigrater(ctx, t, []string{"-40", "40-"}, []string{"-80", "80-"}) defer tme.stopTablets(t) + tme.expectNoPreviousJournals() // Migrate reads _, err := tme.wr.SwitchReads(ctx, tme.targetKeyspace, "test", topodatapb.TabletType_RDONLY, nil, DirectionForward, false) if err != nil { t.Fatal(err) } + tme.expectNoPreviousJournals() _, err = tme.wr.SwitchReads(ctx, tme.targetKeyspace, "test", topodatapb.TabletType_REPLICA, nil, DirectionForward, false) if err != nil { t.Fatal(err) @@ -1155,11 +1175,13 @@ func TestStreamMigrateStillCopying(t *testing.T) { tme := newTestShardMigrater(ctx, t, []string{"0"}, []string{"-80", "80-"}) defer tme.stopTablets(t) + tme.expectNoPreviousJournals() // Migrate reads _, err := tme.wr.SwitchReads(ctx, tme.targetKeyspace, "test", topodatapb.TabletType_RDONLY, nil, DirectionForward, false) if err != nil { t.Fatal(err) } + tme.expectNoPreviousJournals() _, err = tme.wr.SwitchReads(ctx, tme.targetKeyspace, "test", topodatapb.TabletType_REPLICA, nil, DirectionForward, false) if err != nil { t.Fatal(err) @@ -1216,11 +1238,13 @@ func TestStreamMigrateEmptyWorkflow(t *testing.T) { tme := newTestShardMigrater(ctx, t, []string{"0"}, []string{"-80", "80-"}) defer tme.stopTablets(t) + tme.expectNoPreviousJournals() // Migrate reads _, err := tme.wr.SwitchReads(ctx, tme.targetKeyspace, "test", topodatapb.TabletType_RDONLY, nil, DirectionForward, false) if err != nil { t.Fatal(err) } + tme.expectNoPreviousJournals() _, err = tme.wr.SwitchReads(ctx, tme.targetKeyspace, "test", topodatapb.TabletType_REPLICA, nil, DirectionForward, false) if err != nil { t.Fatal(err) @@ -1276,11 +1300,13 @@ func TestStreamMigrateDupWorkflow(t *testing.T) { tme := newTestShardMigrater(ctx, t, []string{"0"}, []string{"-80", "80-"}) defer tme.stopTablets(t) + tme.expectNoPreviousJournals() // Migrate reads _, err := tme.wr.SwitchReads(ctx, tme.targetKeyspace, "test", topodatapb.TabletType_RDONLY, nil, DirectionForward, false) if err != nil { t.Fatal(err) } + tme.expectNoPreviousJournals() _, err = tme.wr.SwitchReads(ctx, tme.targetKeyspace, "test", topodatapb.TabletType_REPLICA, nil, DirectionForward, false) if err != nil { t.Fatal(err) @@ -1337,11 +1363,13 @@ func TestStreamMigrateStreamsMismatch(t *testing.T) { tme := newTestShardMigrater(ctx, t, []string{"-80", "80-"}, []string{"-"}) defer tme.stopTablets(t) + tme.expectNoPreviousJournals() // Migrate reads _, err := tme.wr.SwitchReads(ctx, tme.targetKeyspace, "test", topodatapb.TabletType_RDONLY, nil, DirectionForward, false) if err != nil { t.Fatal(err) } + tme.expectNoPreviousJournals() _, err = tme.wr.SwitchReads(ctx, tme.targetKeyspace, "test", topodatapb.TabletType_REPLICA, nil, DirectionForward, false) if err != nil { t.Fatal(err) diff --git a/go/vt/wrangler/traffic_switcher.go b/go/vt/wrangler/traffic_switcher.go index 7693ffd8e0e..82217195009 100644 --- a/go/vt/wrangler/traffic_switcher.go +++ b/go/vt/wrangler/traffic_switcher.go @@ -137,6 +137,17 @@ func (wr *Wrangler) SwitchReads(ctx context.Context, targetKeyspace, workflow st return nil, err } + //If journals exist notify user and fail + journalsExist, _, err := ts.checkJournals(ctx) + if err != nil { + wr.Logger().Errorf("checkJournals failed: %v", err) + return nil, err + } + if journalsExist { + wr.Logger().Errorf("Found a previous journal entry for %d", ts.id) + return nil, fmt.Errorf("found an entry from a previous run for migration id %d in _vt.resharding_journal, please review and delete it before proceeding", ts.id) + } + var sw iswitcher if dryRun { sw = &switcherDryRun{ts: ts, drLog: NewLogRecorder()} @@ -235,6 +246,7 @@ func (wr *Wrangler) SwitchWrites(ctx context.Context, targetKeyspace, workflow s sw.cancelMigration(ctx, sm) return 0, sw.logs(), nil } + ts.wr.Logger().Infof("Stopping streams") sourceWorkflows, err = sw.stopStreams(ctx, sm) if err != nil { ts.wr.Logger().Errorf("stopStreams failed: %v", err) @@ -246,24 +258,28 @@ func (wr *Wrangler) SwitchWrites(ctx context.Context, targetKeyspace, workflow s sw.cancelMigration(ctx, sm) return 0, nil, err } + ts.wr.Logger().Infof("Stopping source writes") if err := sw.stopSourceWrites(ctx); err != nil { ts.wr.Logger().Errorf("stopSourceWrites failed: %v", err) sw.cancelMigration(ctx, sm) return 0, nil, err } + ts.wr.Logger().Infof("Waiting for streams to catchup") if err := sw.waitForCatchup(ctx, filteredReplicationWaitTime); err != nil { ts.wr.Logger().Errorf("waitForCatchup failed: %v", err) sw.cancelMigration(ctx, sm) return 0, nil, err } + ts.wr.Logger().Infof("Migrating streams") if err := sw.migrateStreams(ctx, sm); err != nil { ts.wr.Logger().Errorf("migrateStreams failed: %v", err) sw.cancelMigration(ctx, sm) return 0, nil, err } + ts.wr.Logger().Infof("Creating reverse streams") if err := sw.createReverseVReplication(ctx); err != nil { ts.wr.Logger().Errorf("createReverseVReplication failed: %v", err) sw.cancelMigration(ctx, sm) @@ -530,6 +546,7 @@ func hashStreams(targetKeyspace string, targets map[string]*tsTarget) int64 { expanded = append(expanded, fmt.Sprintf("%s:%d", shard, uid)) } } + sort.Strings(expanded) hasher := fnv.New64() hasher.Write([]byte(targetKeyspace)) @@ -676,34 +693,48 @@ func (ts *trafficSwitcher) switchShardReads(ctx context.Context, cells []string, return ts.wr.ts.MigrateServedType(ctx, ts.sourceKeyspace, toShards, fromShards, servedType, cells) } +func (wr *Wrangler) checkIfJournalExistsOnTablet(ctx context.Context, tablet *topodatapb.Tablet, migrationID int64) (*binlogdatapb.Journal, bool, error) { + var exists bool + journal := &binlogdatapb.Journal{} + query := fmt.Sprintf("select val from _vt.resharding_journal where id=%v", migrationID) + p3qr, err := wr.tmc.VReplicationExec(ctx, tablet, query) + if err != nil { + return nil, false, err + } + if len(p3qr.Rows) != 0 { + qr := sqltypes.Proto3ToResult(p3qr) + if !exists { + if err := proto.UnmarshalText(qr.Rows[0][0].ToString(), journal); err != nil { + return nil, false, err + } + exists = true + } + } + return journal, exists, nil + +} + // checkJournals returns true if at least one journal has been created. // If so, it also returns the list of sourceWorkflows that need to be switched. func (ts *trafficSwitcher) checkJournals(ctx context.Context) (journalsExist bool, sourceWorkflows []string, err error) { var mu sync.Mutex - journal := &binlogdatapb.Journal{} - var exists bool err = ts.forAllSources(func(source *tsSource) error { - statement := fmt.Sprintf("select val from _vt.resharding_journal where id=%v", ts.id) - p3qr, err := ts.wr.tmc.VReplicationExec(ctx, source.master.Tablet, statement) + mu.Lock() + defer mu.Unlock() + journal, exists, err := ts.wr.checkIfJournalExistsOnTablet(ctx, source.master.Tablet, ts.id) if err != nil { return err } - if len(p3qr.Rows) != 0 { - qr := sqltypes.Proto3ToResult(p3qr) - mu.Lock() - defer mu.Unlock() - - if !exists { - if err := proto.UnmarshalText(qr.Rows[0][0].ToString(), journal); err != nil { - return err - } - exists = true + if exists { + if journal.Id != 0 { + sourceWorkflows = journal.SourceWorkflows } source.journaled = true + journalsExist = true } return nil }) - return exists, journal.SourceWorkflows, err + return journalsExist, sourceWorkflows, err } func (ts *trafficSwitcher) stopSourceWrites(ctx context.Context) error { @@ -844,7 +875,7 @@ func (ts *trafficSwitcher) createReverseVReplication(ctx context.Context) error if ts.sourceKSSchema.Keyspace.Sharded { vtable, ok := ts.sourceKSSchema.Tables[rule.Match] if !ok { - return fmt.Errorf("table %s not found in vschema", rule.Match) + return fmt.Errorf("table %s not found in vschema1", rule.Match) } // TODO(sougou): handle degenerate cases like sequence, etc. // We currently assume the primary vindex is the best way to filter, which may not be true. diff --git a/go/vt/wrangler/traffic_switcher_env_test.go b/go/vt/wrangler/traffic_switcher_env_test.go index 81f8b38b7da..4ac1c0742dd 100644 --- a/go/vt/wrangler/traffic_switcher_env_test.go +++ b/go/vt/wrangler/traffic_switcher_env_test.go @@ -396,6 +396,13 @@ func (tme *testMigraterEnv) setMasterPositions() { } } +func (tme *testMigraterEnv) expectNoPreviousJournals() { + // validate that no previous journals exist + for _, dbclient := range tme.dbSourceClients { + dbclient.addQueryRE(tsCheckJournals, &sqltypes.Result{}, nil) + } +} + func (tme *testShardMigraterEnv) forAllStreams(f func(i, j int)) { for i := range tme.targetShards { for j := range tme.sourceShards { @@ -494,3 +501,10 @@ func (tme *testShardMigraterEnv) expectCancelMigration() { } tme.expectDeleteReverseVReplication() } + +func (tme *testShardMigraterEnv) expectNoPreviousJournals() { + // validate that no previous journals exist + for _, dbclient := range tme.dbSourceClients { + dbclient.addQueryRE(tsCheckJournals, &sqltypes.Result{}, nil) + } +} diff --git a/go/vt/wrangler/traffic_switcher_test.go b/go/vt/wrangler/traffic_switcher_test.go index 70c45a261c4..8e80c03a362 100644 --- a/go/vt/wrangler/traffic_switcher_test.go +++ b/go/vt/wrangler/traffic_switcher_test.go @@ -65,6 +65,10 @@ var ( } ) +const ( + tsCheckJournals = "select val from _vt.resharding_journal where id=.*" +) + // TestTableMigrate tests table mode migrations. // This has to be kept in sync with TestShardMigrate. func TestTableMigrateMainflow(t *testing.T) { @@ -79,6 +83,7 @@ func TestTableMigrateMainflow(t *testing.T) { "ks2.t2": {"ks1.t2"}, }) + tme.expectNoPreviousJournals() //------------------------------------------------------------------------------------------------------------------- // Single cell RDONLY migration. _, err := tme.wr.SwitchReads(ctx, tme.targetKeyspace, "test", topodatapb.TabletType_RDONLY, []string{"cell1"}, DirectionForward, false) @@ -105,6 +110,7 @@ func TestTableMigrateMainflow(t *testing.T) { }) verifyQueries(t, tme.allDBClients) + tme.expectNoPreviousJournals() //------------------------------------------------------------------------------------------------------------------- // Other cell REPLICA migration. // The global routing already contains redirections for rdonly. @@ -147,6 +153,7 @@ func TestTableMigrateMainflow(t *testing.T) { }) verifyQueries(t, tme.allDBClients) + tme.expectNoPreviousJournals() //------------------------------------------------------------------------------------------------------------------- // Single cell backward REPLICA migration. _, err = tme.wr.SwitchReads(ctx, tme.targetKeyspace, "test", topodatapb.TabletType_REPLICA, []string{"cell2"}, DirectionBackward, false) @@ -167,6 +174,7 @@ func TestTableMigrateMainflow(t *testing.T) { }) verifyQueries(t, tme.allDBClients) + tme.expectNoPreviousJournals() //------------------------------------------------------------------------------------------------------------------- // Switch all REPLICA. _, err = tme.wr.SwitchReads(ctx, tme.targetKeyspace, "test", topodatapb.TabletType_REPLICA, nil, DirectionForward, false) @@ -193,6 +201,7 @@ func TestTableMigrateMainflow(t *testing.T) { }) verifyQueries(t, tme.allDBClients) + tme.expectNoPreviousJournals() //------------------------------------------------------------------------------------------------------------------- // All cells RDONLY backward migration. _, err = tme.wr.SwitchReads(ctx, tme.targetKeyspace, "test", topodatapb.TabletType_RDONLY, nil, DirectionBackward, false) @@ -213,6 +222,7 @@ func TestTableMigrateMainflow(t *testing.T) { }) verifyQueries(t, tme.allDBClients) + tme.expectNoPreviousJournals() //------------------------------------------------------------------------------------------------------------------- // All cells RDONLY backward migration. _, err = tme.wr.SwitchReads(ctx, tme.targetKeyspace, "test", topodatapb.TabletType_REPLICA, nil, DirectionBackward, false) @@ -248,11 +258,13 @@ func TestTableMigrateMainflow(t *testing.T) { //------------------------------------------------------------------------------------------------------------------- // Test SwitchWrites cancelation on failure. + tme.expectNoPreviousJournals() // Switch all the reads first. _, err = tme.wr.SwitchReads(ctx, tme.targetKeyspace, "test", topodatapb.TabletType_RDONLY, nil, DirectionForward, false) if err != nil { t.Fatal(err) } + tme.expectNoPreviousJournals() _, err = tme.wr.SwitchReads(ctx, tme.targetKeyspace, "test", topodatapb.TabletType_REPLICA, nil, DirectionForward, false) if err != nil { t.Fatal(err) @@ -455,6 +467,7 @@ func TestShardMigrateMainflow(t *testing.T) { checkServedTypes(t, tme.ts, "ks:-80", 0) checkServedTypes(t, tme.ts, "ks:80-", 0) + tme.expectNoPreviousJournals() //------------------------------------------------------------------------------------------------------------------- // Single cell RDONLY migration. _, err := tme.wr.SwitchReads(ctx, tme.targetKeyspace, "test", topodatapb.TabletType_RDONLY, []string{"cell1"}, DirectionForward, false) @@ -471,6 +484,7 @@ func TestShardMigrateMainflow(t *testing.T) { checkCellServedTypes(t, tme.ts, "ks:80-", "cell2", 0) verifyQueries(t, tme.allDBClients) + tme.expectNoPreviousJournals() //------------------------------------------------------------------------------------------------------------------- // Other cell REPLICA migration. _, err = tme.wr.SwitchReads(ctx, tme.targetKeyspace, "test", topodatapb.TabletType_REPLICA, []string{"cell2"}, DirectionForward, false) @@ -487,6 +501,7 @@ func TestShardMigrateMainflow(t *testing.T) { checkCellServedTypes(t, tme.ts, "ks:80-", "cell2", 1) verifyQueries(t, tme.allDBClients) + tme.expectNoPreviousJournals() //------------------------------------------------------------------------------------------------------------------- // Single cell backward REPLICA migration. _, err = tme.wr.SwitchReads(ctx, tme.targetKeyspace, "test", topodatapb.TabletType_REPLICA, []string{"cell2"}, DirectionBackward, false) @@ -503,6 +518,7 @@ func TestShardMigrateMainflow(t *testing.T) { checkCellServedTypes(t, tme.ts, "ks:80-", "cell2", 0) verifyQueries(t, tme.allDBClients) + tme.expectNoPreviousJournals() //------------------------------------------------------------------------------------------------------------------- // Switch all RDONLY. // This is an extra step that does not exist in the tables test. @@ -518,6 +534,7 @@ func TestShardMigrateMainflow(t *testing.T) { checkServedTypes(t, tme.ts, "ks:80-", 1) verifyQueries(t, tme.allDBClients) + tme.expectNoPreviousJournals() //------------------------------------------------------------------------------------------------------------------- // Switch all REPLICA. _, err = tme.wr.SwitchReads(ctx, tme.targetKeyspace, "test", topodatapb.TabletType_REPLICA, nil, DirectionForward, false) @@ -530,6 +547,7 @@ func TestShardMigrateMainflow(t *testing.T) { checkServedTypes(t, tme.ts, "ks:80-", 2) verifyQueries(t, tme.allDBClients) + tme.expectNoPreviousJournals() //------------------------------------------------------------------------------------------------------------------- // All cells RDONLY backward migration. _, err = tme.wr.SwitchReads(ctx, tme.targetKeyspace, "test", topodatapb.TabletType_RDONLY, nil, DirectionBackward, false) @@ -562,6 +580,7 @@ func TestShardMigrateMainflow(t *testing.T) { //------------------------------------------------------------------------------------------------------------------- // Test SwitchWrites cancelation on failure. + tme.expectNoPreviousJournals() // Switch all the reads first. _, err = tme.wr.SwitchReads(ctx, tme.targetKeyspace, "test", topodatapb.TabletType_RDONLY, nil, DirectionForward, false) if err != nil { @@ -731,18 +750,17 @@ func TestTableMigrateOneToMany(t *testing.T) { tme := newTestTableMigraterCustom(ctx, t, []string{"0"}, []string{"-80", "80-"}, "select * %s") defer tme.stopTablets(t) + tme.expectNoPreviousJournals() _, err := tme.wr.SwitchReads(ctx, tme.targetKeyspace, "test", topodatapb.TabletType_RDONLY, nil, DirectionForward, false) if err != nil { t.Fatal(err) } + tme.expectNoPreviousJournals() _, err = tme.wr.SwitchReads(ctx, tme.targetKeyspace, "test", topodatapb.TabletType_REPLICA, nil, DirectionForward, false) if err != nil { t.Fatal(err) } - // checkJournals - tme.dbSourceClients[0].addQueryRE("select val from _vt.resharding_journal.*", &sqltypes.Result{}, nil) - waitForCatchup := func() { // mi.waitForCatchup-> mi.wr.tmc.VReplicationWaitForPos state := sqltypes.MakeTestResult(sqltypes.MakeTestFields( @@ -803,6 +821,7 @@ func TestTableMigrateOneToMany(t *testing.T) { _, err = tme.wr.DropSources(ctx, tme.targetKeyspace, "test", DropTable, false) require.Error(t, err, "Workflow has not completed, cannot DropSources") + tme.dbSourceClients[0].addQueryRE(tsCheckJournals, &sqltypes.Result{}, nil) _, _, err = tme.wr.SwitchWrites(ctx, tme.targetKeyspace, "test", 1*time.Second, false, false, false) if err != nil { t.Fatal(err) @@ -868,10 +887,6 @@ func TestTableMigrateOneToMany(t *testing.T) { tme.tmeDB.AddQuery("drop table vt_ks1.t2", &sqltypes.Result{}) tme.dbTargetClients[0].addQuery("select id from _vt.vreplication where db_name = 'vt_ks2' and workflow = 'test'", &sqltypes.Result{}, nil) // tme.dbTargetClients[1].addQuery("select id from _vt.vreplication where db_name = 'vt_ks2' and workflow = 'test'", &sqltypes.Result{}, nil) - //TODO, why are the delete queries not required?! - //tme.dbTargetClients[0].addQuery("delete from _vt.vreplication where db_name='vt_ks2' and workflow='test'", &sqltypes.Result{}, nil) - //tme.dbTargetClients[1].addQuery("delete from _vt.vreplication where db_name='vt_ks2' and workflow='test'", &sqltypes.Result{}, nil) - } dropSources() @@ -930,17 +945,22 @@ func TestTableMigrateOneToManyDryRun(t *testing.T) { "Unlock keyspace ks2", "Unlock keyspace ks1", } + tme.expectNoPreviousJournals() dryRunResults, err := tme.wr.SwitchReads(ctx, tme.targetKeyspace, "test", topodatapb.TabletType_RDONLY, nil, DirectionForward, true) require.NoError(t, err) require.Empty(t, cmp.Diff(wantdryRunReads, *dryRunResults)) + tme.expectNoPreviousJournals() _, err = tme.wr.SwitchReads(ctx, tme.targetKeyspace, "test", topodatapb.TabletType_RDONLY, nil, DirectionForward, false) require.NoError(t, err) + tme.expectNoPreviousJournals() _, err = tme.wr.SwitchReads(ctx, tme.targetKeyspace, "test", topodatapb.TabletType_REPLICA, nil, DirectionForward, false) require.NoError(t, err) + verifyQueries(t, tme.allDBClients) + // checkJournals - tme.dbSourceClients[0].addQueryRE("select val from _vt.resharding_journal.*", &sqltypes.Result{}, nil) + tme.dbSourceClients[0].addQueryRE(tsCheckJournals, &sqltypes.Result{}, nil) waitForCatchup := func() { // mi.waitForCatchup-> mi.wr.tmc.VReplicationWaitForPos @@ -1013,14 +1033,14 @@ func TestMigrateFailJournal(t *testing.T) { tme := newTestTableMigrater(ctx, t) defer tme.stopTablets(t) + tme.expectNoPreviousJournals() _, err := tme.wr.SwitchReads(ctx, tme.targetKeyspace, "test", topodatapb.TabletType_RDONLY, nil, DirectionForward, false) if err != nil { t.Fatal(err) } + tme.expectNoPreviousJournals() _, err = tme.wr.SwitchReads(ctx, tme.targetKeyspace, "test", topodatapb.TabletType_REPLICA, nil, DirectionForward, false) - if err != nil { - t.Fatal(err) - } + require.NoError(t, err) // mi.checkJournals tme.dbSourceClients[0].addQuery("select val from _vt.resharding_journal where id=7672494164556733923", &sqltypes.Result{}, nil) @@ -1109,15 +1129,16 @@ func TestTableMigrateJournalExists(t *testing.T) { tme := newTestTableMigrater(ctx, t) defer tme.stopTablets(t) + tme.expectNoPreviousJournals() _, err := tme.wr.SwitchReads(ctx, tme.targetKeyspace, "test", topodatapb.TabletType_RDONLY, nil, DirectionForward, false) if err != nil { t.Fatal(err) } + tme.expectNoPreviousJournals() _, err = tme.wr.SwitchReads(ctx, tme.targetKeyspace, "test", topodatapb.TabletType_REPLICA, nil, DirectionForward, false) if err != nil { t.Fatal(err) } - // mi.checkJournals: Show one journal as created. tme.dbSourceClients[0].addQuery("select val from _vt.resharding_journal where id=7672494164556733923", sqltypes.MakeTestResult(sqltypes.MakeTestFields("val", "varbinary"), ""), nil) tme.dbSourceClients[1].addQuery("select val from _vt.resharding_journal where id=7672494164556733923", &sqltypes.Result{}, nil) @@ -1167,16 +1188,17 @@ func TestTableMigrateJournalExists(t *testing.T) { verifyQueries(t, tme.allDBClients) } - func TestShardMigrateJournalExists(t *testing.T) { ctx := context.Background() tme := newTestShardMigrater(ctx, t, []string{"-40", "40-"}, []string{"-80", "80-"}) defer tme.stopTablets(t) + tme.expectNoPreviousJournals() _, err := tme.wr.SwitchReads(ctx, tme.targetKeyspace, "test", topodatapb.TabletType_RDONLY, nil, DirectionForward, false) if err != nil { t.Fatal(err) } + tme.expectNoPreviousJournals() _, err = tme.wr.SwitchReads(ctx, tme.targetKeyspace, "test", topodatapb.TabletType_REPLICA, nil, DirectionForward, false) if err != nil { t.Fatal(err) @@ -1226,16 +1248,17 @@ func TestShardMigrateJournalExists(t *testing.T) { verifyQueries(t, tme.allDBClients) } - func TestTableMigrateCancel(t *testing.T) { ctx := context.Background() tme := newTestTableMigrater(ctx, t) defer tme.stopTablets(t) + tme.expectNoPreviousJournals() _, err := tme.wr.SwitchReads(ctx, tme.targetKeyspace, "test", topodatapb.TabletType_RDONLY, nil, DirectionForward, false) if err != nil { t.Fatal(err) } + tme.expectNoPreviousJournals() _, err = tme.wr.SwitchReads(ctx, tme.targetKeyspace, "test", topodatapb.TabletType_REPLICA, nil, DirectionForward, false) if err != nil { t.Fatal(err) @@ -1289,10 +1312,12 @@ func TestTableMigrateCancelDryRun(t *testing.T) { "Unlock keyspace ks1", } + tme.expectNoPreviousJournals() _, err := tme.wr.SwitchReads(ctx, tme.targetKeyspace, "test", topodatapb.TabletType_RDONLY, nil, DirectionForward, false) if err != nil { t.Fatal(err) } + tme.expectNoPreviousJournals() _, err = tme.wr.SwitchReads(ctx, tme.targetKeyspace, "test", topodatapb.TabletType_REPLICA, nil, DirectionForward, false) if err != nil { t.Fatal(err) @@ -1336,10 +1361,12 @@ func TestTableMigrateNoReverse(t *testing.T) { tme := newTestTableMigrater(ctx, t) defer tme.stopTablets(t) + tme.expectNoPreviousJournals() _, err := tme.wr.SwitchReads(ctx, tme.targetKeyspace, "test", topodatapb.TabletType_RDONLY, nil, DirectionForward, false) if err != nil { t.Fatal(err) } + tme.expectNoPreviousJournals() _, err = tme.wr.SwitchReads(ctx, tme.targetKeyspace, "test", topodatapb.TabletType_REPLICA, nil, DirectionForward, false) if err != nil { t.Fatal(err) @@ -1434,11 +1461,13 @@ func TestMigrateFrozen(t *testing.T) { tme := newTestTableMigrater(ctx, t) defer tme.stopTablets(t) + tme.expectNoPreviousJournals() _, err := tme.wr.SwitchReads(ctx, tme.targetKeyspace, "test", topodatapb.TabletType_RDONLY, nil, DirectionForward, false) if err != nil { t.Fatal(err) } + tme.expectNoPreviousJournals() _, err = tme.wr.SwitchReads(ctx, tme.targetKeyspace, "test", topodatapb.TabletType_REPLICA, nil, DirectionForward, false) if err != nil { t.Fatal(err) @@ -1461,6 +1490,7 @@ func TestMigrateFrozen(t *testing.T) { ), nil) tme.dbTargetClients[1].addQuery(vreplQueryks2, &sqltypes.Result{}, nil) + tme.dbSourceClients[0].addQueryRE(tsCheckJournals, &sqltypes.Result{}, nil) _, err = tme.wr.SwitchReads(ctx, tme.targetKeyspace, "test", topodatapb.TabletType_REPLICA, nil, DirectionForward, false) want := "cannot switch reads while SwitchWrites is in progress" if err == nil || err.Error() != want { @@ -1489,6 +1519,7 @@ func TestMigrateNoStreamsFound(t *testing.T) { tme.dbTargetClients[0].addQuery(vreplQueryks2, &sqltypes.Result{}, nil) tme.dbTargetClients[1].addQuery(vreplQueryks2, &sqltypes.Result{}, nil) + tme.expectNoPreviousJournals() _, err := tme.wr.SwitchReads(ctx, tme.targetKeyspace, "test", topodatapb.TabletType_RDONLY, nil, DirectionForward, false) want := "no streams found in keyspace ks2 for: test" if err == nil || !strings.Contains(err.Error(), want) { @@ -1520,6 +1551,7 @@ func TestMigrateDistinctSources(t *testing.T) { fmt.Sprintf("1|%v|||", bls), ), nil) + tme.expectNoPreviousJournals() _, err := tme.wr.SwitchReads(ctx, tme.targetKeyspace, "test", topodatapb.TabletType_RDONLY, nil, DirectionForward, false) want := "source keyspaces are mismatched across streams" if err == nil || !strings.Contains(err.Error(), want) { @@ -1549,6 +1581,7 @@ func TestMigrateMismatchedTables(t *testing.T) { nil, ) + tme.expectNoPreviousJournals() _, err := tme.wr.SwitchReads(ctx, tme.targetKeyspace, "test", topodatapb.TabletType_RDONLY, nil, DirectionForward, false) want := "table lists are mismatched across streams" if err == nil || !strings.Contains(err.Error(), want) { @@ -1563,6 +1596,7 @@ func TestTableMigrateAllShardsNotPresent(t *testing.T) { tme.dbTargetClients[0].addQuery(vreplQueryks2, &sqltypes.Result{}, nil) + tme.expectNoPreviousJournals() _, err := tme.wr.SwitchReads(ctx, tme.targetKeyspace, "test", topodatapb.TabletType_RDONLY, nil, DirectionForward, false) want := "mismatched shards for keyspace" if err == nil || !strings.Contains(err.Error(), want) { @@ -1575,6 +1609,10 @@ func TestMigrateNoTableWildcards(t *testing.T) { tme := newTestTableMigrater(ctx, t) defer tme.stopTablets(t) + // validate that no previous journals exist + tme.dbSourceClients[0].addQueryRE(tsCheckJournals, &sqltypes.Result{}, nil) + tme.dbSourceClients[1].addQueryRE(tsCheckJournals, &sqltypes.Result{}, nil) + bls1 := &binlogdatapb.BinlogSource{ Keyspace: "ks1", Shard: "-40", @@ -1616,7 +1654,7 @@ func TestMigrateNoTableWildcards(t *testing.T) { "int64|varchar|varchar|varchar|varchar"), fmt.Sprintf("1|%v|||", bls3), ), nil) - + tme.expectNoPreviousJournals() _, err := tme.wr.SwitchReads(ctx, tme.targetKeyspace, "test", topodatapb.TabletType_RDONLY, nil, DirectionForward, false) want := "cannot migrate streams with wild card table names" if err == nil || !strings.Contains(err.Error(), want) { diff --git a/helm/release.sh b/helm/release.sh index 682837dd8a8..0c225f54e19 100755 --- a/helm/release.sh +++ b/helm/release.sh @@ -1,43 +1,68 @@ #!/bin/bash +set -ex -vt_base_version=v7.0.1 -orchestrator_version=3.2.3 -pmm_client_version=1.17.4 +vt_base_version='v7.0.2' +orchestrator_version='3.2.3' +pmm_client_version='1.17.4' docker pull vitess/base:$vt_base_version docker build --build-arg VT_BASE_VER=$vt_base_version -t vitess/k8s:$vt_base_version-buster . +docker tag vitess/k8s:$vt_base_version-buster vitess/k8s:$vt_base_version docker push vitess/k8s:$vt_base_version-buster +docker push vitess/k8s:$vt_base_version docker build --build-arg VT_BASE_VER=$vt_base_version -t vitess/vtgate:$vt_base_version-buster vtgate +docker tag vitess/vtgate:$vt_base_version-buster vitess/vtgate:$vt_base_version docker push vitess/vtgate:$vt_base_version-buster +docker push vitess/vtgate:$vt_base_version docker build --build-arg VT_BASE_VER=$vt_base_version -t vitess/vttablet:$vt_base_version-buster vttablet +docker tag vitess/vttablet:$vt_base_version-buster vitess/vttablet:$vt_base_version docker push vitess/vttablet:$vt_base_version-buster +docker push vitess/vttablet:$vt_base_version docker build --build-arg VT_BASE_VER=$vt_base_version -t vitess/mysqlctld:$vt_base_version-buster mysqlctld +docker tag vitess/mysqlctld:$vt_base_version-buster vitess/mysqlctld:$vt_base_version docker push vitess/mysqlctld:$vt_base_version-buster +docker push vitess/mysqlctld:$vt_base_version docker build --build-arg VT_BASE_VER=$vt_base_version -t vitess/vtctl:$vt_base_version-buster vtctl +docker tag vitess/vtctl:$vt_base_version-buster vitess/vtctl:$vt_base_version docker push vitess/vtctl:$vt_base_version-buster +docker push vitess/vtctl:$vt_base_version docker build --build-arg VT_BASE_VER=$vt_base_version -t vitess/vtctlclient:$vt_base_version-buster vtctlclient +docker tag vitess/vtctlclient:$vt_base_version-buster vitess/vtctlclient:$vt_base_version docker push vitess/vtctlclient:$vt_base_version-buster +docker push vitess/vtctlclient:$vt_base_version docker build --build-arg VT_BASE_VER=$vt_base_version -t vitess/vtctld:$vt_base_version-buster vtctld +docker tag vitess/vtctld:$vt_base_version-buster vitess/vtctld:$vt_base_version docker push vitess/vtctld:$vt_base_version-buster +docker push vitess/vtctld:$vt_base_version docker build --build-arg VT_BASE_VER=$vt_base_version -t vitess/vtworker:$vt_base_version-buster vtworker +docker tag vitess/vtworker:$vt_base_version-buster vitess/vtworker:$vt_base_version docker push vitess/vtworker:$vt_base_version-buster +docker push vitess/vtworker:$vt_base_version docker build --build-arg VT_BASE_VER=$vt_base_version -t vitess/logrotate:$vt_base_version-buster logrotate +docker tag vitess/logrotate:$vt_base_version-buster vitess/logrotate:$vt_base_version docker push vitess/logrotate:$vt_base_version-buster +docker push vitess/logrotate:$vt_base_version docker build --build-arg VT_BASE_VER=$vt_base_version -t vitess/logtail:$vt_base_version-buster logtail +docker tag vitess/logtail:$vt_base_version-buster vitess/logtail:$vt_base_version docker push vitess/logtail:$vt_base_version-buster +docker push vitess/logtail:$vt_base_version docker build --build-arg VT_BASE_VER=$vt_base_version --build-arg PMM_CLIENT_VER=$pmm_client_version -t vitess/pmm-client:v$pmm_client_version-buster pmm-client +docker tag vitess/pmm-client:v$pmm_client_version-buster vitess/pmm-client:v$pmm_client_version docker push vitess/pmm-client:v$pmm_client_version-buster +docker push vitess/pmm-client:v$pmm_client_version -docker build --build-arg VT_BASE_VER=$vt_base_version --build-arg PMM_CLIENT_VER=$pmm_client_version -t vitess/orchestrator:v$orchestrator_version-buster orchestrator +docker build --build-arg VT_BASE_VER=$vt_base_version --build-arg ORC_VER=$orchestrator_version -t vitess/orchestrator:v$orchestrator_version-buster orchestrator +docker tag vitess/orchestrator:v$orchestrator_version-buster vitess/orchestrator:v$orchestrator_version docker push vitess/orchestrator:v$orchestrator_version-buster +docker push vitess/orchestrator:v$orchestrator_version