From 264ae747342a287dc81fe583a8752a4c42cd049b Mon Sep 17 00:00:00 2001 From: David Weitzman Date: Tue, 15 Sep 2020 15:27:14 -0700 Subject: [PATCH 01/19] tx limiter: fix quota leak if Begin() errors or if the tx killer runs The transaction limiter reduces a caller ID's quota within the transaction pool to some fraction of the overall pool size. We've found it useful for tightening the blast radius when a single client starts to have long transactions for whatever reason. We noticed in a development enviornment that the tx limiter was preventing any new transactions for a particular caller ID even though no transactions for that user were already in progress. I'm not too familiar with this code, although it seems a bit brittle. In this PR I've tried to make sure that if there's an error grabbing a connection from the connection pool or if a connection is killed by the transaction killer, tx limiter quota is restored. I'd love for anyone who is to take a close look at this. It seems possible that killed transactions were also previously not logged, and this might fix that too?... See https://github.com/vitessio/vitess/issues/6727 Signed-off-by: David Weitzman --- go/vt/vttablet/tabletserver/tx_pool.go | 10 ++ go/vt/vttablet/tabletserver/tx_pool_test.go | 169 ++++++++++++++++---- 2 files changed, 150 insertions(+), 29 deletions(-) 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() } From aeabe06240739a49a3b65788b294dd345cc89ad8 Mon Sep 17 00:00:00 2001 From: Derek Perkins Date: Tue, 22 Sep 2020 17:45:08 -0600 Subject: [PATCH 02/19] helm/docker: fix Docker builds + tag 7.0.2 Signed-off-by: Derek Perkins --- docker/k8s/Dockerfile | 2 +- docker/k8s/mysqlctld/Dockerfile | 2 +- docker/k8s/orchestrator/Dockerfile | 5 ++--- docker/k8s/pmm-client/Dockerfile | 5 ++--- docker/k8s/vtbackup/Dockerfile | 2 +- docker/k8s/vtctl/Dockerfile | 2 +- docker/k8s/vtctlclient/Dockerfile | 2 +- docker/k8s/vtctld/Dockerfile | 2 +- docker/k8s/vtgate/Dockerfile | 2 +- docker/k8s/vttablet/Dockerfile | 2 +- docker/k8s/vtworker/Dockerfile | 2 +- helm/release.sh | 33 ++++++++++++++++++++++++++---- 12 files changed, 42 insertions(+), 19 deletions(-) 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/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 From ba0e41085d427fe8a7da7a083beffcc99bf451b3 Mon Sep 17 00:00:00 2001 From: Rohit Nayak Date: Thu, 24 Sep 2020 21:26:52 +0200 Subject: [PATCH 03/19] Error metrics: initial ones for vstreamer Signed-off-by: Rohit Nayak --- go/vt/vttablet/tabletserver/vstreamer/copy.go | 3 ++ .../vttablet/tabletserver/vstreamer/engine.go | 40 +++++++++++-------- .../tabletserver/vstreamer/uvstreamer.go | 7 +++- .../tabletserver/vstreamer/uvstreamer_test.go | 2 - .../tabletserver/vstreamer/vstreamer.go | 21 +++++++--- 5 files changed, 48 insertions(+), 25 deletions(-) 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..07ab36467b5 100644 --- a/go/vt/vttablet/tabletserver/vstreamer/engine.go +++ b/go/vt/vttablet/tabletserver/vstreamer/engine.go @@ -73,14 +73,18 @@ 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 + vstreamersEndedSuccessfully *stats.Counter + vstreamersEndedWithErrors *stats.Counter } // NewEngine creates a new Engine. @@ -102,14 +106,18 @@ 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"), + vstreamersEndedSuccessfully: env.Exporter().NewCounter("VStreamersEndedSuccessfully", "Count of vstreamers that ended successfully"), + 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/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..97b3ba7d033 100644 --- a/go/vt/vttablet/tabletserver/vstreamer/vstreamer.go +++ b/go/vt/vttablet/tabletserver/vstreamer/vstreamer.go @@ -147,9 +147,11 @@ 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) return err } vs.pos = pos @@ -161,21 +163,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 +254,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 +283,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 +291,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 +313,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 +509,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 +545,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,12 +813,15 @@ 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 } + vse.vstreamersEndedSuccessfully.Add(1) log.Infof("stream (at source tablet) ended @ %v", stopPos) return nil } From bc1ff89af9bbc1cb1c7533b6f3c44eb99d243d8d Mon Sep 17 00:00:00 2001 From: Rohit Nayak Date: Fri, 25 Sep 2020 01:02:16 +0200 Subject: [PATCH 04/19] Error metrics: initial ones for vreplication Signed-off-by: Rohit Nayak --- go/vt/binlog/binlogplayer/binlog_player.go | 15 ++++++---- .../tabletmanager/vreplication/controller.go | 6 ++++ .../tabletmanager/vreplication/stats.go | 30 ++++++++++++++++++- .../tabletmanager/vreplication/vplayer.go | 2 ++ .../tabletmanager/vreplication/vreplicator.go | 3 ++ 5 files changed, 49 insertions(+), 7 deletions(-) diff --git a/go/vt/binlog/binlogplayer/binlog_player.go b/go/vt/binlog/binlogplayer/binlog_player.go index d8f6f51c286..134fef7b75f 100644 --- a/go/vt/binlog/binlogplayer/binlog_player.go +++ b/go/vt/binlog/binlogplayer/binlog_player.go @@ -84,11 +84,13 @@ type Stats struct { State sync2.AtomicString - PhaseTimings *stats.Timings - QueryTimings *stats.Timings - QueryCount *stats.CountersWithSingleLabel - CopyRowCount *stats.Counter - CopyLoopCount *stats.Counter + PhaseTimings *stats.Timings + QueryTimings *stats.Timings + QueryCount *stats.CountersWithSingleLabel + CopyRowCount *stats.Counter + CopyLoopCount *stats.Counter + TabletPickerLatency *stats.Timings + ErrorCounts *stats.CountersWithMultiLabels } // SetLastPosition sets the last replication position. @@ -129,7 +131,8 @@ func NewStats() *Stats { bps.QueryCount = stats.NewCountersWithSingleLabel("", "", "Phase", "") bps.CopyRowCount = stats.NewCounter("", "") bps.CopyLoopCount = stats.NewCounter("", "") - + bps.TabletPickerLatency = stats.NewTimings("", "", "") + bps.ErrorCounts = stats.NewCountersWithMultiLabels("", "", []string{"type"}) return bps } diff --git a/go/vt/vttablet/tabletmanager/vreplication/controller.go b/go/vt/vttablet/tabletmanager/vreplication/controller.go index cb0e722c299..41db36a8161 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(): @@ -190,8 +191,11 @@ func (ct *controller) runBlp(ctx context.Context) (err error) { var tablet *topodatapb.Tablet if ct.source.GetExternalMysql() == "" { log.Infof("trying to find a tablet eligible for vreplication. stream id: %v", ct.id) + startTime := time.Now() tablet, err = ct.tabletPicker.PickForStreaming(ctx) + ct.blpStats.TabletPickerLatency.Record(ct.workflow, startTime) 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 +207,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 +246,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..8221e4ce79a 100644 --- a/go/vt/vttablet/tabletmanager/vreplication/stats.go +++ b/go/vt/vttablet/tabletmanager/vreplication/stats.go @@ -148,7 +148,20 @@ func (st *vrStats) register() { } return result }) - + stats.NewCounterFunc( + "VReplicationTimeToFindSourceTablet", + "time taken by tablet picker to find an appropriate tablet", + func() int64 { + st.mu.Lock() + defer st.mu.Unlock() + result := int64(0) + for _, ct := range st.controllers { + for _, t := range ct.blpStats.TabletPickerLatency.Histograms() { + result += t.Total() + } + } + return result + }) stats.NewGaugesFuncWithMultiLabels( "VReplicationPhaseTimingsCounts", "vreplication per phase count of timings per stream", @@ -252,6 +265,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..3b549fe0e13 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,7 @@ 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) return err } } diff --git a/go/vt/vttablet/tabletmanager/vreplication/vreplicator.go b/go/vt/vttablet/tabletmanager/vreplication/vreplicator.go index 105492a4790..7c06b2abbf6 100644 --- a/go/vt/vttablet/tabletmanager/vreplication/vreplicator.go +++ b/go/vt/vttablet/tabletmanager/vreplication/vreplicator.go @@ -165,10 +165,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 +182,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) From 5ad645cdf4f4a306366dc2075e8554be3897a083 Mon Sep 17 00:00:00 2001 From: Rohit Nayak Date: Fri, 25 Sep 2020 12:00:55 +0200 Subject: [PATCH 05/19] Error metrics: removed debug metrics Signed-off-by: Rohit Nayak --- go/vt/binlog/binlogplayer/binlog_player.go | 14 +++--- .../tabletmanager/vreplication/controller.go | 2 - .../tabletmanager/vreplication/stats.go | 15 +----- .../tabletmanager/vreplication/vplayer.go | 1 + .../tabletmanager/vreplication/vreplicator.go | 1 + .../vttablet/tabletserver/vstreamer/engine.go | 46 +++++++++---------- .../tabletserver/vstreamer/vstreamer.go | 2 +- 7 files changed, 32 insertions(+), 49 deletions(-) diff --git a/go/vt/binlog/binlogplayer/binlog_player.go b/go/vt/binlog/binlogplayer/binlog_player.go index 134fef7b75f..df04691b215 100644 --- a/go/vt/binlog/binlogplayer/binlog_player.go +++ b/go/vt/binlog/binlogplayer/binlog_player.go @@ -84,13 +84,12 @@ type Stats struct { State sync2.AtomicString - PhaseTimings *stats.Timings - QueryTimings *stats.Timings - QueryCount *stats.CountersWithSingleLabel - CopyRowCount *stats.Counter - CopyLoopCount *stats.Counter - TabletPickerLatency *stats.Timings - ErrorCounts *stats.CountersWithMultiLabels + PhaseTimings *stats.Timings + QueryTimings *stats.Timings + QueryCount *stats.CountersWithSingleLabel + CopyRowCount *stats.Counter + CopyLoopCount *stats.Counter + ErrorCounts *stats.CountersWithMultiLabels } // SetLastPosition sets the last replication position. @@ -131,7 +130,6 @@ func NewStats() *Stats { bps.QueryCount = stats.NewCountersWithSingleLabel("", "", "Phase", "") bps.CopyRowCount = stats.NewCounter("", "") bps.CopyLoopCount = stats.NewCounter("", "") - bps.TabletPickerLatency = stats.NewTimings("", "", "") bps.ErrorCounts = stats.NewCountersWithMultiLabels("", "", []string{"type"}) return bps } diff --git a/go/vt/vttablet/tabletmanager/vreplication/controller.go b/go/vt/vttablet/tabletmanager/vreplication/controller.go index 41db36a8161..512eca415a8 100644 --- a/go/vt/vttablet/tabletmanager/vreplication/controller.go +++ b/go/vt/vttablet/tabletmanager/vreplication/controller.go @@ -191,9 +191,7 @@ func (ct *controller) runBlp(ctx context.Context) (err error) { var tablet *topodatapb.Tablet if ct.source.GetExternalMysql() == "" { log.Infof("trying to find a tablet eligible for vreplication. stream id: %v", ct.id) - startTime := time.Now() tablet, err = ct.tabletPicker.PickForStreaming(ctx) - ct.blpStats.TabletPickerLatency.Record(ct.workflow, startTime) if err != nil { ct.blpStats.ErrorCounts.Add([]string{"No Source Tablet Found"}, 1) return err diff --git a/go/vt/vttablet/tabletmanager/vreplication/stats.go b/go/vt/vttablet/tabletmanager/vreplication/stats.go index 8221e4ce79a..2a218d98a91 100644 --- a/go/vt/vttablet/tabletmanager/vreplication/stats.go +++ b/go/vt/vttablet/tabletmanager/vreplication/stats.go @@ -148,20 +148,7 @@ func (st *vrStats) register() { } return result }) - stats.NewCounterFunc( - "VReplicationTimeToFindSourceTablet", - "time taken by tablet picker to find an appropriate tablet", - func() int64 { - st.mu.Lock() - defer st.mu.Unlock() - result := int64(0) - for _, ct := range st.controllers { - for _, t := range ct.blpStats.TabletPickerLatency.Histograms() { - result += t.Total() - } - } - return result - }) + stats.NewGaugesFuncWithMultiLabels( "VReplicationPhaseTimingsCounts", "vreplication per phase count of timings per stream", diff --git a/go/vt/vttablet/tabletmanager/vreplication/vplayer.go b/go/vt/vttablet/tabletmanager/vreplication/vplayer.go index 3b549fe0e13..cdfb62ed718 100644 --- a/go/vt/vttablet/tabletmanager/vreplication/vplayer.go +++ b/go/vt/vttablet/tabletmanager/vreplication/vplayer.go @@ -368,6 +368,7 @@ 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 7c06b2abbf6..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) } diff --git a/go/vt/vttablet/tabletserver/vstreamer/engine.go b/go/vt/vttablet/tabletserver/vstreamer/engine.go index 07ab36467b5..5ddc4ecaeaf 100644 --- a/go/vt/vttablet/tabletserver/vstreamer/engine.go +++ b/go/vt/vttablet/tabletserver/vstreamer/engine.go @@ -73,18 +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 - errorCounts *stats.CountersWithSingleLabel - vstreamersCreated *stats.Counter - vstreamersEndedSuccessfully *stats.Counter - vstreamersEndedWithErrors *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. @@ -106,18 +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"), - vstreamersCreated: env.Exporter().NewCounter("VStreamersCreated", "Count of vstreamers created"), - vstreamersEndedSuccessfully: env.Exporter().NewCounter("VStreamersEndedSuccessfully", "Count of vstreamers that ended successfully"), - 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"), + 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/vstreamer.go b/go/vt/vttablet/tabletserver/vstreamer/vstreamer.go index 97b3ba7d033..6d387beee85 100644 --- a/go/vt/vttablet/tabletserver/vstreamer/vstreamer.go +++ b/go/vt/vttablet/tabletserver/vstreamer/vstreamer.go @@ -152,6 +152,7 @@ func (vs *vstreamer) Stream() error { 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 @@ -821,7 +822,6 @@ func wrapError(err error, stopPos mysql.Position, vse *Engine) error { log.Error(err) return err } - vse.vstreamersEndedSuccessfully.Add(1) log.Infof("stream (at source tablet) ended @ %v", stopPos) return nil } From 8e6f28294ab9d9756aba1d324b620661a563ddc6 Mon Sep 17 00:00:00 2001 From: Rohit Nayak Date: Sat, 26 Sep 2020 19:52:48 +0200 Subject: [PATCH 06/19] Start watcher if tracker is on. More logs Signed-off-by: Rohit Nayak --- go/test/endtoend/vreplication/cluster.go | 2 +- go/vt/vttablet/tabletserver/binlog_watcher.go | 4 ++-- go/vt/vttablet/tabletserver/state_manager.go | 5 +++-- go/vt/vttablet/tabletserver/vstreamer/uvstreamer.go | 1 + 4 files changed, 7 insertions(+), 5 deletions(-) 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/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/state_manager.go b/go/vt/vttablet/tabletserver/state_manager.go index 5459ee8f56f..30da143e8b2 100644 --- a/go/vt/vttablet/tabletserver/state_manager.go +++ b/go/vt/vttablet/tabletserver/state_manager.go @@ -510,11 +510,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/vstreamer/uvstreamer.go b/go/vt/vttablet/tabletserver/vstreamer/uvstreamer.go index 6ed3db5bf29..8c52e5d3bf2 100644 --- a/go/vt/vttablet/tabletserver/vstreamer/uvstreamer.go +++ b/go/vt/vttablet/tabletserver/vstreamer/uvstreamer.go @@ -94,6 +94,7 @@ func newUVStreamer(ctx context.Context, vse *Engine, cp dbconfigs.Connector, se MaxReplicationLag: 1 * time.Nanosecond, CatchupRetryTime: 1 * time.Second, } + send2 := func(evs []*binlogdatapb.VEvent) error { vse.vstreamerEventsStreamed.Add(int64(len(evs))) return send(evs) From f0c8097d9a87139b116c535b29697512be012b02 Mon Sep 17 00:00:00 2001 From: Rohit Nayak Date: Sat, 26 Sep 2020 19:54:39 +0200 Subject: [PATCH 07/19] Start watcher if tracker is on. More logs Signed-off-by: Rohit Nayak --- go/vt/vttablet/tabletserver/vstreamer/uvstreamer.go | 1 - 1 file changed, 1 deletion(-) diff --git a/go/vt/vttablet/tabletserver/vstreamer/uvstreamer.go b/go/vt/vttablet/tabletserver/vstreamer/uvstreamer.go index 8c52e5d3bf2..6ed3db5bf29 100644 --- a/go/vt/vttablet/tabletserver/vstreamer/uvstreamer.go +++ b/go/vt/vttablet/tabletserver/vstreamer/uvstreamer.go @@ -94,7 +94,6 @@ func newUVStreamer(ctx context.Context, vse *Engine, cp dbconfigs.Connector, se MaxReplicationLag: 1 * time.Nanosecond, CatchupRetryTime: 1 * time.Second, } - send2 := func(evs []*binlogdatapb.VEvent) error { vse.vstreamerEventsStreamed.Add(int64(len(evs))) return send(evs) From 220d1647886b1aa3e22589839369fdccdc7dc5bb Mon Sep 17 00:00:00 2001 From: Rohit Nayak Date: Mon, 28 Sep 2020 21:20:52 +0200 Subject: [PATCH 08/19] Add validations for streams/journal entries leftover from previous/incomplete workflows Signed-off-by: Rohit Nayak --- go/vt/wrangler/keyspace.go | 31 ++++-- go/vt/wrangler/materializer.go | 140 ++++++++++++++++++++++++++-- go/vt/wrangler/materializer_test.go | 2 + go/vt/wrangler/resharder.go | 47 ++++++++++ go/vt/wrangler/traffic_switcher.go | 54 ++++++++--- 5 files changed, 244 insertions(+), 30 deletions(-) diff --git a/go/vt/wrangler/keyspace.go b/go/vt/wrangler/keyspace.go index 3846f443ca1..0c8c8efd942 100644 --- a/go/vt/wrangler/keyspace.go +++ b/go/vt/wrangler/keyspace.go @@ -113,17 +113,28 @@ 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", workflow, keyspace), + }, { + 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", keyspace, workflow), + }} + 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 len(p3qr.Rows) != 0 { + allErrors.RecordError(fmt.Errorf(validation.msg)) + return + } } + }(si) } wg.Wait() diff --git a/go/vt/wrangler/materializer.go b/go/vt/wrangler/materializer.go index 6f0e43bdc0c..6057682a4ec 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" @@ -122,7 +126,78 @@ 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 + } + wr.Logger().Infof("********* Migration id is %d", migrationId) + + 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 + } + journal, err := wr.checkIfJournalExistsOnTablet(ctx, tablet.Tablet, migrationId) + if err != nil { + return err + } + if journal.Id != 0 { + mu.Lock() + defer mu.Unlock() + exists = true + tablets = append(tablets, tablet.AliasString()) + } + return nil + }) + return exists, tablets, err } // CreateLookupVindex creates a lookup vindex and sets up the backfill. @@ -533,23 +608,74 @@ 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]) + 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) diff --git a/go/vt/wrangler/materializer_test.go b/go/vt/wrangler/materializer_test.go index 12882b0d8b0..d856cbdbf60 100644 --- a/go/vt/wrangler/materializer_test.go +++ b/go/vt/wrangler/materializer_test.go @@ -37,6 +37,7 @@ 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'" func TestMigrateTables(t *testing.T) { ms := &vtctldatapb.MaterializeSettings{ @@ -52,6 +53,7 @@ func TestMigrateTables(t *testing.T) { defer env.close() env.tmc.expectVRQuery(200, insertPrefix, &sqltypes.Result{}) + env.tmc.expectVRQuery(200, mzSelectIdQuery, &sqltypes.Result{}) env.tmc.expectVRQuery(200, mzUpdateQuery, &sqltypes.Result{}) ctx := context.Background() diff --git a/go/vt/wrangler/resharder.go b/go/vt/wrangler/resharder.go index 131f2fadc63..909cea0c10d 100644 --- a/go/vt/wrangler/resharder.go +++ b/go/vt/wrangler/resharder.go @@ -18,9 +18,14 @@ package wrangler import ( "fmt" + "hash/fnv" + "math" + "sort" "sync" "time" + "vitess.io/vitess/go/vt/vtgate/evalengine" + "github.com/golang/protobuf/proto" "github.com/pkg/errors" "golang.org/x/net/context" @@ -58,6 +63,41 @@ type refStream struct { tabletTypes string } +// hashStreams produces a reproducible hash based on the input parameters. +func (rs *resharder) getMigrationId(ctx context.Context) (int64, error) { + var expanded []string + var mu sync.Mutex + err := rs.forAll(rs.targetShards, func(target *topo.ShardInfo) error { + var id int64 + var err error + targetMaster := rs.targetMasters[target.ShardName()] + query := fmt.Sprintf("select id from _vt.vreplication where db_name=%s and workflow=%s", encodeString(targetMaster.DbName()), encodeString(rs.workflow)) + p3qr, err := rs.wr.tmc.VReplicationExec(ctx, targetMaster.Tablet, query) + if err != nil { + return vterrors.Wrapf(err, "VReplicationExec(%v, %s)", targetMaster.Tablet, query) + } + qr := sqltypes.Proto3ToResult(p3qr) + for i := 0; i < len(qr.Rows); i++ { + id, err = evalengine.ToInt64(qr.Rows[i][0]) + mu.Lock() + expanded = append(expanded, fmt.Sprintf("%s:%d", target.ShardName(), id)) + mu.Unlock() + } + return nil + }) + if err != nil { + return 0, err + } + sort.Strings(expanded) + hasher := fnv.New64() + hasher.Write([]byte(rs.keyspace)) + for _, str := range expanded { + hasher.Write([]byte(str)) + } + // Convert to int64 after dropping the highest bit. + return int64(hasher.Sum64() & math.MaxInt64), nil +} + // Reshard initiates a resharding workflow. func (wr *Wrangler) Reshard(ctx context.Context, keyspace, workflow string, sources, targets []string, skipSchemaCopy bool, cell, tabletTypes string) error { if err := wr.validateNewWorkflow(ctx, keyspace, workflow); err != nil { @@ -76,9 +116,16 @@ func (wr *Wrangler) Reshard(ctx context.Context, keyspace, workflow string, sour if err := rs.createStreams(ctx); err != nil { return vterrors.Wrap(err, "createStreams") } + migrationId, err := rs.getMigrationId(ctx) + if err != nil { + return err + } + wr.Logger().Infof("********* Migration id is %d", migrationId) + if err := rs.startStreams(ctx); err != nil { return vterrors.Wrap(err, "startStream") } + return nil } diff --git a/go/vt/wrangler/traffic_switcher.go b/go/vt/wrangler/traffic_switcher.go index 7693ffd8e0e..a556ef6a17a 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()} @@ -530,6 +541,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 +688,50 @@ 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, error) { + var exists bool + journal := &binlogdatapb.Journal{} + query := fmt.Sprintf("select val from _vt.resharding_journal where id=%v", migrationId) + wr.Logger().Infof("********* running %s on %s", query, tablet.String()) + p3qr, err := wr.tmc.VReplicationExec(ctx, tablet, query) + if err != nil { + return nil, 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, err + } + wr.Logger().Infof("********* journal is %s", journal.String()) + exists = true + } + } + return journal, 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) + journal, err := ts.wr.checkIfJournalExistsOnTablet(ctx, source.master.Tablet, ts.id) if err != nil { return err } - if len(p3qr.Rows) != 0 { - qr := sqltypes.Proto3ToResult(p3qr) + if journal.Id != 0 { mu.Lock() defer mu.Unlock() - - if !exists { - if err := proto.UnmarshalText(qr.Rows[0][0].ToString(), journal); err != nil { - return err - } - exists = true - } + exists = true source.journaled = true + sourceWorkflows = journal.SourceWorkflows } return nil }) - return exists, journal.SourceWorkflows, err + return exists, sourceWorkflows, err } func (ts *trafficSwitcher) stopSourceWrites(ctx context.Context) error { From 47a93f0457986374af957e842b2438de98a16af0 Mon Sep 17 00:00:00 2001 From: GuptaManan100 Date: Fri, 2 Oct 2020 15:22:22 +0530 Subject: [PATCH 09/19] Added Non restricted words support in column names and added tests for it Signed-off-by: GuptaManan100 --- go/vt/sqlparser/parse_test.go | 14 + go/vt/sqlparser/sql.go | 1957 +++++++++++++++++---------------- go/vt/sqlparser/sql.y | 2 +- 3 files changed, 1052 insertions(+), 921 deletions(-) diff --git a/go/vt/sqlparser/parse_test.go b/go/vt/sqlparser/parse_test.go index e65c3beb9c4..cd650692288 100644 --- a/go/vt/sqlparser/parse_test.go +++ b/go/vt/sqlparser/parse_test.go @@ -2455,6 +2455,14 @@ func TestCreateTable(t *testing.T) { " 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" + @@ -2784,6 +2792,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, }} ) @@ -2792,6 +2805,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 0f0c9fb27a6..7bb4db5a609 100644 --- a/go/vt/sqlparser/sql.go +++ b/go/vt/sqlparser/sql.go @@ -908,419 +908,430 @@ var yyExca = [...]int{ const yyPrivate = 57344 -const yyLast = 17396 +const yyLast = 18567 var yyAct = [...]int{ - 400, 1621, 1419, 1578, 1303, 1205, 1050, 1357, 1611, 359, - 1225, 1493, 1022, 1393, 344, 695, 1527, 1358, 1206, 373, - 1354, 1093, 1254, 734, 1049, 1369, 1192, 71, 3, 596, - 330, 1480, 741, 1059, 1322, 1363, 930, 440, 1143, 92, - 865, 1280, 1001, 290, 937, 313, 290, 1019, 779, 1271, - 885, 92, 1063, 290, 772, 1024, 1008, 417, 402, 739, - 762, 69, 963, 761, 1089, 907, 744, 28, 1030, 346, - 776, 1046, 769, 778, 335, 565, 67, 605, 708, 342, - 92, 893, 66, 566, 290, 331, 290, 751, 334, 585, - 1079, 8, 7, 6, 1614, 1598, 1609, 1586, 1606, 30, - 31, 32, 60, 34, 35, 1420, 1597, 1585, 1339, 1449, - 374, 29, 570, 1387, 1242, 615, 1112, 1241, 408, 64, - 1243, 780, 72, 781, 36, 55, 56, 1040, 58, 333, - 1111, 286, 282, 283, 284, 403, 94, 95, 96, 332, - 29, 423, 427, 709, 1388, 1389, 628, 45, 1041, 1042, - 434, 59, 1262, 1072, 74, 75, 76, 77, 78, 79, - 1483, 94, 95, 96, 30, 1080, 1440, 60, 34, 35, - 339, 623, 1110, 1438, 1305, 624, 621, 622, 404, 323, - 892, 1553, 657, 656, 666, 667, 659, 660, 661, 662, - 663, 664, 665, 658, 325, 437, 668, 385, 321, 391, - 392, 389, 390, 388, 387, 386, 626, 602, 627, 604, - 94, 95, 96, 393, 394, 854, 59, 38, 39, 41, - 40, 43, 940, 57, 853, 1107, 1104, 1105, 278, 1103, - 1306, 276, 1307, 280, 894, 895, 896, 616, 617, 851, - 1605, 601, 603, 1608, 1629, 1571, 44, 63, 62, 1579, - 1302, 53, 54, 42, 1064, 1323, 855, 1002, 611, 285, - 852, 1528, 1114, 1117, 586, 1625, 572, 46, 47, 280, - 48, 49, 50, 51, 1308, 1066, 1530, 290, 577, 578, - 1536, 858, 290, 1290, 587, 631, 842, 1299, 290, 1226, - 1228, 1560, 1380, 1301, 290, 594, 1325, 1379, 600, 1378, - 568, 575, 1109, 293, 281, 92, 1124, 92, 1073, 1123, - 680, 681, 582, 1462, 92, 1286, 1287, 1288, 1386, 1197, - 1172, 1151, 1036, 755, 1108, 1047, 92, 92, 613, 693, - 279, 592, 1584, 1327, 599, 1331, 1162, 1326, 1159, 1324, - 658, 668, 629, 668, 1329, 1238, 980, 1529, 648, 886, - 880, 1080, 82, 1328, 645, 637, 277, 610, 606, 1569, - 61, 598, 1554, 642, 643, 1545, 1330, 1332, 1113, 612, - 648, 1227, 1066, 1367, 588, 589, 590, 607, 608, 1065, - 579, 1623, 580, 1115, 1624, 581, 1622, 1289, 782, 1537, - 1535, 83, 1294, 1291, 1282, 1292, 1285, 1300, 1281, 1298, - 641, 1341, 1283, 1284, 94, 95, 96, 94, 95, 96, - 964, 678, 1169, 964, 844, 614, 1293, 614, 1260, 640, - 638, 639, 1574, 748, 614, 61, 92, 571, 1589, 290, - 290, 290, 732, 92, 1069, 731, 887, 881, 29, 92, - 1630, 1070, 696, 1489, 1488, 597, 680, 681, 680, 681, - 1275, 677, 679, 659, 660, 661, 662, 663, 664, 665, - 658, 1406, 777, 668, 914, 711, 713, 715, 717, 719, - 721, 722, 1136, 1137, 1138, 745, 1065, 760, 912, 913, - 911, 1274, 692, 1263, 1631, 1591, 697, 698, 699, 700, - 701, 702, 703, 704, 1570, 707, 710, 710, 710, 716, - 710, 710, 716, 710, 724, 725, 726, 727, 728, 729, - 730, 1506, 1066, 1486, 412, 29, 573, 574, 682, 683, - 684, 685, 686, 687, 688, 689, 690, 691, 733, 59, - 712, 714, 1272, 718, 720, 878, 723, 94, 95, 96, - 766, 910, 432, 870, 94, 95, 96, 1032, 437, 657, - 656, 666, 667, 659, 660, 661, 662, 663, 664, 665, - 658, 275, 1366, 668, 1542, 290, 1446, 647, 645, 840, - 92, 1158, 843, 564, 845, 290, 290, 92, 92, 92, - 646, 647, 645, 290, 648, 1541, 290, 1402, 1343, 290, - 863, 864, 1033, 290, 1035, 92, 1533, 1607, 648, 1067, - 92, 92, 92, 290, 92, 92, 1144, 661, 662, 663, - 664, 665, 658, 1593, 412, 668, 1065, 92, 92, 985, - 986, 1062, 1060, 994, 1061, 869, 646, 647, 645, 1458, - 867, 1058, 1064, 1533, 1582, 618, 68, 743, 428, 429, - 430, 644, 630, 1157, 648, 1156, 657, 656, 666, 667, - 659, 660, 661, 662, 663, 664, 665, 658, 859, 1544, - 668, 902, 904, 905, 646, 647, 645, 1193, 903, 931, - 993, 908, 646, 647, 645, 94, 95, 96, 933, 982, - 614, 1410, 648, 1533, 412, 1533, 1561, 614, 614, 614, - 648, 412, 92, 656, 666, 667, 659, 660, 661, 662, - 663, 664, 665, 658, 889, 614, 668, 1533, 1532, 968, - 614, 614, 614, 1005, 614, 614, 952, 955, 1232, 981, - 1031, 909, 965, 1478, 1477, 92, 92, 614, 614, 947, - 1004, 943, 1464, 412, 942, 1461, 412, 70, 646, 647, - 645, 1412, 1411, 92, 646, 647, 645, 696, 1408, 1409, - 290, 1408, 1407, 92, 993, 412, 648, 290, 1005, 290, - 934, 935, 648, 1005, 412, 644, 412, 290, 290, 290, - 1005, 944, 973, 974, 1193, 92, 789, 788, 92, 1246, - 993, 411, 362, 361, 364, 365, 366, 367, 1039, 92, - 566, 363, 368, 943, 1020, 405, 999, 94, 95, 96, - 1175, 932, 59, 995, 94, 95, 96, 1174, 1245, 941, + 400, 1622, 1420, 1579, 1303, 1494, 344, 1612, 615, 1205, + 1481, 1050, 1528, 1225, 1357, 359, 1393, 1022, 1079, 1358, + 695, 1046, 1206, 1354, 734, 1254, 1093, 1049, 1363, 373, + 1059, 1369, 71, 3, 330, 930, 440, 613, 865, 92, + 1322, 741, 1143, 290, 937, 313, 290, 1271, 1280, 408, + 1063, 92, 1019, 290, 1024, 772, 596, 779, 1008, 1192, + 885, 762, 744, 346, 1001, 739, 417, 963, 761, 402, + 69, 28, 907, 1089, 565, 778, 1030, 751, 605, 335, + 92, 769, 776, 92, 290, 67, 290, 72, 437, 331, + 709, 893, 334, 66, 8, 342, 7, 1615, 708, 6, + 1599, 1610, 1587, 1112, 1607, 940, 585, 1421, 1598, 1586, + 1339, 1450, 570, 1387, 94, 95, 96, 1111, 1040, 74, + 75, 76, 77, 78, 79, 385, 333, 391, 392, 389, + 390, 388, 387, 386, 1388, 1389, 628, 423, 427, 403, + 30, 393, 394, 60, 34, 35, 1041, 1042, 94, 95, + 96, 332, 286, 282, 283, 284, 1262, 1072, 278, 1110, + 1484, 276, 434, 280, 1554, 657, 656, 666, 667, 659, + 660, 661, 662, 663, 664, 665, 658, 1242, 1305, 668, + 1241, 1080, 780, 1243, 781, 602, 1441, 604, 1073, 623, + 1439, 892, 59, 624, 621, 622, 323, 325, 627, 94, + 95, 96, 321, 616, 617, 626, 854, 853, 1307, 851, + 1609, 1606, 1107, 1104, 1105, 1572, 1103, 1580, 1396, 601, + 603, 1302, 1002, 1630, 1323, 586, 611, 1626, 1226, 1228, + 572, 280, 1537, 1529, 1306, 1308, 858, 631, 842, 1380, + 1379, 1378, 575, 852, 894, 895, 896, 855, 1531, 1114, + 1117, 1299, 1066, 568, 293, 281, 1124, 1301, 1066, 1123, + 279, 680, 681, 1561, 1162, 1325, 1159, 1463, 1386, 1197, + 1172, 339, 1151, 1036, 755, 693, 592, 290, 577, 578, + 285, 1047, 290, 668, 587, 1238, 277, 980, 290, 1109, + 94, 95, 96, 658, 290, 594, 668, 598, 600, 94, + 95, 96, 1327, 886, 1331, 92, 1326, 92, 1324, 880, + 1227, 1108, 599, 1329, 92, 82, 914, 645, 606, 1530, + 648, 1570, 1328, 1546, 1367, 610, 92, 92, 782, 582, + 912, 913, 911, 648, 1585, 1330, 1332, 612, 641, 1290, + 1080, 1538, 1536, 1624, 618, 1555, 1625, 1341, 1623, 647, + 645, 630, 964, 1407, 83, 1113, 1065, 964, 844, 1169, + 637, 1300, 1065, 1298, 1631, 777, 648, 642, 643, 629, + 1115, 1286, 1287, 1288, 680, 681, 680, 681, 607, 608, + 571, 597, 767, 1575, 30, 31, 32, 60, 34, 35, + 887, 588, 589, 590, 1260, 748, 881, 579, 1590, 580, + 1158, 61, 581, 1490, 64, 678, 1489, 1069, 1632, 36, + 55, 56, 1275, 58, 1070, 661, 662, 663, 664, 665, + 658, 275, 640, 668, 638, 288, 92, 639, 1274, 290, + 290, 290, 45, 92, 1263, 326, 59, 732, 1592, 92, + 1157, 437, 1156, 1289, 731, 432, 696, 1571, 1294, 1291, + 1282, 1292, 1285, 59, 1281, 646, 647, 645, 1283, 1284, + 412, 646, 647, 645, 1507, 910, 567, 1487, 569, 573, + 574, 1272, 1293, 648, 646, 647, 645, 712, 714, 648, + 718, 720, 760, 723, 745, 711, 713, 715, 717, 719, + 721, 722, 648, 733, 902, 904, 905, 878, 428, 429, + 430, 903, 38, 39, 41, 40, 43, 870, 57, 656, 666, 667, 659, 660, 661, 662, 663, 664, 665, 658, - 1366, 906, 668, 1032, 915, 916, 917, 918, 919, 920, - 921, 922, 923, 924, 925, 926, 927, 928, 929, 1034, - 997, 1029, 993, 290, 92, 1037, 92, 59, 1116, 1038, - 977, 1031, 290, 290, 290, 290, 290, 983, 290, 290, - 987, 1095, 290, 92, 1355, 1054, 30, 1366, 1033, 857, - 1031, 941, 1010, 1013, 1014, 1015, 1011, 1021, 1012, 1016, - 290, 969, 1370, 1371, 774, 290, 30, 290, 290, 1599, - 437, 290, 92, 437, 1081, 1082, 1083, 1513, 841, 1495, - 1074, 1091, 1092, 1469, 1051, 848, 849, 850, 1094, 1398, - 1370, 1371, 1376, 1249, 1090, 1131, 1085, 412, 59, 1084, - 948, 949, 1304, 868, 954, 957, 958, 1496, 872, 873, - 874, 908, 876, 877, 1097, 1616, 1375, 401, 59, 1612, - 1400, 1373, 1355, 1276, 30, 882, 883, 890, 861, 972, - 1217, 1214, 975, 976, 614, 1218, 614, 657, 656, 666, - 667, 659, 660, 661, 662, 663, 664, 665, 658, 1200, - 1213, 668, 1603, 614, 1215, 1201, 93, 1139, 1182, 1216, - 291, 909, 1219, 291, 1014, 1015, 1596, 1347, 93, 742, - 291, 1601, 1191, 1190, 1267, 290, 59, 787, 595, 960, - 1259, 1181, 735, 1152, 1576, 1575, 290, 290, 290, 290, - 290, 1186, 403, 961, 736, 1511, 1257, 93, 290, 1207, - 1251, 291, 290, 291, 1456, 1168, 290, 1198, 1491, 1202, - 1100, 290, 290, 860, 1018, 290, 290, 290, 406, 407, - 409, 1455, 1195, 1185, 410, 70, 1189, 1454, 1244, 1224, - 92, 1350, 1150, 1196, 1188, 404, 1247, 1193, 625, 1250, - 1194, 1618, 1617, 1255, 1255, 1163, 1153, 1209, 1210, 1208, - 1212, 1231, 1211, 1220, 867, 1160, 884, 756, 1233, 418, - 749, 1230, 1235, 1140, 1141, 1142, 1256, 1618, 1239, 1558, - 1236, 1484, 979, 419, 405, 73, 68, 65, 92, 92, - 746, 747, 421, 1, 420, 766, 312, 1075, 1076, 1077, - 1078, 1610, 1203, 1204, 1252, 1253, 766, 766, 766, 766, - 766, 1421, 1492, 1086, 1087, 1088, 1106, 1577, 92, 1526, - 1392, 1057, 1021, 1279, 1229, 1273, 1010, 1013, 1014, 1015, - 1011, 766, 1012, 1016, 1048, 766, 1295, 81, 563, 80, - 1568, 1266, 92, 1268, 1269, 1270, 879, 609, 931, 1056, - 1055, 1148, 1149, 1534, 1261, 1051, 1264, 1265, 1071, 1482, - 1399, 1258, 1099, 1573, 1101, 795, 793, 1321, 794, 1312, - 1310, 1311, 1166, 792, 797, 1320, 796, 791, 290, 305, - 891, 1128, 322, 1334, 1333, 1318, 1017, 783, 92, 1340, - 1096, 750, 84, 1297, 92, 92, 1356, 1296, 1102, 614, - 943, 1068, 302, 942, 291, 1207, 619, 620, 307, 291, - 676, 1359, 1187, 1240, 438, 291, 431, 1361, 984, 738, - 92, 291, 1365, 290, 1453, 1349, 1167, 1374, 614, 705, - 962, 765, 93, 345, 93, 901, 360, 92, 357, 92, - 92, 93, 358, 1255, 1255, 1391, 988, 1199, 1382, 650, - 1384, 343, 1385, 93, 93, 1381, 425, 1319, 1405, 418, - 337, 1390, 764, 757, 1009, 1396, 1397, 290, 1007, 1006, - 1383, 770, 1372, 419, 1395, 1368, 763, 992, 1344, 414, - 415, 416, 421, 959, 420, 1552, 1448, 290, 413, 371, - 52, 33, 327, 92, 633, 1422, 92, 92, 92, 290, - 422, 1414, 1360, 1319, 29, 1314, 1315, 1353, 23, 22, - 21, 20, 19, 25, 18, 336, 1415, 17, 1417, 16, - 1335, 1336, 583, 1337, 1338, 37, 1403, 1404, 91, 27, - 1427, 1428, 26, 766, 15, 1345, 1346, 14, 13, 1436, - 324, 12, 11, 10, 9, 5, 4, 636, 24, 694, - 2, 0, 1051, 93, 1051, 0, 291, 291, 291, 0, - 93, 0, 0, 0, 0, 0, 93, 1457, 0, 439, - 0, 1207, 0, 0, 0, 1466, 0, 0, 0, 0, - 0, 92, 0, 0, 0, 0, 0, 1247, 1465, 92, - 0, 0, 0, 0, 945, 946, 0, 0, 0, 0, - 1476, 0, 0, 0, 92, 1475, 0, 0, 0, 0, - 0, 92, 0, 0, 0, 0, 0, 1278, 0, 0, - 1401, 0, 0, 0, 0, 1499, 0, 0, 0, 1431, - 0, 0, 978, 0, 0, 0, 0, 0, 0, 0, - 1447, 0, 0, 0, 0, 1497, 1309, 0, 0, 0, - 0, 0, 92, 92, 0, 92, 0, 0, 0, 0, - 92, 1510, 92, 92, 92, 290, 1512, 0, 1359, 92, - 0, 0, 0, 0, 1429, 0, 0, 1524, 1514, 1471, - 1472, 1473, 1531, 0, 1538, 0, 92, 290, 1485, 0, - 1487, 1519, 291, 1520, 1522, 1523, 1051, 93, 0, 0, - 0, 0, 291, 291, 93, 93, 93, 0, 0, 0, - 291, 1559, 0, 291, 614, 1498, 291, 1546, 0, 1567, - 291, 0, 93, 1359, 92, 1565, 1494, 93, 93, 93, - 291, 93, 93, 1566, 0, 92, 92, 0, 0, 0, - 0, 0, 1581, 0, 93, 93, 1580, 1539, 0, 1540, - 0, 92, 0, 0, 1587, 0, 0, 1505, 0, 1360, - 0, 29, 290, 1207, 0, 0, 0, 0, 0, 0, - 92, 0, 0, 0, 1518, 0, 0, 1595, 0, 0, - 0, 0, 0, 0, 1525, 0, 0, 1600, 1602, 0, - 92, 0, 1543, 0, 439, 649, 439, 0, 0, 0, - 0, 0, 0, 439, 1500, 1501, 1502, 1503, 1504, 1615, - 1626, 0, 1507, 1508, 1360, 632, 634, 0, 0, 93, - 0, 1604, 1433, 1434, 0, 1435, 0, 0, 1437, 0, - 1439, 336, 0, 1146, 0, 0, 0, 1147, 0, 0, - 706, 0, 0, 0, 0, 0, 0, 0, 1154, 1155, - 1494, 1051, 93, 93, 1161, 0, 0, 1164, 1165, 0, - 0, 0, 0, 0, 0, 1171, 737, 740, 0, 1173, - 93, 0, 1176, 1177, 1178, 1179, 1180, 291, 0, 0, - 93, 0, 0, 0, 291, 0, 291, 0, 0, 0, - 0, 0, 0, 1479, 291, 291, 291, 0, 0, 0, - 0, 0, 93, 0, 0, 93, 0, 0, 0, 1613, - 0, 1445, 0, 0, 0, 753, 93, 0, 0, 1222, - 1223, 0, 439, 0, 0, 652, 0, 655, 784, 0, - 0, 0, 1490, 669, 670, 671, 672, 673, 674, 675, - 0, 653, 654, 651, 657, 656, 666, 667, 659, 660, - 661, 662, 663, 664, 665, 658, 0, 0, 668, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 291, 93, 0, 93, 1619, 0, 0, 0, 0, 291, - 291, 291, 291, 291, 1452, 291, 291, 0, 0, 291, - 93, 657, 656, 666, 667, 659, 660, 661, 662, 663, - 664, 665, 658, 0, 0, 668, 0, 291, 0, 0, - 0, 0, 291, 0, 291, 291, 0, 0, 291, 93, - 0, 0, 0, 0, 0, 657, 656, 666, 667, 659, - 660, 661, 662, 663, 664, 665, 658, 0, 0, 668, - 0, 0, 0, 0, 0, 0, 0, 0, 1316, 1317, - 0, 0, 0, 0, 0, 871, 0, 0, 0, 439, - 0, 0, 0, 0, 0, 0, 439, 439, 439, 657, - 656, 666, 667, 659, 660, 661, 662, 663, 664, 665, - 658, 0, 888, 668, 439, 0, 0, 0, 0, 439, - 439, 439, 0, 439, 439, 0, 0, 0, 0, 0, - 0, 897, 898, 899, 900, 0, 439, 439, 0, 0, - 0, 0, 0, 0, 0, 0, 94, 95, 96, 0, - 0, 0, 291, 0, 1377, 0, 0, 0, 0, 0, - 0, 0, 0, 291, 291, 291, 291, 291, 0, 0, - 0, 0, 0, 0, 0, 291, 0, 0, 0, 291, - 0, 0, 0, 291, 0, 0, 950, 951, 291, 291, - 0, 1451, 291, 291, 291, 0, 0, 0, 0, 0, - 294, 0, 0, 0, 0, 0, 0, 93, 0, 297, - 0, 936, 0, 439, 0, 0, 0, 306, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 966, 0, 0, - 0, 0, 657, 656, 666, 667, 659, 660, 661, 662, - 663, 664, 665, 658, 970, 971, 668, 0, 1430, 0, - 0, 304, 1432, 767, 0, 93, 93, 311, 0, 0, - 0, 0, 989, 1441, 1442, 0, 0, 0, 0, 1045, - 0, 0, 753, 0, 0, 439, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 93, 0, 295, 0, 0, - 1459, 1460, 0, 1463, 439, 0, 288, 439, 0, 0, - 0, 0, 0, 0, 0, 0, 326, 0, 439, 93, - 0, 1474, 0, 0, 308, 298, 0, 309, 310, 317, - 0, 0, 0, 301, 303, 314, 299, 300, 319, 318, - 0, 296, 316, 315, 0, 0, 0, 567, 0, 569, - 0, 0, 0, 0, 0, 291, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 93, 0, 0, 0, 0, - 0, 93, 93, 439, 0, 439, 0, 0, 0, 0, - 0, 0, 0, 372, 0, 0, 0, 0, 0, 0, - 0, 0, 439, 0, 0, 0, 0, 93, 0, 0, - 291, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1521, 0, 1444, 93, 0, 93, 93, 0, 0, - 0, 1135, 0, 0, 0, 0, 289, 0, 0, 320, - 0, 0, 0, 0, 0, 0, 289, 0, 1443, 0, - 1548, 1549, 1550, 1551, 291, 1555, 0, 1556, 1557, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 426, 426, - 1562, 1170, 1563, 1564, 291, 0, 0, 289, 0, 289, - 93, 0, 0, 93, 93, 93, 291, 0, 1183, 1184, - 740, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1583, 657, 656, 666, 667, 659, 660, 661, - 662, 663, 664, 665, 658, 0, 0, 668, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1592, 657, 656, + 743, 1543, 668, 1136, 1137, 1138, 1032, 985, 986, 1534, + 1608, 44, 63, 62, 1594, 412, 53, 54, 42, 68, + 657, 656, 666, 667, 659, 660, 661, 662, 663, 664, + 665, 658, 46, 47, 668, 48, 49, 50, 51, 94, + 95, 96, 1366, 932, 1542, 290, 94, 95, 96, 840, + 92, 1033, 843, 1035, 845, 290, 290, 92, 92, 92, + 646, 647, 645, 290, 1534, 1583, 290, 1534, 412, 290, + 863, 864, 1403, 290, 412, 92, 1355, 1144, 648, 1366, + 92, 92, 92, 290, 92, 92, 1032, 841, 94, 95, + 96, 1232, 1245, 1031, 848, 849, 850, 92, 92, 682, + 683, 684, 685, 686, 687, 688, 689, 690, 691, 867, + 1534, 1562, 868, 1534, 1533, 1479, 1478, 872, 873, 874, + 1459, 876, 877, 1465, 412, 61, 1462, 412, 646, 647, + 645, 1033, 869, 1031, 882, 883, 1343, 1413, 1412, 576, + 1409, 1410, 1409, 1408, 584, 1193, 648, 859, 1067, 931, + 591, 993, 412, 1005, 412, 644, 593, 1545, 933, 30, + 1411, 908, 666, 667, 659, 660, 661, 662, 663, 664, + 665, 658, 92, 1193, 668, 644, 412, 789, 788, 70, + 1004, 994, 941, 30, 1200, 889, 1005, 1246, 952, 955, + 1201, 1005, 1039, 1175, 965, 909, 1174, 659, 660, 661, + 662, 663, 664, 665, 658, 92, 92, 668, 1005, 993, + 943, 59, 942, 405, 1514, 1031, 983, 857, 947, 1366, + 774, 30, 993, 92, 59, 1600, 1496, 1304, 993, 1074, + 290, 696, 1470, 92, 1094, 59, 982, 290, 1399, 290, + 1370, 1371, 1617, 1249, 941, 1090, 1085, 290, 290, 290, + 1084, 1497, 973, 974, 1097, 92, 934, 935, 92, 1613, + 944, 977, 1401, 437, 1373, 59, 437, 1355, 1276, 92, + 92, 987, 943, 59, 999, 890, 981, 1051, 861, 1020, + 1217, 1215, 1376, 948, 949, 1218, 1216, 954, 957, 958, + 1375, 759, 995, 771, 742, 646, 647, 645, 1219, 1214, + 1014, 1015, 1081, 1082, 1083, 1213, 1604, 1597, 412, 1347, + 997, 1182, 972, 648, 1602, 975, 976, 1191, 1190, 1267, + 787, 595, 1259, 290, 92, 1577, 92, 1034, 1116, 1576, + 1029, 1038, 290, 290, 290, 290, 290, 1037, 290, 290, + 1512, 1257, 290, 92, 1054, 1251, 1095, 1457, 657, 656, 666, 667, 659, 660, 661, 662, 663, 664, 665, 658, - 0, 0, 668, 0, 966, 0, 0, 0, 0, 0, - 576, 0, 0, 0, 0, 584, 0, 0, 0, 0, - 0, 591, 0, 0, 0, 0, 0, 593, 93, 1627, - 1628, 0, 0, 0, 0, 0, 93, 0, 0, 1313, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 439, - 0, 93, 0, 0, 1145, 0, 0, 0, 93, 657, + 290, 1099, 668, 1101, 1492, 290, 1100, 290, 290, 735, + 960, 290, 92, 362, 361, 364, 365, 366, 367, 860, + 1128, 736, 363, 368, 961, 1018, 406, 407, 409, 1456, + 1091, 1092, 410, 1010, 1013, 1014, 1015, 1011, 1455, 1012, + 1016, 70, 906, 1370, 1371, 915, 916, 917, 918, 919, + 920, 921, 922, 923, 924, 925, 926, 927, 928, 929, + 1350, 908, 1131, 1193, 625, 1189, 1619, 790, 1010, 1013, + 1014, 1015, 1011, 1188, 1012, 1016, 418, 846, 847, 1619, + 1618, 68, 1163, 1160, 884, 856, 756, 749, 771, 1559, + 419, 862, 1485, 979, 405, 909, 73, 746, 747, 421, + 65, 420, 969, 1, 1139, 875, 312, 1075, 1076, 1077, + 1078, 1611, 1422, 1493, 1106, 290, 1578, 1153, 1527, 1392, + 1057, 1048, 1181, 1086, 1087, 1088, 290, 290, 290, 290, + 290, 1207, 1186, 81, 1152, 563, 403, 80, 290, 1569, + 879, 609, 290, 1056, 1055, 1535, 290, 1261, 1071, 1483, + 1168, 290, 290, 1400, 1202, 290, 290, 290, 1258, 401, + 1574, 795, 793, 794, 1148, 1149, 792, 1195, 1244, 1185, + 92, 797, 796, 791, 1224, 305, 1194, 891, 1051, 1250, + 1198, 1247, 1196, 1255, 1255, 1166, 322, 1017, 1209, 1210, + 783, 1212, 1096, 867, 1208, 1220, 750, 1211, 93, 84, + 1230, 1297, 291, 1233, 1296, 291, 418, 1235, 1102, 1256, + 93, 1236, 291, 1231, 1264, 1265, 1068, 1239, 92, 92, + 419, 1266, 302, 1268, 1269, 1270, 619, 415, 416, 421, + 620, 420, 1252, 1253, 307, 676, 1187, 1240, 438, 93, + 431, 1361, 93, 291, 984, 291, 738, 1454, 92, 1349, + 1167, 705, 996, 1273, 962, 765, 1278, 1279, 345, 1000, + 901, 1003, 360, 357, 358, 988, 1199, 650, 343, 337, + 764, 1028, 92, 1295, 757, 1009, 1007, 1006, 931, 770, + 1319, 1372, 1368, 763, 992, 1309, 414, 959, 1553, 1449, + 413, 1453, 52, 33, 327, 633, 422, 23, 1321, 22, + 21, 1344, 20, 1312, 1140, 1141, 1142, 19, 290, 25, + 1310, 1311, 18, 1333, 1320, 1318, 17, 16, 92, 1334, + 583, 37, 27, 26, 92, 92, 1319, 1207, 1340, 943, + 1356, 942, 657, 656, 666, 667, 659, 660, 661, 662, + 663, 664, 665, 658, 15, 1098, 668, 14, 13, 12, + 92, 1359, 11, 290, 1118, 1119, 1120, 1121, 1122, 10, + 1125, 1126, 9, 1374, 1127, 5, 4, 92, 1353, 92, + 92, 636, 24, 1255, 1255, 1051, 694, 1051, 1381, 2, + 1391, 0, 1129, 0, 0, 1365, 0, 1130, 1406, 0, + 0, 0, 0, 1134, 1390, 968, 0, 290, 1397, 1398, + 0, 1395, 0, 0, 0, 1383, 1404, 1405, 0, 0, + 0, 1382, 0, 1384, 0, 1385, 0, 290, 0, 0, + 0, 0, 0, 92, 0, 1423, 92, 92, 92, 290, + 0, 0, 0, 0, 0, 1415, 291, 0, 0, 0, + 0, 291, 0, 0, 0, 0, 0, 291, 0, 0, + 1416, 0, 1418, 291, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 93, 0, 93, 411, 0, 0, + 0, 0, 0, 93, 1437, 0, 0, 0, 374, 29, + 0, 0, 0, 0, 0, 93, 93, 1428, 1429, 0, + 1432, 0, 0, 1207, 0, 0, 0, 0, 0, 0, + 1458, 0, 0, 0, 0, 0, 0, 0, 29, 1467, + 0, 92, 0, 0, 0, 0, 0, 0, 0, 1051, + 92, 0, 1247, 0, 0, 0, 0, 1466, 0, 0, + 0, 0, 0, 0, 1234, 92, 1314, 1315, 0, 0, + 0, 0, 92, 0, 1476, 0, 404, 1486, 0, 1488, + 1495, 1335, 1336, 0, 1337, 1338, 1500, 0, 0, 0, + 0, 0, 0, 1477, 0, 0, 1345, 1346, 0, 0, + 0, 0, 1491, 0, 1499, 0, 0, 1498, 0, 0, + 0, 0, 0, 92, 92, 93, 92, 0, 291, 291, + 291, 92, 93, 92, 92, 92, 290, 1511, 93, 1513, + 92, 1520, 0, 1521, 1523, 1524, 0, 0, 0, 1359, + 0, 0, 0, 1525, 1515, 0, 1532, 92, 290, 1506, + 0, 1539, 0, 0, 0, 0, 0, 1547, 1540, 0, + 1541, 0, 1434, 1435, 0, 1436, 1519, 0, 1438, 0, + 1440, 0, 0, 0, 0, 0, 1526, 0, 0, 1560, + 1568, 1402, 0, 0, 0, 92, 0, 0, 0, 1566, + 1567, 0, 0, 0, 1359, 0, 92, 92, 0, 0, + 0, 1581, 0, 0, 1495, 1051, 0, 0, 1582, 0, + 0, 0, 92, 0, 0, 0, 1207, 0, 0, 1588, + 1348, 0, 0, 290, 0, 0, 0, 0, 0, 0, + 0, 92, 0, 1480, 0, 1430, 0, 0, 1596, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1601, 1603, + 0, 92, 0, 0, 291, 0, 0, 0, 0, 93, + 0, 1605, 0, 0, 291, 291, 93, 93, 93, 1616, + 0, 1627, 291, 0, 0, 291, 0, 0, 291, 0, + 0, 0, 291, 0, 93, 0, 0, 0, 0, 93, + 93, 93, 291, 93, 93, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 93, 93, 0, 1414, + 1452, 0, 0, 614, 0, 614, 0, 0, 0, 0, + 0, 0, 614, 0, 0, 0, 0, 0, 0, 1417, + 0, 0, 0, 0, 0, 0, 29, 1447, 0, 0, + 0, 1427, 0, 0, 0, 0, 0, 0, 0, 677, + 679, 657, 656, 666, 667, 659, 660, 661, 662, 663, + 664, 665, 658, 0, 0, 668, 1501, 1502, 1503, 1504, + 1505, 0, 0, 0, 1508, 1509, 0, 0, 0, 0, + 692, 93, 0, 0, 697, 698, 699, 700, 701, 702, + 703, 704, 0, 707, 710, 710, 710, 716, 710, 710, + 716, 710, 724, 725, 726, 727, 728, 729, 730, 0, + 0, 0, 0, 29, 93, 93, 0, 657, 656, 666, + 667, 659, 660, 661, 662, 663, 664, 665, 658, 1446, + 0, 668, 93, 0, 0, 0, 0, 0, 766, 291, + 0, 0, 93, 0, 0, 0, 291, 0, 291, 0, + 0, 0, 0, 0, 0, 0, 291, 291, 291, 0, + 0, 0, 0, 0, 93, 0, 1313, 93, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 93, 93, + 0, 0, 0, 94, 95, 96, 657, 656, 666, 667, + 659, 660, 661, 662, 663, 664, 665, 658, 425, 0, + 668, 0, 0, 0, 0, 0, 0, 0, 0, 657, + 656, 666, 667, 659, 660, 661, 662, 663, 664, 665, + 658, 371, 0, 668, 0, 0, 0, 0, 0, 0, + 1548, 0, 291, 93, 0, 93, 1620, 294, 0, 0, + 0, 291, 291, 291, 291, 291, 297, 291, 291, 1445, + 0, 291, 93, 0, 306, 0, 0, 336, 0, 0, + 91, 0, 0, 0, 0, 0, 0, 0, 0, 291, + 0, 0, 324, 0, 291, 0, 291, 291, 614, 0, + 291, 93, 0, 0, 0, 614, 614, 614, 304, 0, + 0, 1444, 0, 0, 311, 0, 0, 0, 0, 0, + 0, 439, 0, 614, 566, 1591, 0, 0, 614, 614, + 614, 0, 614, 614, 0, 0, 0, 0, 0, 0, + 945, 946, 0, 0, 295, 614, 614, 0, 0, 657, + 656, 666, 667, 659, 660, 661, 662, 663, 664, 665, + 658, 0, 0, 668, 0, 0, 0, 0, 0, 0, + 0, 308, 298, 0, 309, 310, 317, 0, 978, 0, + 301, 303, 314, 299, 300, 319, 318, 0, 296, 316, + 315, 657, 656, 666, 667, 659, 660, 661, 662, 663, + 664, 665, 658, 0, 291, 668, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 291, 291, 291, 291, 291, + 0, 0, 0, 0, 0, 0, 0, 291, 0, 0, + 0, 291, 0, 0, 0, 291, 0, 0, 0, 0, + 291, 291, 0, 0, 291, 291, 291, 0, 0, 0, + 0, 0, 652, 0, 655, 0, 0, 0, 0, 93, + 669, 670, 671, 672, 673, 674, 675, 0, 653, 654, + 651, 657, 656, 666, 667, 659, 660, 661, 662, 663, + 664, 665, 658, 0, 0, 668, 0, 0, 0, 1145, + 0, 0, 0, 0, 0, 1021, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 93, 93, 657, 656, 666, 667, 659, 660, 661, 662, 663, 664, 665, 658, 0, 0, 668, 657, 656, 666, 667, 659, 660, - 661, 662, 663, 664, 665, 658, 0, 0, 668, 0, - 0, 0, 0, 0, 0, 0, 0, 1277, 439, 93, - 93, 0, 93, 0, 0, 0, 0, 93, 0, 93, - 93, 93, 291, 0, 0, 0, 93, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 439, 0, 0, - 289, 0, 0, 93, 291, 289, 1342, 0, 0, 0, - 0, 289, 0, 0, 0, 0, 0, 289, 0, 0, - 0, 439, 0, 0, 0, 0, 0, 0, 0, 0, - 1351, 0, 759, 0, 771, 0, 0, 0, 0, 0, - 0, 93, 439, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 93, 93, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 812, 0, 0, 0, 439, 93, 0, - 966, 0, 0, 1362, 1364, 0, 0, 0, 0, 291, - 0, 0, 0, 0, 0, 0, 0, 93, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1364, - 0, 0, 0, 0, 0, 0, 0, 93, 0, 0, - 0, 0, 0, 0, 0, 0, 439, 0, 439, 1394, + 661, 662, 663, 664, 665, 658, 0, 93, 668, 0, + 0, 0, 0, 0, 0, 0, 439, 0, 439, 0, + 0, 0, 0, 0, 0, 439, 0, 649, 0, 0, + 0, 93, 0, 0, 0, 0, 0, 632, 634, 0, + 0, 0, 614, 0, 614, 0, 0, 0, 0, 1146, + 0, 0, 0, 1147, 0, 0, 0, 0, 0, 0, + 0, 614, 0, 336, 1154, 1155, 0, 291, 0, 0, + 1161, 0, 706, 1164, 1165, 0, 0, 93, 0, 0, + 0, 1171, 0, 93, 93, 1173, 0, 0, 1176, 1177, + 1178, 1179, 1180, 0, 0, 0, 0, 0, 737, 740, + 0, 0, 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, 1222, 1223, 753, 0, 0, + 1150, 0, 0, 404, 439, 0, 0, 0, 0, 0, + 784, 0, 0, 0, 0, 0, 291, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 291, 0, 0, 0, + 0, 0, 93, 0, 0, 93, 93, 93, 291, 0, + 0, 0, 0, 766, 0, 0, 0, 0, 0, 0, + 1203, 1204, 0, 0, 766, 766, 766, 766, 766, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1021, 0, 1229, 0, 0, 0, 0, 0, 0, 766, + 0, 0, 0, 766, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1316, 1317, 0, 0, 0, 0, + 93, 0, 0, 0, 0, 0, 0, 0, 0, 93, + 0, 439, 0, 0, 0, 0, 0, 871, 439, 439, + 439, 0, 0, 0, 93, 0, 0, 614, 0, 0, + 0, 93, 0, 0, 0, 0, 439, 0, 0, 0, + 0, 439, 439, 439, 888, 439, 439, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 614, 0, 439, 439, + 0, 0, 0, 897, 898, 899, 900, 0, 0, 0, + 1377, 0, 93, 93, 0, 93, 0, 0, 0, 0, + 93, 0, 93, 93, 93, 291, 0, 0, 0, 93, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 93, 291, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 950, 951, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1360, 0, 29, 936, 0, 439, 0, 0, 0, 0, + 0, 0, 0, 0, 93, 0, 0, 0, 0, 966, + 0, 0, 0, 0, 0, 93, 93, 0, 0, 0, + 0, 766, 0, 0, 1431, 0, 970, 971, 1433, 0, + 0, 93, 0, 0, 0, 0, 0, 0, 0, 1442, + 1443, 0, 291, 0, 989, 0, 0, 0, 0, 0, + 93, 0, 0, 0, 753, 372, 0, 439, 0, 0, + 0, 1045, 0, 0, 0, 0, 1460, 1461, 0, 1464, + 93, 0, 0, 0, 0, 0, 439, 0, 0, 439, + 0, 0, 0, 0, 0, 0, 0, 1475, 0, 0, + 439, 566, 0, 0, 0, 0, 0, 0, 289, 0, + 0, 320, 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, 1448, 0, + 426, 426, 0, 0, 0, 0, 0, 0, 0, 289, + 0, 289, 0, 0, 0, 439, 0, 439, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 439, 0, 0, 1472, 1473, 1474, + 0, 0, 0, 0, 0, 0, 0, 0, 1522, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1135, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 614, 812, 0, 0, 1549, 1550, 1551, + 1552, 0, 1556, 0, 1557, 1558, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1563, 0, 1564, + 1565, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1170, 0, 0, 0, 0, 1360, 0, + 29, 0, 0, 0, 0, 0, 0, 0, 0, 1584, + 1183, 1184, 740, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1544, 0, 0, 1593, 0, 0, 0, 800, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1360, 0, 0, 966, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1628, 1629, 0, 813, + 0, 0, 289, 0, 0, 0, 0, 289, 0, 0, + 0, 0, 0, 289, 0, 0, 0, 0, 0, 289, + 0, 439, 0, 0, 0, 826, 829, 830, 831, 832, + 833, 834, 0, 835, 836, 837, 838, 839, 814, 815, + 816, 817, 798, 799, 827, 0, 801, 0, 802, 803, + 804, 805, 806, 807, 808, 809, 810, 811, 818, 819, + 820, 821, 822, 823, 824, 825, 0, 0, 1614, 1277, + 439, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 439, 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, 800, 0, 0, - 0, 0, 289, 289, 773, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 790, 0, - 0, 0, 1418, 0, 0, 1423, 1424, 1425, 846, 847, - 1450, 0, 0, 0, 0, 0, 856, 0, 813, 771, - 0, 0, 862, 0, 0, 0, 0, 336, 0, 0, - 0, 0, 0, 0, 1467, 0, 875, 1468, 0, 0, - 1470, 0, 0, 0, 826, 829, 830, 831, 832, 833, - 834, 0, 835, 836, 837, 838, 839, 814, 815, 816, - 817, 798, 799, 827, 0, 801, 966, 802, 803, 804, - 805, 806, 807, 808, 809, 810, 811, 818, 819, 820, - 821, 822, 823, 824, 825, 0, 0, 0, 0, 0, - 439, 0, 0, 0, 0, 0, 0, 0, 1481, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1342, 0, + 0, 828, 0, 439, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 439, 0, 0, 0, 0, 289, 0, - 439, 1509, 336, 0, 0, 0, 0, 0, 289, 289, - 0, 0, 0, 0, 0, 0, 289, 0, 0, 289, - 828, 0, 289, 0, 0, 0, 866, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 289, 0, 0, 0, - 0, 1515, 1516, 0, 1517, 0, 0, 0, 0, 1481, - 0, 1481, 1481, 1481, 0, 0, 0, 0, 1394, 0, - 0, 0, 0, 996, 0, 0, 0, 0, 0, 0, - 1000, 0, 1003, 0, 0, 1481, 0, 0, 0, 0, - 0, 0, 1028, 0, 0, 0, 0, 0, 0, 0, + 426, 0, 1351, 0, 439, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 289, 289, 773, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 439, + 0, 0, 966, 0, 0, 1362, 1364, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1572, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 439, 439, 426, 866, 0, 0, - 0, 426, 426, 0, 0, 426, 426, 426, 966, 0, - 1588, 967, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1098, 0, 0, 1594, - 426, 426, 426, 426, 426, 1118, 1119, 1120, 1121, 1122, - 0, 1125, 1126, 0, 0, 1127, 0, 0, 0, 1481, - 0, 0, 0, 289, 0, 0, 0, 0, 0, 866, - 289, 0, 289, 1129, 0, 0, 0, 0, 1130, 0, - 289, 1026, 289, 0, 1134, 0, 0, 0, 0, 0, + 0, 1364, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 439, 0, + 439, 1394, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1419, 0, 0, 1424, 1425, 1426, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 289, 0, 1451, 0, 0, 0, 0, 0, 0, 0, + 289, 289, 0, 0, 0, 0, 0, 0, 289, 336, + 0, 289, 0, 0, 289, 0, 1468, 0, 866, 1469, + 0, 0, 1471, 0, 0, 0, 0, 0, 289, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 966, 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, 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, 289, 0, - 1132, 1133, 0, 0, 289, 0, 0, 0, 0, 0, + 0, 0, 439, 0, 0, 0, 0, 0, 0, 0, + 0, 1482, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 439, 0, 0, 0, + 0, 0, 0, 439, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1510, 336, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 426, 866, + 0, 0, 0, 426, 426, 0, 0, 426, 426, 426, + 0, 0, 0, 967, 1516, 1517, 0, 1518, 0, 0, + 0, 0, 1482, 0, 1482, 1482, 1482, 0, 0, 0, + 0, 1394, 426, 426, 426, 426, 426, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1482, 0, + 0, 0, 0, 0, 0, 289, 0, 0, 0, 0, + 0, 866, 289, 0, 289, 0, 0, 0, 0, 0, + 0, 0, 289, 1026, 289, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1573, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 439, 439, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1234, 0, 0, 0, 0, + 0, 966, 0, 1589, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1595, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 289, 0, + 0, 0, 1482, 0, 0, 0, 0, 289, 289, 289, + 289, 289, 0, 289, 289, 0, 0, 289, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 426, 426, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 289, 0, 0, 0, 0, + 289, 0, 1132, 1133, 0, 0, 289, 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, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 426, 289, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 967, 289, - 289, 289, 289, 289, 0, 0, 0, 0, 0, 0, - 0, 1221, 0, 0, 0, 289, 0, 0, 0, 1026, - 0, 0, 0, 0, 289, 289, 0, 0, 289, 1237, - 866, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, - 0, 1348, 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, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 426, + 289, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 967, 289, 289, 289, 289, 289, 0, 0, 0, 0, + 0, 0, 0, 1221, 0, 0, 0, 289, 0, 0, + 0, 1026, 0, 0, 0, 0, 289, 289, 0, 0, + 289, 1237, 866, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, - 1413, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 866, 0, 0, 0, - 1416, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 289, 1426, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 967, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 866, 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, 967, 0, 0, 0, + 0, 0, 0, 0, 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, 0, 0, 0, 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 967, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1547, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 967, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1590, 0, 0, 0, 0, - 0, 0, 549, 537, 0, 0, 494, 552, 467, 484, - 560, 485, 488, 525, 452, 507, 184, 482, 1026, 471, - 447, 478, 448, 469, 496, 126, 500, 466, 539, 510, - 551, 155, 0, 472, 558, 158, 516, 0, 231, 172, - 289, 0, 0, 498, 541, 505, 534, 493, 526, 457, - 515, 553, 483, 523, 554, 0, 0, 0, 94, 95, - 96, 0, 1052, 1053, 0, 0, 0, 0, 0, 116, - 0, 520, 548, 480, 522, 524, 562, 446, 517, 0, - 450, 453, 559, 544, 475, 476, 1248, 0, 0, 0, - 0, 0, 0, 497, 506, 531, 491, 0, 0, 0, - 0, 0, 967, 0, 0, 473, 0, 514, 0, 0, - 0, 454, 451, 0, 0, 289, 0, 495, 0, 0, - 0, 456, 0, 474, 532, 0, 444, 135, 536, 543, - 492, 292, 547, 490, 489, 550, 203, 0, 235, 139, - 154, 112, 151, 98, 108, 0, 137, 181, 211, 215, - 540, 470, 479, 120, 477, 213, 191, 252, 513, 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, 449, 0, 232, 255, 274, 114, 465, 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, 461, 464, 459, 460, 508, - 509, 555, 556, 557, 533, 455, 0, 462, 463, 0, - 538, 545, 546, 512, 97, 106, 157, 271, 206, 131, - 256, 445, 458, 124, 468, 0, 0, 481, 486, 487, - 499, 501, 502, 503, 504, 511, 518, 519, 521, 527, - 528, 529, 530, 535, 542, 561, 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, 549, 537, 0, 0, 494, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 549, 537, 0, 0, 494, 552, 467, 484, 560, 485, 488, 525, 452, 507, 184, - 482, 0, 471, 447, 478, 448, 469, 496, 126, 500, + 482, 1026, 471, 447, 478, 448, 469, 496, 126, 500, 466, 539, 510, 551, 155, 0, 472, 558, 158, 516, - 0, 231, 172, 0, 0, 0, 498, 541, 505, 534, + 0, 231, 172, 289, 0, 0, 498, 541, 505, 534, 493, 526, 457, 515, 553, 483, 523, 554, 0, 0, 0, 94, 95, 96, 0, 1052, 1053, 0, 0, 0, 0, 0, 116, 0, 520, 548, 480, 522, 524, 562, - 446, 517, 0, 450, 453, 559, 544, 475, 476, 0, + 446, 517, 0, 450, 453, 559, 544, 475, 476, 1248, 0, 0, 0, 0, 0, 0, 497, 506, 531, 491, - 0, 0, 0, 0, 0, 0, 0, 0, 473, 0, - 514, 0, 0, 0, 454, 451, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 967, 0, 0, 473, 0, + 514, 0, 0, 0, 454, 451, 0, 0, 289, 0, 495, 0, 0, 0, 456, 0, 474, 532, 0, 444, 135, 536, 543, 492, 292, 547, 490, 489, 550, 203, 0, 235, 139, 154, 112, 151, 98, 108, 0, 137, @@ -1351,7 +1362,7 @@ var yyAct = [...]int{ 496, 126, 500, 466, 539, 510, 551, 155, 0, 472, 558, 158, 516, 0, 231, 172, 0, 0, 0, 498, 541, 505, 534, 493, 526, 457, 515, 553, 483, 523, - 554, 59, 0, 0, 94, 95, 96, 0, 0, 0, + 554, 0, 0, 0, 94, 95, 96, 0, 1052, 1053, 0, 0, 0, 0, 0, 116, 0, 520, 548, 480, 522, 524, 562, 446, 517, 0, 450, 453, 559, 544, 475, 476, 0, 0, 0, 0, 0, 0, 0, 497, @@ -1387,12 +1398,12 @@ var yyAct = [...]int{ 478, 448, 469, 496, 126, 500, 466, 539, 510, 551, 155, 0, 472, 558, 158, 516, 0, 231, 172, 0, 0, 0, 498, 541, 505, 534, 493, 526, 457, 515, - 553, 483, 523, 554, 0, 0, 0, 94, 95, 96, + 553, 483, 523, 554, 59, 0, 0, 94, 95, 96, 0, 0, 0, 0, 0, 0, 0, 0, 116, 0, 520, 548, 480, 522, 524, 562, 446, 517, 0, 450, 453, 559, 544, 475, 476, 0, 0, 0, 0, 0, 0, 0, 497, 506, 531, 491, 0, 0, 0, 0, - 0, 0, 1352, 0, 473, 0, 514, 0, 0, 0, + 0, 0, 0, 0, 473, 0, 514, 0, 0, 0, 454, 451, 0, 0, 0, 0, 495, 0, 0, 0, 456, 0, 474, 532, 0, 444, 135, 536, 543, 492, 292, 547, 490, 489, 550, 203, 0, 235, 139, 154, @@ -1428,7 +1439,7 @@ var yyAct = [...]int{ 0, 116, 0, 520, 548, 480, 522, 524, 562, 446, 517, 0, 450, 453, 559, 544, 475, 476, 0, 0, 0, 0, 0, 0, 0, 497, 506, 531, 491, 0, - 0, 0, 0, 0, 0, 1238, 0, 473, 0, 514, + 0, 0, 0, 0, 0, 1352, 0, 473, 0, 514, 0, 0, 0, 454, 451, 0, 0, 0, 0, 495, 0, 0, 0, 456, 0, 474, 532, 0, 444, 135, 536, 543, 492, 292, 547, 490, 489, 550, 203, 0, @@ -1464,7 +1475,7 @@ var yyAct = [...]int{ 0, 0, 0, 0, 116, 0, 520, 548, 480, 522, 524, 562, 446, 517, 0, 450, 453, 559, 544, 475, 476, 0, 0, 0, 0, 0, 0, 0, 497, 506, - 531, 491, 0, 0, 0, 0, 0, 0, 998, 0, + 531, 491, 0, 0, 0, 0, 0, 0, 1238, 0, 473, 0, 514, 0, 0, 0, 454, 451, 0, 0, 0, 0, 495, 0, 0, 0, 456, 0, 474, 532, 0, 444, 135, 536, 543, 492, 292, 547, 490, 489, @@ -1501,7 +1512,7 @@ var yyAct = [...]int{ 548, 480, 522, 524, 562, 446, 517, 0, 450, 453, 559, 544, 475, 476, 0, 0, 0, 0, 0, 0, 0, 497, 506, 531, 491, 0, 0, 0, 0, 0, - 0, 0, 0, 473, 0, 514, 0, 0, 0, 454, + 0, 998, 0, 473, 0, 514, 0, 0, 0, 454, 451, 0, 0, 0, 0, 495, 0, 0, 0, 456, 0, 474, 532, 0, 444, 135, 536, 543, 492, 292, 547, 490, 489, 550, 203, 0, 235, 139, 154, 112, @@ -1547,11 +1558,11 @@ var yyAct = [...]int{ 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, - 442, 257, 177, 240, 248, 171, 164, 104, 246, 169, + 110, 257, 177, 240, 248, 171, 164, 104, 246, 169, 163, 153, 129, 141, 201, 161, 202, 142, 174, 173, 175, 0, 449, 0, 232, 255, 274, 114, 465, 239, 266, 269, 0, 205, 115, 134, 128, 200, 132, 156, - 265, 267, 268, 443, 441, 436, 435, 152, 160, 208, + 265, 267, 268, 176, 111, 144, 229, 152, 160, 208, 272, 190, 214, 118, 254, 230, 461, 464, 459, 460, 508, 509, 555, 556, 557, 533, 455, 0, 462, 463, 0, 538, 545, 546, 512, 97, 106, 157, 271, 206, @@ -1580,7 +1591,7 @@ var yyAct = [...]int{ 203, 0, 235, 139, 154, 112, 151, 98, 108, 0, 137, 181, 211, 215, 540, 470, 479, 120, 477, 213, 191, 252, 513, 193, 212, 159, 241, 204, 251, 261, - 262, 238, 259, 270, 228, 101, 237, 775, 117, 223, + 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, 442, 257, 177, 240, 248, 171, 164, @@ -1617,7 +1628,7 @@ var yyAct = [...]int{ 98, 108, 0, 137, 181, 211, 215, 540, 470, 479, 120, 477, 213, 191, 252, 513, 193, 212, 159, 241, 204, 251, 261, 262, 238, 259, 270, 228, 101, 237, - 433, 117, 223, 0, 0, 0, 103, 247, 234, 170, + 775, 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, 442, 257, 177, 240, 248, 171, 164, 104, 246, 169, 163, 153, 129, 141, @@ -1636,8 +1647,149 @@ var yyAct = [...]int{ 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, 938, 0, 341, 0, 0, - 0, 126, 0, 340, 0, 0, 0, 155, 0, 939, + 250, 264, 549, 537, 0, 0, 494, 552, 467, 484, + 560, 485, 488, 525, 452, 507, 184, 482, 0, 471, + 447, 478, 448, 469, 496, 126, 500, 466, 539, 510, + 551, 155, 0, 472, 558, 158, 516, 0, 231, 172, + 0, 0, 0, 498, 541, 505, 534, 493, 526, 457, + 515, 553, 483, 523, 554, 0, 0, 0, 94, 95, + 96, 0, 0, 0, 0, 0, 0, 0, 0, 116, + 0, 520, 548, 480, 522, 524, 562, 446, 517, 0, + 450, 453, 559, 544, 475, 476, 0, 0, 0, 0, + 0, 0, 0, 497, 506, 531, 491, 0, 0, 0, + 0, 0, 0, 0, 0, 473, 0, 514, 0, 0, + 0, 454, 451, 0, 0, 0, 0, 495, 0, 0, + 0, 456, 0, 474, 532, 0, 444, 135, 536, 543, + 492, 292, 547, 490, 489, 550, 203, 0, 235, 139, + 154, 112, 151, 98, 108, 0, 137, 181, 211, 215, + 540, 470, 479, 120, 477, 213, 191, 252, 513, 193, + 212, 159, 241, 204, 251, 261, 262, 238, 259, 270, + 228, 101, 237, 433, 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, 442, + 257, 177, 240, 248, 171, 164, 104, 246, 169, 163, + 153, 129, 141, 201, 161, 202, 142, 174, 173, 175, + 0, 449, 0, 232, 255, 274, 114, 465, 239, 266, + 269, 0, 205, 115, 134, 128, 200, 132, 156, 265, + 267, 268, 443, 441, 436, 435, 152, 160, 208, 272, + 190, 214, 118, 254, 230, 461, 464, 459, 460, 508, + 509, 555, 556, 557, 533, 455, 0, 462, 463, 0, + 538, 545, 546, 512, 97, 106, 157, 271, 206, 131, + 256, 445, 458, 124, 468, 0, 0, 481, 486, 487, + 499, 501, 502, 503, 504, 511, 518, 519, 521, 527, + 528, 529, 530, 535, 542, 561, 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, 938, 0, + 341, 0, 0, 0, 126, 0, 340, 0, 0, 0, + 155, 0, 939, 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, 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, 1043, 0, 59, 0, 0, 94, 95, 96, 362, + 361, 364, 365, 366, 367, 0, 0, 116, 363, 368, + 369, 370, 1044, 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, 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, @@ -1674,12 +1826,12 @@ var yyAct = [...]int{ 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, 1043, 0, - 59, 0, 0, 94, 95, 96, 362, 361, 364, 365, - 366, 367, 0, 0, 116, 363, 368, 369, 370, 1044, + 375, 376, 0, 0, 0, 0, 0, 0, 0, 0, + 59, 0, 0, 94, 95, 96, 362, 956, 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, 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, @@ -1710,11 +1862,11 @@ var yyAct = [...]int{ 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, + 0, 0, 94, 95, 96, 362, 953, 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, 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, @@ -1740,16 +1892,122 @@ var yyAct = [...]int{ 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, 1621, 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, 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, + 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, 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, + 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, @@ -1776,121 +2034,15 @@ var yyAct = [...]int{ 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, 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, 956, 364, 365, 366, 367, 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, 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, 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, 953, 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, 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, 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, @@ -1918,19 +2070,19 @@ var yyAct = [...]int{ 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, + 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, 0, 0, 0, 0, 0, 0, 0, 657, 656, + 666, 667, 659, 660, 661, 662, 663, 664, 665, 658, + 0, 0, 668, 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, 1620, + 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, @@ -1940,9 +2092,9 @@ var yyAct = [...]int{ 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, + 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, @@ -1952,18 +2104,18 @@ var yyAct = [...]int{ 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, + 752, 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, 754, 0, 0, 0, 0, 0, 0, 116, + 0, 0, 0, 0, 0, 646, 647, 645, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 648, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 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, @@ -1975,9 +2127,9 @@ var yyAct = [...]int{ 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, + 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, @@ -1988,17 +2140,17 @@ var yyAct = [...]int{ 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, + 155, 0, 0, 0, 158, 0, 0, 231, 172, 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, + 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, 135, 88, 89, 0, + 85, 0, 0, 0, 90, 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, @@ -2010,9 +2162,9 @@ var yyAct = [...]int{ 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, + 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, 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, @@ -2022,19 +2174,19 @@ var yyAct = [...]int{ 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, 126, 1066, 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, 0, 0, - 0, 0, 0, 0, 0, 657, 656, 666, 667, 659, - 660, 661, 662, 663, 664, 665, 658, 0, 0, 668, 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, 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, 1065, 292, + 0, 0, 0, 1062, 1060, 0, 1061, 139, 154, 112, + 151, 98, 108, 1058, 1064, 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, @@ -2056,15 +2208,15 @@ var yyAct = [...]int{ 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, 752, 0, 0, + 138, 250, 264, 184, 0, 0, 0, 1025, 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, 754, + 0, 0, 0, 0, 0, 94, 95, 96, 0, 1027, 0, 0, 0, 0, 0, 0, 116, 0, 0, 0, - 0, 0, 646, 647, 645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 648, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, @@ -2091,83 +2243,83 @@ var yyAct = [...]int{ 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, + 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, 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, 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, 88, 89, 0, 85, 0, 0, - 0, 90, 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, 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, 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, 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, 1025, 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, 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, 94, 95, 96, 0, 1027, 0, 0, - 0, 0, 0, 0, 116, 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, 1025, 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, + 1027, 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, 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, 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, 1023, 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, 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, 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, 94, 95, 96, 0, 0, + 990, 0, 0, 991, 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, @@ -2197,11 +2349,11 @@ var yyAct = [...]int{ 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, 1025, 0, 0, 0, - 0, 126, 0, 0, 0, 0, 0, 155, 0, 0, + 250, 264, 184, 0, 0, 0, 0, 0, 0, 0, + 0, 126, 0, 786, 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, 1027, 0, + 0, 0, 0, 0, 94, 95, 96, 0, 785, 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, @@ -2211,7 +2363,7 @@ var yyAct = [...]int{ 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, 1023, 212, 159, 241, 204, + 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, @@ -2236,8 +2388,8 @@ var yyAct = [...]int{ 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, 990, 0, - 0, 991, 0, 0, 116, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -2268,10 +2420,10 @@ var yyAct = [...]int{ 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, 786, 0, 0, 0, 155, 0, 0, 0, 158, + 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, 785, 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, @@ -2306,7 +2458,7 @@ var yyAct = [...]int{ 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, - 412, 94, 95, 96, 0, 0, 0, 0, 0, 0, + 0, 94, 95, 96, 0, 1027, 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, @@ -2340,8 +2492,8 @@ var yyAct = [...]int{ 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 94, 95, 96, 0, 754, 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, @@ -2371,82 +2523,82 @@ var yyAct = [...]int{ 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, 1027, 0, 0, 0, 0, 0, 0, - 116, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 243, 253, 260, 263, 138, 250, 264, 768, 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, 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, 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, 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, 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, 0, 0, 0, 0, 0, 0, 94, 95, - 96, 0, 754, 0, 0, 0, 0, 0, 0, 116, + 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, 758, 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, 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, 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, 768, 0, 0, 0, 0, - 0, 0, 184, 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, 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, 94, 95, 96, 0, 635, 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, @@ -2477,14 +2629,14 @@ var yyAct = [...]int{ 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, 758, + 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, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 564, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -2516,13 +2668,13 @@ var yyAct = [...]int{ 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, 635, 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, 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, @@ -2546,7 +2698,7 @@ var yyAct = [...]int{ 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, + 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, @@ -2557,8 +2709,8 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 329, 0, - 135, 0, 0, 0, 292, 0, 0, 0, 0, 203, + 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, @@ -2581,7 +2733,7 @@ var yyAct = [...]int{ 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, + 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, @@ -2593,7 +2745,7 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 135, - 0, 287, 0, 292, 0, 0, 0, 0, 203, 0, + 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, @@ -2616,54 +2768,19 @@ var yyAct = [...]int{ 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, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 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, 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, + 243, 253, 260, 263, 138, 250, 264, } var yyPact = [...]int{ - 93, -1000, -287, 1091, -1000, -1000, -1000, -1000, -1000, -1000, + 378, -1000, -276, 956, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 1029, 880, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, 294, 11773, 97, - 172, 0, 16679, 171, 1865, 17028, -1000, 22, -1000, -2, - 17028, 15, 16330, -1000, -1000, -92, -102, -1000, 9679, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, 789, 1017, 1022, - 1027, 631, 1247, -1000, 8270, 8270, 133, 133, 133, 6874, - -1000, -1000, 476, 17028, 167, 17028, -155, 129, 129, 129, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 905, 735, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, 257, 12246, 27, + 123, 21, 17850, 122, 1772, 18199, -1000, 26, -1000, 15, + 18199, 18, 17501, -1000, -1000, -80, -105, -1000, 10152, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, 727, 885, 890, + 895, 534, 1064, -1000, 8743, 8743, 95, 95, 95, 7347, + -1000, -1000, 17152, 18199, 120, 18199, -155, 93, 93, 93, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, @@ -2682,24 +2799,24 @@ 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, 169, 17028, 614, 614, 256, - -1000, 17028, 127, 614, 127, 127, 127, 17028, -1000, 210, - -1000, -1000, -1000, 17028, 614, 967, 348, 75, 261, 261, - 261, -1000, 224, -1000, 4333, 67, 4333, -60, 1045, 35, - -23, -1000, 348, 4333, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, 150, -1000, -1000, 17028, 15981, 158, 311, -1000, - -1000, -1000, -1000, -1000, -1000, 582, 666, -1000, 9679, 1654, - 744, 744, -1000, -1000, 188, -1000, -1000, 10726, 10726, 10726, - 10726, 10726, 10726, 10726, 10726, 10726, 10726, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, 110, 18199, 505, 505, 273, + -1000, 18199, 88, 505, 88, 88, 88, 18199, -1000, 155, + -1000, -1000, -1000, 18199, 505, 810, 284, 53, 221, 221, + 221, -1000, 192, -1000, 4806, 33, 4806, -42, 931, 34, + -33, -1000, 284, 4806, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, 102, -1000, -1000, 18199, 16803, 134, 249, -1000, + -1000, -1000, -1000, -1000, -1000, 616, 396, -1000, 10152, 2001, + 686, 686, -1000, -1000, 139, -1000, -1000, 11199, 11199, 11199, + 11199, 11199, 11199, 11199, 11199, 11199, 11199, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, 744, 208, -1000, 9330, 744, 744, 744, 744, 744, - 744, 744, 744, 9679, 744, 744, 744, 744, 744, 744, - 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, - -1000, -1000, 1029, -1000, 880, -1000, -1000, -1000, 982, 9679, - 9679, 1029, -1000, 950, 8270, -1000, -1000, 1057, -1000, -1000, - -1000, -1000, 352, 1068, -1000, 11424, 202, 1065, 15632, 14229, - 15283, 825, 6511, -128, -1000, -1000, -1000, 299, 13531, -1000, - -1000, -1000, 966, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, 686, 154, -1000, 9803, 686, 686, 686, 686, 686, + 686, 686, 686, 10152, 686, 686, 686, 686, 686, 686, + 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, + -1000, -1000, 905, -1000, 735, -1000, -1000, -1000, 869, 10152, + 10152, 905, -1000, 775, 8743, -1000, -1000, 934, -1000, -1000, + -1000, -1000, 324, 955, -1000, 11897, 153, 954, 16454, 15051, + 16105, 681, 6984, -67, -1000, -1000, -1000, 239, 14353, -1000, + -1000, -1000, 809, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, @@ -2711,139 +2828,139 @@ 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, 717, 17028, -1000, 2462, -1000, 614, 4333, - 152, 614, 333, 614, 17028, 17028, 4333, 4333, 4333, 71, - 92, 83, 17028, 810, 146, 17028, 1009, 892, 17028, 614, - 614, -1000, 5785, -1000, 4333, 348, -1000, 478, 9679, 4333, - 4333, 4333, 17028, 4333, 4333, -1000, 470, -1000, -1000, 338, - -1000, -1000, -1000, -1000, -1000, -1000, 4333, 4333, -1000, 1064, - 337, -1000, -1000, -1000, -1000, 9679, 261, -1000, 891, -1000, - -1000, 1, -1000, -1000, -1000, -1000, -1000, 1091, -1000, -1000, - -1000, -132, -1000, -1000, 9679, 9679, 9679, 9679, 587, 252, - 10726, 471, 381, 10726, 10726, 10726, 10726, 10726, 10726, 10726, - 10726, 10726, 10726, 10726, 10726, 10726, 10726, 10726, 736, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, 614, -1000, 1088, - 718, 718, 227, 227, 227, 227, 227, 227, 227, 227, - 227, 11075, 7223, 5785, 631, 706, 1029, 8270, 8270, 9679, - 9679, 8968, 8619, 8270, 977, 328, 666, 17028, -1000, -1000, - 10377, -1000, -1000, -1000, -1000, -1000, 454, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, 17028, 17028, 8270, 8270, 8270, 8270, - 8270, 1022, 631, 1057, -1000, 1082, 247, 660, 798, -1000, - 594, 1022, 13182, 611, -1000, 1057, -1000, -1000, -1000, 17028, - -1000, -1000, 14927, -1000, -1000, 5422, 17028, 95, 17028, -1000, - 699, 1090, -1000, -1000, -1000, 1011, 12484, 12833, 17028, 811, - 535, -1000, -1000, 201, 6148, -128, -1000, 6148, 729, -1000, - -123, -104, 7572, 211, -1000, -1000, -1000, -1000, 3970, 483, - 539, 360, -74, -1000, -1000, -1000, 842, -1000, 842, 842, - 842, 842, -37, -37, -37, -37, -1000, -1000, -1000, -1000, - -1000, 861, 858, -1000, 842, 842, 842, -1000, -1000, -1000, + -1000, -1000, -1000, 638, 18199, -1000, 2743, -1000, 505, 4806, + 104, 505, 277, 505, 18199, 18199, 4806, 4806, 4806, 41, + 75, 74, 18199, 678, 101, 18199, 875, 742, 18199, 505, + 505, -1000, 6258, -1000, 4806, 284, -1000, 442, 10152, 4806, + 4806, 4806, 18199, 4806, 4806, -1000, 432, -1000, -1000, 297, + -1000, -1000, -1000, -1000, -1000, -1000, 4806, 4806, -1000, 952, + 291, -1000, -1000, -1000, -1000, 10152, 221, -1000, 739, -1000, + -1000, 12, -1000, -1000, -1000, -1000, -1000, 956, -1000, -1000, + -1000, -122, -1000, -1000, 10152, 10152, 10152, 10152, 420, 224, + 11199, 395, 233, 11199, 11199, 11199, 11199, 11199, 11199, 11199, + 11199, 11199, 11199, 11199, 11199, 11199, 11199, 11199, 498, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, 505, -1000, 968, + 829, 829, 169, 169, 169, 169, 169, 169, 169, 169, + 169, 11548, 7696, 6258, 534, 636, 905, 8743, 8743, 10152, + 10152, 9441, 9092, 8743, 868, 267, 396, 18199, -1000, -1000, + 10850, -1000, -1000, -1000, -1000, -1000, 400, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, 18199, 18199, 8743, 8743, 8743, 8743, + 8743, 890, 534, 934, -1000, 963, 188, 737, 677, -1000, + 502, 890, 14004, 689, -1000, 934, -1000, -1000, -1000, 18199, + -1000, -1000, 15749, -1000, -1000, 5895, 18199, 60, 18199, -1000, + 669, 902, -1000, -1000, -1000, 882, 13306, 13655, 18199, 594, + 514, -1000, -1000, 152, 6621, -67, -1000, 6621, 653, -1000, + -132, -106, 8045, 167, -1000, -1000, -1000, -1000, 4443, 12595, + 608, 333, -70, -1000, -1000, -1000, 691, -1000, 691, 691, + 691, 691, -21, -21, -21, -21, -1000, -1000, -1000, -1000, + -1000, 712, 708, -1000, 691, 691, 691, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, 856, 856, 856, 850, 850, - 877, -1000, 17028, 4333, 1006, 4333, -1000, 100, -1000, -1000, - -1000, 17028, 17028, 17028, 17028, 17028, 180, 17028, 17028, 792, - -1000, 17028, 4333, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, 666, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 17028, - -1000, -1000, -1000, -1000, 17028, 348, 17028, 17028, 666, -1000, - 17028, 17028, -1000, -1000, -1000, -1000, -1000, 666, 252, 488, - 274, -1000, -1000, 398, -1000, -1000, 1779, -1000, -1000, -1000, - -1000, 471, 10726, 10726, 10726, 449, 1779, 2274, 708, 592, - 227, 501, 501, 229, 229, 229, 229, 229, 349, 349, - -1000, -1000, -1000, 454, -1000, -1000, -1000, 454, 8270, 8270, - 783, 744, 200, -1000, 789, -1000, -1000, 1022, 695, 695, - 586, 548, 326, 1063, 695, 324, 1053, 695, 695, 8270, - -1000, -1000, 325, -1000, 9679, 454, -1000, 199, -1000, 857, - 748, 741, 695, 454, 454, 695, 695, 982, -1000, -1000, - 937, 9679, 9679, 9679, -1000, -1000, -1000, 982, 1034, -1000, - 956, 955, 1044, 8270, 14229, 1057, -1000, -1000, -1000, 198, - 1044, 938, 744, -1000, 17028, 14229, 14229, 14229, 14229, 14229, - -1000, 924, 905, -1000, 928, 904, 936, 17028, -1000, 704, - 631, 12484, 235, 744, -1000, 14578, -1000, -1000, 95, 661, - 14229, 17028, -1000, -1000, 14229, 17028, 5059, -1000, 729, -128, - -137, -1000, -1000, -1000, -1000, 666, -1000, 743, 720, 3607, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, 855, 614, -1000, - 991, 246, 343, 614, 987, -1000, -1000, -1000, 970, -1000, - 344, -76, -1000, -1000, 417, -37, -37, -1000, -1000, 211, - 963, 211, 211, 211, 467, 467, -1000, -1000, -1000, -1000, - 415, -1000, -1000, -1000, 384, -1000, 887, 17028, 4333, -1000, - -1000, -1000, -1000, 254, 254, 264, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, 88, 865, -1000, - -1000, -1000, -1000, 6, 64, 139, -1000, 4333, -1000, 337, - 337, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - 449, 1779, 2259, -1000, 10726, 10726, -1000, -1000, 695, 695, - 8270, 5785, 1029, 982, -1000, -1000, 140, 736, 140, 10726, - 10726, -1000, 10726, 10726, -1000, -169, 721, 313, -1000, 9679, - 502, -1000, 5785, -1000, 10726, 10726, -1000, -1000, -1000, -1000, - -1000, -1000, 945, 666, 666, -1000, -1000, 17028, -1000, -1000, - -1000, -1000, 1037, 9679, -1000, 711, -1000, 4696, 1022, 886, - 17028, 744, 1091, 12484, 17028, 761, -1000, 284, 1090, 854, - 885, 826, -1000, -1000, -1000, -1000, 890, -1000, 866, -1000, - -1000, -1000, -1000, -1000, 631, -1000, 166, 164, 159, 17028, - -1000, 1044, 14229, 654, -1000, 654, -1000, 197, -1000, -1000, - -1000, -138, -111, -1000, -1000, -1000, 3970, -1000, 3970, 17028, - 105, -1000, 614, 614, -1000, -1000, -1000, 851, 884, 10726, - -1000, -1000, -1000, 527, 211, 211, -1000, 346, -1000, -1000, - -1000, 692, -1000, 689, 622, 682, 17028, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, 707, 707, 707, 696, 696, + 717, -1000, 18199, 4806, 862, 4806, -1000, 87, -1000, -1000, + -1000, 18199, 18199, 18199, 18199, 18199, 130, 18199, 18199, 676, + -1000, 18199, 4806, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, 396, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 18199, + -1000, -1000, -1000, -1000, 18199, 284, 18199, 18199, 396, -1000, + 18199, 18199, -1000, -1000, -1000, -1000, -1000, 396, 224, 270, + 237, -1000, -1000, 449, -1000, -1000, 2054, -1000, -1000, -1000, + -1000, 395, 11199, 11199, 11199, 440, 2054, 2039, 580, 408, + 169, 309, 309, 182, 182, 182, 182, 182, 613, 613, + -1000, -1000, -1000, 400, -1000, -1000, -1000, 400, 8743, 8743, + 670, 686, 151, -1000, 727, -1000, -1000, 890, 612, 612, + 383, 377, 254, 951, 612, 252, 950, 612, 612, 8743, + -1000, -1000, 272, -1000, 10152, 400, -1000, 149, -1000, 768, + 657, 654, 612, 400, 400, 612, 612, 869, -1000, -1000, + 790, 10152, 10152, 10152, -1000, -1000, -1000, 869, 933, -1000, + 801, 800, 930, 8743, 15051, 934, -1000, -1000, -1000, 148, + 930, 673, 686, -1000, 18199, 15051, 15051, 15051, 15051, 15051, + -1000, 779, 773, -1000, 755, 754, 772, 18199, -1000, 614, + 534, 13306, 174, 686, -1000, 15400, -1000, -1000, 60, 554, + 15051, 18199, -1000, -1000, 15051, 18199, 5532, -1000, 653, -67, + -74, -1000, -1000, -1000, -1000, 396, -1000, 547, 648, 4080, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, 705, 505, -1000, + 836, 223, 229, 505, 832, -1000, -1000, -1000, 812, -1000, + 320, -72, -1000, -1000, 368, -21, -21, -1000, -1000, 167, + 808, 167, 167, 167, 406, 406, -1000, -1000, -1000, -1000, + 362, -1000, -1000, -1000, 346, -1000, 732, 18199, 4806, -1000, + -1000, -1000, -1000, 310, 310, 228, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, 59, 690, -1000, + -1000, -1000, -1000, 10, 40, 100, -1000, 4806, -1000, 291, + 291, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + 440, 2054, 1736, -1000, 11199, 11199, -1000, -1000, 612, 612, + 8743, 6258, 905, 869, -1000, -1000, 109, 498, 109, 11199, + 11199, -1000, 11199, 11199, -1000, -167, 683, 259, -1000, 10152, + 570, -1000, 6258, -1000, 11199, 11199, -1000, -1000, -1000, -1000, + -1000, -1000, 787, 396, 396, -1000, -1000, 18199, -1000, -1000, + -1000, -1000, 926, 10152, -1000, 647, -1000, 5169, 890, 731, + 18199, 686, 956, 13306, 18199, 680, -1000, 235, 902, 704, + 728, 867, -1000, -1000, -1000, -1000, 764, -1000, 756, -1000, + -1000, -1000, -1000, -1000, 534, -1000, 108, 107, 106, 18199, + -1000, 930, 15051, 652, -1000, 652, -1000, 147, -1000, -1000, + -1000, -138, -121, -1000, -1000, -1000, 4443, -1000, 4443, 18199, + 69, -1000, 505, 505, -1000, -1000, -1000, 700, 726, 11199, + -1000, -1000, -1000, 532, 167, 167, -1000, 238, -1000, -1000, + -1000, 603, -1000, 601, 621, 598, 18199, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, 17028, -1000, -1000, -1000, - -1000, -1000, 17028, -175, 614, 17028, 17028, 17028, 17028, -1000, - 348, 348, -1000, 10726, 1779, 1779, -1000, -1000, 454, -1000, - 1022, -1000, 454, 842, 842, -1000, 842, 850, -1000, 842, - -14, 842, -21, 454, 454, 2188, 2163, 1701, 546, 744, - -164, -1000, 666, 9679, -1000, 1912, 1735, -1000, -1000, 1032, - 1024, 666, -1000, -1000, -1000, 996, 808, 570, -1000, -1000, - 7921, 676, 192, 673, -1000, 1029, 17028, 9679, -1000, -1000, - 9679, 845, -1000, 9679, -1000, -1000, -1000, 1029, 744, 744, - 744, 673, 1029, 654, -1000, -1000, 239, -1000, -1000, -1000, - 3607, -1000, 664, -1000, 842, -1000, -1000, -1000, 17028, -64, - 1081, 1779, -1000, -1000, -1000, -1000, -1000, -37, 448, -37, - 378, -1000, 377, 4333, -1000, -1000, -1000, -1000, 1001, -1000, - 5785, -1000, -1000, 841, 870, -1000, -1000, -1000, -1000, 1779, - -1000, 982, -1000, -1000, 149, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, 10726, 10726, 10726, 10726, 10726, 1022, 446, - 666, 10726, 10726, -1000, 9679, 9679, 986, -1000, 744, -1000, - 860, 17028, 17028, -1000, 17028, 1022, -1000, 666, 666, 17028, - 666, 13880, 17028, 17028, 12122, 1022, -1000, 204, 17028, -1000, - 648, -1000, 251, -1000, -61, 211, -1000, 211, 525, 504, - -1000, 744, 600, -1000, 276, 17028, 17028, -1000, -1000, -1000, - 857, 857, 857, 857, 82, 454, -1000, 857, 857, 666, - 582, 1079, -1000, 744, 1091, 170, -1000, -1000, -1000, 626, - 624, -1000, 624, 624, 235, -1000, 204, -1000, 614, 270, - 429, -1000, 94, 17028, 350, 976, -1000, 975, -1000, -1000, - -1000, -1000, -1000, 87, 5785, 3970, 574, -1000, -1000, -1000, - -1000, -1000, 454, 54, -184, -1000, -1000, -1000, 17028, 570, - 17028, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 362, -1000, - -1000, 17028, -1000, -1000, 420, -1000, -1000, 554, -1000, 17028, - -1000, -1000, 865, -1000, 944, -173, -187, 503, -1000, -1000, - 831, -1000, -1000, 87, 954, -175, -1000, 930, -1000, 17028, - -1000, 76, -1000, -182, 537, 78, -185, 883, 744, -188, - 879, -1000, 1051, 10028, -1000, -1000, 1077, 234, 234, 857, - 454, -1000, -1000, -1000, 98, 410, -1000, -1000, -1000, -1000, - -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, 18199, -1000, -1000, -1000, + -1000, -1000, 18199, -173, 505, 18199, 18199, 18199, 18199, -1000, + 284, 284, -1000, 11199, 2054, 2054, -1000, -1000, 400, -1000, + 890, -1000, 400, 691, 691, -1000, 691, 696, -1000, 691, + 3, 691, -1, 400, 400, 1921, 1879, 1759, 1667, 686, + -162, -1000, 396, 10152, -1000, 1601, 1112, -1000, -1000, 903, + 892, 396, -1000, -1000, -1000, 839, 540, 581, -1000, -1000, + 8394, 587, 146, 584, -1000, 905, 18199, 10152, -1000, -1000, + 10152, 694, -1000, 10152, -1000, -1000, -1000, 905, 686, 686, + 686, 584, 905, 652, -1000, -1000, 179, -1000, -1000, -1000, + 4080, -1000, 576, -1000, 691, -1000, 832, -1000, -1000, 18199, + -64, 962, 2054, -1000, -1000, -1000, -1000, -1000, -21, 402, + -21, 340, -1000, 337, 4806, -1000, -1000, -1000, -1000, 857, + -1000, 6258, -1000, -1000, 688, 714, -1000, -1000, -1000, -1000, + 2054, -1000, 869, -1000, -1000, 138, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, 11199, 11199, 11199, 11199, 11199, 890, + 399, 396, 11199, 11199, -1000, 10152, 10152, 831, -1000, 686, + -1000, 697, 18199, 18199, -1000, 18199, 890, -1000, 396, 396, + 18199, 396, 14702, 18199, 18199, 12944, 890, -1000, 176, 18199, + -1000, 574, -1000, 203, -1000, -133, 167, -1000, 167, 504, + 461, -1000, 686, 618, -1000, 234, 18199, 18199, -1000, -1000, + -1000, 768, 768, 768, 768, 65, 400, -1000, 768, 768, + 396, 616, 959, -1000, 686, 956, 142, -1000, -1000, -1000, + 571, 528, -1000, 528, 528, 174, -1000, 176, -1000, 505, + 232, 382, -1000, 64, 18199, 311, 820, -1000, 816, -1000, + -1000, -1000, -1000, -1000, 55, 6258, 4443, 525, -1000, -1000, + -1000, -1000, -1000, 400, 56, -179, -1000, -1000, -1000, 18199, + 581, 18199, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 332, + -1000, -1000, 18199, -1000, -1000, 373, -1000, -1000, 475, -1000, + 18199, -1000, -1000, 690, -1000, 785, -171, -182, 503, -1000, + -1000, 687, -1000, -1000, 55, 797, -173, -1000, 784, -1000, + 18199, -1000, 47, -1000, -176, 470, 45, -180, 723, 686, + -185, 706, -1000, 949, 10501, -1000, -1000, 936, 196, 196, + 768, 400, -1000, -1000, -1000, 77, 334, -1000, -1000, -1000, + -1000, -1000, -1000, } var yyPgo = [...]int{ - 0, 1360, 1359, 27, 67, 58, 1358, 1357, 1356, 1355, - 93, 92, 91, 1354, 1353, 1352, 1351, 1348, 1347, 1344, - 1342, 1339, 1335, 1332, 1329, 1327, 1324, 1323, 1322, 1321, - 1320, 1319, 1318, 122, 1310, 1304, 1302, 1301, 76, 1300, - 1298, 1296, 1295, 1293, 38, 222, 44, 66, 1289, 57, - 1266, 1287, 47, 63, 60, 1286, 25, 1285, 1282, 72, - 1281, 1279, 56, 1278, 1274, 2033, 1273, 54, 1272, 10, - 26, 1270, 1261, 1259, 1257, 79, 170, 1256, 1252, 9, - 1248, 1246, 143, 1245, 65, 15, 7, 19, 17, 1243, - 69, 1241, 14, 1240, 62, 1239, 1236, 1235, 1234, 32, - 1229, 59, 1228, 118, 23, 1227, 31, 42, 35, 20, - 5, 1226, 1224, 18, 70, 48, 73, 1223, 1222, 1220, - 561, 1218, 50, 1217, 1216, 1212, 29, 77, 89, 427, - 1211, 1208, 1207, 1203, 1202, 37, 937, 1299, 115, 87, - 1201, 1200, 1197, 2153, 40, 55, 12, 1196, 1192, 1190, - 30, 328, 36, 462, 1189, 34, 1187, 1186, 1184, 1183, - 1178, 1176, 1175, 308, 1173, 1171, 1170, 90, 71, 64, - 21, 1169, 1168, 1164, 1163, 49, 75, 1160, 1159, 52, - 1157, 1156, 22, 1150, 1149, 1148, 1147, 1144, 24, 6, - 1131, 13, 1130, 16, 1129, 33, 1127, 3, 1126, 11, - 1122, 2, 0, 1121, 4, 41, 1, 1111, 8, 1106, - 1103, 1097, 110, 709, 68, 1095, 78, + 0, 1259, 1256, 32, 71, 69, 1252, 1251, 1246, 1245, + 99, 96, 94, 1242, 1239, 1232, 1229, 1228, 1227, 1224, + 1203, 1202, 1201, 1200, 1197, 1196, 1192, 1189, 1187, 1182, + 1180, 1179, 1177, 87, 1176, 1175, 1174, 1173, 85, 1172, + 1170, 1169, 1168, 1167, 42, 105, 44, 62, 1166, 66, + 1848, 1164, 52, 68, 61, 1163, 31, 1162, 1161, 81, + 1159, 1157, 58, 1156, 1155, 382, 1154, 55, 1150, 13, + 59, 1149, 1148, 1147, 1146, 95, 271, 1145, 1144, 15, + 1143, 1142, 90, 1140, 72, 20, 14, 29, 19, 1138, + 63, 1135, 6, 1134, 67, 1131, 1130, 1129, 1127, 41, + 1126, 65, 1124, 49, 24, 1121, 10, 64, 28, 23, + 9, 1120, 1118, 22, 82, 57, 75, 1117, 1116, 1115, + 421, 1114, 60, 1110, 1106, 1102, 56, 78, 106, 380, + 1096, 1088, 1084, 1081, 1079, 36, 1039, 1871, 8, 77, + 1076, 1072, 1070, 2625, 38, 54, 17, 1067, 1066, 1057, + 34, 37, 35, 365, 1055, 40, 1053, 1052, 1051, 1046, + 1043, 1042, 1041, 188, 1040, 1038, 1033, 18, 21, 73, + 26, 1029, 1028, 1027, 1025, 47, 74, 1024, 1023, 50, + 1021, 1020, 25, 1019, 1017, 1015, 1013, 1001, 27, 11, + 1000, 16, 999, 12, 998, 30, 996, 3, 994, 5, + 993, 2, 0, 992, 4, 48, 1, 991, 7, 986, + 983, 980, 1358, 1275, 76, 976, 98, } var yyR1 = [...]int{ @@ -3113,7 +3230,7 @@ var yyChk = [...]int{ 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, -185, 97, -176, -202, -65, 133, -65, + 13, 308, 79, -185, 97, -176, -137, -65, 133, -65, 267, -129, 137, -129, -129, 132, -65, -202, -202, 124, 126, 129, 56, -23, -65, -128, 137, -202, -128, -128, -128, -65, 121, -65, -202, 31, -126, 97, 13, 259, @@ -3196,31 +3313,31 @@ var yyChk = [...]int{ -212, -105, -137, -108, -137, -70, 59, 89, -57, -56, 56, 57, -58, 56, -56, 46, 46, -213, 133, 133, 133, -108, -70, -52, -70, -70, 121, 251, 255, 256, - -188, -189, -192, -191, -137, -195, -182, -182, 58, -166, - 56, -76, 60, -168, -168, -202, 115, 60, 59, 60, - 59, 60, 59, -65, -150, -150, -65, -150, -137, -201, - 280, -203, -202, -137, -137, -137, -65, -126, -126, -76, - -213, -103, -213, -163, -163, -163, -170, -163, 187, -163, - 187, -213, -213, 20, 20, 20, 20, -212, -41, 273, - -50, 59, 59, -98, 15, 17, 28, -109, 59, -213, - -213, 59, 121, -213, 59, -99, -113, -50, -50, 58, - -50, -212, -212, -212, -213, -99, -70, 60, 59, -163, - -106, -137, -171, 224, 10, -167, 65, -167, 66, 66, - -151, 27, -200, -199, -138, 58, 57, -104, -167, -202, - -76, -76, -76, -76, -76, -103, 65, -76, -76, -50, - -85, 29, -88, 37, -3, -137, -137, -137, -103, -106, - -106, -213, -106, -106, -146, -103, -194, -193, 57, 143, - 72, -191, 60, 59, -174, 139, 29, 138, -79, -168, - -168, 60, 60, -212, 59, 89, -106, -65, -213, -213, - -213, -213, -42, 99, 280, -213, -213, -213, 10, -86, - 121, 60, -213, -213, -213, -69, -193, -202, -183, 89, - 65, 151, -137, -164, 72, 29, 29, -196, -197, 162, - -199, -189, 60, -213, 278, 53, 281, -110, -137, 66, - -65, 65, -213, 59, -137, -204, 42, 279, 282, 58, - -197, 37, -201, 42, -106, 164, 280, 60, 165, 281, - -207, -208, 56, -212, 282, -208, 56, 11, 10, -76, - 161, -206, 152, 147, 150, 31, -206, -213, -213, 146, - 30, 74, + -188, -189, -192, -191, -137, -195, 149, -182, -182, 58, + -166, 56, -76, 60, -168, -168, -202, 115, 60, 59, + 60, 59, 60, 59, -65, -150, -150, -65, -150, -137, + -201, 280, -203, -202, -137, -137, -137, -65, -126, -126, + -76, -213, -103, -213, -163, -163, -163, -170, -163, 187, + -163, 187, -213, -213, 20, 20, 20, 20, -212, -41, + 273, -50, 59, 59, -98, 15, 17, 28, -109, 59, + -213, -213, 59, 121, -213, 59, -99, -113, -50, -50, + 58, -50, -212, -212, -212, -213, -99, -70, 60, 59, + -163, -106, -137, -171, 224, 10, -167, 65, -167, 66, + 66, -151, 27, -200, -199, -138, 58, 57, -104, -167, + -202, -76, -76, -76, -76, -76, -103, 65, -76, -76, + -50, -85, 29, -88, 37, -3, -137, -137, -137, -103, + -106, -106, -213, -106, -106, -146, -103, -194, -193, 57, + 143, 72, -191, 60, 59, -174, 139, 29, 138, -79, + -168, -168, 60, 60, -212, 59, 89, -106, -65, -213, + -213, -213, -213, -42, 99, 280, -213, -213, -213, 10, + -86, 121, 60, -213, -213, -213, -69, -193, -202, -183, + 89, 65, 151, -137, -164, 72, 29, 29, -196, -197, + 162, -199, -189, 60, -213, 278, 53, 281, -110, -137, + 66, -65, 65, -213, 59, -137, -204, 42, 279, 282, + 58, -197, 37, -201, 42, -106, 164, 280, 60, 165, + 281, -207, -208, 56, -212, 282, -208, 56, 11, 10, + -76, 161, -206, 152, 147, 150, 31, -206, -213, -213, + 146, 30, 74, } var yyDef = [...]int{ @@ -3330,7 +3447,7 @@ var yyDef = [...]int{ 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, + 932, 964, 204, 204, 866, 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, 1008, 81, @@ -3363,31 +3480,31 @@ var yyDef = [...]int{ 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, 1008, 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, + 224, 227, 0, 206, 150, 209, 0, 193, 194, 0, + 168, 0, 165, 151, 125, 126, 171, 172, 170, 0, + 170, 0, 155, 0, 1008, 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, } var yyTok1 = [...]int{ diff --git a/go/vt/sqlparser/sql.y b/go/vt/sqlparser/sql.y index e142dbf905f..74ce3774db8 100644 --- a/go/vt/sqlparser/sql.y +++ b/go/vt/sqlparser/sql.y @@ -779,7 +779,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 From 9ef52bbb90b2b0aab906e6b85c5fd832bc831662 Mon Sep 17 00:00:00 2001 From: GuptaManan100 Date: Fri, 2 Oct 2020 16:43:52 +0530 Subject: [PATCH 10/19] Added Parsing for Into outfile s3 Signed-off-by: GuptaManan100 --- go/vt/sqlparser/ast.go | 4 + go/vt/sqlparser/parse_test.go | 52 +- go/vt/sqlparser/sql.go | 6449 +++++++++++++++++---------------- go/vt/sqlparser/sql.y | 16 +- go/vt/sqlparser/token.go | 3 +- 5 files changed, 3311 insertions(+), 3213 deletions(-) diff --git a/go/vt/sqlparser/ast.go b/go/vt/sqlparser/ast.go index ecdeddad73c..d1e9c04a86b 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 @@ -968,6 +969,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 cd650692288..bd7687118f9 100644 --- a/go/vt/sqlparser/parse_test.go +++ b/go/vt/sqlparser/parse_test.go @@ -2101,6 +2101,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 @@ -2451,7 +2501,7 @@ 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" + ")", diff --git a/go/vt/sqlparser/sql.go b/go/vt/sqlparser/sql.go index 7bb4db5a609..f58ea8516da 100644 --- a/go/vt/sqlparser/sql.go +++ b/go/vt/sqlparser/sql.go @@ -155,321 +155,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", @@ -508,6 +510,8 @@ var yyToknames = [...]string{ "KEYS", "DO", "DISTINCTROW", + "OUTFILE", + "S3", "VALUES", "LAST_INSERT_ID", "NEXT", @@ -855,1422 +859,1359 @@ 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, 703, - -2, 699, -1, 401, - 121, 704, - -2, 700, - -1, 415, - 39, 373, - -2, 385, + 123, 705, + -2, 701, + -1, 402, + 123, 706, + -2, 702, -1, 416, - 39, 374, + 41, 373, + -2, 385, + -1, 417, + 41, 374, -2, 386, - -1, 435, - 89, 958, - -2, 74, -1, 436, - 89, 873, + 91, 962, + -2, 74, + -1, 437, + 91, 876, -2, 75, - -1, 441, - 89, 840, - -2, 665, - -1, 443, - 89, 905, + -1, 442, + 91, 843, -2, 667, - -1, 943, - 121, 706, - -2, 702, - -1, 1028, - 57, 56, + -1, 444, + 91, 908, + -2, 669, + -1, 945, + 123, 708, + -2, 704, + -1, 1032, 59, 56, + 61, 56, -2, 60, - -1, 1377, + -1, 1383, 5, 624, 18, 624, 20, 624, 32, 624, - 60, 624, + 62, 624, -2, 411, } const yyPrivate = 57344 -const yyLast = 18567 +const yyLast = 18680 var yyAct = [...]int{ - 400, 1622, 1420, 1579, 1303, 1494, 344, 1612, 615, 1205, - 1481, 1050, 1528, 1225, 1357, 359, 1393, 1022, 1079, 1358, - 695, 1046, 1206, 1354, 734, 1254, 1093, 1049, 1363, 373, - 1059, 1369, 71, 3, 330, 930, 440, 613, 865, 92, - 1322, 741, 1143, 290, 937, 313, 290, 1271, 1280, 408, - 1063, 92, 1019, 290, 1024, 772, 596, 779, 1008, 1192, - 885, 762, 744, 346, 1001, 739, 417, 963, 761, 402, - 69, 28, 907, 1089, 565, 778, 1030, 751, 605, 335, - 92, 769, 776, 92, 290, 67, 290, 72, 437, 331, - 709, 893, 334, 66, 8, 342, 7, 1615, 708, 6, - 1599, 1610, 1587, 1112, 1607, 940, 585, 1421, 1598, 1586, - 1339, 1450, 570, 1387, 94, 95, 96, 1111, 1040, 74, - 75, 76, 77, 78, 79, 385, 333, 391, 392, 389, - 390, 388, 387, 386, 1388, 1389, 628, 423, 427, 403, - 30, 393, 394, 60, 34, 35, 1041, 1042, 94, 95, - 96, 332, 286, 282, 283, 284, 1262, 1072, 278, 1110, - 1484, 276, 434, 280, 1554, 657, 656, 666, 667, 659, - 660, 661, 662, 663, 664, 665, 658, 1242, 1305, 668, - 1241, 1080, 780, 1243, 781, 602, 1441, 604, 1073, 623, - 1439, 892, 59, 624, 621, 622, 323, 325, 627, 94, - 95, 96, 321, 616, 617, 626, 854, 853, 1307, 851, - 1609, 1606, 1107, 1104, 1105, 1572, 1103, 1580, 1396, 601, - 603, 1302, 1002, 1630, 1323, 586, 611, 1626, 1226, 1228, - 572, 280, 1537, 1529, 1306, 1308, 858, 631, 842, 1380, - 1379, 1378, 575, 852, 894, 895, 896, 855, 1531, 1114, - 1117, 1299, 1066, 568, 293, 281, 1124, 1301, 1066, 1123, - 279, 680, 681, 1561, 1162, 1325, 1159, 1463, 1386, 1197, - 1172, 339, 1151, 1036, 755, 693, 592, 290, 577, 578, - 285, 1047, 290, 668, 587, 1238, 277, 980, 290, 1109, - 94, 95, 96, 658, 290, 594, 668, 598, 600, 94, - 95, 96, 1327, 886, 1331, 92, 1326, 92, 1324, 880, - 1227, 1108, 599, 1329, 92, 82, 914, 645, 606, 1530, - 648, 1570, 1328, 1546, 1367, 610, 92, 92, 782, 582, - 912, 913, 911, 648, 1585, 1330, 1332, 612, 641, 1290, - 1080, 1538, 1536, 1624, 618, 1555, 1625, 1341, 1623, 647, - 645, 630, 964, 1407, 83, 1113, 1065, 964, 844, 1169, - 637, 1300, 1065, 1298, 1631, 777, 648, 642, 643, 629, - 1115, 1286, 1287, 1288, 680, 681, 680, 681, 607, 608, - 571, 597, 767, 1575, 30, 31, 32, 60, 34, 35, - 887, 588, 589, 590, 1260, 748, 881, 579, 1590, 580, - 1158, 61, 581, 1490, 64, 678, 1489, 1069, 1632, 36, - 55, 56, 1275, 58, 1070, 661, 662, 663, 664, 665, - 658, 275, 640, 668, 638, 288, 92, 639, 1274, 290, - 290, 290, 45, 92, 1263, 326, 59, 732, 1592, 92, - 1157, 437, 1156, 1289, 731, 432, 696, 1571, 1294, 1291, - 1282, 1292, 1285, 59, 1281, 646, 647, 645, 1283, 1284, - 412, 646, 647, 645, 1507, 910, 567, 1487, 569, 573, - 574, 1272, 1293, 648, 646, 647, 645, 712, 714, 648, - 718, 720, 760, 723, 745, 711, 713, 715, 717, 719, - 721, 722, 648, 733, 902, 904, 905, 878, 428, 429, - 430, 903, 38, 39, 41, 40, 43, 870, 57, 656, - 666, 667, 659, 660, 661, 662, 663, 664, 665, 658, - 743, 1543, 668, 1136, 1137, 1138, 1032, 985, 986, 1534, - 1608, 44, 63, 62, 1594, 412, 53, 54, 42, 68, - 657, 656, 666, 667, 659, 660, 661, 662, 663, 664, - 665, 658, 46, 47, 668, 48, 49, 50, 51, 94, - 95, 96, 1366, 932, 1542, 290, 94, 95, 96, 840, - 92, 1033, 843, 1035, 845, 290, 290, 92, 92, 92, - 646, 647, 645, 290, 1534, 1583, 290, 1534, 412, 290, - 863, 864, 1403, 290, 412, 92, 1355, 1144, 648, 1366, - 92, 92, 92, 290, 92, 92, 1032, 841, 94, 95, - 96, 1232, 1245, 1031, 848, 849, 850, 92, 92, 682, - 683, 684, 685, 686, 687, 688, 689, 690, 691, 867, - 1534, 1562, 868, 1534, 1533, 1479, 1478, 872, 873, 874, - 1459, 876, 877, 1465, 412, 61, 1462, 412, 646, 647, - 645, 1033, 869, 1031, 882, 883, 1343, 1413, 1412, 576, - 1409, 1410, 1409, 1408, 584, 1193, 648, 859, 1067, 931, - 591, 993, 412, 1005, 412, 644, 593, 1545, 933, 30, - 1411, 908, 666, 667, 659, 660, 661, 662, 663, 664, - 665, 658, 92, 1193, 668, 644, 412, 789, 788, 70, - 1004, 994, 941, 30, 1200, 889, 1005, 1246, 952, 955, - 1201, 1005, 1039, 1175, 965, 909, 1174, 659, 660, 661, - 662, 663, 664, 665, 658, 92, 92, 668, 1005, 993, - 943, 59, 942, 405, 1514, 1031, 983, 857, 947, 1366, - 774, 30, 993, 92, 59, 1600, 1496, 1304, 993, 1074, - 290, 696, 1470, 92, 1094, 59, 982, 290, 1399, 290, - 1370, 1371, 1617, 1249, 941, 1090, 1085, 290, 290, 290, - 1084, 1497, 973, 974, 1097, 92, 934, 935, 92, 1613, - 944, 977, 1401, 437, 1373, 59, 437, 1355, 1276, 92, - 92, 987, 943, 59, 999, 890, 981, 1051, 861, 1020, - 1217, 1215, 1376, 948, 949, 1218, 1216, 954, 957, 958, - 1375, 759, 995, 771, 742, 646, 647, 645, 1219, 1214, - 1014, 1015, 1081, 1082, 1083, 1213, 1604, 1597, 412, 1347, - 997, 1182, 972, 648, 1602, 975, 976, 1191, 1190, 1267, - 787, 595, 1259, 290, 92, 1577, 92, 1034, 1116, 1576, - 1029, 1038, 290, 290, 290, 290, 290, 1037, 290, 290, - 1512, 1257, 290, 92, 1054, 1251, 1095, 1457, 657, 656, - 666, 667, 659, 660, 661, 662, 663, 664, 665, 658, - 290, 1099, 668, 1101, 1492, 290, 1100, 290, 290, 735, - 960, 290, 92, 362, 361, 364, 365, 366, 367, 860, - 1128, 736, 363, 368, 961, 1018, 406, 407, 409, 1456, - 1091, 1092, 410, 1010, 1013, 1014, 1015, 1011, 1455, 1012, - 1016, 70, 906, 1370, 1371, 915, 916, 917, 918, 919, - 920, 921, 922, 923, 924, 925, 926, 927, 928, 929, - 1350, 908, 1131, 1193, 625, 1189, 1619, 790, 1010, 1013, - 1014, 1015, 1011, 1188, 1012, 1016, 418, 846, 847, 1619, - 1618, 68, 1163, 1160, 884, 856, 756, 749, 771, 1559, - 419, 862, 1485, 979, 405, 909, 73, 746, 747, 421, - 65, 420, 969, 1, 1139, 875, 312, 1075, 1076, 1077, - 1078, 1611, 1422, 1493, 1106, 290, 1578, 1153, 1527, 1392, - 1057, 1048, 1181, 1086, 1087, 1088, 290, 290, 290, 290, - 290, 1207, 1186, 81, 1152, 563, 403, 80, 290, 1569, - 879, 609, 290, 1056, 1055, 1535, 290, 1261, 1071, 1483, - 1168, 290, 290, 1400, 1202, 290, 290, 290, 1258, 401, - 1574, 795, 793, 794, 1148, 1149, 792, 1195, 1244, 1185, - 92, 797, 796, 791, 1224, 305, 1194, 891, 1051, 1250, - 1198, 1247, 1196, 1255, 1255, 1166, 322, 1017, 1209, 1210, - 783, 1212, 1096, 867, 1208, 1220, 750, 1211, 93, 84, - 1230, 1297, 291, 1233, 1296, 291, 418, 1235, 1102, 1256, - 93, 1236, 291, 1231, 1264, 1265, 1068, 1239, 92, 92, - 419, 1266, 302, 1268, 1269, 1270, 619, 415, 416, 421, - 620, 420, 1252, 1253, 307, 676, 1187, 1240, 438, 93, - 431, 1361, 93, 291, 984, 291, 738, 1454, 92, 1349, - 1167, 705, 996, 1273, 962, 765, 1278, 1279, 345, 1000, - 901, 1003, 360, 357, 358, 988, 1199, 650, 343, 337, - 764, 1028, 92, 1295, 757, 1009, 1007, 1006, 931, 770, - 1319, 1372, 1368, 763, 992, 1309, 414, 959, 1553, 1449, - 413, 1453, 52, 33, 327, 633, 422, 23, 1321, 22, - 21, 1344, 20, 1312, 1140, 1141, 1142, 19, 290, 25, - 1310, 1311, 18, 1333, 1320, 1318, 17, 16, 92, 1334, - 583, 37, 27, 26, 92, 92, 1319, 1207, 1340, 943, - 1356, 942, 657, 656, 666, 667, 659, 660, 661, 662, - 663, 664, 665, 658, 15, 1098, 668, 14, 13, 12, - 92, 1359, 11, 290, 1118, 1119, 1120, 1121, 1122, 10, - 1125, 1126, 9, 1374, 1127, 5, 4, 92, 1353, 92, - 92, 636, 24, 1255, 1255, 1051, 694, 1051, 1381, 2, - 1391, 0, 1129, 0, 0, 1365, 0, 1130, 1406, 0, - 0, 0, 0, 1134, 1390, 968, 0, 290, 1397, 1398, - 0, 1395, 0, 0, 0, 1383, 1404, 1405, 0, 0, - 0, 1382, 0, 1384, 0, 1385, 0, 290, 0, 0, - 0, 0, 0, 92, 0, 1423, 92, 92, 92, 290, - 0, 0, 0, 0, 0, 1415, 291, 0, 0, 0, - 0, 291, 0, 0, 0, 0, 0, 291, 0, 0, - 1416, 0, 1418, 291, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 93, 0, 93, 411, 0, 0, - 0, 0, 0, 93, 1437, 0, 0, 0, 374, 29, - 0, 0, 0, 0, 0, 93, 93, 1428, 1429, 0, - 1432, 0, 0, 1207, 0, 0, 0, 0, 0, 0, - 1458, 0, 0, 0, 0, 0, 0, 0, 29, 1467, - 0, 92, 0, 0, 0, 0, 0, 0, 0, 1051, - 92, 0, 1247, 0, 0, 0, 0, 1466, 0, 0, - 0, 0, 0, 0, 1234, 92, 1314, 1315, 0, 0, - 0, 0, 92, 0, 1476, 0, 404, 1486, 0, 1488, - 1495, 1335, 1336, 0, 1337, 1338, 1500, 0, 0, 0, - 0, 0, 0, 1477, 0, 0, 1345, 1346, 0, 0, - 0, 0, 1491, 0, 1499, 0, 0, 1498, 0, 0, - 0, 0, 0, 92, 92, 93, 92, 0, 291, 291, - 291, 92, 93, 92, 92, 92, 290, 1511, 93, 1513, - 92, 1520, 0, 1521, 1523, 1524, 0, 0, 0, 1359, - 0, 0, 0, 1525, 1515, 0, 1532, 92, 290, 1506, - 0, 1539, 0, 0, 0, 0, 0, 1547, 1540, 0, - 1541, 0, 1434, 1435, 0, 1436, 1519, 0, 1438, 0, - 1440, 0, 0, 0, 0, 0, 1526, 0, 0, 1560, - 1568, 1402, 0, 0, 0, 92, 0, 0, 0, 1566, - 1567, 0, 0, 0, 1359, 0, 92, 92, 0, 0, - 0, 1581, 0, 0, 1495, 1051, 0, 0, 1582, 0, - 0, 0, 92, 0, 0, 0, 1207, 0, 0, 1588, - 1348, 0, 0, 290, 0, 0, 0, 0, 0, 0, - 0, 92, 0, 1480, 0, 1430, 0, 0, 1596, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1601, 1603, - 0, 92, 0, 0, 291, 0, 0, 0, 0, 93, - 0, 1605, 0, 0, 291, 291, 93, 93, 93, 1616, - 0, 1627, 291, 0, 0, 291, 0, 0, 291, 0, - 0, 0, 291, 0, 93, 0, 0, 0, 0, 93, - 93, 93, 291, 93, 93, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 93, 93, 0, 1414, - 1452, 0, 0, 614, 0, 614, 0, 0, 0, 0, - 0, 0, 614, 0, 0, 0, 0, 0, 0, 1417, - 0, 0, 0, 0, 0, 0, 29, 1447, 0, 0, - 0, 1427, 0, 0, 0, 0, 0, 0, 0, 677, - 679, 657, 656, 666, 667, 659, 660, 661, 662, 663, - 664, 665, 658, 0, 0, 668, 1501, 1502, 1503, 1504, - 1505, 0, 0, 0, 1508, 1509, 0, 0, 0, 0, - 692, 93, 0, 0, 697, 698, 699, 700, 701, 702, - 703, 704, 0, 707, 710, 710, 710, 716, 710, 710, - 716, 710, 724, 725, 726, 727, 728, 729, 730, 0, - 0, 0, 0, 29, 93, 93, 0, 657, 656, 666, - 667, 659, 660, 661, 662, 663, 664, 665, 658, 1446, - 0, 668, 93, 0, 0, 0, 0, 0, 766, 291, - 0, 0, 93, 0, 0, 0, 291, 0, 291, 0, - 0, 0, 0, 0, 0, 0, 291, 291, 291, 0, - 0, 0, 0, 0, 93, 0, 1313, 93, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 93, 93, - 0, 0, 0, 94, 95, 96, 657, 656, 666, 667, - 659, 660, 661, 662, 663, 664, 665, 658, 425, 0, - 668, 0, 0, 0, 0, 0, 0, 0, 0, 657, - 656, 666, 667, 659, 660, 661, 662, 663, 664, 665, - 658, 371, 0, 668, 0, 0, 0, 0, 0, 0, - 1548, 0, 291, 93, 0, 93, 1620, 294, 0, 0, - 0, 291, 291, 291, 291, 291, 297, 291, 291, 1445, - 0, 291, 93, 0, 306, 0, 0, 336, 0, 0, - 91, 0, 0, 0, 0, 0, 0, 0, 0, 291, - 0, 0, 324, 0, 291, 0, 291, 291, 614, 0, - 291, 93, 0, 0, 0, 614, 614, 614, 304, 0, - 0, 1444, 0, 0, 311, 0, 0, 0, 0, 0, - 0, 439, 0, 614, 566, 1591, 0, 0, 614, 614, - 614, 0, 614, 614, 0, 0, 0, 0, 0, 0, - 945, 946, 0, 0, 295, 614, 614, 0, 0, 657, - 656, 666, 667, 659, 660, 661, 662, 663, 664, 665, - 658, 0, 0, 668, 0, 0, 0, 0, 0, 0, - 0, 308, 298, 0, 309, 310, 317, 0, 978, 0, - 301, 303, 314, 299, 300, 319, 318, 0, 296, 316, - 315, 657, 656, 666, 667, 659, 660, 661, 662, 663, - 664, 665, 658, 0, 291, 668, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 291, 291, 291, 291, 291, - 0, 0, 0, 0, 0, 0, 0, 291, 0, 0, - 0, 291, 0, 0, 0, 291, 0, 0, 0, 0, - 291, 291, 0, 0, 291, 291, 291, 0, 0, 0, - 0, 0, 652, 0, 655, 0, 0, 0, 0, 93, - 669, 670, 671, 672, 673, 674, 675, 0, 653, 654, - 651, 657, 656, 666, 667, 659, 660, 661, 662, 663, - 664, 665, 658, 0, 0, 668, 0, 0, 0, 1145, - 0, 0, 0, 0, 0, 1021, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 93, 93, 657, - 656, 666, 667, 659, 660, 661, 662, 663, 664, 665, - 658, 0, 0, 668, 657, 656, 666, 667, 659, 660, - 661, 662, 663, 664, 665, 658, 0, 93, 668, 0, - 0, 0, 0, 0, 0, 0, 439, 0, 439, 0, - 0, 0, 0, 0, 0, 439, 0, 649, 0, 0, - 0, 93, 0, 0, 0, 0, 0, 632, 634, 0, - 0, 0, 614, 0, 614, 0, 0, 0, 0, 1146, - 0, 0, 0, 1147, 0, 0, 0, 0, 0, 0, - 0, 614, 0, 336, 1154, 1155, 0, 291, 0, 0, - 1161, 0, 706, 1164, 1165, 0, 0, 93, 0, 0, - 0, 1171, 0, 93, 93, 1173, 0, 0, 1176, 1177, - 1178, 1179, 1180, 0, 0, 0, 0, 0, 737, 740, + 401, 1586, 1308, 1426, 1501, 1210, 345, 1629, 1535, 360, + 1054, 1230, 1363, 1026, 1399, 743, 1619, 736, 1364, 71, + 3, 1211, 697, 617, 1083, 1077, 1197, 374, 1360, 1259, + 1097, 1053, 932, 1050, 331, 1063, 1369, 441, 867, 92, + 1375, 1327, 1488, 291, 69, 314, 291, 1023, 887, 1285, + 1276, 92, 598, 291, 1147, 774, 1067, 781, 1005, 1028, + 1012, 764, 418, 769, 965, 741, 763, 939, 746, 28, + 403, 909, 347, 780, 409, 1093, 567, 67, 771, 1034, + 92, 336, 778, 92, 291, 753, 291, 72, 607, 332, + 895, 66, 335, 8, 710, 343, 587, 1622, 1606, 7, + 6, 1617, 1594, 438, 1614, 1427, 289, 1605, 711, 1593, + 1344, 1456, 572, 1394, 1395, 782, 327, 783, 615, 74, + 75, 76, 77, 78, 79, 386, 1393, 392, 393, 390, + 391, 389, 388, 387, 94, 95, 96, 404, 1045, 1046, + 1044, 394, 395, 424, 428, 1116, 630, 569, 30, 571, + 334, 60, 34, 35, 287, 283, 284, 285, 1247, 1115, + 279, 1246, 435, 277, 1248, 281, 625, 333, 1267, 1076, + 626, 623, 624, 942, 1310, 1561, 659, 658, 668, 669, + 661, 662, 663, 664, 665, 666, 667, 660, 1491, 1084, + 670, 1447, 94, 95, 96, 1445, 324, 94, 95, 96, + 894, 326, 59, 1114, 322, 604, 856, 606, 629, 618, + 619, 628, 659, 658, 668, 669, 661, 662, 663, 664, + 665, 666, 667, 660, 1616, 1328, 670, 855, 1312, 853, + 1311, 1613, 1587, 1307, 1006, 1579, 1633, 1402, 613, 603, + 605, 1070, 1637, 896, 897, 898, 588, 857, 574, 1536, + 1544, 281, 1313, 1304, 860, 633, 1111, 1108, 1109, 1306, + 1107, 844, 280, 854, 1538, 1070, 1330, 1231, 1233, 1148, + 1386, 1385, 1384, 570, 577, 94, 95, 96, 291, 579, + 580, 294, 286, 291, 282, 589, 1568, 1128, 278, 291, + 1127, 1166, 1470, 1118, 1121, 291, 596, 1163, 1392, 602, + 682, 683, 584, 1332, 1202, 1336, 92, 1331, 92, 1329, + 1176, 1155, 1040, 1051, 1334, 92, 757, 695, 594, 94, + 95, 96, 660, 1333, 670, 670, 1243, 92, 92, 888, + 984, 600, 601, 1113, 1592, 1537, 1335, 1337, 1084, 612, + 608, 578, 648, 649, 647, 650, 586, 1069, 639, 1232, + 814, 614, 593, 882, 1631, 1112, 1562, 1632, 595, 1630, + 650, 1545, 1543, 916, 647, 1305, 631, 1303, 644, 645, + 581, 1069, 582, 1413, 82, 583, 1346, 914, 915, 913, + 650, 1577, 590, 591, 592, 1161, 1553, 1160, 1373, 609, + 610, 784, 663, 664, 665, 666, 667, 660, 643, 1117, + 670, 1265, 966, 682, 683, 1073, 648, 649, 647, 682, + 683, 61, 1074, 83, 1119, 680, 846, 599, 889, 733, + 649, 647, 642, 1638, 650, 734, 620, 92, 640, 641, + 291, 291, 291, 632, 92, 1582, 802, 650, 1295, 966, + 92, 1173, 883, 779, 750, 698, 658, 668, 669, 661, + 662, 663, 664, 665, 666, 667, 660, 438, 1597, 670, + 661, 662, 663, 664, 665, 666, 667, 660, 573, 1639, + 670, 1497, 1291, 1292, 1293, 1496, 1280, 815, 762, 1279, + 59, 747, 713, 715, 717, 719, 721, 723, 724, 1268, + 989, 990, 912, 761, 735, 773, 714, 716, 1599, 720, + 722, 1578, 725, 828, 831, 832, 833, 834, 835, 836, + 1514, 837, 838, 839, 840, 841, 816, 817, 818, 819, + 800, 801, 829, 433, 803, 1494, 804, 805, 806, 807, + 808, 809, 810, 811, 812, 813, 820, 821, 822, 823, + 824, 825, 826, 827, 1294, 648, 649, 647, 1460, 1299, + 1296, 1287, 1297, 1290, 1277, 1286, 880, 575, 576, 1288, + 1289, 872, 413, 650, 1541, 1615, 986, 291, 904, 906, + 907, 842, 92, 1298, 845, 905, 847, 291, 291, 92, + 92, 92, 648, 649, 647, 291, 276, 68, 291, 745, + 1348, 291, 865, 866, 1550, 291, 1549, 92, 1162, 830, + 650, 1198, 92, 92, 92, 291, 92, 92, 985, 668, + 669, 661, 662, 663, 664, 665, 666, 667, 660, 92, + 92, 670, 1140, 1141, 1142, 1601, 413, 648, 649, 647, + 792, 1409, 869, 363, 362, 365, 366, 367, 368, 1071, + 848, 849, 364, 369, 413, 650, 1541, 1590, 858, 1009, + 871, 773, 1541, 413, 864, 648, 649, 647, 94, 95, + 96, 1372, 934, 429, 430, 431, 861, 1466, 877, 1541, + 1569, 933, 59, 650, 94, 95, 96, 1237, 1250, 1035, + 935, 910, 94, 95, 96, 1014, 1017, 1018, 1019, 1015, + 843, 1016, 1020, 1036, 92, 1376, 1377, 850, 851, 852, + 1541, 1540, 1486, 1485, 1472, 413, 1469, 413, 1419, 1418, + 954, 957, 1415, 1416, 949, 870, 967, 891, 1036, 943, + 874, 875, 876, 70, 878, 879, 911, 92, 92, 1415, + 1414, 997, 413, 945, 944, 1009, 413, 884, 885, 30, + 1037, 1198, 1039, 646, 413, 92, 791, 790, 646, 1552, + 30, 698, 291, 1361, 1008, 92, 1372, 998, 1417, 291, + 1009, 291, 1251, 1043, 1205, 1037, 1179, 1035, 997, 291, + 291, 291, 1206, 1178, 946, 997, 1035, 92, 936, 937, + 92, 943, 406, 1521, 1009, 987, 859, 776, 1024, 1372, + 1607, 92, 92, 59, 1503, 945, 1003, 975, 976, 30, + 438, 1078, 1477, 438, 59, 1309, 997, 1098, 979, 1405, + 999, 1376, 1377, 1504, 1055, 1000, 1254, 1094, 991, 1089, + 1088, 1101, 1004, 1624, 1007, 1620, 1079, 1080, 1081, 1082, + 1085, 1086, 1087, 1407, 1032, 1379, 59, 1361, 1281, 892, + 1001, 863, 1090, 1091, 1092, 291, 92, 1382, 92, 1033, + 1120, 1042, 1038, 59, 291, 291, 291, 291, 291, 1041, + 291, 291, 1222, 1381, 291, 92, 1220, 1223, 1058, 1219, + 1218, 1221, 1099, 950, 951, 1611, 1604, 956, 959, 960, + 1353, 1224, 291, 1018, 1019, 1187, 744, 291, 413, 291, + 291, 1609, 1196, 291, 92, 1195, 1352, 1014, 1017, 1018, + 1019, 1015, 974, 1016, 1020, 977, 978, 1186, 1102, 1272, + 737, 962, 402, 789, 1095, 1096, 597, 1122, 1123, 1124, + 1125, 1126, 738, 1129, 1130, 963, 1459, 1131, 659, 658, + 668, 669, 661, 662, 663, 664, 665, 666, 667, 660, + 1135, 910, 670, 1264, 1584, 1133, 1583, 1519, 1262, 1256, + 1134, 93, 1464, 1499, 982, 292, 1138, 1104, 292, 862, + 1022, 407, 408, 93, 1103, 292, 1105, 659, 658, 668, + 669, 661, 662, 663, 664, 665, 666, 667, 660, 419, + 1194, 670, 410, 1132, 1463, 1143, 911, 411, 1193, 70, + 1462, 1356, 93, 420, 1198, 93, 292, 1185, 292, 291, + 627, 1167, 748, 749, 422, 1164, 421, 1626, 1625, 1191, + 291, 291, 291, 291, 291, 1212, 404, 1156, 886, 758, + 751, 406, 291, 1626, 1157, 1207, 291, 1566, 1492, 1172, + 291, 1203, 983, 419, 68, 291, 291, 73, 65, 291, + 291, 291, 1, 313, 1618, 1229, 1200, 420, 1428, 1500, + 1110, 1585, 1249, 1190, 92, 1534, 416, 417, 422, 1398, + 421, 1453, 1201, 1255, 1252, 1061, 1199, 1260, 1260, 1052, + 81, 565, 1214, 1215, 80, 1217, 1213, 1055, 869, 1216, + 1576, 1225, 1238, 881, 611, 1060, 1240, 1059, 1542, 1235, + 1266, 1236, 1075, 1490, 1406, 1241, 1263, 1261, 1581, 1239, + 797, 1244, 92, 92, 1269, 1270, 795, 796, 794, 799, + 798, 793, 306, 893, 1152, 1153, 323, 1271, 1021, 1273, + 1274, 1275, 1257, 1258, 785, 1100, 752, 84, 1302, 1301, + 1106, 1072, 92, 303, 621, 1170, 622, 308, 678, 1192, + 1278, 1284, 1245, 659, 658, 668, 669, 661, 662, 663, + 664, 665, 666, 667, 660, 439, 92, 670, 1300, 432, + 1367, 981, 933, 988, 740, 1461, 1355, 1171, 707, 964, + 767, 346, 1325, 903, 361, 1326, 358, 970, 359, 1324, + 992, 1204, 1315, 1316, 652, 344, 1345, 338, 766, 759, + 292, 1013, 1011, 291, 1338, 292, 1010, 772, 1378, 1317, + 1349, 292, 1374, 92, 1339, 765, 996, 292, 415, 92, + 92, 1362, 1212, 961, 945, 944, 1560, 1455, 93, 414, + 93, 1283, 1323, 52, 33, 328, 1324, 93, 635, 423, + 23, 22, 375, 29, 1365, 92, 21, 1371, 291, 93, + 93, 20, 19, 25, 18, 17, 16, 585, 37, 412, + 1314, 27, 92, 26, 92, 92, 1354, 1380, 1260, 1260, + 15, 14, 29, 1388, 1397, 1390, 13, 1391, 12, 11, + 10, 1387, 9, 1412, 5, 1055, 4, 1055, 1359, 638, + 24, 1458, 291, 1396, 696, 1389, 2, 1403, 1404, 0, + 0, 1401, 0, 0, 0, 0, 0, 0, 0, 0, + 405, 0, 291, 1410, 1411, 0, 0, 0, 92, 0, + 1429, 92, 92, 92, 291, 0, 0, 0, 0, 0, + 1421, 0, 659, 658, 668, 669, 661, 662, 663, 664, + 665, 666, 667, 660, 0, 1422, 670, 1424, 0, 93, + 0, 0, 292, 292, 292, 1420, 93, 0, 0, 0, + 0, 0, 93, 0, 1440, 1441, 0, 1442, 0, 0, + 1444, 0, 1446, 1443, 0, 1423, 0, 0, 1434, 1435, + 0, 0, 0, 0, 0, 0, 0, 1433, 0, 1212, + 0, 0, 0, 0, 0, 0, 0, 1473, 0, 0, + 0, 1465, 0, 0, 1474, 0, 0, 92, 0, 0, + 1438, 0, 0, 0, 1483, 0, 92, 1252, 0, 0, + 0, 0, 0, 0, 0, 0, 1484, 0, 0, 0, + 1055, 92, 0, 0, 0, 0, 1487, 0, 92, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1493, + 0, 1495, 1507, 0, 0, 0, 0, 0, 0, 0, + 0, 1502, 0, 0, 0, 0, 1505, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1506, 0, 0, 0, + 92, 92, 0, 92, 0, 0, 0, 0, 92, 292, + 92, 92, 92, 291, 93, 1520, 1518, 92, 1522, 292, + 292, 93, 93, 93, 1365, 0, 1532, 292, 0, 0, + 292, 1539, 1546, 292, 92, 291, 0, 292, 0, 93, + 0, 0, 0, 0, 93, 93, 93, 292, 93, 93, + 1527, 0, 1528, 1530, 1531, 0, 0, 1547, 0, 1548, + 1513, 93, 93, 0, 1567, 0, 0, 1575, 616, 1498, + 616, 0, 92, 1574, 1573, 0, 1554, 616, 1526, 1365, + 0, 0, 0, 92, 92, 0, 0, 1588, 1533, 0, + 0, 29, 0, 0, 1589, 0, 0, 0, 1555, 92, + 0, 0, 1595, 1212, 679, 681, 1502, 1055, 0, 0, + 291, 0, 0, 0, 0, 0, 0, 0, 92, 0, + 0, 0, 0, 1603, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1608, 0, 694, 93, 1610, 92, 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, 1634, 1623, 0, 0, 29, 93, + 93, 0, 0, 1598, 0, 0, 1452, 0, 0, 0, + 1612, 0, 0, 0, 0, 0, 0, 93, 0, 0, + 0, 0, 0, 768, 292, 0, 0, 93, 0, 0, + 0, 292, 0, 292, 0, 0, 372, 0, 0, 0, + 0, 292, 292, 292, 0, 0, 0, 0, 0, 93, + 0, 0, 93, 0, 30, 31, 32, 60, 34, 35, + 1451, 0, 0, 93, 93, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 64, 91, 0, 0, 0, 36, + 55, 56, 0, 58, 0, 0, 0, 325, 659, 658, + 668, 669, 661, 662, 663, 664, 665, 666, 667, 660, + 0, 0, 670, 0, 45, 0, 0, 0, 59, 0, + 0, 0, 0, 0, 0, 0, 440, 292, 93, 568, + 93, 0, 0, 0, 0, 0, 292, 292, 292, 292, + 292, 0, 292, 292, 0, 0, 292, 93, 0, 0, + 0, 0, 659, 658, 668, 669, 661, 662, 663, 664, + 665, 666, 667, 660, 292, 426, 670, 0, 0, 292, + 0, 292, 292, 0, 616, 292, 93, 0, 0, 0, + 0, 616, 616, 616, 38, 39, 41, 40, 43, 0, + 57, 0, 0, 0, 0, 0, 0, 0, 0, 616, + 0, 0, 0, 0, 616, 616, 616, 0, 616, 616, + 0, 0, 0, 44, 63, 62, 0, 0, 53, 54, + 42, 616, 616, 0, 337, 0, 94, 95, 96, 0, + 0, 0, 0, 0, 46, 47, 0, 48, 49, 50, + 51, 654, 0, 657, 947, 948, 0, 0, 0, 671, + 672, 673, 674, 675, 676, 677, 0, 655, 656, 653, + 659, 658, 668, 669, 661, 662, 663, 664, 665, 666, + 667, 660, 0, 0, 670, 0, 0, 0, 0, 0, + 295, 292, 980, 0, 0, 0, 0, 0, 0, 298, + 0, 0, 292, 292, 292, 292, 292, 307, 0, 0, + 0, 0, 0, 0, 292, 340, 0, 0, 292, 0, + 0, 0, 292, 0, 0, 0, 0, 292, 292, 1318, + 0, 292, 292, 292, 0, 0, 0, 61, 0, 0, + 0, 305, 0, 1450, 0, 0, 93, 312, 0, 659, + 658, 668, 669, 661, 662, 663, 664, 665, 666, 667, + 660, 0, 440, 670, 440, 0, 0, 0, 0, 0, + 0, 440, 0, 0, 0, 0, 0, 296, 0, 0, + 0, 1025, 0, 634, 636, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 93, 93, 0, 0, 0, 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, 93, 659, 658, 668, 669, 661, + 662, 663, 664, 665, 666, 667, 660, 0, 0, 670, + 0, 1149, 0, 0, 0, 0, 0, 0, 93, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 616, 0, + 616, 659, 658, 668, 669, 661, 662, 663, 664, 665, + 666, 667, 660, 0, 0, 670, 0, 616, 0, 0, + 0, 0, 0, 755, 0, 292, 0, 0, 0, 0, + 440, 0, 0, 1150, 0, 93, 786, 1151, 0, 0, + 0, 93, 93, 0, 0, 0, 0, 0, 1158, 1159, + 0, 0, 0, 0, 1165, 651, 0, 1168, 1169, 0, + 0, 0, 0, 0, 0, 1175, 0, 93, 0, 1177, + 292, 0, 1180, 1181, 1182, 1183, 1184, 0, 0, 0, + 0, 0, 0, 0, 93, 0, 93, 93, 0, 0, + 0, 337, 0, 0, 0, 0, 1154, 0, 0, 405, + 708, 659, 658, 668, 669, 661, 662, 663, 664, 665, + 666, 667, 660, 0, 292, 670, 0, 0, 0, 0, + 0, 1227, 1228, 0, 0, 0, 739, 742, 0, 0, + 0, 0, 0, 0, 292, 0, 0, 0, 0, 0, + 93, 0, 0, 93, 93, 93, 292, 0, 0, 0, + 0, 768, 0, 0, 0, 0, 0, 0, 1208, 1209, + 0, 0, 768, 768, 768, 768, 768, 0, 440, 0, + 0, 0, 0, 0, 0, 440, 440, 440, 1025, 0, + 1234, 0, 0, 0, 0, 0, 0, 768, 0, 0, + 0, 768, 0, 440, 0, 0, 0, 0, 440, 440, + 440, 0, 440, 440, 684, 685, 686, 687, 688, 689, + 690, 691, 692, 693, 0, 440, 440, 0, 0, 0, 0, 0, 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, 1222, 1223, 753, 0, 0, - 1150, 0, 0, 404, 439, 0, 0, 0, 0, 0, - 784, 0, 0, 0, 0, 0, 291, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 291, 0, 0, 0, - 0, 0, 93, 0, 0, 93, 93, 93, 291, 0, - 0, 0, 0, 766, 0, 0, 0, 0, 0, 0, - 1203, 1204, 0, 0, 766, 766, 766, 766, 766, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1021, 0, 1229, 0, 0, 0, 0, 0, 0, 766, - 0, 0, 0, 766, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1316, 1317, 0, 0, 0, 0, - 93, 0, 0, 0, 0, 0, 0, 0, 0, 93, - 0, 439, 0, 0, 0, 0, 0, 871, 439, 439, - 439, 0, 0, 0, 93, 0, 0, 614, 0, 0, - 0, 93, 0, 0, 0, 0, 439, 0, 0, 0, - 0, 439, 439, 439, 888, 439, 439, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 614, 0, 439, 439, - 0, 0, 0, 897, 898, 899, 900, 0, 0, 0, - 1377, 0, 93, 93, 0, 93, 0, 0, 0, 0, - 93, 0, 93, 93, 93, 291, 0, 0, 0, 93, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 93, 291, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 950, 951, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1360, 0, 29, 936, 0, 439, 0, 0, 0, 0, - 0, 0, 0, 0, 93, 0, 0, 0, 0, 966, - 0, 0, 0, 0, 0, 93, 93, 0, 0, 0, - 0, 766, 0, 0, 1431, 0, 970, 971, 1433, 0, - 0, 93, 0, 0, 0, 0, 0, 0, 0, 1442, - 1443, 0, 291, 0, 989, 0, 0, 0, 0, 0, - 93, 0, 0, 0, 753, 372, 0, 439, 0, 0, - 0, 1045, 0, 0, 0, 0, 1460, 1461, 0, 1464, - 93, 0, 0, 0, 0, 0, 439, 0, 0, 439, - 0, 0, 0, 0, 0, 0, 0, 1475, 0, 0, - 439, 566, 0, 0, 0, 0, 0, 0, 289, 0, - 0, 320, 0, 0, 0, 0, 0, 0, 289, 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, 1448, 0, - 426, 426, 0, 0, 0, 0, 0, 0, 0, 289, - 0, 289, 0, 0, 0, 439, 0, 439, 0, 0, + 1321, 1322, 0, 93, 0, 616, 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, 439, 0, 0, 1472, 1473, 1474, - 0, 0, 0, 0, 0, 0, 0, 0, 1522, 0, + 0, 0, 0, 0, 616, 0, 0, 0, 0, 0, + 938, 0, 440, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 93, 93, 0, 93, 968, 0, 0, 0, + 93, 0, 93, 93, 93, 292, 873, 0, 0, 93, + 0, 0, 0, 972, 973, 0, 0, 1383, 0, 0, + 0, 0, 0, 0, 0, 0, 93, 292, 0, 0, + 0, 993, 0, 890, 0, 0, 0, 0, 0, 0, + 0, 755, 0, 0, 440, 0, 0, 0, 0, 1366, + 0, 29, 899, 900, 901, 902, 0, 0, 0, 0, + 0, 0, 0, 440, 93, 0, 440, 0, 0, 0, + 0, 0, 0, 0, 0, 93, 93, 440, 568, 0, + 768, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 93, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 292, 0, 0, 0, 0, 952, 953, 0, + 93, 1437, 0, 0, 0, 1439, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1448, 1449, 0, 0, + 93, 0, 440, 0, 440, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1135, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 614, 812, 0, 0, 1549, 1550, 1551, - 1552, 0, 1556, 0, 1557, 1558, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1563, 0, 1564, - 1565, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1170, 0, 0, 0, 0, 1360, 0, - 29, 0, 0, 0, 0, 0, 0, 0, 0, 1584, - 1183, 1184, 740, 0, 0, 0, 0, 0, 0, 0, + 0, 440, 0, 0, 1467, 1468, 0, 1471, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1544, 0, 0, 1593, 0, 0, 0, 800, 0, + 0, 0, 0, 0, 0, 1482, 0, 0, 0, 0, + 1139, 0, 0, 0, 0, 0, 0, 1454, 0, 0, + 1049, 0, 0, 0, 0, 0, 0, 0, 908, 0, + 0, 917, 918, 919, 920, 921, 922, 923, 924, 925, + 926, 927, 928, 929, 930, 931, 373, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1479, 1480, 1481, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1360, 0, 0, 966, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1628, 1629, 0, 813, - 0, 0, 289, 0, 0, 0, 0, 289, 0, 0, - 0, 0, 0, 289, 0, 0, 0, 0, 0, 289, - 0, 439, 0, 0, 0, 826, 829, 830, 831, 832, - 833, 834, 0, 835, 836, 837, 838, 839, 814, 815, - 816, 817, 798, 799, 827, 0, 801, 0, 802, 803, - 804, 805, 806, 807, 808, 809, 810, 811, 818, 819, - 820, 821, 822, 823, 824, 825, 0, 0, 1614, 1277, - 439, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 971, 290, + 0, 0, 321, 616, 0, 0, 0, 1529, 0, 290, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 439, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1342, 0, - 0, 828, 0, 439, 0, 0, 0, 0, 0, 0, + 0, 427, 427, 0, 0, 968, 1556, 1557, 1558, 1559, + 290, 1563, 290, 1564, 1565, 0, 0, 0, 0, 1366, + 0, 29, 0, 0, 0, 0, 1570, 0, 1571, 1572, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 426, 0, 1351, 0, 439, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 289, 289, 773, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 439, - 0, 0, 966, 0, 0, 1362, 1364, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 440, 0, 1551, 0, 0, 0, 0, 0, 1591, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1364, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 439, 0, - 439, 1394, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1366, 0, 0, 0, 0, 0, + 0, 0, 1174, 1600, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1282, 440, + 0, 1188, 1189, 742, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1635, 1636, 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, 440, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1621, + 1144, 1145, 1146, 440, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1419, 0, 0, 1424, 1425, 1426, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 440, + 0, 0, 968, 0, 290, 1368, 1370, 0, 0, 290, + 0, 0, 0, 0, 0, 290, 0, 0, 0, 0, + 0, 290, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1370, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 440, 0, + 440, 1400, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 289, 0, 1451, 0, 0, 0, 0, 0, 0, 0, - 289, 289, 0, 0, 0, 0, 0, 0, 289, 336, - 0, 289, 0, 0, 289, 0, 1468, 0, 866, 1469, - 0, 0, 1471, 0, 0, 0, 0, 0, 289, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 966, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1347, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 439, 0, 0, 0, 0, 0, 0, 0, - 0, 1482, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 439, 0, 0, 0, - 0, 0, 0, 439, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1510, 336, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 426, 866, - 0, 0, 0, 426, 426, 0, 0, 426, 426, 426, - 0, 0, 0, 967, 1516, 1517, 0, 1518, 0, 0, - 0, 0, 1482, 0, 1482, 1482, 1482, 0, 0, 0, - 0, 1394, 426, 426, 426, 426, 426, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1482, 0, - 0, 0, 0, 0, 0, 289, 0, 0, 0, 0, - 0, 866, 289, 0, 289, 0, 0, 0, 0, 0, - 0, 0, 289, 1026, 289, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1573, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 439, 439, 0, + 0, 0, 0, 0, 1425, 0, 0, 1430, 1431, 1432, + 0, 0, 0, 0, 1357, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 966, 0, 1589, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1595, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 289, 0, - 0, 0, 1482, 0, 0, 0, 0, 289, 289, 289, - 289, 289, 0, 289, 289, 0, 0, 289, 0, 0, + 0, 0, 427, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 290, 290, 775, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 289, 0, 0, 0, 0, - 289, 0, 1132, 1133, 0, 0, 289, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 440, 0, 0, 0, 0, 0, 0, + 0, 0, 1489, 0, 1319, 1320, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 440, 0, 1340, + 1341, 0, 1342, 1343, 440, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1350, 1351, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1457, 0, 1523, 1524, 0, 1525, + 0, 0, 0, 0, 1489, 0, 1489, 1489, 1489, 0, + 0, 0, 337, 1400, 0, 0, 0, 0, 0, 1475, + 0, 0, 1476, 290, 0, 1478, 0, 0, 0, 0, + 1489, 0, 0, 290, 290, 0, 0, 0, 0, 0, + 0, 290, 0, 0, 290, 0, 0, 290, 0, 0, + 1408, 868, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 290, 0, 0, 0, 0, 0, 0, 1580, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 440, + 440, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 968, 0, 1596, 0, 0, 0, 0, + 0, 0, 0, 0, 1436, 0, 0, 0, 1517, 337, + 0, 0, 0, 0, 1602, 0, 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, 1489, 0, 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, 427, 868, 0, 0, 0, 427, 427, 0, 0, + 427, 427, 427, 0, 0, 0, 969, 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, 0, 426, - 289, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 967, 289, 289, 289, 289, 289, 0, 0, 0, 0, - 0, 0, 0, 1221, 0, 0, 0, 289, 0, 0, - 0, 1026, 0, 0, 0, 0, 289, 289, 0, 0, - 289, 1237, 866, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 290, 0, + 0, 0, 0, 0, 868, 290, 0, 290, 0, 0, + 0, 0, 0, 0, 0, 290, 1030, 290, 0, 0, + 0, 0, 0, 0, 0, 0, 1508, 1509, 1510, 1511, + 1512, 0, 0, 0, 1515, 1516, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, + 290, 290, 290, 290, 290, 0, 290, 290, 0, 0, + 290, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 290, 0, + 0, 0, 0, 290, 0, 1136, 1137, 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, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 427, 427, 0, + 0, 0, 0, 0, 0, 0, 0, 1627, 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, 426, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 866, 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, 967, 0, 0, 0, + 0, 0, 0, 0, 427, 290, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 969, 290, 290, 290, 290, + 290, 0, 0, 0, 0, 0, 0, 0, 1226, 0, + 0, 0, 290, 0, 0, 0, 1030, 0, 0, 0, + 0, 290, 290, 0, 0, 290, 1242, 868, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 967, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 868, 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, 0, 969, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, - 0, 0, 0, 0, 0, 549, 537, 0, 0, 494, - 552, 467, 484, 560, 485, 488, 525, 452, 507, 184, - 482, 1026, 471, 447, 478, 448, 469, 496, 126, 500, - 466, 539, 510, 551, 155, 0, 472, 558, 158, 516, - 0, 231, 172, 289, 0, 0, 498, 541, 505, 534, - 493, 526, 457, 515, 553, 483, 523, 554, 0, 0, - 0, 94, 95, 96, 0, 1052, 1053, 0, 0, 0, - 0, 0, 116, 0, 520, 548, 480, 522, 524, 562, - 446, 517, 0, 450, 453, 559, 544, 475, 476, 1248, - 0, 0, 0, 0, 0, 0, 497, 506, 531, 491, - 0, 0, 0, 0, 0, 967, 0, 0, 473, 0, - 514, 0, 0, 0, 454, 451, 0, 0, 289, 0, - 495, 0, 0, 0, 456, 0, 474, 532, 0, 444, - 135, 536, 543, 492, 292, 547, 490, 489, 550, 203, - 0, 235, 139, 154, 112, 151, 98, 108, 0, 137, - 181, 211, 215, 540, 470, 479, 120, 477, 213, 191, - 252, 513, 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, 449, 0, 232, 255, 274, 114, - 465, 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, 461, 464, - 459, 460, 508, 509, 555, 556, 557, 533, 455, 0, - 462, 463, 0, 538, 545, 546, 512, 97, 106, 157, - 271, 206, 131, 256, 445, 458, 124, 468, 0, 0, - 481, 486, 487, 499, 501, 502, 503, 504, 511, 518, - 519, 521, 527, 528, 529, 530, 535, 542, 561, 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, 549, 537, - 0, 0, 494, 552, 467, 484, 560, 485, 488, 525, - 452, 507, 184, 482, 0, 471, 447, 478, 448, 469, - 496, 126, 500, 466, 539, 510, 551, 155, 0, 472, - 558, 158, 516, 0, 231, 172, 0, 0, 0, 498, - 541, 505, 534, 493, 526, 457, 515, 553, 483, 523, - 554, 0, 0, 0, 94, 95, 96, 0, 1052, 1053, - 0, 0, 0, 0, 0, 116, 0, 520, 548, 480, - 522, 524, 562, 446, 517, 0, 450, 453, 559, 544, - 475, 476, 0, 0, 0, 0, 0, 0, 0, 497, - 506, 531, 491, 0, 0, 0, 0, 0, 0, 0, - 0, 473, 0, 514, 0, 0, 0, 454, 451, 0, - 0, 0, 0, 495, 0, 0, 0, 456, 0, 474, - 532, 0, 444, 135, 536, 543, 492, 292, 547, 490, - 489, 550, 203, 0, 235, 139, 154, 112, 151, 98, - 108, 0, 137, 181, 211, 215, 540, 470, 479, 120, - 477, 213, 191, 252, 513, 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, 449, 0, 232, - 255, 274, 114, 465, 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, 461, 464, 459, 460, 508, 509, 555, 556, 557, - 533, 455, 0, 462, 463, 0, 538, 545, 546, 512, - 97, 106, 157, 271, 206, 131, 256, 445, 458, 124, - 468, 0, 0, 481, 486, 487, 499, 501, 502, 503, - 504, 511, 518, 519, 521, 527, 528, 529, 530, 535, - 542, 561, 99, 100, 107, 113, 119, 123, 127, 130, + 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, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 969, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1030, + 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, 551, 539, 0, 0, + 495, 554, 468, 485, 562, 486, 489, 526, 453, 508, + 184, 483, 0, 472, 448, 479, 449, 470, 497, 126, + 501, 467, 541, 511, 553, 155, 0, 473, 528, 224, + 560, 158, 517, 0, 232, 172, 0, 0, 0, 499, + 543, 506, 536, 494, 527, 458, 516, 555, 484, 524, + 556, 0, 0, 969, 94, 95, 96, 0, 1056, 1057, + 0, 0, 0, 0, 0, 116, 290, 521, 550, 481, + 523, 525, 564, 447, 518, 0, 451, 454, 561, 546, + 476, 477, 1253, 0, 0, 0, 0, 0, 0, 498, + 507, 533, 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, + 534, 0, 445, 135, 538, 545, 493, 293, 549, 491, + 490, 552, 203, 0, 236, 139, 154, 112, 151, 98, + 108, 0, 137, 181, 211, 215, 542, 471, 480, 120, + 478, 213, 191, 253, 514, 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, 450, 0, 233, + 256, 275, 114, 466, 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, 462, 465, 460, 461, 509, 510, 557, 558, 559, + 535, 456, 0, 463, 464, 0, 540, 547, 548, 513, + 97, 106, 157, 272, 206, 131, 257, 446, 459, 124, + 469, 0, 0, 482, 487, 488, 500, 502, 503, 504, + 505, 512, 519, 520, 522, 529, 530, 531, 532, 537, + 544, 563, 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, 549, 537, 0, 0, 494, 552, 467, 484, 560, - 485, 488, 525, 452, 507, 184, 482, 0, 471, 447, - 478, 448, 469, 496, 126, 500, 466, 539, 510, 551, - 155, 0, 472, 558, 158, 516, 0, 231, 172, 0, - 0, 0, 498, 541, 505, 534, 493, 526, 457, 515, - 553, 483, 523, 554, 59, 0, 0, 94, 95, 96, - 0, 0, 0, 0, 0, 0, 0, 0, 116, 0, - 520, 548, 480, 522, 524, 562, 446, 517, 0, 450, - 453, 559, 544, 475, 476, 0, 0, 0, 0, 0, - 0, 0, 497, 506, 531, 491, 0, 0, 0, 0, - 0, 0, 0, 0, 473, 0, 514, 0, 0, 0, - 454, 451, 0, 0, 0, 0, 495, 0, 0, 0, - 456, 0, 474, 532, 0, 444, 135, 536, 543, 492, - 292, 547, 490, 489, 550, 203, 0, 235, 139, 154, - 112, 151, 98, 108, 0, 137, 181, 211, 215, 540, - 470, 479, 120, 477, 213, 191, 252, 513, 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, - 449, 0, 232, 255, 274, 114, 465, 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, 461, 464, 459, 460, 508, 509, - 555, 556, 557, 533, 455, 0, 462, 463, 0, 538, - 545, 546, 512, 97, 106, 157, 271, 206, 131, 256, - 445, 458, 124, 468, 0, 0, 481, 486, 487, 499, - 501, 502, 503, 504, 511, 518, 519, 521, 527, 528, - 529, 530, 535, 542, 561, 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, 549, 537, 0, 0, 494, 552, - 467, 484, 560, 485, 488, 525, 452, 507, 184, 482, - 0, 471, 447, 478, 448, 469, 496, 126, 500, 466, - 539, 510, 551, 155, 0, 472, 558, 158, 516, 0, - 231, 172, 0, 0, 0, 498, 541, 505, 534, 493, - 526, 457, 515, 553, 483, 523, 554, 0, 0, 0, - 94, 95, 96, 0, 0, 0, 0, 0, 0, 0, - 0, 116, 0, 520, 548, 480, 522, 524, 562, 446, - 517, 0, 450, 453, 559, 544, 475, 476, 0, 0, - 0, 0, 0, 0, 0, 497, 506, 531, 491, 0, - 0, 0, 0, 0, 0, 1352, 0, 473, 0, 514, - 0, 0, 0, 454, 451, 0, 0, 0, 0, 495, - 0, 0, 0, 456, 0, 474, 532, 0, 444, 135, - 536, 543, 492, 292, 547, 490, 489, 550, 203, 0, - 235, 139, 154, 112, 151, 98, 108, 0, 137, 181, - 211, 215, 540, 470, 479, 120, 477, 213, 191, 252, - 513, 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, 449, 0, 232, 255, 274, 114, 465, - 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, 461, 464, 459, - 460, 508, 509, 555, 556, 557, 533, 455, 0, 462, - 463, 0, 538, 545, 546, 512, 97, 106, 157, 271, - 206, 131, 256, 445, 458, 124, 468, 0, 0, 481, - 486, 487, 499, 501, 502, 503, 504, 511, 518, 519, - 521, 527, 528, 529, 530, 535, 542, 561, 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, 549, 537, 0, - 0, 494, 552, 467, 484, 560, 485, 488, 525, 452, - 507, 184, 482, 0, 471, 447, 478, 448, 469, 496, - 126, 500, 466, 539, 510, 551, 155, 0, 472, 558, - 158, 516, 0, 231, 172, 0, 0, 0, 498, 541, - 505, 534, 493, 526, 457, 515, 553, 483, 523, 554, - 0, 0, 0, 94, 95, 96, 0, 0, 0, 0, - 0, 0, 0, 0, 116, 0, 520, 548, 480, 522, - 524, 562, 446, 517, 0, 450, 453, 559, 544, 475, - 476, 0, 0, 0, 0, 0, 0, 0, 497, 506, - 531, 491, 0, 0, 0, 0, 0, 0, 1238, 0, - 473, 0, 514, 0, 0, 0, 454, 451, 0, 0, - 0, 0, 495, 0, 0, 0, 456, 0, 474, 532, - 0, 444, 135, 536, 543, 492, 292, 547, 490, 489, - 550, 203, 0, 235, 139, 154, 112, 151, 98, 108, - 0, 137, 181, 211, 215, 540, 470, 479, 120, 477, - 213, 191, 252, 513, 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, 449, 0, 232, 255, - 274, 114, 465, 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, - 461, 464, 459, 460, 508, 509, 555, 556, 557, 533, - 455, 0, 462, 463, 0, 538, 545, 546, 512, 97, - 106, 157, 271, 206, 131, 256, 445, 458, 124, 468, - 0, 0, 481, 486, 487, 499, 501, 502, 503, 504, - 511, 518, 519, 521, 527, 528, 529, 530, 535, 542, - 561, 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, - 549, 537, 0, 0, 494, 552, 467, 484, 560, 485, - 488, 525, 452, 507, 184, 482, 0, 471, 447, 478, - 448, 469, 496, 126, 500, 466, 539, 510, 551, 155, - 0, 472, 558, 158, 516, 0, 231, 172, 0, 0, - 0, 498, 541, 505, 534, 493, 526, 457, 515, 553, - 483, 523, 554, 0, 0, 0, 94, 95, 96, 0, - 0, 0, 0, 0, 0, 0, 0, 116, 0, 520, - 548, 480, 522, 524, 562, 446, 517, 0, 450, 453, - 559, 544, 475, 476, 0, 0, 0, 0, 0, 0, - 0, 497, 506, 531, 491, 0, 0, 0, 0, 0, - 0, 998, 0, 473, 0, 514, 0, 0, 0, 454, - 451, 0, 0, 0, 0, 495, 0, 0, 0, 456, - 0, 474, 532, 0, 444, 135, 536, 543, 492, 292, - 547, 490, 489, 550, 203, 0, 235, 139, 154, 112, - 151, 98, 108, 0, 137, 181, 211, 215, 540, 470, - 479, 120, 477, 213, 191, 252, 513, 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, 449, - 0, 232, 255, 274, 114, 465, 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, 461, 464, 459, 460, 508, 509, 555, - 556, 557, 533, 455, 0, 462, 463, 0, 538, 545, - 546, 512, 97, 106, 157, 271, 206, 131, 256, 445, - 458, 124, 468, 0, 0, 481, 486, 487, 499, 501, - 502, 503, 504, 511, 518, 519, 521, 527, 528, 529, - 530, 535, 542, 561, 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, 549, 537, 0, 0, 494, 552, 467, - 484, 560, 485, 488, 525, 452, 507, 184, 482, 0, - 471, 447, 478, 448, 469, 496, 126, 500, 466, 539, - 510, 551, 155, 0, 472, 558, 158, 516, 0, 231, - 172, 0, 0, 0, 498, 541, 505, 534, 493, 526, - 457, 515, 553, 483, 523, 554, 0, 0, 0, 94, + 216, 217, 218, 219, 220, 221, 222, 225, 226, 227, + 228, 234, 237, 243, 244, 254, 261, 264, 138, 251, + 265, 551, 539, 0, 0, 495, 554, 468, 485, 562, + 486, 489, 526, 453, 508, 184, 483, 0, 472, 448, + 479, 449, 470, 497, 126, 501, 467, 541, 511, 553, + 155, 0, 473, 528, 224, 560, 158, 517, 0, 232, + 172, 0, 0, 0, 499, 543, 506, 536, 494, 527, + 458, 516, 555, 484, 524, 556, 0, 0, 0, 94, + 95, 96, 0, 1056, 1057, 0, 0, 0, 0, 0, + 116, 0, 521, 550, 481, 523, 525, 564, 447, 518, + 0, 451, 454, 561, 546, 476, 477, 0, 0, 0, + 0, 0, 0, 0, 498, 507, 533, 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, 534, 0, 445, 135, 538, + 545, 493, 293, 549, 491, 490, 552, 203, 0, 236, + 139, 154, 112, 151, 98, 108, 0, 137, 181, 211, + 215, 542, 471, 480, 120, 478, 213, 191, 253, 514, + 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, 450, 0, 233, 256, 275, 114, 466, 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, 462, 465, 460, 461, + 509, 510, 557, 558, 559, 535, 456, 0, 463, 464, + 0, 540, 547, 548, 513, 97, 106, 157, 272, 206, + 131, 257, 446, 459, 124, 469, 0, 0, 482, 487, + 488, 500, 502, 503, 504, 505, 512, 519, 520, 522, + 529, 530, 531, 532, 537, 544, 563, 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, 551, 539, 0, 0, + 495, 554, 468, 485, 562, 486, 489, 526, 453, 508, + 184, 483, 0, 472, 448, 479, 449, 470, 497, 126, + 501, 467, 541, 511, 553, 155, 0, 473, 528, 224, + 560, 158, 517, 0, 232, 172, 0, 0, 0, 499, + 543, 506, 536, 494, 527, 458, 516, 555, 484, 524, + 556, 59, 0, 0, 94, 95, 96, 0, 0, 0, + 0, 0, 0, 0, 0, 116, 0, 521, 550, 481, + 523, 525, 564, 447, 518, 0, 451, 454, 561, 546, + 476, 477, 0, 0, 0, 0, 0, 0, 0, 498, + 507, 533, 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, + 534, 0, 445, 135, 538, 545, 493, 293, 549, 491, + 490, 552, 203, 0, 236, 139, 154, 112, 151, 98, + 108, 0, 137, 181, 211, 215, 542, 471, 480, 120, + 478, 213, 191, 253, 514, 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, 450, 0, 233, + 256, 275, 114, 466, 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, 462, 465, 460, 461, 509, 510, 557, 558, 559, + 535, 456, 0, 463, 464, 0, 540, 547, 548, 513, + 97, 106, 157, 272, 206, 131, 257, 446, 459, 124, + 469, 0, 0, 482, 487, 488, 500, 502, 503, 504, + 505, 512, 519, 520, 522, 529, 530, 531, 532, 537, + 544, 563, 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, 551, 539, 0, 0, 495, 554, 468, 485, 562, + 486, 489, 526, 453, 508, 184, 483, 0, 472, 448, + 479, 449, 470, 497, 126, 501, 467, 541, 511, 553, + 155, 0, 473, 528, 224, 560, 158, 517, 0, 232, + 172, 0, 0, 0, 499, 543, 506, 536, 494, 527, + 458, 516, 555, 484, 524, 556, 0, 0, 0, 94, 95, 96, 0, 0, 0, 0, 0, 0, 0, 0, - 116, 0, 520, 548, 480, 522, 524, 562, 446, 517, - 0, 450, 453, 559, 544, 475, 476, 0, 0, 0, - 0, 0, 0, 0, 497, 506, 531, 491, 0, 0, - 0, 0, 0, 0, 0, 0, 473, 0, 514, 0, - 0, 0, 454, 451, 0, 0, 0, 0, 495, 0, - 0, 0, 456, 0, 474, 532, 0, 444, 135, 536, - 543, 492, 292, 547, 490, 489, 550, 203, 0, 235, + 116, 0, 521, 550, 481, 523, 525, 564, 447, 518, + 0, 451, 454, 561, 546, 476, 477, 0, 0, 0, + 0, 0, 0, 0, 498, 507, 533, 492, 0, 0, + 0, 0, 0, 0, 1358, 0, 474, 0, 515, 0, + 0, 0, 455, 452, 0, 0, 0, 0, 496, 0, + 0, 0, 457, 0, 475, 534, 0, 445, 135, 538, + 545, 493, 293, 549, 491, 490, 552, 203, 0, 236, 139, 154, 112, 151, 98, 108, 0, 137, 181, 211, - 215, 540, 470, 479, 120, 477, 213, 191, 252, 513, - 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, + 215, 542, 471, 480, 120, 478, 213, 191, 253, 514, + 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, 449, 0, 232, 255, 274, 114, 465, 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, 461, 464, 459, 460, - 508, 509, 555, 556, 557, 533, 455, 0, 462, 463, - 0, 538, 545, 546, 512, 97, 106, 157, 271, 206, - 131, 256, 445, 458, 124, 468, 0, 0, 481, 486, - 487, 499, 501, 502, 503, 504, 511, 518, 519, 521, - 527, 528, 529, 530, 535, 542, 561, 99, 100, 107, + 175, 0, 450, 0, 233, 256, 275, 114, 466, 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, 462, 465, 460, 461, + 509, 510, 557, 558, 559, 535, 456, 0, 463, 464, + 0, 540, 547, 548, 513, 97, 106, 157, 272, 206, + 131, 257, 446, 459, 124, 469, 0, 0, 482, 487, + 488, 500, 502, 503, 504, 505, 512, 519, 520, 522, + 529, 530, 531, 532, 537, 544, 563, 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, 549, 537, 0, 0, - 494, 552, 467, 484, 560, 485, 488, 525, 452, 507, - 184, 482, 0, 471, 447, 478, 448, 469, 496, 126, - 500, 466, 539, 510, 551, 155, 0, 472, 558, 158, - 516, 0, 231, 172, 0, 0, 0, 498, 541, 505, - 534, 493, 526, 457, 515, 553, 483, 523, 554, 0, - 0, 0, 94, 95, 96, 0, 0, 0, 0, 0, - 0, 0, 0, 116, 0, 520, 548, 480, 522, 524, - 562, 446, 517, 0, 450, 453, 559, 544, 475, 476, - 0, 0, 0, 0, 0, 0, 0, 497, 506, 531, - 491, 0, 0, 0, 0, 0, 0, 0, 0, 473, - 0, 514, 0, 0, 0, 454, 451, 0, 0, 0, - 0, 495, 0, 0, 0, 456, 0, 474, 532, 0, - 444, 135, 536, 543, 492, 292, 547, 490, 489, 550, - 203, 0, 235, 139, 154, 112, 151, 98, 108, 0, - 137, 181, 211, 215, 540, 470, 479, 120, 477, 213, - 191, 252, 513, 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, 442, 257, 177, 240, 248, 171, 164, - 104, 246, 169, 163, 153, 129, 141, 201, 161, 202, - 142, 174, 173, 175, 0, 449, 0, 232, 255, 274, - 114, 465, 239, 266, 269, 0, 205, 115, 134, 128, - 200, 132, 156, 265, 267, 268, 443, 441, 436, 435, - 152, 160, 208, 272, 190, 214, 118, 254, 230, 461, - 464, 459, 460, 508, 509, 555, 556, 557, 533, 455, - 0, 462, 463, 0, 538, 545, 546, 512, 97, 106, - 157, 271, 206, 131, 256, 445, 458, 124, 468, 0, - 0, 481, 486, 487, 499, 501, 502, 503, 504, 511, - 518, 519, 521, 527, 528, 529, 530, 535, 542, 561, - 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, 549, - 537, 0, 0, 494, 552, 467, 484, 560, 485, 488, - 525, 452, 507, 184, 482, 0, 471, 447, 478, 448, - 469, 496, 126, 500, 466, 539, 510, 551, 155, 0, - 472, 558, 158, 516, 0, 231, 172, 0, 0, 0, - 498, 541, 505, 534, 493, 526, 457, 515, 553, 483, - 523, 554, 0, 0, 0, 94, 95, 96, 0, 0, - 0, 0, 0, 0, 0, 0, 116, 0, 520, 548, - 480, 522, 524, 562, 446, 517, 0, 450, 453, 559, - 544, 475, 476, 0, 0, 0, 0, 0, 0, 0, - 497, 506, 531, 491, 0, 0, 0, 0, 0, 0, - 0, 0, 473, 0, 514, 0, 0, 0, 454, 451, - 0, 0, 0, 0, 495, 0, 0, 0, 456, 0, - 474, 532, 0, 444, 135, 536, 543, 492, 292, 547, - 490, 489, 550, 203, 0, 235, 139, 154, 112, 151, - 98, 108, 0, 137, 181, 211, 215, 540, 470, 479, - 120, 477, 213, 191, 252, 513, 193, 212, 159, 241, - 204, 251, 261, 262, 238, 259, 270, 228, 101, 237, - 775, 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, 442, 257, 177, 240, - 248, 171, 164, 104, 246, 169, 163, 153, 129, 141, - 201, 161, 202, 142, 174, 173, 175, 0, 449, 0, - 232, 255, 274, 114, 465, 239, 266, 269, 0, 205, - 115, 134, 128, 200, 132, 156, 265, 267, 268, 443, - 441, 436, 435, 152, 160, 208, 272, 190, 214, 118, - 254, 230, 461, 464, 459, 460, 508, 509, 555, 556, - 557, 533, 455, 0, 462, 463, 0, 538, 545, 546, - 512, 97, 106, 157, 271, 206, 131, 256, 445, 458, - 124, 468, 0, 0, 481, 486, 487, 499, 501, 502, - 503, 504, 511, 518, 519, 521, 527, 528, 529, 530, - 535, 542, 561, 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, 549, 537, 0, 0, 494, 552, 467, 484, - 560, 485, 488, 525, 452, 507, 184, 482, 0, 471, - 447, 478, 448, 469, 496, 126, 500, 466, 539, 510, - 551, 155, 0, 472, 558, 158, 516, 0, 231, 172, - 0, 0, 0, 498, 541, 505, 534, 493, 526, 457, - 515, 553, 483, 523, 554, 0, 0, 0, 94, 95, - 96, 0, 0, 0, 0, 0, 0, 0, 0, 116, - 0, 520, 548, 480, 522, 524, 562, 446, 517, 0, - 450, 453, 559, 544, 475, 476, 0, 0, 0, 0, - 0, 0, 0, 497, 506, 531, 491, 0, 0, 0, - 0, 0, 0, 0, 0, 473, 0, 514, 0, 0, - 0, 454, 451, 0, 0, 0, 0, 495, 0, 0, - 0, 456, 0, 474, 532, 0, 444, 135, 536, 543, - 492, 292, 547, 490, 489, 550, 203, 0, 235, 139, - 154, 112, 151, 98, 108, 0, 137, 181, 211, 215, - 540, 470, 479, 120, 477, 213, 191, 252, 513, 193, - 212, 159, 241, 204, 251, 261, 262, 238, 259, 270, - 228, 101, 237, 433, 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, 442, - 257, 177, 240, 248, 171, 164, 104, 246, 169, 163, - 153, 129, 141, 201, 161, 202, 142, 174, 173, 175, - 0, 449, 0, 232, 255, 274, 114, 465, 239, 266, - 269, 0, 205, 115, 134, 128, 200, 132, 156, 265, - 267, 268, 443, 441, 436, 435, 152, 160, 208, 272, - 190, 214, 118, 254, 230, 461, 464, 459, 460, 508, - 509, 555, 556, 557, 533, 455, 0, 462, 463, 0, - 538, 545, 546, 512, 97, 106, 157, 271, 206, 131, - 256, 445, 458, 124, 468, 0, 0, 481, 486, 487, - 499, 501, 502, 503, 504, 511, 518, 519, 521, 527, - 528, 529, 530, 535, 542, 561, 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, 938, 0, - 341, 0, 0, 0, 126, 0, 340, 0, 0, 0, - 155, 0, 939, 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, 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, 1043, 0, 59, 0, 0, 94, 95, 96, 362, - 361, 364, 365, 366, 367, 0, 0, 116, 363, 368, - 369, 370, 1044, 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, 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, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 99, 100, 107, 113, 119, 123, 127, 130, + 221, 222, 225, 226, 227, 228, 234, 237, 243, 244, + 254, 261, 264, 138, 251, 265, 551, 539, 0, 0, + 495, 554, 468, 485, 562, 486, 489, 526, 453, 508, + 184, 483, 0, 472, 448, 479, 449, 470, 497, 126, + 501, 467, 541, 511, 553, 155, 0, 473, 528, 224, + 560, 158, 517, 0, 232, 172, 0, 0, 0, 499, + 543, 506, 536, 494, 527, 458, 516, 555, 484, 524, + 556, 0, 0, 0, 94, 95, 96, 0, 0, 0, + 0, 0, 0, 0, 0, 116, 0, 521, 550, 481, + 523, 525, 564, 447, 518, 0, 451, 454, 561, 546, + 476, 477, 0, 0, 0, 0, 0, 0, 0, 498, + 507, 533, 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, + 534, 0, 445, 135, 538, 545, 493, 293, 549, 491, + 490, 552, 203, 0, 236, 139, 154, 112, 151, 98, + 108, 0, 137, 181, 211, 215, 542, 471, 480, 120, + 478, 213, 191, 253, 514, 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, 450, 0, 233, + 256, 275, 114, 466, 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, 462, 465, 460, 461, 509, 510, 557, 558, 559, + 535, 456, 0, 463, 464, 0, 540, 547, 548, 513, + 97, 106, 157, 272, 206, 131, 257, 446, 459, 124, + 469, 0, 0, 482, 487, 488, 500, 502, 503, 504, + 505, 512, 519, 520, 522, 529, 530, 531, 532, 537, + 544, 563, 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, 956, 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, + 216, 217, 218, 219, 220, 221, 222, 225, 226, 227, + 228, 234, 237, 243, 244, 254, 261, 264, 138, 251, + 265, 551, 539, 0, 0, 495, 554, 468, 485, 562, + 486, 489, 526, 453, 508, 184, 483, 0, 472, 448, + 479, 449, 470, 497, 126, 501, 467, 541, 511, 553, + 155, 0, 473, 528, 224, 560, 158, 517, 0, 232, + 172, 0, 0, 0, 499, 543, 506, 536, 494, 527, + 458, 516, 555, 484, 524, 556, 0, 0, 0, 94, + 95, 96, 0, 0, 0, 0, 0, 0, 0, 0, + 116, 0, 521, 550, 481, 523, 525, 564, 447, 518, + 0, 451, 454, 561, 546, 476, 477, 0, 0, 0, + 0, 0, 0, 0, 498, 507, 533, 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, 534, 0, 445, 135, 538, + 545, 493, 293, 549, 491, 490, 552, 203, 0, 236, + 139, 154, 112, 151, 98, 108, 0, 137, 181, 211, + 215, 542, 471, 480, 120, 478, 213, 191, 253, 514, + 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, 450, 0, 233, 256, 275, 114, 466, 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, 462, 465, 460, 461, + 509, 510, 557, 558, 559, 535, 456, 0, 463, 464, + 0, 540, 547, 548, 513, 97, 106, 157, 272, 206, + 131, 257, 446, 459, 124, 469, 0, 0, 482, 487, + 488, 500, 502, 503, 504, 505, 512, 519, 520, 522, + 529, 530, 531, 532, 537, 544, 563, 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, 551, 539, 0, 0, + 495, 554, 468, 485, 562, 486, 489, 526, 453, 508, + 184, 483, 0, 472, 448, 479, 449, 470, 497, 126, + 501, 467, 541, 511, 553, 155, 0, 473, 528, 224, + 560, 158, 517, 0, 232, 172, 0, 0, 0, 499, + 543, 506, 536, 494, 527, 458, 516, 555, 484, 524, + 556, 0, 0, 0, 94, 95, 96, 0, 0, 0, + 0, 0, 0, 0, 0, 116, 0, 521, 550, 481, + 523, 525, 564, 447, 518, 0, 451, 454, 561, 546, + 476, 477, 0, 0, 0, 0, 0, 0, 0, 498, + 507, 533, 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, + 534, 0, 445, 135, 538, 545, 493, 293, 549, 491, + 490, 552, 203, 0, 236, 139, 154, 112, 151, 98, + 108, 0, 137, 181, 211, 215, 542, 471, 480, 120, + 478, 213, 191, 253, 514, 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, 450, 0, 233, + 256, 275, 114, 466, 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, 462, 465, 460, 461, 509, 510, 557, 558, 559, + 535, 456, 0, 463, 464, 0, 540, 547, 548, 513, + 97, 106, 157, 272, 206, 131, 257, 446, 459, 124, + 469, 0, 0, 482, 487, 488, 500, 502, 503, 504, + 505, 512, 519, 520, 522, 529, 530, 531, 532, 537, + 544, 563, 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, 551, 539, 0, 0, 495, 554, 468, 485, 562, + 486, 489, 526, 453, 508, 184, 483, 0, 472, 448, + 479, 449, 470, 497, 126, 501, 467, 541, 511, 553, + 155, 0, 473, 528, 224, 560, 158, 517, 0, 232, + 172, 0, 0, 0, 499, 543, 506, 536, 494, 527, + 458, 516, 555, 484, 524, 556, 0, 0, 0, 94, + 95, 96, 0, 0, 0, 0, 0, 0, 0, 0, + 116, 0, 521, 550, 481, 523, 525, 564, 447, 518, + 0, 451, 454, 561, 546, 476, 477, 0, 0, 0, + 0, 0, 0, 0, 498, 507, 533, 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, 534, 0, 445, 135, 538, + 545, 493, 293, 549, 491, 490, 552, 203, 0, 236, + 139, 154, 112, 151, 98, 108, 0, 137, 181, 211, + 215, 542, 471, 480, 120, 478, 213, 191, 253, 514, + 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, + 443, 258, 177, 241, 249, 171, 164, 104, 247, 169, + 163, 153, 129, 141, 201, 161, 202, 142, 174, 173, + 175, 0, 450, 0, 233, 256, 275, 114, 466, 240, + 267, 270, 0, 205, 115, 134, 128, 200, 132, 156, + 266, 268, 269, 444, 442, 437, 436, 152, 160, 208, + 273, 190, 214, 118, 255, 231, 462, 465, 460, 461, + 509, 510, 557, 558, 559, 535, 456, 0, 463, 464, + 0, 540, 547, 548, 513, 97, 106, 157, 272, 206, + 131, 257, 446, 459, 124, 469, 0, 0, 482, 487, + 488, 500, 502, 503, 504, 505, 512, 519, 520, 522, + 529, 530, 531, 532, 537, 544, 563, 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, 551, 539, 0, 0, + 495, 554, 468, 485, 562, 486, 489, 526, 453, 508, + 184, 483, 0, 472, 448, 479, 449, 470, 497, 126, + 501, 467, 541, 511, 553, 155, 0, 473, 528, 224, + 560, 158, 517, 0, 232, 172, 0, 0, 0, 499, + 543, 506, 536, 494, 527, 458, 516, 555, 484, 524, + 556, 0, 0, 0, 94, 95, 96, 0, 0, 0, + 0, 0, 0, 0, 0, 116, 0, 521, 550, 481, + 523, 525, 564, 447, 518, 0, 451, 454, 561, 546, + 476, 477, 0, 0, 0, 0, 0, 0, 0, 498, + 507, 533, 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, + 534, 0, 445, 135, 538, 545, 493, 293, 549, 491, + 490, 552, 203, 0, 236, 139, 154, 112, 151, 98, + 108, 0, 137, 181, 211, 215, 542, 471, 480, 120, + 478, 213, 191, 253, 514, 193, 212, 159, 242, 204, + 252, 262, 263, 239, 260, 271, 229, 101, 238, 777, + 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, 443, 258, 177, 241, 249, + 171, 164, 104, 247, 169, 163, 153, 129, 141, 201, + 161, 202, 142, 174, 173, 175, 0, 450, 0, 233, + 256, 275, 114, 466, 240, 267, 270, 0, 205, 115, + 134, 128, 200, 132, 156, 266, 268, 269, 444, 442, + 437, 436, 152, 160, 208, 273, 190, 214, 118, 255, + 231, 462, 465, 460, 461, 509, 510, 557, 558, 559, + 535, 456, 0, 463, 464, 0, 540, 547, 548, 513, + 97, 106, 157, 272, 206, 131, 257, 446, 459, 124, + 469, 0, 0, 482, 487, 488, 500, 502, 503, 504, + 505, 512, 519, 520, 522, 529, 530, 531, 532, 537, + 544, 563, 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, 551, 539, 0, 0, 495, 554, 468, 485, 562, + 486, 489, 526, 453, 508, 184, 483, 0, 472, 448, + 479, 449, 470, 497, 126, 501, 467, 541, 511, 553, + 155, 0, 473, 528, 224, 560, 158, 517, 0, 232, + 172, 0, 0, 0, 499, 543, 506, 536, 494, 527, + 458, 516, 555, 484, 524, 556, 0, 0, 0, 94, + 95, 96, 0, 0, 0, 0, 0, 0, 0, 0, + 116, 0, 521, 550, 481, 523, 525, 564, 447, 518, + 0, 451, 454, 561, 546, 476, 477, 0, 0, 0, + 0, 0, 0, 0, 498, 507, 533, 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, 534, 0, 445, 135, 538, + 545, 493, 293, 549, 491, 490, 552, 203, 0, 236, + 139, 154, 112, 151, 98, 108, 0, 137, 181, 211, + 215, 542, 471, 480, 120, 478, 213, 191, 253, 514, + 193, 212, 159, 242, 204, 252, 262, 263, 239, 260, + 271, 229, 101, 238, 434, 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, + 443, 258, 177, 241, 249, 171, 164, 104, 247, 169, + 163, 153, 129, 141, 201, 161, 202, 142, 174, 173, + 175, 0, 450, 0, 233, 256, 275, 114, 466, 240, + 267, 270, 0, 205, 115, 134, 128, 200, 132, 156, + 266, 268, 269, 444, 442, 437, 436, 152, 160, 208, + 273, 190, 214, 118, 255, 231, 462, 465, 460, 461, + 509, 510, 557, 558, 559, 535, 456, 0, 463, 464, + 0, 540, 547, 548, 513, 97, 106, 157, 272, 206, + 131, 257, 446, 459, 124, 469, 0, 0, 482, 487, + 488, 500, 502, 503, 504, 505, 512, 519, 520, 522, + 529, 530, 531, 532, 537, 544, 563, 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, 940, + 0, 342, 0, 0, 0, 126, 0, 341, 0, 0, + 0, 155, 0, 941, 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, 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, 953, 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, + 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, 1047, 0, 59, 0, + 0, 94, 95, 96, 363, 362, 365, 366, 367, 368, + 0, 0, 116, 364, 369, 370, 371, 1048, 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, 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, + 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, 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, + 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, 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, + 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, 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, 1621, 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, + 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, 958, 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, - 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, 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, 955, + 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, 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, 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, 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, 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, + 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, 352, 353, 0, 0, 0, 0, 398, - 0, 354, 0, 0, 347, 348, 350, 349, 351, 356, + 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, - 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, + 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, 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, + 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, 224, 225, 226, 227, 233, 236, 242, - 243, 253, 260, 263, 138, 250, 264, 184, 0, 0, + 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, 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, 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, 1628, 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, 657, 656, - 666, 667, 659, 660, 661, 662, 663, 664, 665, 658, - 0, 0, 668, 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, 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, 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, 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, - 752, 0, 0, 0, 0, 126, 0, 0, 0, 0, - 0, 155, 0, 0, 0, 158, 0, 0, 231, 172, + 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, 94, 95, - 96, 0, 754, 0, 0, 0, 0, 0, 0, 116, - 0, 0, 0, 0, 0, 646, 647, 645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 648, 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, 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, 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, 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, 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, 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, + 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, 754, 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, 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, - 0, 0, 0, 0, 0, 0, 135, 88, 89, 0, - 85, 0, 0, 0, 90, 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, 87, 0, 0, 0, 0, + 650, 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, 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, 1066, 0, 0, 0, 0, 155, - 0, 0, 0, 158, 0, 0, 231, 172, 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, 0, 0, - 0, 0, 0, 0, 0, 135, 0, 0, 1065, 292, - 0, 0, 0, 1062, 1060, 0, 1061, 139, 154, 112, - 151, 98, 108, 1058, 1064, 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, 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, - 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, 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, 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, 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, 1025, 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, 1027, - 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, 0, 0, + 0, 0, 126, 1070, 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, 0, 0, 0, 0, 0, - 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, 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, - 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, 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, 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, 0, 0, 0, 0, 135, 0, 0, 1069, + 293, 0, 0, 0, 1066, 1064, 0, 1065, 139, 154, + 112, 151, 98, 108, 1062, 1068, 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, 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, @@ -2278,395 +2219,504 @@ 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, 1025, 0, + 225, 226, 227, 228, 234, 237, 243, 244, 254, 261, + 264, 138, 251, 265, 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, 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, - 1027, 0, 0, 0, 0, 0, 0, 116, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1023, 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, 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, 97, 106, 157, 271, 206, 131, 256, 0, - 0, 124, 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, 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, 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, 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, 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, 94, 95, 96, 0, 0, - 990, 0, 0, 991, 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, 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, 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, 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, 786, 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, 1029, 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, 94, 95, 96, 0, 785, 0, - 0, 0, 0, 0, 0, 116, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 1027, 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, 994, + 0, 0, 995, 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, 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, 184, 0, 0, 0, 0, 0, 0, 0, 0, + 126, 0, 788, 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, 412, 94, 95, 96, 0, 0, 0, 0, - 0, 0, 0, 0, 116, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 94, 95, 96, 0, 787, + 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, 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, 0, 0, 0, 97, - 106, 157, 271, 206, 131, 256, 0, 0, 124, 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, 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, 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, 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, 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, 0, 97, 106, - 157, 271, 206, 131, 256, 0, 0, 124, 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, - 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, 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, 94, 95, 96, 0, 1027, 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, 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, - 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, 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, 97, 106, 157, - 271, 206, 131, 256, 0, 0, 124, 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, 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, 94, 95, + 96, 0, 1031, 0, 0, 0, 0, 0, 0, 116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 94, 95, 96, 0, 754, 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, 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, 768, 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, 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, 756, 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, 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, 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, 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, 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, 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, 224, 0, 158, 0, 0, 232, 172, 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, 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, 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, 758, 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, 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, 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, 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, 760, 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, 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, 637, 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, 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, 635, 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, 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, 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, 566, 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, 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, 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, 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, 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, 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, 564, + 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, 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, 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, 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, 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, @@ -2674,113 +2724,78 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 329, - 0, 135, 0, 0, 0, 292, 0, 0, 0, 0, - 203, 0, 235, 139, 154, 112, 151, 98, 108, 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, 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, + 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, 0, 0, + 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, 328, 250, 264, 184, + 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, 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, 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, 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, 97, 106, 157, - 271, 206, 131, 256, 0, 0, 124, 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, 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, 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, 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, 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, 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, + 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{ - 378, -1000, -276, 956, -1000, -1000, -1000, -1000, -1000, -1000, + 1688, -1000, -280, 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, 905, 735, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, 257, 12246, 27, - 123, 21, 17850, 122, 1772, 18199, -1000, 26, -1000, 15, - 18199, 18, 17501, -1000, -1000, -80, -105, -1000, 10152, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, 727, 885, 890, - 895, 534, 1064, -1000, 8743, 8743, 95, 95, 95, 7347, - -1000, -1000, 17152, 18199, 120, 18199, -155, 93, 93, 93, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 973, 793, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, 314, 12323, 27, + 150, 21, 17959, 147, 1793, 18310, -1000, 26, -1000, 13, + 18310, 20, 17608, -1000, -1000, -66, -83, -1000, 10217, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, 776, 940, 964, + 970, 582, 1011, -1000, 8800, 8800, 113, 113, 113, 7396, + -1000, -1000, 17257, 18310, 138, 18310, -157, 109, 109, 109, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, @@ -2799,24 +2814,24 @@ 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, 110, 18199, 505, 505, 273, - -1000, 18199, 88, 505, 88, 88, 88, 18199, -1000, 155, - -1000, -1000, -1000, 18199, 505, 810, 284, 53, 221, 221, - 221, -1000, 192, -1000, 4806, 33, 4806, -42, 931, 34, - -33, -1000, 284, 4806, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, 102, -1000, -1000, 18199, 16803, 134, 249, -1000, - -1000, -1000, -1000, -1000, -1000, 616, 396, -1000, 10152, 2001, - 686, 686, -1000, -1000, 139, -1000, -1000, 11199, 11199, 11199, - 11199, 11199, 11199, 11199, 11199, 11199, 11199, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, 140, 18310, 619, 619, + 244, -1000, 18310, 107, 619, 107, 107, 107, 18310, -1000, + 195, -1000, -1000, -1000, 18310, 619, 885, 318, 71, 241, + 241, 241, -1000, 204, -1000, 4841, 37, 4841, -67, 987, + 38, -25, -1000, 318, 4841, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, 118, -1000, -1000, 18310, 16906, 142, 307, + -1000, -1000, -1000, -1000, -1000, -1000, 687, 262, -1000, 10217, + 1788, 612, 612, -1000, -1000, 176, -1000, -1000, 11270, 11270, + 11270, 11270, 11270, 11270, 11270, 11270, 11270, 11270, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, 686, 154, -1000, 9803, 686, 686, 686, 686, 686, - 686, 686, 686, 10152, 686, 686, 686, 686, 686, 686, - 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, - -1000, -1000, 905, -1000, 735, -1000, -1000, -1000, 869, 10152, - 10152, 905, -1000, 775, 8743, -1000, -1000, 934, -1000, -1000, - -1000, -1000, 324, 955, -1000, 11897, 153, 954, 16454, 15051, - 16105, 681, 6984, -67, -1000, -1000, -1000, 239, 14353, -1000, - -1000, -1000, 809, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, 612, 194, -1000, 9866, 612, 612, 612, 612, + 612, 612, 612, 612, 10217, 612, 612, 612, 612, 612, + 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, + 612, -1000, -1000, 973, -1000, 793, -1000, -1000, -1000, 890, + 10217, 10217, 973, -1000, 845, 8800, -1000, -1000, 957, -1000, + -1000, -1000, -1000, 371, 1008, -1000, 11972, 193, 1007, 16555, + 15144, 16204, 726, 7031, -136, -1000, -1000, -1000, 300, 14442, + -1000, -1000, -1000, 882, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, @@ -2828,189 +2843,189 @@ 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, 638, 18199, -1000, 2743, -1000, 505, 4806, - 104, 505, 277, 505, 18199, 18199, 4806, 4806, 4806, 41, - 75, 74, 18199, 678, 101, 18199, 875, 742, 18199, 505, - 505, -1000, 6258, -1000, 4806, 284, -1000, 442, 10152, 4806, - 4806, 4806, 18199, 4806, 4806, -1000, 432, -1000, -1000, 297, - -1000, -1000, -1000, -1000, -1000, -1000, 4806, 4806, -1000, 952, - 291, -1000, -1000, -1000, -1000, 10152, 221, -1000, 739, -1000, - -1000, 12, -1000, -1000, -1000, -1000, -1000, 956, -1000, -1000, - -1000, -122, -1000, -1000, 10152, 10152, 10152, 10152, 420, 224, - 11199, 395, 233, 11199, 11199, 11199, 11199, 11199, 11199, 11199, - 11199, 11199, 11199, 11199, 11199, 11199, 11199, 11199, 498, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, 505, -1000, 968, - 829, 829, 169, 169, 169, 169, 169, 169, 169, 169, - 169, 11548, 7696, 6258, 534, 636, 905, 8743, 8743, 10152, - 10152, 9441, 9092, 8743, 868, 267, 396, 18199, -1000, -1000, - 10850, -1000, -1000, -1000, -1000, -1000, 400, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, 18199, 18199, 8743, 8743, 8743, 8743, - 8743, 890, 534, 934, -1000, 963, 188, 737, 677, -1000, - 502, 890, 14004, 689, -1000, 934, -1000, -1000, -1000, 18199, - -1000, -1000, 15749, -1000, -1000, 5895, 18199, 60, 18199, -1000, - 669, 902, -1000, -1000, -1000, 882, 13306, 13655, 18199, 594, - 514, -1000, -1000, 152, 6621, -67, -1000, 6621, 653, -1000, - -132, -106, 8045, 167, -1000, -1000, -1000, -1000, 4443, 12595, - 608, 333, -70, -1000, -1000, -1000, 691, -1000, 691, 691, - 691, 691, -21, -21, -21, -21, -1000, -1000, -1000, -1000, - -1000, 712, 708, -1000, 691, 691, 691, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, 685, 18310, -1000, 319, -1000, + 619, 4841, 125, 619, 333, 619, 18310, 18310, 4841, 4841, + 4841, 59, 93, 72, 18310, 725, 117, 18310, 935, 783, + 18310, 619, 619, -1000, 6301, -1000, 4841, 318, -1000, 494, + 10217, 4841, 4841, 4841, 18310, 4841, 4841, -1000, 489, -1000, + -1000, 341, -1000, -1000, -1000, -1000, -1000, -1000, 4841, 4841, + -1000, 1006, 317, -1000, -1000, -1000, -1000, 10217, 241, -1000, + 781, -1000, -1000, 19, -1000, -1000, -1000, -1000, -1000, 1029, + -1000, -1000, -1000, -125, -1000, -1000, 10217, 10217, 10217, 10217, + 492, 247, 11270, 420, 278, 11270, 11270, 11270, 11270, 11270, + 11270, 11270, 11270, 11270, 11270, 11270, 11270, 11270, 11270, 11270, + 595, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 619, + -1000, 1015, 567, 567, 208, 208, 208, 208, 208, 208, + 208, 208, 208, 11621, 7747, 6301, 582, 682, 973, 8800, + 8800, 10217, 10217, 9502, 9151, 8800, 889, 315, 262, 18310, + -1000, -1000, 10919, -1000, -1000, -1000, -1000, -1000, 500, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, 18310, 18310, 8800, 8800, + 8800, 8800, 8800, 964, 582, 957, 927, 1022, 229, 547, + 724, -1000, 465, 964, 14091, 745, -1000, 957, -1000, -1000, + -1000, 18310, -1000, -1000, 15846, -1000, -1000, 5936, 18310, 70, + 18310, -1000, 723, 849, -1000, -1000, -1000, 937, 13389, 13740, + 18310, 706, 681, -1000, -1000, 189, 6666, -136, -1000, 6666, + 702, -1000, -112, -116, 8098, 197, -1000, -1000, -1000, -1000, + 4476, 12674, 577, 329, -60, -1000, -1000, -1000, 741, -1000, + 741, 741, 741, 741, -15, -15, -15, -15, -1000, -1000, + -1000, -1000, -1000, 760, 759, -1000, 741, 741, 741, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, 707, 707, 707, 696, 696, - 717, -1000, 18199, 4806, 862, 4806, -1000, 87, -1000, -1000, - -1000, 18199, 18199, 18199, 18199, 18199, 130, 18199, 18199, 676, - -1000, 18199, 4806, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, 396, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 18199, - -1000, -1000, -1000, -1000, 18199, 284, 18199, 18199, 396, -1000, - 18199, 18199, -1000, -1000, -1000, -1000, -1000, 396, 224, 270, - 237, -1000, -1000, 449, -1000, -1000, 2054, -1000, -1000, -1000, - -1000, 395, 11199, 11199, 11199, 440, 2054, 2039, 580, 408, - 169, 309, 309, 182, 182, 182, 182, 182, 613, 613, - -1000, -1000, -1000, 400, -1000, -1000, -1000, 400, 8743, 8743, - 670, 686, 151, -1000, 727, -1000, -1000, 890, 612, 612, - 383, 377, 254, 951, 612, 252, 950, 612, 612, 8743, - -1000, -1000, 272, -1000, 10152, 400, -1000, 149, -1000, 768, - 657, 654, 612, 400, 400, 612, 612, 869, -1000, -1000, - 790, 10152, 10152, 10152, -1000, -1000, -1000, 869, 933, -1000, - 801, 800, 930, 8743, 15051, 934, -1000, -1000, -1000, 148, - 930, 673, 686, -1000, 18199, 15051, 15051, 15051, 15051, 15051, - -1000, 779, 773, -1000, 755, 754, 772, 18199, -1000, 614, - 534, 13306, 174, 686, -1000, 15400, -1000, -1000, 60, 554, - 15051, 18199, -1000, -1000, 15051, 18199, 5532, -1000, 653, -67, - -74, -1000, -1000, -1000, -1000, 396, -1000, 547, 648, 4080, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, 705, 505, -1000, - 836, 223, 229, 505, 832, -1000, -1000, -1000, 812, -1000, - 320, -72, -1000, -1000, 368, -21, -21, -1000, -1000, 167, - 808, 167, 167, 167, 406, 406, -1000, -1000, -1000, -1000, - 362, -1000, -1000, -1000, 346, -1000, 732, 18199, 4806, -1000, - -1000, -1000, -1000, 310, 310, 228, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, 59, 690, -1000, - -1000, -1000, -1000, 10, 40, 100, -1000, 4806, -1000, 291, - 291, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - 440, 2054, 1736, -1000, 11199, 11199, -1000, -1000, 612, 612, - 8743, 6258, 905, 869, -1000, -1000, 109, 498, 109, 11199, - 11199, -1000, 11199, 11199, -1000, -167, 683, 259, -1000, 10152, - 570, -1000, 6258, -1000, 11199, 11199, -1000, -1000, -1000, -1000, - -1000, -1000, 787, 396, 396, -1000, -1000, 18199, -1000, -1000, - -1000, -1000, 926, 10152, -1000, 647, -1000, 5169, 890, 731, - 18199, 686, 956, 13306, 18199, 680, -1000, 235, 902, 704, - 728, 867, -1000, -1000, -1000, -1000, 764, -1000, 756, -1000, - -1000, -1000, -1000, -1000, 534, -1000, 108, 107, 106, 18199, - -1000, 930, 15051, 652, -1000, 652, -1000, 147, -1000, -1000, - -1000, -138, -121, -1000, -1000, -1000, 4443, -1000, 4443, 18199, - 69, -1000, 505, 505, -1000, -1000, -1000, 700, 726, 11199, - -1000, -1000, -1000, 532, 167, 167, -1000, 238, -1000, -1000, - -1000, 603, -1000, 601, 621, 598, 18199, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, 757, 757, 757, + 747, 747, 762, -1000, 18310, 4841, 933, 4841, -1000, 129, + -1000, -1000, -1000, 18310, 18310, 18310, 18310, 18310, 159, 18310, + 18310, 715, -1000, 18310, 4841, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, 262, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, 18310, -1000, -1000, -1000, -1000, 18310, 318, 18310, 18310, + 262, -1000, 18310, 18310, -1000, -1000, -1000, -1000, -1000, 262, + 247, 339, 282, -1000, -1000, 546, -1000, -1000, 2079, -1000, + -1000, -1000, -1000, 420, 11270, 11270, 11270, 110, 2079, 1979, + 505, 343, 208, 284, 284, 209, 209, 209, 209, 209, + 354, 354, -1000, -1000, -1000, 500, -1000, -1000, -1000, 500, + 8800, 8800, 714, 612, 188, -1000, 776, -1000, -1000, 964, + 670, 670, 326, 575, 285, 993, 670, 279, 989, 670, + 670, 8800, -1000, -1000, 352, -1000, 10217, 500, -1000, 187, + -1000, 826, 712, 705, 670, 500, 500, 670, 670, 890, + -1000, -1000, 870, -1000, 842, 10217, 10217, 10217, -1000, -1000, + -1000, 890, 968, -1000, 856, 853, 981, 8800, 15144, 957, + -1000, -1000, -1000, 181, 981, 733, 612, -1000, 18310, 15144, + 15144, 15144, 15144, 15144, -1000, 822, 821, -1000, 818, 814, + 833, 18310, -1000, 674, 582, 13389, 211, 612, -1000, 15495, + -1000, -1000, 70, 618, 15144, 18310, -1000, -1000, 15144, 18310, + 5571, -1000, 702, -136, -95, -1000, -1000, -1000, -1000, 262, + -1000, 611, 701, 4111, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, 756, 619, -1000, 920, 236, 212, 619, 919, -1000, + -1000, -1000, 913, -1000, 325, -62, -1000, -1000, 421, -15, + -15, -1000, -1000, 197, 878, 197, 197, 197, 487, 487, + -1000, -1000, -1000, -1000, 411, -1000, -1000, -1000, 408, -1000, + 780, 18310, 4841, -1000, -1000, -1000, -1000, 409, 409, 230, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, 18199, -1000, -1000, -1000, - -1000, -1000, 18199, -173, 505, 18199, 18199, 18199, 18199, -1000, - 284, 284, -1000, 11199, 2054, 2054, -1000, -1000, 400, -1000, - 890, -1000, 400, 691, 691, -1000, 691, 696, -1000, 691, - 3, 691, -1, 400, 400, 1921, 1879, 1759, 1667, 686, - -162, -1000, 396, 10152, -1000, 1601, 1112, -1000, -1000, 903, - 892, 396, -1000, -1000, -1000, 839, 540, 581, -1000, -1000, - 8394, 587, 146, 584, -1000, 905, 18199, 10152, -1000, -1000, - 10152, 694, -1000, 10152, -1000, -1000, -1000, 905, 686, 686, - 686, 584, 905, 652, -1000, -1000, 179, -1000, -1000, -1000, - 4080, -1000, 576, -1000, 691, -1000, 832, -1000, -1000, 18199, - -64, 962, 2054, -1000, -1000, -1000, -1000, -1000, -21, 402, - -21, 340, -1000, 337, 4806, -1000, -1000, -1000, -1000, 857, - -1000, 6258, -1000, -1000, 688, 714, -1000, -1000, -1000, -1000, - 2054, -1000, 869, -1000, -1000, 138, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, 11199, 11199, 11199, 11199, 11199, 890, - 399, 396, 11199, 11199, -1000, 10152, 10152, 831, -1000, 686, - -1000, 697, 18199, 18199, -1000, 18199, 890, -1000, 396, 396, - 18199, 396, 14702, 18199, 18199, 12944, 890, -1000, 176, 18199, - -1000, 574, -1000, 203, -1000, -133, 167, -1000, 167, 504, - 461, -1000, 686, 618, -1000, 234, 18199, 18199, -1000, -1000, - -1000, 768, 768, 768, 768, 65, 400, -1000, 768, 768, - 396, 616, 959, -1000, 686, 956, 142, -1000, -1000, -1000, - 571, 528, -1000, 528, 528, 174, -1000, 176, -1000, 505, - 232, 382, -1000, 64, 18199, 311, 820, -1000, 816, -1000, - -1000, -1000, -1000, -1000, 55, 6258, 4443, 525, -1000, -1000, - -1000, -1000, -1000, 400, 56, -179, -1000, -1000, -1000, 18199, - 581, 18199, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 332, - -1000, -1000, 18199, -1000, -1000, 373, -1000, -1000, 475, -1000, - 18199, -1000, -1000, 690, -1000, 785, -171, -182, 503, -1000, - -1000, 687, -1000, -1000, 55, 797, -173, -1000, 784, -1000, - 18199, -1000, 47, -1000, -176, 470, 45, -180, 723, 686, - -185, 706, -1000, 949, 10501, -1000, -1000, 936, 196, 196, - 768, 400, -1000, -1000, -1000, 77, 334, -1000, -1000, -1000, - -1000, -1000, -1000, + -1000, 69, 746, -1000, -1000, -1000, -1000, 4, 58, 115, + -1000, 4841, -1000, 317, 317, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, 110, 2079, 1867, -1000, 11270, 11270, + -1000, -1000, 670, 670, 8800, 6301, 973, 890, -1000, -1000, + 108, 595, 108, 11270, 11270, -1000, 11270, 11270, -1000, -169, + 707, 286, -1000, 10217, 502, -1000, 6301, -1000, 11270, 11270, + -1000, -1000, -1000, -1000, -1000, -1000, 858, 836, 262, 262, + -1000, -1000, 18310, -1000, -1000, -1000, -1000, 977, 10217, -1000, + 699, -1000, 5206, 964, 779, 18310, 612, 1029, 13389, 18310, + 728, -1000, 297, 849, 753, 777, 637, -1000, -1000, -1000, + -1000, 815, -1000, 799, -1000, -1000, -1000, -1000, -1000, 582, + -1000, 137, 136, 135, 18310, -1000, 981, 15144, 588, -1000, + 588, -1000, 175, -1000, -1000, -1000, -127, -144, -1000, -1000, + -1000, 4476, -1000, 4476, 18310, 86, -1000, 619, 619, -1000, + -1000, -1000, 749, 775, 11270, -1000, -1000, -1000, 569, 197, + 197, -1000, 256, -1000, -1000, -1000, 668, -1000, 651, 697, + 647, 18310, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, 18310, -1000, -1000, -1000, -1000, -1000, 18310, -177, 619, + 18310, 18310, 18310, 18310, -1000, 318, 318, -1000, 11270, 2079, + 2079, -1000, -1000, 500, -1000, 964, -1000, 500, 741, 741, + -1000, 741, 747, -1000, 741, 6, 741, 2, 500, 500, + 1943, 1680, 1626, 1041, 612, -164, -1000, 262, 10217, -1000, + 1220, 865, 481, -1000, -1000, 975, 967, 262, -1000, -1000, + -1000, 924, 695, 606, -1000, -1000, 8449, 645, 169, 643, + -1000, 973, 18310, 10217, -1000, -1000, 10217, 742, -1000, 10217, + -1000, -1000, -1000, 973, 612, 612, 612, 643, 973, 588, + -1000, -1000, 218, -1000, -1000, -1000, 4111, -1000, 641, -1000, + 741, -1000, 919, -1000, -1000, 18310, -38, 1018, 2079, -1000, + -1000, -1000, -1000, -1000, -15, 458, -15, 407, -1000, 403, + 4841, -1000, -1000, -1000, -1000, 926, -1000, 6301, -1000, -1000, + 734, 754, -1000, -1000, -1000, -1000, 2079, -1000, 890, -1000, + -1000, 134, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + 11270, 11270, 11270, 11270, 11270, 964, 443, 262, 11270, 11270, + -1000, -1000, 10217, 10217, 918, -1000, 612, -1000, 744, 18310, + 18310, -1000, 18310, 964, -1000, 262, 262, 18310, 262, 14793, + 18310, 18310, 13025, 964, -1000, 190, 18310, -1000, 639, -1000, + 221, -1000, -135, 197, -1000, 197, 534, 532, -1000, 612, + 688, -1000, 295, 18310, 18310, -1000, -1000, -1000, 826, 826, + 826, 826, 74, 500, -1000, 826, 826, 262, 687, 1017, + -1000, 612, 1029, 163, -1000, -1000, -1000, 608, 591, -1000, + 591, 591, 211, -1000, 190, -1000, 619, 290, 434, -1000, + 82, 18310, 361, 917, -1000, 915, -1000, -1000, -1000, -1000, + -1000, 68, 6301, 4476, 585, -1000, -1000, -1000, -1000, -1000, + 500, 54, -181, -1000, -1000, -1000, 18310, 606, 18310, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, 390, -1000, -1000, 18310, + -1000, -1000, 431, -1000, -1000, 564, -1000, 18310, -1000, -1000, + 746, -1000, 832, -174, -186, 600, -1000, -1000, 730, -1000, + -1000, 68, 852, -177, -1000, 831, -1000, 18310, -1000, 65, + -1000, -178, 503, 57, -182, 767, 612, -187, 765, -1000, + 997, 10568, -1000, -1000, 1013, 205, 205, 826, 500, -1000, + -1000, -1000, 94, 393, -1000, -1000, -1000, -1000, -1000, -1000, } var yyPgo = [...]int{ - 0, 1259, 1256, 32, 71, 69, 1252, 1251, 1246, 1245, - 99, 96, 94, 1242, 1239, 1232, 1229, 1228, 1227, 1224, - 1203, 1202, 1201, 1200, 1197, 1196, 1192, 1189, 1187, 1182, - 1180, 1179, 1177, 87, 1176, 1175, 1174, 1173, 85, 1172, - 1170, 1169, 1168, 1167, 42, 105, 44, 62, 1166, 66, - 1848, 1164, 52, 68, 61, 1163, 31, 1162, 1161, 81, - 1159, 1157, 58, 1156, 1155, 382, 1154, 55, 1150, 13, - 59, 1149, 1148, 1147, 1146, 95, 271, 1145, 1144, 15, - 1143, 1142, 90, 1140, 72, 20, 14, 29, 19, 1138, - 63, 1135, 6, 1134, 67, 1131, 1130, 1129, 1127, 41, - 1126, 65, 1124, 49, 24, 1121, 10, 64, 28, 23, - 9, 1120, 1118, 22, 82, 57, 75, 1117, 1116, 1115, - 421, 1114, 60, 1110, 1106, 1102, 56, 78, 106, 380, - 1096, 1088, 1084, 1081, 1079, 36, 1039, 1871, 8, 77, - 1076, 1072, 1070, 2625, 38, 54, 17, 1067, 1066, 1057, - 34, 37, 35, 365, 1055, 40, 1053, 1052, 1051, 1046, - 1043, 1042, 1041, 188, 1040, 1038, 1033, 18, 21, 73, - 26, 1029, 1028, 1027, 1025, 47, 74, 1024, 1023, 50, - 1021, 1020, 25, 1019, 1017, 1015, 1013, 1001, 27, 11, - 1000, 16, 999, 12, 998, 30, 996, 3, 994, 5, - 993, 2, 0, 992, 4, 48, 1, 991, 7, 986, - 983, 980, 1358, 1275, 76, 976, 98, + 0, 1286, 1284, 19, 69, 70, 1280, 1279, 1276, 1274, + 100, 99, 93, 1272, 1270, 1269, 1268, 1266, 1261, 1260, + 1253, 1251, 1248, 1247, 1246, 1245, 1244, 1243, 1242, 1241, + 1236, 1231, 1230, 87, 1229, 1228, 1225, 1224, 77, 1223, + 1219, 1217, 1216, 1213, 54, 173, 67, 68, 1208, 62, + 1795, 1206, 47, 66, 61, 1205, 40, 1202, 1198, 78, + 1197, 1196, 60, 1192, 1191, 63, 1189, 55, 1188, 11, + 26, 1187, 1185, 1184, 1181, 95, 1935, 1180, 1178, 9, + 1176, 1174, 108, 1173, 71, 22, 12, 27, 18, 1171, + 72, 1170, 6, 1169, 64, 1168, 1167, 1166, 1165, 15, + 1164, 65, 1163, 74, 1161, 17, 1160, 42, 58, 36, + 28, 5, 1159, 1155, 21, 82, 57, 73, 1142, 1139, + 1138, 586, 1137, 48, 1136, 1134, 1133, 52, 88, 96, + 468, 1131, 1130, 1129, 1128, 1127, 37, 912, 1676, 23, + 85, 1126, 1125, 1124, 2606, 38, 59, 13, 1118, 1116, + 1113, 34, 118, 32, 443, 1112, 41, 1111, 1110, 1109, + 1108, 1107, 1106, 1100, 25, 1098, 1096, 1094, 24, 33, + 75, 30, 1093, 1092, 1090, 1088, 50, 76, 1087, 1085, + 56, 1084, 1083, 29, 1080, 1074, 1071, 1070, 1069, 31, + 10, 1065, 14, 1059, 8, 1055, 35, 1051, 1, 1050, + 4, 1049, 3, 0, 1048, 2, 49, 7, 1044, 16, + 1043, 1042, 1038, 1232, 1177, 79, 1037, 94, } var yyR1 = [...]int{ - 0, 210, 211, 211, 1, 1, 1, 1, 1, 1, + 0, 211, 212, 212, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 202, 202, 202, 21, 3, 3, 3, 3, 2, 2, + 203, 203, 203, 21, 3, 3, 3, 3, 2, 2, 8, 9, 4, 5, 5, 10, 10, 37, 37, 11, - 12, 12, 12, 12, 214, 214, 59, 59, 60, 60, - 107, 107, 13, 14, 14, 116, 116, 115, 115, 115, - 117, 117, 117, 117, 153, 153, 15, 15, 15, 15, - 15, 15, 15, 204, 204, 203, 201, 201, 200, 200, - 199, 22, 184, 186, 186, 185, 185, 185, 185, 176, - 156, 156, 156, 156, 159, 159, 157, 157, 157, 157, - 157, 157, 157, 157, 157, 158, 158, 158, 158, 158, - 160, 160, 160, 160, 160, 161, 161, 161, 161, 161, - 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, - 162, 162, 162, 162, 162, 162, 162, 162, 175, 175, - 163, 163, 169, 169, 170, 170, 170, 172, 172, 173, - 173, 130, 130, 130, 165, 165, 166, 166, 171, 171, - 167, 167, 167, 168, 168, 168, 174, 174, 174, 174, - 174, 164, 164, 177, 177, 194, 194, 193, 193, 193, - 183, 183, 190, 190, 190, 190, 190, 180, 180, 180, - 181, 181, 179, 179, 182, 182, 192, 192, 191, 178, - 178, 195, 195, 195, 195, 207, 208, 206, 206, 206, - 206, 206, 187, 187, 187, 188, 188, 188, 189, 189, - 189, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 205, 205, - 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, - 205, 205, 198, 196, 196, 197, 197, 17, 23, 23, + 12, 12, 12, 12, 215, 215, 59, 59, 60, 60, + 108, 108, 13, 14, 14, 117, 117, 116, 116, 116, + 118, 118, 118, 118, 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, 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, 123, 123, - 209, 209, 125, 125, 121, 121, 124, 124, 122, 122, - 122, 126, 126, 126, 127, 127, 154, 154, 154, 26, - 26, 28, 28, 29, 30, 30, 148, 148, 149, 149, + 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, 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, 215, 33, 34, 34, 38, + 27, 27, 27, 27, 20, 216, 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, 140, 140, 140, - 139, 139, 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, 147, 147, - 146, 146, 146, 145, 145, 61, 61, 61, 63, 62, + 49, 45, 45, 47, 47, 47, 47, 141, 141, 141, + 140, 140, 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, 148, 148, + 147, 147, 147, 146, 146, 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, @@ -3020,36 +3035,21 @@ 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, 216, 216, 82, + 79, 79, 79, 79, 79, 79, 79, 217, 217, 82, 81, 81, 81, 81, 81, 81, 81, 42, 42, 42, - 42, 42, 152, 152, 155, 155, 155, 155, 155, 155, - 155, 155, 155, 155, 155, 155, 155, 95, 95, 41, + 42, 42, 153, 153, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 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, 142, 142, - 142, 118, 118, 128, 128, 129, 129, 120, 120, 131, - 131, 131, 131, 131, 131, 131, 131, 131, 131, 132, - 132, 132, 133, 133, 134, 134, 134, 141, 141, 137, - 137, 138, 138, 143, 143, 144, 144, 135, 135, 135, - 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, - 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, - 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, - 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, - 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, - 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, - 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, - 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, - 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, - 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, - 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, - 135, 135, 135, 135, 135, 135, 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, + 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, + 143, 143, 143, 119, 119, 129, 129, 130, 130, 121, + 121, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 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, @@ -3061,18 +3061,33 @@ var yyR1 = [...]int{ 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, 212, 213, 150, 151, 151, - 151, + 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, + 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, 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, 137, 137, 137, 137, + 137, 137, 137, 137, 137, 137, 137, 137, 137, 213, + 214, 151, 152, 152, 152, } 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, @@ -3132,14 +3147,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, - 1, 1, 1, 1, 0, 1, 1, 0, 2, 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, 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, 1, 1, 1, @@ -3169,358 +3184,358 @@ var yyR2 = [...]int{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, - 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 0, 0, 1, 1, } var yyChk = [...]int{ - -1000, -210, -1, -3, -8, -9, -10, -11, -12, -13, + -1000, -211, -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, -212, - 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, -211, 369, -38, 5, -99, - 16, -3, -33, -215, -33, -33, -33, -33, -33, -33, - -184, -186, 58, 97, -134, 134, 78, 259, 131, 132, - 138, -137, -202, -136, 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, -120, 134, 259, 131, 233, - 136, 132, 132, 133, 134, 259, 131, 132, -65, -143, - -202, -136, 134, 132, 115, 202, 246, 124, 230, 241, - 242, 238, -125, 239, 166, -154, 132, -121, 229, 232, - 233, 172, -209, -202, 240, 248, 247, 234, 244, 243, - -143, 176, -148, 181, -137, 179, -65, -36, 365, 128, - -150, -150, 231, 231, -150, -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, -137, -143, -87, -212, 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, - -202, -136, -5, -4, -212, 6, 21, 22, -103, 18, - 17, -213, 60, -40, -48, 43, 44, -49, 22, 36, - 47, 45, -34, -47, 106, -50, -143, -47, -120, -120, - -120, -111, -153, 176, -114, 248, 247, -138, -112, -137, - -135, 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, -185, 97, -176, -137, -65, 133, -65, - 267, -129, 137, -129, -129, 132, -65, -202, -202, 124, - 126, 129, 56, -23, -65, -128, 137, -202, -128, -128, - -128, -65, 121, -65, -202, 31, -126, 97, 13, 259, - -202, 166, 132, 167, 134, -127, 97, -127, -127, -180, - 133, 34, 145, -151, -212, -138, 170, 171, -151, -124, - -123, 236, 237, 231, 235, 13, 171, 231, 169, -126, - -151, 135, -137, -35, -137, 65, -7, -3, -11, -10, - -12, 89, -150, -150, 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, -212, -90, -212, - 122, 123, -76, -76, -76, -76, -76, -76, -76, -76, - -76, -76, -212, 121, -2, -85, -4, -212, -212, -212, - -212, -212, -212, -212, -212, -95, -50, -212, -216, -82, - -212, -216, -82, -216, -82, -216, -212, -216, -82, -216, - -82, -216, -216, -82, -212, -212, -212, -212, -212, -212, - -212, -99, -3, -33, -104, 20, 32, -50, -100, -101, - -50, -99, 39, -45, -47, -49, 43, 44, 71, 12, - -140, -139, 23, -137, 65, 121, 12, -66, 27, -65, - -52, -53, -54, -55, -68, -91, -212, -65, 12, -59, - -60, -65, -67, -143, 59, 176, -114, -153, -116, -115, - 249, 251, 89, -142, -137, 65, 30, 31, 60, 59, - -65, -156, -159, -161, -160, -162, -157, -158, 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, - -202, -151, 134, -202, 81, -202, -65, -65, -151, -151, - -151, 168, 168, 132, 132, 173, -65, 59, 135, -59, - 24, 56, -65, -202, -202, -144, -143, -135, -151, -126, - 65, -50, -151, -151, -151, -65, -151, -151, 65, -181, - 12, 99, -151, -151, 12, -122, 12, 99, -50, -127, - 56, -149, 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, + -29, -30, -31, -32, -6, -27, -20, -21, -4, -213, + 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, -212, 371, -38, 5, -99, + 16, -3, -33, -216, -33, -33, -33, -33, -33, -33, + -185, -187, 60, 99, -135, 136, 80, 261, 133, 134, + 140, -138, -203, -137, 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, -121, 136, 261, 133, + 235, 138, 134, 134, 135, 136, 261, 133, 134, -65, + -144, -203, -137, 136, 134, 117, 204, 248, 126, 232, + 243, 244, 240, -126, 241, 168, -155, 134, -122, 231, + 234, 235, 174, -210, -203, 242, 250, 249, 236, 246, + 245, -144, 178, -149, 183, -138, 181, -65, -36, 367, + 130, -151, -151, 233, 233, -151, -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, -138, -144, -87, -213, 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, -203, -137, -5, -4, -213, 6, 21, 22, -103, + 18, 17, -214, 62, -40, -48, 45, 46, -49, 22, + 36, 49, 47, -34, -47, 108, -50, -144, -47, -121, + -121, -121, -112, -154, 178, -115, 250, 249, -139, -113, + -138, -136, 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, -186, 99, -177, -138, -65, + 135, -65, 269, -130, 139, -130, -130, 134, -65, -203, + -203, 126, 128, 131, 58, -23, -65, -129, 139, -203, + -129, -129, -129, -65, 123, -65, -203, 31, -127, 99, + 13, 261, -203, 168, 134, 169, 136, -128, 99, -128, + -128, -181, 135, 34, 147, -152, -213, -139, 172, 173, + -152, -125, -124, 238, 239, 233, 237, 13, 173, 233, + 171, -127, -152, 137, -138, -35, -138, 67, -7, -3, + -11, -10, -12, 91, -151, -151, 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, -213, + -90, -213, 124, 125, -76, -76, -76, -76, -76, -76, + -76, -76, -76, -76, -213, 123, -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, -105, 20, 32, -50, + -100, -101, -50, -99, 41, -45, -47, -49, 45, 46, + 73, 12, -141, -140, 23, -138, 67, 123, 12, -66, + 27, -65, -52, -53, -54, -55, -68, -91, -213, -65, + 12, -59, -60, -65, -67, -144, 61, 178, -115, -154, + -117, -116, 251, 253, 91, -143, -138, 67, 30, 31, + 62, 61, -65, -157, -160, -162, -161, -163, -158, -159, + 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, -203, -152, 136, -203, 83, -203, -65, -65, + -152, -152, -152, 170, 170, 134, 134, 175, -65, 61, + 137, -59, 24, 58, -65, -203, -203, -145, -144, -136, + -152, -127, 67, -50, -152, -152, -152, -65, -152, -152, + 67, -182, 12, 101, -152, -152, 12, -123, 12, 101, + -50, -128, 58, -150, 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, - -152, -202, 65, -202, -75, -75, -137, -46, 22, 36, - -45, -138, -144, -135, -38, -213, -213, -99, -45, -45, - -50, -50, -92, 65, -45, -92, 65, -45, -45, -43, - 22, 36, -93, -94, 85, -92, -137, -143, -213, -76, - -137, -137, -45, -46, -46, -45, -45, -103, -213, 10, - 99, 59, 19, 59, -102, 25, 26, -103, -77, -137, - 66, 69, -51, 59, 12, -49, -65, -139, 106, -144, - -65, -107, 162, -65, 31, 59, -61, -63, -62, -64, - 46, 50, 52, 47, 48, 49, 53, -147, 23, -52, - -3, -212, -146, 162, -145, 23, -143, 65, -65, -59, - -214, 59, 12, 57, -214, 59, 121, -114, -116, 59, - 250, 252, 253, 56, 77, -50, -168, 114, -187, -188, - -189, -138, 65, 66, -176, -177, -178, -190, 148, -195, - 139, 141, 138, -179, 149, 133, 29, 60, -130, 74, - 81, -172, 227, -163, 58, -163, -163, -163, -163, -167, - 202, -167, -167, -167, 58, 58, -163, -163, -163, -169, - 58, -169, -169, -170, 58, -170, -141, 57, -65, -151, - 24, -151, -131, 129, 126, 127, -198, 125, 224, 202, - 72, 30, 16, 268, 162, 283, -202, 163, -65, -65, - -65, -65, -65, 129, 126, -65, -65, -65, -151, -65, - -65, -126, -143, -143, -65, -137, 74, 75, 76, -84, - -76, -76, -76, -44, 157, 80, -213, -213, -45, -45, - -212, 121, -5, -103, -213, -213, 59, 57, 23, 12, - 12, -213, 12, 12, -213, -213, -45, -96, -94, 87, - -50, -213, 121, -213, 59, 59, -213, -213, -213, -213, - -213, -104, 41, -50, -50, -101, -104, -118, 20, 12, - 37, 37, -70, 13, -47, -52, -49, 121, -70, -74, - 31, 37, -3, -212, -212, -110, -113, -92, -53, -54, - -54, -53, -54, 46, 46, 46, 51, 46, 51, 46, - -62, -143, -213, -213, -3, -69, 54, 136, 55, -212, - -145, -107, 57, -52, -65, -52, -67, -143, 106, -115, - -117, 254, 251, 257, -202, 65, 59, -189, 89, 58, - -202, 29, -179, -179, -182, -202, -182, 29, -165, 30, - 74, -173, 228, 66, -167, -167, -168, 31, -168, -168, - -168, -175, 65, -175, 66, 66, 56, -137, -151, -150, - -205, 144, 140, 148, 149, 142, 61, 62, 63, 133, - 29, 139, 141, 162, 138, -205, -132, -133, 135, 23, - 133, 29, 162, -204, 57, 168, 224, 168, 135, -151, - -122, -122, -44, 80, -76, -76, -213, -213, -46, -138, - -99, -104, -155, 115, 199, 156, 197, 193, 213, 204, - 226, 195, 227, -152, -155, -76, -76, -76, -76, 277, - -99, 88, -50, 86, -138, -76, -76, 42, -65, -97, - 14, -50, 106, -103, -109, 56, -110, -86, -88, -87, - -212, -105, -137, -108, -137, -70, 59, 89, -57, -56, - 56, 57, -58, 56, -56, 46, 46, -213, 133, 133, - 133, -108, -70, -52, -70, -70, 121, 251, 255, 256, - -188, -189, -192, -191, -137, -195, 149, -182, -182, 58, - -166, 56, -76, 60, -168, -168, -202, 115, 60, 59, - 60, 59, 60, 59, -65, -150, -150, -65, -150, -137, - -201, 280, -203, -202, -137, -137, -137, -65, -126, -126, - -76, -213, -103, -213, -163, -163, -163, -170, -163, 187, - -163, 187, -213, -213, 20, 20, 20, 20, -212, -41, - 273, -50, 59, 59, -98, 15, 17, 28, -109, 59, - -213, -213, 59, 121, -213, 59, -99, -113, -50, -50, - 58, -50, -212, -212, -212, -213, -99, -70, 60, 59, - -163, -106, -137, -171, 224, 10, -167, 65, -167, 66, - 66, -151, 27, -200, -199, -138, 58, 57, -104, -167, - -202, -76, -76, -76, -76, -76, -103, 65, -76, -76, - -50, -85, 29, -88, 37, -3, -137, -137, -137, -103, - -106, -106, -213, -106, -106, -146, -103, -194, -193, 57, - 143, 72, -191, 60, 59, -174, 139, 29, 138, -79, - -168, -168, 60, 60, -212, 59, 89, -106, -65, -213, - -213, -213, -213, -42, 99, 280, -213, -213, -213, 10, - -86, 121, 60, -213, -213, -213, -69, -193, -202, -183, - 89, 65, 151, -137, -164, 72, 29, 29, -196, -197, - 162, -199, -189, 60, -213, 278, 53, 281, -110, -137, - 66, -65, 65, -213, 59, -137, -204, 42, 279, 282, - 58, -197, 37, -201, 42, -106, 164, 280, 60, 165, - 281, -207, -208, 56, -212, 282, -208, 56, 11, 10, - -76, 161, -206, 152, 147, 150, 31, -206, -213, -213, - 146, 30, 74, + -76, -76, -153, -203, 67, -203, -75, -75, -138, -46, + 22, 36, -45, -139, -145, -136, -38, -214, -214, -99, + -45, -45, -50, -50, -92, 67, -45, -92, 67, -45, + -45, -43, 22, 36, -93, -94, 87, -92, -138, -144, + -214, -76, -138, -138, -45, -46, -46, -45, -45, -103, + -214, -104, 27, 10, 101, 61, 19, 61, -102, 25, + 26, -103, -77, -138, 68, 71, -51, 61, 12, -49, + -65, -140, 108, -145, -65, -108, 164, -65, 31, 61, + -61, -63, -62, -64, 48, 52, 54, 49, 50, 51, + 55, -148, 23, -52, -3, -213, -147, 164, -146, 23, + -144, 67, -65, -59, -215, 61, 12, 59, -215, 61, + 123, -115, -117, 61, 252, 254, 255, 58, 79, -50, + -169, 116, -188, -189, -190, -139, 67, 68, -177, -178, + -179, -191, 150, -196, 141, 143, 140, -180, 151, 135, + 29, 62, -131, 76, 83, -173, 229, -164, 60, -164, + -164, -164, -164, -168, 204, -168, -168, -168, 60, 60, + -164, -164, -164, -170, 60, -170, -170, -171, 60, -171, + -142, 59, -65, -152, 24, -152, -132, 131, 128, 129, + -199, 127, 226, 204, 74, 30, 16, 270, 164, 285, + -203, 165, -65, -65, -65, -65, -65, 131, 128, -65, + -65, -65, -152, -65, -65, -127, -144, -144, -65, -138, + 76, 77, 78, -84, -76, -76, -76, -44, 159, 82, + -214, -214, -45, -45, -213, 123, -5, -103, -214, -214, + 61, 59, 23, 12, 12, -214, 12, 12, -214, -214, + -45, -96, -94, 89, -50, -214, 123, -214, 61, 61, + -214, -214, -214, -214, -214, -105, 37, 43, -50, -50, + -101, -105, -119, 20, 12, 39, 39, -70, 13, -47, + -52, -49, 123, -70, -74, 31, 39, -3, -213, -213, + -111, -114, -92, -53, -54, -54, -53, -54, 48, 48, + 48, 53, 48, 53, 48, -62, -144, -214, -214, -3, + -69, 56, 138, 57, -213, -146, -108, 59, -52, -65, + -52, -67, -144, 108, -116, -118, 256, 253, 259, -203, + 67, 61, -190, 91, 60, -203, 29, -180, -180, -183, + -203, -183, 29, -166, 30, 76, -174, 230, 68, -168, + -168, -169, 31, -169, -169, -169, -176, 67, -176, 68, + 68, 58, -138, -152, -151, -206, 146, 142, 150, 151, + 144, 63, 64, 65, 135, 29, 141, 143, 164, 140, + -206, -133, -134, 137, 23, 135, 29, 164, -205, 59, + 170, 226, 170, 137, -152, -123, -123, -44, 82, -76, + -76, -214, -214, -46, -139, -99, -105, -156, 117, 201, + 158, 199, 195, 215, 206, 228, 197, 229, -153, -156, + -76, -76, -76, -76, 279, -99, 90, -50, 88, -139, + -76, -76, 38, 44, -65, -97, 14, -50, 108, -103, + -110, 58, -111, -86, -88, -87, -213, -106, -138, -109, + -138, -70, 61, 91, -57, -56, 58, 59, -58, 58, + -56, 48, 48, -214, 135, 135, 135, -109, -70, -52, + -70, -70, 123, 253, 257, 258, -189, -190, -193, -192, + -138, -196, 151, -183, -183, 60, -167, 58, -76, 62, + -169, -169, -203, 117, 62, 61, 62, 61, 62, 61, + -65, -151, -151, -65, -151, -138, -202, 282, -204, -203, + -138, -138, -138, -65, -127, -127, -76, -214, -103, -214, + -164, -164, -164, -171, -164, 189, -164, 189, -214, -214, + 20, 20, 20, 20, -213, -41, 275, -50, 61, 61, + 67, -98, 15, 17, 28, -110, 61, -214, -214, 61, + 123, -214, 61, -99, -114, -50, -50, 60, -50, -213, + -213, -213, -214, -99, -70, 62, 61, -164, -107, -138, + -172, 226, 10, -168, 67, -168, 68, 68, -152, 27, + -201, -200, -139, 60, 59, -105, -168, -203, -76, -76, + -76, -76, -76, -103, 67, -76, -76, -50, -85, 29, + -88, 39, -3, -138, -138, -138, -103, -107, -107, -214, + -107, -107, -147, -103, -195, -194, 59, 145, 74, -192, + 62, 61, -175, 141, 29, 140, -79, -169, -169, 62, + 62, -213, 61, 91, -107, -65, -214, -214, -214, -214, + -42, 101, 282, -214, -214, -214, 10, -86, 123, 62, + -214, -214, -214, -69, -194, -203, -184, 91, 67, 153, + -138, -165, 74, 29, 29, -197, -198, 164, -200, -190, + 62, -214, 280, 55, 283, -111, -138, 68, -65, 67, + -214, 61, -138, -205, 44, 281, 284, 60, -198, 39, + -202, 44, -107, 166, 282, 62, 167, 283, -208, -209, + 58, -213, 284, -209, 58, 11, 10, -76, 163, -207, + 154, 149, 152, 31, -207, -214, -214, 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, 694, 677, + 365, 365, 365, 365, 365, 365, 365, 0, 696, 679, 0, 0, 0, 0, -2, 330, 331, 0, 333, -2, - 0, 0, 342, 1007, 1007, 0, 0, 1007, 0, 1005, + 0, 0, 342, 1011, 1011, 0, 0, 1011, 0, 1009, 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, 990, 0, 675, 675, 675, - 695, 696, 699, 700, 30, 31, 32, 826, 827, 828, - 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, 991, 992, 993, 994, 995, 996, 997, 998, 999, - 1000, 1001, 1002, 1003, 1004, 0, 0, 0, 0, 0, - 678, 0, 673, 0, 673, 673, 673, 0, 276, 447, - 703, 704, 990, 0, 0, 0, 321, 0, 324, 324, - 324, 290, 0, 292, 1008, 0, 1008, 0, 299, 0, - 0, 305, 321, 1008, 313, 327, 328, 315, 310, 311, - 329, 332, 0, 337, 340, 0, 355, 0, 867, 347, - 360, 361, 1007, 1007, 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, 1006, 0, 0, -2, -2, 381, 387, 388, - 389, 390, 366, 0, 393, 397, 0, 0, 0, 0, - 0, 62, 0, 978, 658, -2, -2, 0, 0, 701, - 702, -2, 839, -2, 707, 708, 709, 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, 0, 0, 95, 0, 93, 0, 1008, - 0, 0, 0, 0, 0, 0, 1008, 1008, 1008, 0, - 0, 0, 0, 267, 0, 0, 0, 0, 0, 0, - 0, 275, 0, 277, 1008, 321, 280, 0, 0, 1008, - 1008, 1008, 0, 1008, 1008, 287, 0, 288, 289, 0, - 197, 198, 199, 293, 1009, 1010, 1008, 1008, 295, 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, 978, 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, - 697, 79, 0, 1008, 0, 1008, 91, 0, 236, 238, - 239, 0, 0, 0, 0, 0, 0, 0, 0, 270, - 674, 0, 1008, 273, 274, 448, 705, 706, 278, 279, - 322, 323, 281, 282, 283, 284, 285, 286, 325, 0, - 200, 201, 294, 298, 0, 321, 0, 0, 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, 922, 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, - 932, 964, 204, 204, 866, 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, 1008, 81, - 676, 82, 1007, 0, 0, 689, 237, 679, 680, 681, - 682, 683, 684, 685, 686, 687, 688, 0, 83, 241, - 243, 242, 246, 0, 0, 0, 268, 1008, 272, 318, - 318, 297, 319, 320, 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, 698, 80, 231, - 1007, 248, 249, 250, 251, 252, 253, 254, 255, 256, - 257, 258, 259, 260, 261, 1007, 0, 1007, 690, 691, - 692, 693, 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, 0, 193, 194, 0, - 168, 0, 165, 151, 125, 126, 171, 172, 170, 0, - 170, 0, 155, 0, 1008, 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, 994, 0, 677, 677, 677, + 697, 698, 701, 702, 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, 993, 995, 996, 997, 998, 999, 1000, 1001, 1002, + 1003, 1004, 1005, 1006, 1007, 1008, 0, 0, 0, 0, + 0, 680, 0, 675, 0, 675, 675, 675, 0, 276, + 447, 705, 706, 994, 0, 0, 0, 321, 0, 324, + 324, 324, 290, 0, 292, 1012, 0, 1012, 0, 299, + 0, 0, 305, 321, 1012, 313, 327, 328, 315, 310, + 311, 329, 332, 0, 337, 340, 0, 355, 0, 870, + 347, 360, 361, 1011, 1011, 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, 1010, 0, 0, -2, -2, 381, 387, + 388, 389, 390, 366, 0, 393, 397, 0, 0, 0, + 0, 0, 62, 0, 982, 660, -2, -2, 0, 0, + 703, 704, -2, 842, -2, 709, 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, 1012, 0, 0, 0, 0, 0, 0, 1012, 1012, + 1012, 0, 0, 0, 0, 267, 0, 0, 0, 0, + 0, 0, 0, 275, 0, 277, 1012, 321, 280, 0, + 0, 1012, 1012, 1012, 0, 1012, 1012, 287, 0, 288, + 289, 0, 197, 198, 199, 293, 1013, 1014, 1012, 1012, + 295, 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, 982, 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, 699, 79, 0, 1012, 0, 1012, 91, 0, + 236, 238, 239, 0, 0, 0, 0, 0, 0, 0, + 0, 270, 676, 0, 1012, 273, 274, 448, 707, 708, + 278, 279, 322, 323, 281, 282, 283, 284, 285, 286, + 325, 0, 200, 201, 294, 298, 0, 321, 0, 0, + 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, 925, 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, 935, 968, 204, 204, 869, 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, 1012, 81, 678, 82, 1011, 0, 0, 691, + 237, 681, 682, 683, 684, 685, 686, 687, 688, 689, + 690, 0, 83, 241, 243, 242, 246, 0, 0, 0, + 268, 1012, 272, 318, 318, 297, 319, 320, 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, 700, 80, 231, 1011, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, + 1011, 0, 1011, 692, 693, 694, 695, 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, + 1012, 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{ @@ -3529,12 +3544,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, @@ -3570,7 +3585,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 { @@ -3912,87 +3928,88 @@ yydefault: case 1: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:357 +//line sql.y:359 { setParseTree(yylex, yyDollar[1].statement) } case 2: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:362 +//line sql.y:364 { } case 3: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:363 +//line sql.y:365 { } case 4: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:367 +//line sql.y:369 { yyVAL.statement = yyDollar[1].selStmt } case 29: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:395 +//line sql.y:397 { setParseTree(yylex, nil) } case 30: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:401 +//line sql.y:403 { yyVAL.colIdent = NewColIdentWithAt(string(yyDollar[1].bytes), NoAt) } case 31: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:405 +//line sql.y:407 { yyVAL.colIdent = NewColIdentWithAt(string(yyDollar[1].bytes), SingleAt) } case 32: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:409 +//line sql.y:411 { yyVAL.colIdent = NewColIdentWithAt(string(yyDollar[1].bytes), DoubleAt) } case 33: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:415 +//line sql.y:417 { yyVAL.statement = &OtherAdmin{} } case 34: - yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:421 + yyDollar = yyS[yypt-5 : yypt+1] +//line sql.y:423 { 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:429 +//line sql.y:432 { 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:433 +//line sql.y:436 { 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:437 +//line sql.y:440 { 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:460 +//line sql.y:463 { sel := yyDollar[1].selStmt.(*Select) sel.OrderBy = yyDollar[2].orderBy @@ -4002,43 +4019,43 @@ yydefault: } case 39: yyDollar = yyS[yypt-6 : yypt+1] -//line sql.y:468 +//line sql.y:471 { 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:474 +//line sql.y:477 { 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:480 +//line sql.y:483 { 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:488 +//line sql.y:491 { 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:494 +//line sql.y:497 { yyVAL.selStmt = yyDollar[1].selStmt } case 44: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:498 +//line sql.y:501 { yyVAL.selStmt = &ParenSelect{Select: yyDollar[2].selStmt} } case 45: yyDollar = yyS[yypt-7 : yypt+1] -//line sql.y:505 +//line sql.y:508 { // insert_data returns a *Insert pre-filled with Columns & Values ins := yyDollar[6].ins @@ -4052,7 +4069,7 @@ yydefault: } case 46: yyDollar = yyS[yypt-8 : yypt+1] -//line sql.y:517 +//line sql.y:520 { cols := make(Columns, 0, len(yyDollar[7].updateExprs)) vals := make(ValTuple, 0, len(yyDollar[8].updateExprs)) @@ -4064,186 +4081,186 @@ yydefault: } case 47: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:529 +//line sql.y:532 { yyVAL.insertAction = InsertAct } case 48: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:533 +//line sql.y:536 { yyVAL.insertAction = ReplaceAct } case 49: yyDollar = yyS[yypt-9 : yypt+1] -//line sql.y:539 +//line sql.y:542 { 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:545 +//line sql.y:548 { 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:549 +//line sql.y:552 { 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:553 +//line sql.y:556 { 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:557 +//line sql.y:560 { 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:562 +//line sql.y:565 { } case 55: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:563 +//line sql.y:566 { } case 56: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:567 +//line sql.y:570 { yyVAL.tableNames = TableNames{yyDollar[1].tableName} } case 57: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:571 +//line sql.y:574 { yyVAL.tableNames = append(yyVAL.tableNames, yyDollar[3].tableName) } case 58: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:577 +//line sql.y:580 { yyVAL.tableNames = TableNames{yyDollar[1].tableName} } case 59: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:581 +//line sql.y:584 { yyVAL.tableNames = append(yyVAL.tableNames, yyDollar[3].tableName) } case 60: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:586 +//line sql.y:589 { yyVAL.partitions = nil } case 61: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:590 +//line sql.y:593 { yyVAL.partitions = yyDollar[3].partitions } case 62: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:596 +//line sql.y:599 { yyVAL.statement = &Set{Comments: Comments(yyDollar[2].bytes2), Exprs: yyDollar[3].setExprs} } case 63: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:602 +//line sql.y:605 { 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:606 +//line sql.y:609 { 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:612 +//line sql.y:615 { yyVAL.characteristics = []Characteristic{yyDollar[1].characteristic} } case 66: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:616 +//line sql.y:619 { yyVAL.characteristics = append(yyVAL.characteristics, yyDollar[3].characteristic) } case 67: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:622 +//line sql.y:625 { yyVAL.characteristic = yyDollar[3].isolationLevel } case 68: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:626 +//line sql.y:629 { yyVAL.characteristic = ReadWrite } case 69: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:630 +//line sql.y:633 { yyVAL.characteristic = ReadOnly } case 70: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:636 +//line sql.y:639 { yyVAL.isolationLevel = RepeatableRead } case 71: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:640 +//line sql.y:643 { yyVAL.isolationLevel = ReadCommitted } case 72: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:644 +//line sql.y:647 { yyVAL.isolationLevel = ReadUncommitted } case 73: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:648 +//line sql.y:651 { yyVAL.isolationLevel = Serializable } case 74: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:654 +//line sql.y:657 { yyVAL.scope = SessionScope } case 75: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:658 +//line sql.y:661 { yyVAL.scope = GlobalScope } case 76: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:664 +//line sql.y:667 { yyDollar[1].ddl.TableSpec = yyDollar[2].TableSpec yyVAL.statement = yyDollar[1].ddl } case 77: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:669 +//line sql.y:672 { // Create table [name] like [name] yyDollar[1].ddl.OptLike = yyDollar[2].optLike @@ -4251,139 +4268,139 @@ yydefault: } case 78: yyDollar = yyS[yypt-8 : yypt+1] -//line sql.y:675 +//line sql.y:678 { // 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:680 +//line sql.y:683 { yyVAL.statement = &DDL{Action: CreateDDLAction, Table: yyDollar[3].tableName.ToViewName()} } case 80: yyDollar = yyS[yypt-6 : yypt+1] -//line sql.y:684 +//line sql.y:687 { yyVAL.statement = &DDL{Action: CreateDDLAction, Table: yyDollar[5].tableName.ToViewName()} } case 81: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:688 +//line sql.y:691 { 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:692 +//line sql.y:695 { 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:697 +//line sql.y:700 { yyVAL.colIdent = NewColIdent("") } case 84: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:701 +//line sql.y:704 { yyVAL.colIdent = yyDollar[2].colIdent } case 85: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:707 +//line sql.y:710 { yyVAL.colIdent = yyDollar[1].colIdent } case 86: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:712 +//line sql.y:715 { var v []VindexParam yyVAL.vindexParams = v } case 87: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:717 +//line sql.y:720 { yyVAL.vindexParams = yyDollar[2].vindexParams } case 88: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:723 +//line sql.y:726 { 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:728 +//line sql.y:731 { yyVAL.vindexParams = append(yyVAL.vindexParams, yyDollar[3].vindexParam) } case 90: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:734 +//line sql.y:737 { yyVAL.vindexParam = VindexParam{Key: yyDollar[1].colIdent, Val: yyDollar[3].str} } case 91: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:740 +//line sql.y:743 { yyVAL.ddl = &DDL{Action: CreateDDLAction, Table: yyDollar[4].tableName} setDDL(yylex, yyVAL.ddl) } case 92: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:747 +//line sql.y:750 { yyVAL.TableSpec = yyDollar[2].TableSpec yyVAL.TableSpec.Options = yyDollar[4].str } case 93: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:754 +//line sql.y:757 { yyVAL.optLike = &OptLike{LikeTable: yyDollar[2].tableName} } case 94: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:758 +//line sql.y:761 { yyVAL.optLike = &OptLike{LikeTable: yyDollar[3].tableName} } case 95: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:764 +//line sql.y:767 { yyVAL.TableSpec = &TableSpec{} yyVAL.TableSpec.AddColumn(yyDollar[1].columnDefinition) } case 96: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:769 +//line sql.y:772 { yyVAL.TableSpec.AddColumn(yyDollar[3].columnDefinition) } case 97: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:773 +//line sql.y:776 { yyVAL.TableSpec.AddIndex(yyDollar[3].indexDefinition) } case 98: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:777 +//line sql.y:780 { yyVAL.TableSpec.AddConstraint(yyDollar[3].constraintDefinition) } case 99: yyDollar = yyS[yypt-8 : yypt+1] -//line sql.y:783 +//line sql.y:786 { yyDollar[2].columnType.NotNull = yyDollar[3].boolean yyDollar[2].columnType.Default = yyDollar[4].optVal @@ -4395,7 +4412,7 @@ yydefault: } case 100: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:794 +//line sql.y:797 { yyVAL.columnType = yyDollar[1].columnType yyVAL.columnType.Unsigned = yyDollar[2].boolean @@ -4403,74 +4420,74 @@ yydefault: } case 104: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:805 +//line sql.y:808 { yyVAL.columnType = yyDollar[1].columnType yyVAL.columnType.Length = yyDollar[2].literal } case 105: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:810 +//line sql.y:813 { yyVAL.columnType = yyDollar[1].columnType } case 106: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:816 +//line sql.y:819 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 107: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:820 +//line sql.y:823 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 108: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:824 +//line sql.y:827 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 109: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:828 +//line sql.y:831 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 110: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:832 +//line sql.y:835 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 111: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:836 +//line sql.y:839 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 112: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:840 +//line sql.y:843 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 113: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:844 +//line sql.y:847 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 114: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:848 +//line sql.y:851 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 115: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:854 +//line sql.y:857 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} yyVAL.columnType.Length = yyDollar[2].LengthScaleOption.Length @@ -4478,7 +4495,7 @@ yydefault: } case 116: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:860 +//line sql.y:863 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} yyVAL.columnType.Length = yyDollar[2].LengthScaleOption.Length @@ -4486,7 +4503,7 @@ yydefault: } case 117: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:866 +//line sql.y:869 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} yyVAL.columnType.Length = yyDollar[2].LengthScaleOption.Length @@ -4494,7 +4511,7 @@ yydefault: } case 118: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:872 +//line sql.y:875 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} yyVAL.columnType.Length = yyDollar[2].LengthScaleOption.Length @@ -4502,7 +4519,7 @@ yydefault: } case 119: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:878 +//line sql.y:881 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} yyVAL.columnType.Length = yyDollar[2].LengthScaleOption.Length @@ -4510,206 +4527,206 @@ yydefault: } case 120: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:886 +//line sql.y:889 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 121: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:890 +//line sql.y:893 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].literal} } case 122: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:894 +//line sql.y:897 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].literal} } case 123: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:898 +//line sql.y:901 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].literal} } case 124: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:902 +//line sql.y:905 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 125: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:908 +//line sql.y:911 { 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:912 +//line sql.y:915 { 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:916 +//line sql.y:919 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].literal} } case 128: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:920 +//line sql.y:923 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].literal} } case 129: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:924 +//line sql.y:927 { 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:928 +//line sql.y:931 { 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:932 +//line sql.y:935 { 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:936 +//line sql.y:939 { 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:940 +//line sql.y:943 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 134: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:944 +//line sql.y:947 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 135: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:948 +//line sql.y:951 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 136: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:952 +//line sql.y:955 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 137: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:956 +//line sql.y:959 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 138: yyDollar = yyS[yypt-6 : yypt+1] -//line sql.y:960 +//line sql.y:963 { 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:965 +//line sql.y:968 { 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:971 +//line sql.y:974 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 141: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:975 +//line sql.y:978 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 142: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:979 +//line sql.y:982 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 143: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:983 +//line sql.y:986 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 144: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:987 +//line sql.y:990 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 145: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:991 +//line sql.y:994 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 146: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:995 +//line sql.y:998 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 147: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:999 +//line sql.y:1002 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].bytes)} } case 148: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1005 +//line sql.y:1008 { 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:1010 +//line sql.y:1013 { yyVAL.strs = append(yyDollar[1].strs, "'"+string(yyDollar[3].bytes)+"'") } case 150: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1015 +//line sql.y:1018 { yyVAL.literal = nil } case 151: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1019 +//line sql.y:1022 { yyVAL.literal = NewIntLiteral(yyDollar[2].bytes) } case 152: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1024 +//line sql.y:1027 { yyVAL.LengthScaleOption = LengthScaleOption{} } case 153: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:1028 +//line sql.y:1031 { yyVAL.LengthScaleOption = LengthScaleOption{ Length: NewIntLiteral(yyDollar[2].bytes), @@ -4718,13 +4735,13 @@ yydefault: } case 154: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1036 +//line sql.y:1039 { yyVAL.LengthScaleOption = LengthScaleOption{} } case 155: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1040 +//line sql.y:1043 { yyVAL.LengthScaleOption = LengthScaleOption{ Length: NewIntLiteral(yyDollar[2].bytes), @@ -4732,7 +4749,7 @@ yydefault: } case 156: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:1046 +//line sql.y:1049 { yyVAL.LengthScaleOption = LengthScaleOption{ Length: NewIntLiteral(yyDollar[2].bytes), @@ -4741,508 +4758,508 @@ yydefault: } case 157: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1054 +//line sql.y:1057 { yyVAL.boolean = false } case 158: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1058 +//line sql.y:1061 { yyVAL.boolean = true } case 159: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1063 +//line sql.y:1066 { yyVAL.boolean = false } case 160: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1067 +//line sql.y:1070 { yyVAL.boolean = true } case 161: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1073 +//line sql.y:1076 { yyVAL.boolean = false } case 162: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1077 +//line sql.y:1080 { yyVAL.boolean = false } case 163: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1081 +//line sql.y:1084 { yyVAL.boolean = true } case 164: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1086 +//line sql.y:1089 { yyVAL.optVal = nil } case 165: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1090 +//line sql.y:1093 { yyVAL.optVal = yyDollar[2].expr } case 166: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1095 +//line sql.y:1098 { yyVAL.optVal = nil } case 167: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1099 +//line sql.y:1102 { yyVAL.optVal = yyDollar[3].expr } case 168: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1104 +//line sql.y:1107 { yyVAL.boolean = false } case 169: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1108 +//line sql.y:1111 { yyVAL.boolean = true } case 170: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1113 +//line sql.y:1116 { yyVAL.str = "" } case 171: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1117 +//line sql.y:1120 { yyVAL.str = string(yyDollar[3].colIdent.String()) } case 172: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1121 +//line sql.y:1124 { yyVAL.str = string(yyDollar[3].bytes) } case 173: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1126 +//line sql.y:1129 { yyVAL.str = "" } case 174: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1130 +//line sql.y:1133 { yyVAL.str = string(yyDollar[2].colIdent.String()) } case 175: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1134 +//line sql.y:1137 { yyVAL.str = string(yyDollar[2].bytes) } case 176: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1139 +//line sql.y:1142 { yyVAL.colKeyOpt = colKeyNone } case 177: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1143 +//line sql.y:1146 { yyVAL.colKeyOpt = colKeyPrimary } case 178: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1147 +//line sql.y:1150 { yyVAL.colKeyOpt = colKey } case 179: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1151 +//line sql.y:1154 { yyVAL.colKeyOpt = colKeyUniqueKey } case 180: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1155 +//line sql.y:1158 { yyVAL.colKeyOpt = colKeyUnique } case 181: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1160 +//line sql.y:1163 { yyVAL.literal = nil } case 182: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1164 +//line sql.y:1167 { yyVAL.literal = NewStrLiteral(yyDollar[2].bytes) } case 183: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:1170 +//line sql.y:1173 { 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:1174 +//line sql.y:1177 { yyVAL.indexDefinition = &IndexDefinition{Info: yyDollar[1].indexInfo, Columns: yyDollar[3].indexColumns} } case 185: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1180 +//line sql.y:1183 { yyVAL.indexOptions = []*IndexOption{yyDollar[1].indexOption} } case 186: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1184 +//line sql.y:1187 { yyVAL.indexOptions = append(yyVAL.indexOptions, yyDollar[2].indexOption) } case 187: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1190 +//line sql.y:1193 { 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:1194 +//line sql.y:1197 { // 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:1199 +//line sql.y:1202 { yyVAL.indexOption = &IndexOption{Name: string(yyDollar[1].bytes), Value: NewStrLiteral(yyDollar[2].bytes)} } case 190: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1205 +//line sql.y:1208 { yyVAL.str = "" } case 191: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1209 +//line sql.y:1212 { yyVAL.str = string(yyDollar[1].bytes) } case 192: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1215 +//line sql.y:1218 { 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:1219 +//line sql.y:1222 { 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:1223 +//line sql.y:1226 { 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:1227 +//line sql.y:1230 { 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:1231 +//line sql.y:1234 { 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:1237 +//line sql.y:1240 { yyVAL.str = string(yyDollar[1].bytes) } case 198: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1241 +//line sql.y:1244 { yyVAL.str = string(yyDollar[1].bytes) } case 199: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1245 +//line sql.y:1248 { yyVAL.str = string(yyDollar[1].bytes) } case 200: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1252 +//line sql.y:1255 { yyVAL.str = string(yyDollar[1].bytes) } case 201: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1256 +//line sql.y:1259 { yyVAL.str = string(yyDollar[1].bytes) } case 202: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1262 +//line sql.y:1265 { yyVAL.str = string(yyDollar[1].bytes) } case 203: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1266 +//line sql.y:1269 { yyVAL.str = string(yyDollar[1].bytes) } case 204: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1271 +//line sql.y:1274 { yyVAL.str = "" } case 205: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1275 +//line sql.y:1278 { yyVAL.str = string(yyDollar[1].colIdent.String()) } case 206: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1281 +//line sql.y:1284 { yyVAL.indexColumns = []*IndexColumn{yyDollar[1].indexColumn} } case 207: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1285 +//line sql.y:1288 { yyVAL.indexColumns = append(yyVAL.indexColumns, yyDollar[3].indexColumn) } case 208: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1291 +//line sql.y:1294 { yyVAL.indexColumn = &IndexColumn{Column: yyDollar[1].colIdent, Length: yyDollar[2].literal} } case 209: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1297 +//line sql.y:1300 { yyVAL.constraintDefinition = &ConstraintDefinition{Name: string(yyDollar[2].colIdent.String()), Details: yyDollar[3].constraintInfo} } case 210: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1301 +//line sql.y:1304 { yyVAL.constraintDefinition = &ConstraintDefinition{Details: yyDollar[1].constraintInfo} } case 211: yyDollar = yyS[yypt-10 : yypt+1] -//line sql.y:1308 +//line sql.y:1311 { 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:1312 +//line sql.y:1315 { 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:1316 +//line sql.y:1319 { 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:1320 +//line sql.y:1323 { 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:1326 +//line sql.y:1329 { yyVAL.ReferenceAction = yyDollar[3].ReferenceAction } case 216: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1332 +//line sql.y:1335 { yyVAL.ReferenceAction = yyDollar[3].ReferenceAction } case 217: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1338 +//line sql.y:1341 { yyVAL.ReferenceAction = Restrict } case 218: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1342 +//line sql.y:1345 { yyVAL.ReferenceAction = Cascade } case 219: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1346 +//line sql.y:1349 { yyVAL.ReferenceAction = NoAction } case 220: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1350 +//line sql.y:1353 { yyVAL.ReferenceAction = SetDefault } case 221: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1354 +//line sql.y:1357 { yyVAL.ReferenceAction = SetNull } case 222: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1359 +//line sql.y:1362 { yyVAL.str = "" } case 223: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1363 +//line sql.y:1366 { yyVAL.str = " " + string(yyDollar[1].str) } case 224: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1367 +//line sql.y:1370 { yyVAL.str = string(yyDollar[1].str) + ", " + string(yyDollar[3].str) } case 225: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1375 +//line sql.y:1378 { yyVAL.str = yyDollar[1].str } case 226: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1379 +//line sql.y:1382 { yyVAL.str = yyDollar[1].str + " " + yyDollar[2].str } case 227: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1383 +//line sql.y:1386 { yyVAL.str = yyDollar[1].str + "=" + yyDollar[3].str } case 228: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1389 +//line sql.y:1392 { yyVAL.str = yyDollar[1].colIdent.String() } case 229: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1393 +//line sql.y:1396 { yyVAL.str = "'" + string(yyDollar[1].bytes) + "'" } case 230: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1397 +//line sql.y:1400 { yyVAL.str = string(yyDollar[1].bytes) } case 231: yyDollar = yyS[yypt-6 : yypt+1] -//line sql.y:1403 +//line sql.y:1406 { yyVAL.statement = &DDL{Action: AlterDDLAction, Table: yyDollar[4].tableName} } case 232: yyDollar = yyS[yypt-7 : yypt+1] -//line sql.y:1407 +//line sql.y:1410 { yyVAL.statement = &DDL{Action: AlterDDLAction, Table: yyDollar[4].tableName} } case 233: yyDollar = yyS[yypt-7 : yypt+1] -//line sql.y:1411 +//line sql.y:1414 { yyVAL.statement = &DDL{Action: AlterDDLAction, Table: yyDollar[4].tableName} } case 234: yyDollar = yyS[yypt-7 : yypt+1] -//line sql.y:1415 +//line sql.y:1418 { // 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:1420 +//line sql.y:1423 { // Rename an index can just be an alter yyVAL.statement = &DDL{Action: AlterDDLAction, Table: yyDollar[4].tableName} } case 236: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1425 +//line sql.y:1428 { yyVAL.statement = &DDL{Action: AlterDDLAction, Table: yyDollar[3].tableName.ToViewName()} } case 237: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:1429 +//line sql.y:1432 { yyVAL.statement = &DDL{Action: AlterDDLAction, Table: yyDollar[4].tableName, PartitionSpec: yyDollar[5].partSpec} } case 238: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1433 +//line sql.y:1436 { yyVAL.statement = &DBDDL{Action: AlterDBDDLAction, DBName: string(yyDollar[3].colIdent.String())} } case 239: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1437 +//line sql.y:1440 { yyVAL.statement = &DBDDL{Action: AlterDBDDLAction, DBName: string(yyDollar[3].colIdent.String())} } case 240: yyDollar = yyS[yypt-7 : yypt+1] -//line sql.y:1441 +//line sql.y:1444 { yyVAL.statement = &DDL{ Action: CreateVindexDDLAction, @@ -5256,7 +5273,7 @@ yydefault: } case 241: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:1453 +//line sql.y:1456 { yyVAL.statement = &DDL{ Action: DropVindexDDLAction, @@ -5268,19 +5285,19 @@ yydefault: } case 242: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:1463 +//line sql.y:1466 { yyVAL.statement = &DDL{Action: AddVschemaTableDDLAction, Table: yyDollar[5].tableName} } case 243: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:1467 +//line sql.y:1470 { yyVAL.statement = &DDL{Action: DropVschemaTableDDLAction, Table: yyDollar[5].tableName} } case 244: yyDollar = yyS[yypt-12 : yypt+1] -//line sql.y:1471 +//line sql.y:1474 { yyVAL.statement = &DDL{ Action: AddColVindexDDLAction, @@ -5295,7 +5312,7 @@ yydefault: } case 245: yyDollar = yyS[yypt-7 : yypt+1] -//line sql.y:1484 +//line sql.y:1487 { yyVAL.statement = &DDL{ Action: DropColVindexDDLAction, @@ -5307,13 +5324,13 @@ yydefault: } case 246: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:1494 +//line sql.y:1497 { yyVAL.statement = &DDL{Action: AddSequenceDDLAction, Table: yyDollar[5].tableName} } case 247: yyDollar = yyS[yypt-9 : yypt+1] -//line sql.y:1498 +//line sql.y:1501 { yyVAL.statement = &DDL{ Action: AddAutoIncDDLAction, @@ -5326,49 +5343,49 @@ yydefault: } case 262: yyDollar = yyS[yypt-7 : yypt+1] -//line sql.y:1527 +//line sql.y:1530 { yyVAL.partSpec = &PartitionSpec{Action: ReorganizeAction, Name: yyDollar[3].colIdent, Definitions: yyDollar[6].partDefs} } case 263: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1533 +//line sql.y:1536 { yyVAL.partDefs = []*PartitionDefinition{yyDollar[1].partDef} } case 264: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1537 +//line sql.y:1540 { yyVAL.partDefs = append(yyDollar[1].partDefs, yyDollar[3].partDef) } case 265: yyDollar = yyS[yypt-8 : yypt+1] -//line sql.y:1543 +//line sql.y:1546 { yyVAL.partDef = &PartitionDefinition{Name: yyDollar[2].colIdent, Limit: yyDollar[7].expr} } case 266: yyDollar = yyS[yypt-8 : yypt+1] -//line sql.y:1547 +//line sql.y:1550 { yyVAL.partDef = &PartitionDefinition{Name: yyDollar[2].colIdent, Maxvalue: true} } case 267: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1553 +//line sql.y:1556 { yyVAL.statement = yyDollar[3].ddl } case 268: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1559 +//line sql.y:1562 { 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:1563 +//line sql.y:1566 { yyVAL.ddl = yyDollar[1].ddl yyVAL.ddl.FromTables = append(yyVAL.ddl.FromTables, yyDollar[3].tableName) @@ -5376,177 +5393,177 @@ yydefault: } case 270: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1571 +//line sql.y:1574 { yyVAL.statement = &DDL{Action: DropDDLAction, FromTables: yyDollar[4].tableNames, IfExists: yyDollar[3].boolean} } case 271: yyDollar = yyS[yypt-6 : yypt+1] -//line sql.y:1575 +//line sql.y:1578 { // 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:1580 +//line sql.y:1583 { 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:1584 +//line sql.y:1587 { 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:1588 +//line sql.y:1591 { 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:1594 +//line sql.y:1597 { yyVAL.statement = &DDL{Action: TruncateDDLAction, Table: yyDollar[3].tableName} } case 276: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1598 +//line sql.y:1601 { yyVAL.statement = &DDL{Action: TruncateDDLAction, Table: yyDollar[2].tableName} } case 277: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1603 +//line sql.y:1606 { yyVAL.statement = &OtherRead{} } case 278: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1609 +//line sql.y:1612 { 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:1614 +//line sql.y:1617 { 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:1619 +//line sql.y:1622 { 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:1624 +//line sql.y:1627 { 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:1629 +//line sql.y:1632 { 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:1633 +//line sql.y:1636 { 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:1637 +//line sql.y:1640 { 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:1641 +//line sql.y:1644 { 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:1645 +//line sql.y:1648 { 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:1649 +//line sql.y:1652 { 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:1654 +//line sql.y:1657 { 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:1659 +//line sql.y:1662 { 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:1664 +//line sql.y:1667 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes), Scope: ImplicitScope} } case 291: yyDollar = yyS[yypt-7 : yypt+1] -//line sql.y:1668 +//line sql.y:1671 { 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:1673 +//line sql.y:1676 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes), Scope: ImplicitScope} } case 293: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1677 +//line sql.y:1680 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes), Scope: ImplicitScope} } case 294: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1681 +//line sql.y:1684 { yyVAL.statement = &Show{Scope: yyDollar[2].scope, Type: string(yyDollar[3].bytes)} } case 295: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1685 +//line sql.y:1688 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes), Scope: ImplicitScope} } case 296: yyDollar = yyS[yypt-7 : yypt+1] -//line sql.y:1689 +//line sql.y:1692 { 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:1694 +//line sql.y:1697 { // this is ugly, but I couldn't find a better way for now if yyDollar[3].str == "processlist" { @@ -5558,56 +5575,56 @@ yydefault: } case 298: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1704 +//line sql.y:1707 { yyVAL.statement = &Show{Scope: yyDollar[2].scope, Type: string(yyDollar[3].bytes)} } case 299: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1708 +//line sql.y:1711 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes), Scope: ImplicitScope} } case 300: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1712 +//line sql.y:1715 { 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:1716 +//line sql.y:1719 { 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:1721 +//line sql.y:1724 { 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:1725 +//line sql.y:1728 { 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:1729 +//line sql.y:1732 { 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:1733 +//line sql.y:1736 { yyVAL.statement = &Show{Type: string(yyDollar[2].bytes), Scope: ImplicitScope} } case 306: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1738 +//line sql.y:1741 { // This should probably be a different type (ShowVitessTopoOpt), but // just getting the thing working for now @@ -5616,806 +5633,806 @@ yydefault: } case 307: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1752 +//line sql.y:1755 { yyVAL.statement = &Show{Type: string(yyDollar[2].colIdent.String()), Scope: ImplicitScope} } case 308: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1758 +//line sql.y:1761 { yyVAL.str = string(yyDollar[1].bytes) } case 309: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1762 +//line sql.y:1765 { yyVAL.str = string(yyDollar[1].bytes) } case 310: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1768 +//line sql.y:1771 { yyVAL.str = string(yyDollar[1].bytes) } case 311: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1772 +//line sql.y:1775 { yyVAL.str = string(yyDollar[1].bytes) } case 312: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1778 +//line sql.y:1781 { yyVAL.str = "" } case 313: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1782 +//line sql.y:1785 { yyVAL.str = "extended " } case 314: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1788 +//line sql.y:1791 { yyVAL.str = "" } case 315: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1792 +//line sql.y:1795 { yyVAL.str = "full " } case 316: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1798 +//line sql.y:1801 { yyVAL.str = string(yyDollar[1].bytes) } case 317: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1802 +//line sql.y:1805 { yyVAL.str = string(yyDollar[1].bytes) } case 318: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1808 +//line sql.y:1811 { yyVAL.str = "" } case 319: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1812 +//line sql.y:1815 { yyVAL.str = yyDollar[2].tableIdent.v } case 320: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1816 +//line sql.y:1819 { yyVAL.str = yyDollar[2].tableIdent.v } case 321: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1822 +//line sql.y:1825 { yyVAL.showFilter = nil } case 322: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1826 +//line sql.y:1829 { yyVAL.showFilter = &ShowFilter{Like: string(yyDollar[2].bytes)} } case 323: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1830 +//line sql.y:1833 { yyVAL.showFilter = &ShowFilter{Filter: yyDollar[2].expr} } case 324: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1836 +//line sql.y:1839 { yyVAL.showFilter = nil } case 325: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1840 +//line sql.y:1843 { yyVAL.showFilter = &ShowFilter{Like: string(yyDollar[2].bytes)} } case 326: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1846 +//line sql.y:1849 { yyVAL.scope = ImplicitScope } case 327: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1850 +//line sql.y:1853 { yyVAL.scope = SessionScope } case 328: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1854 +//line sql.y:1857 { yyVAL.scope = GlobalScope } case 329: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1860 +//line sql.y:1863 { yyVAL.statement = &Use{DBName: yyDollar[2].tableIdent} } case 330: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1864 +//line sql.y:1867 { yyVAL.statement = &Use{DBName: TableIdent{v: ""}} } case 331: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1870 +//line sql.y:1873 { yyVAL.statement = &Begin{} } case 332: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1874 +//line sql.y:1877 { yyVAL.statement = &Begin{} } case 333: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1880 +//line sql.y:1883 { yyVAL.statement = &Commit{} } case 334: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1886 +//line sql.y:1889 { yyVAL.statement = &Rollback{} } case 335: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:1890 +//line sql.y:1893 { yyVAL.statement = &SRollback{Name: yyDollar[5].colIdent} } case 336: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1895 +//line sql.y:1898 { yyVAL.empty = struct{}{} } case 337: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1897 +//line sql.y:1900 { yyVAL.empty = struct{}{} } case 338: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1900 +//line sql.y:1903 { yyVAL.empty = struct{}{} } case 339: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1902 +//line sql.y:1905 { yyVAL.empty = struct{}{} } case 340: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1907 +//line sql.y:1910 { yyVAL.statement = &Savepoint{Name: yyDollar[2].colIdent} } case 341: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1913 +//line sql.y:1916 { yyVAL.statement = &Release{Name: yyDollar[3].colIdent} } case 342: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1918 +//line sql.y:1921 { yyVAL.explainType = EmptyType } case 343: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1922 +//line sql.y:1925 { yyVAL.explainType = JSONType } case 344: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1926 +//line sql.y:1929 { yyVAL.explainType = TreeType } case 345: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1930 +//line sql.y:1933 { yyVAL.explainType = VitessType } case 346: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1934 +//line sql.y:1937 { yyVAL.explainType = TraditionalType } case 347: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1938 +//line sql.y:1941 { yyVAL.explainType = AnalyzeType } case 348: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1944 +//line sql.y:1947 { yyVAL.bytes = yyDollar[1].bytes } case 349: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1948 +//line sql.y:1951 { yyVAL.bytes = yyDollar[1].bytes } case 350: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1952 +//line sql.y:1955 { yyVAL.bytes = yyDollar[1].bytes } case 351: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1958 +//line sql.y:1961 { yyVAL.statement = yyDollar[1].selStmt } case 352: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1962 +//line sql.y:1965 { yyVAL.statement = yyDollar[1].statement } case 353: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1966 +//line sql.y:1969 { yyVAL.statement = yyDollar[1].statement } case 354: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1970 +//line sql.y:1973 { yyVAL.statement = yyDollar[1].statement } case 355: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1975 +//line sql.y:1978 { yyVAL.str = "" } case 356: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1979 +//line sql.y:1982 { yyVAL.str = "" } case 357: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1983 +//line sql.y:1986 { yyVAL.str = "" } case 358: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1989 +//line sql.y:1992 { yyVAL.statement = &OtherRead{} } case 359: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1993 +//line sql.y:1996 { yyVAL.statement = &Explain{Type: yyDollar[2].explainType, Statement: yyDollar[3].statement} } case 360: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1999 +//line sql.y:2002 { yyVAL.statement = &OtherAdmin{} } case 361: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2003 +//line sql.y:2006 { yyVAL.statement = &OtherAdmin{} } case 362: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2007 +//line sql.y:2010 { yyVAL.statement = &OtherAdmin{} } case 363: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2011 +//line sql.y:2014 { yyVAL.statement = &OtherAdmin{} } case 364: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2017 +//line sql.y:2020 { yyVAL.statement = &DDL{Action: FlushDDLAction} } case 365: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2021 +//line sql.y:2024 { setAllowComments(yylex, true) } case 366: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2025 +//line sql.y:2028 { yyVAL.bytes2 = yyDollar[2].bytes2 setAllowComments(yylex, false) } case 367: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2031 +//line sql.y:2034 { yyVAL.bytes2 = nil } case 368: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2035 +//line sql.y:2038 { yyVAL.bytes2 = append(yyDollar[1].bytes2, yyDollar[2].bytes) } case 369: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2041 +//line sql.y:2044 { yyVAL.unionType = UnionBasic } case 370: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2045 +//line sql.y:2048 { yyVAL.unionType = UnionAll } case 371: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2049 +//line sql.y:2052 { yyVAL.unionType = UnionDistinct } case 372: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2054 +//line sql.y:2057 { yyVAL.str = "" } case 373: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2058 +//line sql.y:2061 { yyVAL.str = SQLNoCacheStr } case 374: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2062 +//line sql.y:2065 { yyVAL.str = SQLCacheStr } case 375: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2067 +//line sql.y:2070 { yyVAL.boolean = false } case 376: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2071 +//line sql.y:2074 { yyVAL.boolean = true } case 377: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2075 +//line sql.y:2078 { yyVAL.boolean = true } case 378: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2080 +//line sql.y:2083 { yyVAL.selectExprs = nil } case 379: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2084 +//line sql.y:2087 { yyVAL.selectExprs = yyDollar[1].selectExprs } case 380: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2089 +//line sql.y:2092 { yyVAL.strs = nil } case 381: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2093 +//line sql.y:2096 { yyVAL.strs = []string{yyDollar[1].str} } case 382: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2097 +//line sql.y:2100 { // 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:2101 +//line sql.y:2104 { yyVAL.strs = []string{yyDollar[1].str, yyDollar[2].str, yyDollar[3].str} } case 384: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2105 +//line sql.y:2108 { 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:2111 +//line sql.y:2114 { yyVAL.str = SQLNoCacheStr } case 386: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2115 +//line sql.y:2118 { yyVAL.str = SQLCacheStr } case 387: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2119 +//line sql.y:2122 { yyVAL.str = DistinctStr } case 388: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2123 +//line sql.y:2126 { yyVAL.str = DistinctStr } case 389: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2127 +//line sql.y:2130 { yyVAL.str = StraightJoinHint } case 390: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2131 +//line sql.y:2134 { yyVAL.str = SQLCalcFoundRowsStr } case 391: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2137 +//line sql.y:2140 { yyVAL.selectExprs = SelectExprs{yyDollar[1].selectExpr} } case 392: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2141 +//line sql.y:2144 { yyVAL.selectExprs = append(yyVAL.selectExprs, yyDollar[3].selectExpr) } case 393: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2147 +//line sql.y:2150 { yyVAL.selectExpr = &StarExpr{} } case 394: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2151 +//line sql.y:2154 { yyVAL.selectExpr = &AliasedExpr{Expr: yyDollar[1].expr, As: yyDollar[2].colIdent} } case 395: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2155 +//line sql.y:2158 { yyVAL.selectExpr = &StarExpr{TableName: TableName{Name: yyDollar[1].tableIdent}} } case 396: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:2159 +//line sql.y:2162 { yyVAL.selectExpr = &StarExpr{TableName: TableName{Qualifier: yyDollar[1].tableIdent, Name: yyDollar[3].tableIdent}} } case 397: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2164 +//line sql.y:2167 { yyVAL.colIdent = ColIdent{} } case 398: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2168 +//line sql.y:2171 { yyVAL.colIdent = yyDollar[1].colIdent } case 399: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2172 +//line sql.y:2175 { yyVAL.colIdent = yyDollar[2].colIdent } case 401: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2179 +//line sql.y:2182 { yyVAL.colIdent = NewColIdent(string(yyDollar[1].bytes)) } case 402: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2184 +//line sql.y:2187 { yyVAL.tableExprs = TableExprs{&AliasedTableExpr{Expr: TableName{Name: NewTableIdent("dual")}}} } case 403: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2188 +//line sql.y:2191 { yyVAL.tableExprs = yyDollar[2].tableExprs } case 404: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2194 +//line sql.y:2197 { yyVAL.tableExprs = TableExprs{yyDollar[1].tableExpr} } case 405: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2198 +//line sql.y:2201 { yyVAL.tableExprs = append(yyVAL.tableExprs, yyDollar[3].tableExpr) } case 408: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2208 +//line sql.y:2211 { yyVAL.tableExpr = yyDollar[1].aliasedTableName } case 409: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2212 +//line sql.y:2215 { yyVAL.tableExpr = &AliasedTableExpr{Expr: yyDollar[1].subquery, As: yyDollar[3].tableIdent} } case 410: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2216 +//line sql.y:2219 { yyVAL.tableExpr = &ParenTableExpr{Exprs: yyDollar[2].tableExprs} } case 411: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2222 +//line sql.y:2225 { yyVAL.subquery = &Subquery{yyDollar[2].selStmt} } case 412: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2228 +//line sql.y:2231 { 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:2232 +//line sql.y:2235 { 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:2238 +//line sql.y:2241 { yyVAL.columns = Columns{yyDollar[1].colIdent} } case 415: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2242 +//line sql.y:2245 { yyVAL.columns = append(yyVAL.columns, yyDollar[3].colIdent) } case 416: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2248 +//line sql.y:2251 { yyVAL.partitions = Partitions{yyDollar[1].colIdent} } case 417: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2252 +//line sql.y:2255 { yyVAL.partitions = append(yyVAL.partitions, yyDollar[3].colIdent) } case 418: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2265 +//line sql.y:2268 { 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:2269 +//line sql.y:2272 { 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:2273 +//line sql.y:2276 { 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:2277 +//line sql.y:2280 { 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:2283 +//line sql.y:2286 { yyVAL.joinCondition = JoinCondition{On: yyDollar[2].expr} } case 423: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2285 +//line sql.y:2288 { yyVAL.joinCondition = JoinCondition{Using: yyDollar[3].columns} } case 424: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2289 +//line sql.y:2292 { yyVAL.joinCondition = JoinCondition{} } case 425: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2291 +//line sql.y:2294 { yyVAL.joinCondition = yyDollar[1].joinCondition } case 426: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2295 +//line sql.y:2298 { yyVAL.joinCondition = JoinCondition{} } case 427: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2297 +//line sql.y:2300 { yyVAL.joinCondition = JoinCondition{On: yyDollar[2].expr} } case 428: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2300 +//line sql.y:2303 { yyVAL.empty = struct{}{} } case 429: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2302 +//line sql.y:2305 { yyVAL.empty = struct{}{} } case 430: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2305 +//line sql.y:2308 { yyVAL.tableIdent = NewTableIdent("") } case 431: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2309 +//line sql.y:2312 { yyVAL.tableIdent = yyDollar[1].tableIdent } case 432: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2313 +//line sql.y:2316 { yyVAL.tableIdent = yyDollar[2].tableIdent } case 434: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2320 +//line sql.y:2323 { yyVAL.tableIdent = NewTableIdent(string(yyDollar[1].bytes)) } case 435: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2326 +//line sql.y:2329 { yyVAL.joinType = NormalJoinType } case 436: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2330 +//line sql.y:2333 { yyVAL.joinType = NormalJoinType } case 437: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2334 +//line sql.y:2337 { yyVAL.joinType = NormalJoinType } case 438: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2340 +//line sql.y:2343 { yyVAL.joinType = StraightJoinType } case 439: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2346 +//line sql.y:2349 { yyVAL.joinType = LeftJoinType } case 440: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2350 +//line sql.y:2353 { yyVAL.joinType = LeftJoinType } case 441: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2354 +//line sql.y:2357 { yyVAL.joinType = RightJoinType } case 442: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2358 +//line sql.y:2361 { yyVAL.joinType = RightJoinType } case 443: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2364 +//line sql.y:2367 { yyVAL.joinType = NaturalJoinType } case 444: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2368 +//line sql.y:2371 { if yyDollar[2].joinType == LeftJoinType { yyVAL.joinType = NaturalLeftJoinType @@ -6425,487 +6442,487 @@ yydefault: } case 445: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2378 +//line sql.y:2381 { yyVAL.tableName = yyDollar[2].tableName } case 446: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2382 +//line sql.y:2385 { yyVAL.tableName = yyDollar[1].tableName } case 447: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2388 +//line sql.y:2391 { yyVAL.tableName = TableName{Name: yyDollar[1].tableIdent} } case 448: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2392 +//line sql.y:2395 { yyVAL.tableName = TableName{Qualifier: yyDollar[1].tableIdent, Name: yyDollar[3].tableIdent} } case 449: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2398 +//line sql.y:2401 { yyVAL.tableName = TableName{Name: yyDollar[1].tableIdent} } case 450: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2403 +//line sql.y:2406 { yyVAL.indexHints = nil } case 451: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:2407 +//line sql.y:2410 { yyVAL.indexHints = &IndexHints{Type: UseOp, Indexes: yyDollar[4].columns} } case 452: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2411 +//line sql.y:2414 { yyVAL.indexHints = &IndexHints{Type: UseOp} } case 453: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:2415 +//line sql.y:2418 { yyVAL.indexHints = &IndexHints{Type: IgnoreOp, Indexes: yyDollar[4].columns} } case 454: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:2419 +//line sql.y:2422 { yyVAL.indexHints = &IndexHints{Type: ForceOp, Indexes: yyDollar[4].columns} } case 455: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2424 +//line sql.y:2427 { yyVAL.expr = nil } case 456: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2428 +//line sql.y:2431 { yyVAL.expr = yyDollar[2].expr } case 457: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2434 +//line sql.y:2437 { yyVAL.expr = yyDollar[1].expr } case 458: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2438 +//line sql.y:2441 { yyVAL.expr = &AndExpr{Left: yyDollar[1].expr, Right: yyDollar[3].expr} } case 459: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2442 +//line sql.y:2445 { yyVAL.expr = &OrExpr{Left: yyDollar[1].expr, Right: yyDollar[3].expr} } case 460: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2446 +//line sql.y:2449 { yyVAL.expr = &XorExpr{Left: yyDollar[1].expr, Right: yyDollar[3].expr} } case 461: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2450 +//line sql.y:2453 { yyVAL.expr = &NotExpr{Expr: yyDollar[2].expr} } case 462: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2454 +//line sql.y:2457 { yyVAL.expr = &IsExpr{Operator: yyDollar[3].isExprOperator, Expr: yyDollar[1].expr} } case 463: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2458 +//line sql.y:2461 { yyVAL.expr = yyDollar[1].expr } case 464: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2462 +//line sql.y:2465 { yyVAL.expr = &Default{ColName: yyDollar[2].str} } case 465: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2468 +//line sql.y:2471 { yyVAL.str = "" } case 466: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2472 +//line sql.y:2475 { yyVAL.str = string(yyDollar[2].colIdent.String()) } case 467: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2478 +//line sql.y:2481 { yyVAL.boolVal = BoolVal(true) } case 468: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2482 +//line sql.y:2485 { yyVAL.boolVal = BoolVal(false) } case 469: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2488 +//line sql.y:2491 { 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:2492 +//line sql.y:2495 { yyVAL.expr = &ComparisonExpr{Left: yyDollar[1].expr, Operator: InOp, Right: yyDollar[3].colTuple} } case 471: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2496 +//line sql.y:2499 { yyVAL.expr = &ComparisonExpr{Left: yyDollar[1].expr, Operator: NotInOp, Right: yyDollar[4].colTuple} } case 472: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2500 +//line sql.y:2503 { 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:2504 +//line sql.y:2507 { 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:2508 +//line sql.y:2511 { yyVAL.expr = &ComparisonExpr{Left: yyDollar[1].expr, Operator: RegexpOp, Right: yyDollar[3].expr} } case 475: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2512 +//line sql.y:2515 { yyVAL.expr = &ComparisonExpr{Left: yyDollar[1].expr, Operator: NotRegexpOp, Right: yyDollar[4].expr} } case 476: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:2516 +//line sql.y:2519 { 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:2520 +//line sql.y:2523 { 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:2524 +//line sql.y:2527 { yyVAL.expr = &ExistsExpr{Subquery: yyDollar[2].subquery} } case 479: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2530 +//line sql.y:2533 { yyVAL.isExprOperator = IsNullOp } case 480: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2534 +//line sql.y:2537 { yyVAL.isExprOperator = IsNotNullOp } case 481: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2538 +//line sql.y:2541 { yyVAL.isExprOperator = IsTrueOp } case 482: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2542 +//line sql.y:2545 { yyVAL.isExprOperator = IsNotTrueOp } case 483: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2546 +//line sql.y:2549 { yyVAL.isExprOperator = IsFalseOp } case 484: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2550 +//line sql.y:2553 { yyVAL.isExprOperator = IsNotFalseOp } case 485: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2556 +//line sql.y:2559 { yyVAL.comparisonExprOperator = EqualOp } case 486: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2560 +//line sql.y:2563 { yyVAL.comparisonExprOperator = LessThanOp } case 487: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2564 +//line sql.y:2567 { yyVAL.comparisonExprOperator = GreaterThanOp } case 488: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2568 +//line sql.y:2571 { yyVAL.comparisonExprOperator = LessEqualOp } case 489: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2572 +//line sql.y:2575 { yyVAL.comparisonExprOperator = GreaterEqualOp } case 490: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2576 +//line sql.y:2579 { yyVAL.comparisonExprOperator = NotEqualOp } case 491: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2580 +//line sql.y:2583 { yyVAL.comparisonExprOperator = NullSafeEqualOp } case 492: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2585 +//line sql.y:2588 { yyVAL.expr = nil } case 493: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2589 +//line sql.y:2592 { yyVAL.expr = yyDollar[2].expr } case 494: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2595 +//line sql.y:2598 { yyVAL.colTuple = yyDollar[1].valTuple } case 495: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2599 +//line sql.y:2602 { yyVAL.colTuple = yyDollar[1].subquery } case 496: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2603 +//line sql.y:2606 { yyVAL.colTuple = ListArg(yyDollar[1].bytes) } case 497: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2609 +//line sql.y:2612 { yyVAL.subquery = &Subquery{yyDollar[2].selStmt} } case 498: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2615 +//line sql.y:2618 { yyVAL.exprs = Exprs{yyDollar[1].expr} } case 499: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2619 +//line sql.y:2622 { yyVAL.exprs = append(yyDollar[1].exprs, yyDollar[3].expr) } case 500: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2625 +//line sql.y:2628 { yyVAL.expr = yyDollar[1].expr } case 501: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2629 +//line sql.y:2632 { yyVAL.expr = yyDollar[1].boolVal } case 502: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2633 +//line sql.y:2636 { yyVAL.expr = yyDollar[1].colName } case 503: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2637 +//line sql.y:2640 { yyVAL.expr = yyDollar[1].expr } case 504: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2641 +//line sql.y:2644 { yyVAL.expr = yyDollar[1].subquery } case 505: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2645 +//line sql.y:2648 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: BitAndOp, Right: yyDollar[3].expr} } case 506: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2649 +//line sql.y:2652 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: BitOrOp, Right: yyDollar[3].expr} } case 507: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2653 +//line sql.y:2656 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: BitXorOp, Right: yyDollar[3].expr} } case 508: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2657 +//line sql.y:2660 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: PlusOp, Right: yyDollar[3].expr} } case 509: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2661 +//line sql.y:2664 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: MinusOp, Right: yyDollar[3].expr} } case 510: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2665 +//line sql.y:2668 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: MultOp, Right: yyDollar[3].expr} } case 511: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2669 +//line sql.y:2672 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: DivOp, Right: yyDollar[3].expr} } case 512: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2673 +//line sql.y:2676 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: IntDivOp, Right: yyDollar[3].expr} } case 513: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2677 +//line sql.y:2680 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: ModOp, Right: yyDollar[3].expr} } case 514: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2681 +//line sql.y:2684 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: ModOp, Right: yyDollar[3].expr} } case 515: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2685 +//line sql.y:2688 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: ShiftLeftOp, Right: yyDollar[3].expr} } case 516: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2689 +//line sql.y:2692 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: ShiftRightOp, Right: yyDollar[3].expr} } case 517: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2693 +//line sql.y:2696 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].colName, Operator: JSONExtractOp, Right: yyDollar[3].expr} } case 518: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2697 +//line sql.y:2700 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].colName, Operator: JSONUnquoteExtractOp, Right: yyDollar[3].expr} } case 519: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2701 +//line sql.y:2704 { yyVAL.expr = &CollateExpr{Expr: yyDollar[1].expr, Charset: yyDollar[3].str} } case 520: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2705 +//line sql.y:2708 { yyVAL.expr = &UnaryExpr{Operator: BinaryOp, Expr: yyDollar[2].expr} } case 521: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2709 +//line sql.y:2712 { yyVAL.expr = &UnaryExpr{Operator: UBinaryOp, Expr: yyDollar[2].expr} } case 522: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2713 +//line sql.y:2716 { yyVAL.expr = &UnaryExpr{Operator: Utf8Op, Expr: yyDollar[2].expr} } case 523: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2717 +//line sql.y:2720 { yyVAL.expr = &UnaryExpr{Operator: Utf8mb4Op, Expr: yyDollar[2].expr} } case 524: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2721 +//line sql.y:2724 { yyVAL.expr = &UnaryExpr{Operator: Latin1Op, Expr: yyDollar[2].expr} } case 525: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2725 +//line sql.y:2728 { if num, ok := yyDollar[2].expr.(*Literal); ok && num.Type == IntVal { yyVAL.expr = num @@ -6915,7 +6932,7 @@ yydefault: } case 526: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2733 +//line sql.y:2736 { if num, ok := yyDollar[2].expr.(*Literal); ok && num.Type == IntVal { // Handle double negative @@ -6931,19 +6948,19 @@ yydefault: } case 527: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2747 +//line sql.y:2750 { yyVAL.expr = &UnaryExpr{Operator: TildaOp, Expr: yyDollar[2].expr} } case 528: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2751 +//line sql.y:2754 { yyVAL.expr = &UnaryExpr{Operator: BangOp, Expr: yyDollar[2].expr} } case 529: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2755 +//line sql.y:2758 { // This rule prevents the usage of INTERVAL // as a function. If support is needed for that, @@ -6953,325 +6970,325 @@ yydefault: } case 534: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2773 +//line sql.y:2776 { yyVAL.expr = &FuncExpr{Name: yyDollar[1].colIdent, Exprs: yyDollar[3].selectExprs} } case 535: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:2777 +//line sql.y:2780 { yyVAL.expr = &FuncExpr{Name: yyDollar[1].colIdent, Distinct: true, Exprs: yyDollar[4].selectExprs} } case 536: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:2781 +//line sql.y:2784 { yyVAL.expr = &FuncExpr{Name: yyDollar[1].colIdent, Distinct: true, Exprs: yyDollar[4].selectExprs} } case 537: yyDollar = yyS[yypt-6 : yypt+1] -//line sql.y:2785 +//line sql.y:2788 { 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:2795 +//line sql.y:2798 { yyVAL.expr = &FuncExpr{Name: NewColIdent("left"), Exprs: yyDollar[3].selectExprs} } case 539: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2799 +//line sql.y:2802 { yyVAL.expr = &FuncExpr{Name: NewColIdent("right"), Exprs: yyDollar[3].selectExprs} } case 540: yyDollar = yyS[yypt-6 : yypt+1] -//line sql.y:2803 +//line sql.y:2806 { yyVAL.expr = &ConvertExpr{Expr: yyDollar[3].expr, Type: yyDollar[5].convertType} } case 541: yyDollar = yyS[yypt-6 : yypt+1] -//line sql.y:2807 +//line sql.y:2810 { yyVAL.expr = &ConvertExpr{Expr: yyDollar[3].expr, Type: yyDollar[5].convertType} } case 542: yyDollar = yyS[yypt-6 : yypt+1] -//line sql.y:2811 +//line sql.y:2814 { yyVAL.expr = &ConvertUsingExpr{Expr: yyDollar[3].expr, Type: yyDollar[5].str} } case 543: yyDollar = yyS[yypt-8 : yypt+1] -//line sql.y:2815 +//line sql.y:2818 { 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:2819 +//line sql.y:2822 { 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:2823 +//line sql.y:2826 { 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:2827 +//line sql.y:2830 { 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:2831 +//line sql.y:2834 { 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:2835 +//line sql.y:2838 { 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:2839 +//line sql.y:2842 { 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:2843 +//line sql.y:2846 { yyVAL.expr = &ValuesFuncExpr{Name: yyDollar[3].colName} } case 551: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2853 +//line sql.y:2856 { yyVAL.expr = &FuncExpr{Name: NewColIdent("current_timestamp")} } case 552: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2857 +//line sql.y:2860 { yyVAL.expr = &FuncExpr{Name: NewColIdent("utc_timestamp")} } case 553: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2861 +//line sql.y:2864 { yyVAL.expr = &FuncExpr{Name: NewColIdent("utc_time")} } case 554: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2866 +//line sql.y:2869 { yyVAL.expr = &FuncExpr{Name: NewColIdent("utc_date")} } case 555: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2871 +//line sql.y:2874 { yyVAL.expr = &FuncExpr{Name: NewColIdent("localtime")} } case 556: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2876 +//line sql.y:2879 { yyVAL.expr = &FuncExpr{Name: NewColIdent("localtimestamp")} } case 557: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2882 +//line sql.y:2885 { yyVAL.expr = &FuncExpr{Name: NewColIdent("current_date")} } case 558: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2887 +//line sql.y:2890 { yyVAL.expr = &FuncExpr{Name: NewColIdent("current_time")} } case 559: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2892 +//line sql.y:2895 { yyVAL.expr = &CurTimeFuncExpr{Name: NewColIdent("current_timestamp"), Fsp: yyDollar[2].expr} } case 560: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2896 +//line sql.y:2899 { yyVAL.expr = &CurTimeFuncExpr{Name: NewColIdent("utc_timestamp"), Fsp: yyDollar[2].expr} } case 561: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2900 +//line sql.y:2903 { yyVAL.expr = &CurTimeFuncExpr{Name: NewColIdent("utc_time"), Fsp: yyDollar[2].expr} } case 562: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2905 +//line sql.y:2908 { yyVAL.expr = &CurTimeFuncExpr{Name: NewColIdent("localtime"), Fsp: yyDollar[2].expr} } case 563: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2910 +//line sql.y:2913 { yyVAL.expr = &CurTimeFuncExpr{Name: NewColIdent("localtimestamp"), Fsp: yyDollar[2].expr} } case 564: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2915 +//line sql.y:2918 { yyVAL.expr = &CurTimeFuncExpr{Name: NewColIdent("current_time"), Fsp: yyDollar[2].expr} } case 565: yyDollar = yyS[yypt-8 : yypt+1] -//line sql.y:2919 +//line sql.y:2922 { 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:2923 +//line sql.y:2926 { 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:2933 +//line sql.y:2936 { yyVAL.expr = yyDollar[2].expr } case 570: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2943 +//line sql.y:2946 { yyVAL.expr = &FuncExpr{Name: NewColIdent("if"), Exprs: yyDollar[3].selectExprs} } case 571: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2947 +//line sql.y:2950 { yyVAL.expr = &FuncExpr{Name: NewColIdent("database"), Exprs: yyDollar[3].selectExprs} } case 572: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2951 +//line sql.y:2954 { yyVAL.expr = &FuncExpr{Name: NewColIdent("schema"), Exprs: yyDollar[3].selectExprs} } case 573: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2955 +//line sql.y:2958 { yyVAL.expr = &FuncExpr{Name: NewColIdent("mod"), Exprs: yyDollar[3].selectExprs} } case 574: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2959 +//line sql.y:2962 { yyVAL.expr = &FuncExpr{Name: NewColIdent("replace"), Exprs: yyDollar[3].selectExprs} } case 575: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2963 +//line sql.y:2966 { yyVAL.expr = &FuncExpr{Name: NewColIdent("substr"), Exprs: yyDollar[3].selectExprs} } case 576: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2967 +//line sql.y:2970 { yyVAL.expr = &FuncExpr{Name: NewColIdent("substr"), Exprs: yyDollar[3].selectExprs} } case 577: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2973 +//line sql.y:2976 { yyVAL.matchExprOption = NoOption } case 578: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2977 +//line sql.y:2980 { yyVAL.matchExprOption = BooleanModeOpt } case 579: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2981 +//line sql.y:2984 { yyVAL.matchExprOption = NaturalLanguageModeOpt } case 580: yyDollar = yyS[yypt-7 : yypt+1] -//line sql.y:2985 +//line sql.y:2988 { yyVAL.matchExprOption = NaturalLanguageModeWithQueryExpansionOpt } case 581: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2989 +//line sql.y:2992 { yyVAL.matchExprOption = QueryExpansionOpt } case 582: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2995 +//line sql.y:2998 { yyVAL.str = string(yyDollar[1].colIdent.String()) } case 583: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2999 +//line sql.y:3002 { yyVAL.str = string(yyDollar[1].bytes) } case 584: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3005 +//line sql.y:3008 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].literal} } case 585: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3009 +//line sql.y:3012 { 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:3013 +//line sql.y:3016 { 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:3017 +//line sql.y:3020 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes)} } case 588: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3021 +//line sql.y:3024 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].literal} } case 589: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3025 +//line sql.y:3028 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes)} yyVAL.convertType.Length = yyDollar[2].LengthScaleOption.Length @@ -7279,169 +7296,169 @@ yydefault: } case 590: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3031 +//line sql.y:3034 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes)} } case 591: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3035 +//line sql.y:3038 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].literal} } case 592: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3039 +//line sql.y:3042 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes)} } case 593: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3043 +//line sql.y:3046 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes)} } case 594: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3047 +//line sql.y:3050 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].literal} } case 595: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3051 +//line sql.y:3054 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes)} } case 596: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3055 +//line sql.y:3058 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes)} } case 597: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3060 +//line sql.y:3063 { yyVAL.expr = nil } case 598: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3064 +//line sql.y:3067 { yyVAL.expr = yyDollar[1].expr } case 599: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3069 +//line sql.y:3072 { yyVAL.str = string("") } case 600: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3073 +//line sql.y:3076 { yyVAL.str = " separator '" + string(yyDollar[2].bytes) + "'" } case 601: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3079 +//line sql.y:3082 { yyVAL.whens = []*When{yyDollar[1].when} } case 602: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3083 +//line sql.y:3086 { yyVAL.whens = append(yyDollar[1].whens, yyDollar[2].when) } case 603: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:3089 +//line sql.y:3092 { yyVAL.when = &When{Cond: yyDollar[2].expr, Val: yyDollar[4].expr} } case 604: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3094 +//line sql.y:3097 { yyVAL.expr = nil } case 605: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3098 +//line sql.y:3101 { yyVAL.expr = yyDollar[2].expr } case 606: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3104 +//line sql.y:3107 { yyVAL.colName = &ColName{Name: yyDollar[1].colIdent} } case 607: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3108 +//line sql.y:3111 { yyVAL.colName = &ColName{Qualifier: TableName{Name: yyDollar[1].tableIdent}, Name: yyDollar[3].colIdent} } case 608: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:3112 +//line sql.y:3115 { 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:3118 +//line sql.y:3121 { yyVAL.expr = NewStrLiteral(yyDollar[1].bytes) } case 610: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3122 +//line sql.y:3125 { yyVAL.expr = NewHexLiteral(yyDollar[1].bytes) } case 611: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3126 +//line sql.y:3129 { yyVAL.expr = NewBitLiteral(yyDollar[1].bytes) } case 612: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3130 +//line sql.y:3133 { yyVAL.expr = NewIntLiteral(yyDollar[1].bytes) } case 613: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3134 +//line sql.y:3137 { yyVAL.expr = NewFloatLiteral(yyDollar[1].bytes) } case 614: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3138 +//line sql.y:3141 { yyVAL.expr = NewHexNumLiteral(yyDollar[1].bytes) } case 615: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3142 +//line sql.y:3145 { yyVAL.expr = NewArgument(yyDollar[1].bytes) } case 616: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3146 +//line sql.y:3149 { yyVAL.expr = &NullVal{} } case 617: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3152 +//line sql.y:3155 { // TODO(sougou): Deprecate this construct. if yyDollar[1].colIdent.Lowered() != "value" { @@ -7452,223 +7469,235 @@ yydefault: } case 618: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3161 +//line sql.y:3164 { yyVAL.expr = NewIntLiteral(yyDollar[1].bytes) } case 619: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3165 +//line sql.y:3168 { yyVAL.expr = NewArgument(yyDollar[1].bytes) } case 620: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3170 +//line sql.y:3173 { yyVAL.exprs = nil } case 621: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3174 +//line sql.y:3177 { yyVAL.exprs = yyDollar[3].exprs } case 622: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3179 +//line sql.y:3182 { yyVAL.expr = nil } case 623: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3183 +//line sql.y:3186 { yyVAL.expr = yyDollar[2].expr } case 624: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3188 +//line sql.y:3191 { yyVAL.orderBy = nil } case 625: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3192 +//line sql.y:3195 { yyVAL.orderBy = yyDollar[3].orderBy } case 626: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3198 +//line sql.y:3201 { yyVAL.orderBy = OrderBy{yyDollar[1].order} } case 627: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3202 +//line sql.y:3205 { yyVAL.orderBy = append(yyDollar[1].orderBy, yyDollar[3].order) } case 628: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3208 +//line sql.y:3211 { yyVAL.order = &Order{Expr: yyDollar[1].expr, Direction: yyDollar[2].orderDirection} } case 629: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3213 +//line sql.y:3216 { yyVAL.orderDirection = AscOrder } case 630: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3217 +//line sql.y:3220 { yyVAL.orderDirection = AscOrder } case 631: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3221 +//line sql.y:3224 { yyVAL.orderDirection = DescOrder } case 632: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3226 +//line sql.y:3229 { yyVAL.limit = nil } case 633: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3230 +//line sql.y:3233 { yyVAL.limit = &Limit{Rowcount: yyDollar[2].expr} } case 634: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:3234 +//line sql.y:3237 { yyVAL.limit = &Limit{Offset: yyDollar[2].expr, Rowcount: yyDollar[4].expr} } case 635: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:3238 +//line sql.y:3241 { yyVAL.limit = &Limit{Offset: yyDollar[4].expr, Rowcount: yyDollar[2].expr} } case 636: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3243 +//line sql.y:3246 { yyVAL.lock = NoLock } case 637: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3247 +//line sql.y:3250 { yyVAL.lock = ForUpdateLock } case 638: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:3251 +//line sql.y:3254 { yyVAL.lock = ShareModeLock } case 639: + yyDollar = yyS[yypt-0 : yypt+1] +//line sql.y:3259 + { + yyVAL.str = "" + } + case 640: + yyDollar = yyS[yypt-4 : yypt+1] +//line sql.y:3263 + { + yyVAL.str = string(yyDollar[4].bytes) + } + case 641: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3264 +//line sql.y:3276 { yyVAL.ins = &Insert{Rows: yyDollar[2].values} } - case 640: + case 642: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3268 +//line sql.y:3280 { yyVAL.ins = &Insert{Rows: yyDollar[1].selStmt} } - case 641: + case 643: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:3272 +//line sql.y:3284 { yyVAL.ins = &Insert{Columns: yyDollar[2].columns, Rows: yyDollar[5].values} } - case 642: + case 644: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:3276 +//line sql.y:3288 { yyVAL.ins = &Insert{Columns: yyDollar[2].columns, Rows: yyDollar[4].selStmt} } - case 643: + case 645: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3282 +//line sql.y:3294 { yyVAL.columns = Columns{yyDollar[1].colIdent} } - case 644: + case 646: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3286 +//line sql.y:3298 { yyVAL.columns = Columns{yyDollar[3].colIdent} } - case 645: + case 647: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3290 +//line sql.y:3302 { yyVAL.columns = append(yyVAL.columns, yyDollar[3].colIdent) } - case 646: + case 648: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:3294 +//line sql.y:3306 { yyVAL.columns = append(yyVAL.columns, yyDollar[5].colIdent) } - case 647: + case 649: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3299 +//line sql.y:3311 { yyVAL.updateExprs = nil } - case 648: + case 650: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:3303 +//line sql.y:3315 { yyVAL.updateExprs = yyDollar[5].updateExprs } - case 649: + case 651: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3309 +//line sql.y:3321 { yyVAL.values = Values{yyDollar[1].valTuple} } - case 650: + case 652: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3313 +//line sql.y:3325 { yyVAL.values = append(yyDollar[1].values, yyDollar[3].valTuple) } - case 651: + case 653: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3319 +//line sql.y:3331 { yyVAL.valTuple = yyDollar[1].valTuple } - case 652: + case 654: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3323 +//line sql.y:3335 { yyVAL.valTuple = ValTuple{} } - case 653: + case 655: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3329 +//line sql.y:3341 { yyVAL.valTuple = ValTuple(yyDollar[2].exprs) } - case 654: + case 656: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3335 +//line sql.y:3347 { if len(yyDollar[1].valTuple) == 1 { yyVAL.expr = yyDollar[1].valTuple[0] @@ -7676,319 +7705,319 @@ yydefault: yyVAL.expr = yyDollar[1].valTuple } } - case 655: + case 657: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3345 +//line sql.y:3357 { yyVAL.updateExprs = UpdateExprs{yyDollar[1].updateExpr} } - case 656: + case 658: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3349 +//line sql.y:3361 { yyVAL.updateExprs = append(yyDollar[1].updateExprs, yyDollar[3].updateExpr) } - case 657: + case 659: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3355 +//line sql.y:3367 { yyVAL.updateExpr = &UpdateExpr{Name: yyDollar[1].colName, Expr: yyDollar[3].expr} } - case 658: + case 660: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3361 +//line sql.y:3373 { yyVAL.setExprs = SetExprs{yyDollar[1].setExpr} } - case 659: + case 661: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3365 +//line sql.y:3377 { yyVAL.setExprs = append(yyDollar[1].setExprs, yyDollar[3].setExpr) } - case 660: + case 662: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3371 +//line sql.y:3383 { 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:3375 +//line sql.y:3387 { 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:3379 +//line sql.y:3391 { 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:3383 +//line sql.y:3395 { 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:3387 +//line sql.y:3399 { 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:3395 +//line sql.y:3407 { yyVAL.bytes = []byte("charset") } - case 668: + case 670: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3402 +//line sql.y:3414 { yyVAL.expr = NewStrLiteral([]byte(yyDollar[1].colIdent.String())) } - case 669: + case 671: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3406 +//line sql.y:3418 { yyVAL.expr = NewStrLiteral(yyDollar[1].bytes) } - case 670: + case 672: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3410 +//line sql.y:3422 { yyVAL.expr = &Default{} } - case 673: + case 675: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3419 +//line sql.y:3431 { yyVAL.boolean = false } - case 674: + case 676: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3421 +//line sql.y:3433 { yyVAL.boolean = true } - case 675: + case 677: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3424 +//line sql.y:3436 { yyVAL.boolean = false } - case 676: + case 678: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3426 +//line sql.y:3438 { yyVAL.boolean = true } - case 677: + case 679: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3429 +//line sql.y:3441 { yyVAL.ignore = false } - case 678: - yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3431 - { - yyVAL.ignore = true - } - case 679: - yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3435 - { - yyVAL.empty = struct{}{} - } case 680: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3437 +//line sql.y:3443 { - yyVAL.empty = struct{}{} + yyVAL.ignore = true } case 681: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3439 +//line sql.y:3447 { yyVAL.empty = struct{}{} } case 682: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3441 +//line sql.y:3449 { yyVAL.empty = struct{}{} } case 683: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3443 +//line sql.y:3451 { yyVAL.empty = struct{}{} } case 684: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3445 +//line sql.y:3453 { yyVAL.empty = struct{}{} } case 685: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3447 +//line sql.y:3455 { yyVAL.empty = struct{}{} } case 686: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3449 +//line sql.y:3457 { yyVAL.empty = struct{}{} } case 687: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3451 +//line sql.y:3459 { yyVAL.empty = struct{}{} } case 688: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3453 +//line sql.y:3461 { yyVAL.empty = struct{}{} } case 689: - yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3456 + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:3463 { yyVAL.empty = struct{}{} } case 690: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3458 +//line sql.y:3465 { yyVAL.empty = struct{}{} } case 691: - yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3460 + yyDollar = yyS[yypt-0 : yypt+1] +//line sql.y:3468 { yyVAL.empty = struct{}{} } case 692: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3464 +//line sql.y:3470 { yyVAL.empty = struct{}{} } case 693: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3466 +//line sql.y:3472 { yyVAL.empty = struct{}{} } case 694: - yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3469 + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:3476 { yyVAL.empty = struct{}{} } case 695: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3471 +//line sql.y:3478 { yyVAL.empty = struct{}{} } case 696: - yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3473 + yyDollar = yyS[yypt-0 : yypt+1] +//line sql.y:3481 { yyVAL.empty = struct{}{} } case 697: + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:3483 + { + yyVAL.empty = struct{}{} + } + case 698: + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:3485 + { + yyVAL.empty = struct{}{} + } + case 699: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3476 +//line sql.y:3488 { yyVAL.colIdent = ColIdent{} } - case 698: + case 700: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3478 +//line sql.y:3490 { yyVAL.colIdent = yyDollar[2].colIdent } - case 699: + case 701: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3482 +//line sql.y:3494 { yyVAL.colIdent = yyDollar[1].colIdent } - case 700: + case 702: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3486 +//line sql.y:3498 { yyVAL.colIdent = NewColIdent(string(yyDollar[1].bytes)) } - case 702: + case 704: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3493 +//line sql.y:3505 { yyVAL.colIdent = NewColIdent(string(yyDollar[1].bytes)) } - case 703: + case 705: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3499 +//line sql.y:3511 { yyVAL.tableIdent = NewTableIdent(string(yyDollar[1].colIdent.String())) } - case 704: + case 706: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3503 +//line sql.y:3515 { yyVAL.tableIdent = NewTableIdent(string(yyDollar[1].bytes)) } - case 706: + case 708: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3510 +//line sql.y:3522 { yyVAL.tableIdent = NewTableIdent(string(yyDollar[1].bytes)) } - case 1005: + case 1009: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3834 +//line sql.y:3848 { if incNesting(yylex) { yylex.Error("max nesting level reached") return 1 } } - case 1006: + case 1010: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3843 +//line sql.y:3857 { decNesting(yylex) } - case 1007: + case 1011: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3848 +//line sql.y:3862 { skipToEnd(yylex) } - case 1008: + case 1012: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3853 +//line sql.y:3867 { skipToEnd(yylex) } - case 1009: + case 1013: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3857 +//line sql.y:3871 { skipToEnd(yylex) } - case 1010: + case 1014: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3861 +//line sql.y:3875 { skipToEnd(yylex) } diff --git a/go/vt/sqlparser/sql.y b/go/vt/sqlparser/sql.y index 74ce3774db8..6355eaaf64a 100644 --- a/go/vt/sqlparser/sql.y +++ b/go/vt/sqlparser/sql.y @@ -137,6 +137,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 @@ -286,6 +287,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 @@ -417,12 +419,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 @@ -3252,6 +3255,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: @@ -3604,6 +3616,7 @@ reserved_keyword: | OR | ORDER | OUTER +| OUTFILE | OVER | PERCENT_RANK | RANK @@ -3776,6 +3789,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, From fab84a1a6dcf9c54e16fa0d6c97e73db203b6e18 Mon Sep 17 00:00:00 2001 From: Rohit Nayak Date: Sat, 3 Oct 2020 15:05:52 +0200 Subject: [PATCH 11/19] Update tests. Add tables to vschema for unsharded. More logs esp. for errors. 2 tests skipped for now. Signed-off-by: Rohit Nayak --- go/vt/discovery/tablet_picker.go | 1 - go/vt/mysqlctl/schema.go | 10 +- go/vt/vttablet/tabletserver/schema/engine.go | 5 + .../tabletserver/vstreamer/planbuilder.go | 4 + .../tabletserver/vstreamer/rowstreamer.go | 4 +- go/vt/wrangler/fake_dbclient_test.go | 22 +++- go/vt/wrangler/keyspace.go | 10 +- go/vt/wrangler/materializer.go | 48 ++++---- go/vt/wrangler/materializer_env_test.go | 2 +- go/vt/wrangler/materializer_test.go | 112 ++++++++++++------ go/vt/wrangler/resharder.go | 50 +------- go/vt/wrangler/resharder_env_test.go | 18 ++- go/vt/wrangler/resharder_test.go | 49 ++++++-- go/vt/wrangler/stream_migrater_test.go | 30 ++++- go/vt/wrangler/traffic_switcher.go | 30 ++--- go/vt/wrangler/traffic_switcher_env_test.go | 14 +++ go/vt/wrangler/traffic_switcher_test.go | 86 +++++++++++--- 17 files changed, 326 insertions(+), 169 deletions(-) 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 a90ed76943d..adba9f5926e 100644 --- a/go/vt/mysqlctl/schema.go +++ b/go/vt/mysqlctl/schema.go @@ -58,8 +58,8 @@ func encodeTableName(tableName string) string { return buf.String() } -// tableListSql returns an IN clause "('t1', 't2'...) for a list of tables." -func tableListSql(tables []string) (string, error) { +// tableListSQL returns an IN clause "('t1', 't2'...) for a list of tables." +func tableListSQL(tables []string) (string, error) { if len(tables) == 0 { return "", vterrors.New(vtrpc.Code_INTERNAL, "no tables for tableListSql") } @@ -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 @@ -308,7 +304,7 @@ func (mysqld *Mysqld) getPrimaryKeyColumns(ctx context.Context, dbName string, t } defer conn.Recycle() - tableList, err := tableListSql(tables) + tableList, err := tableListSQL(tables) if err != nil { return nil, err } 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/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/wrangler/fake_dbclient_test.go b/go/vt/wrangler/fake_dbclient_test.go index 6c05ff5015e..faeca38b3c0 100644 --- a/go/vt/wrangler/fake_dbclient_test.go +++ b/go/vt/wrangler/fake_dbclient_test.go @@ -44,10 +44,11 @@ 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++ + //fmt.Printf("Next: %d/%d::%s\n", dbrs.index, len(dbrs.results), query) return dbrs.results[i].result, dbrs.results[i].err } @@ -75,21 +76,27 @@ func newFakeDBClient() *fakeDBClient { } func (dc *fakeDBClient) addQuery(query string, result *sqltypes.Result, err error) { + //fmt.Printf("@@@Addquery %s\n", query) dbr := &dbResult{result: result, err: err} if dbrs, ok := dc.queries[query]; ok { dbrs.results = append(dbrs.results, dbr) + //fmt.Printf("@@@AQuery: %d:%s remaining %d/%v", len(dbrs.results), query, dbrs.index, dc.queries[query]) return } dc.queries[query] = &dbResults{results: []*dbResult{dbr}, err: err} + //fmt.Printf("@@@BQuery: %d:%s remaining %v\n",1, query, dc.queries[query]) } func (dc *fakeDBClient) addQueryRE(query string, result *sqltypes.Result, err error) { + //fmt.Printf("$$$ %s\n", query) dbr := &dbResult{result: result, err: err} if dbrs, ok := dc.queriesRE[query]; ok { dbrs.results = append(dbrs.results, dbr) + //fmt.Printf("AQueryRE: %d:%s remaining %d/%v", len(dbrs.results), query, dbrs.index, dc.queriesRE[query]) return } dc.queriesRE[query] = &dbResults{results: []*dbResult{dbr}, err: err} + //fmt.Printf("BQueryRE: %d:%s remaining %v\n",1, query, dc.queriesRE[query]) } func (dc *fakeDBClient) addInvariant(query string, result *sqltypes.Result) { @@ -127,17 +134,26 @@ func (dc *fakeDBClient) Close() { // ExecuteFetch is part of the DBClient interface func (dc *fakeDBClient) ExecuteFetch(query string, maxrows int) (qr *sqltypes.Result, err error) { + //fmt.Printf("@@@ query: %s, ALL: %v\n", query, dc.queries) + if testMode == "debug" { + fmt.Printf("ExecuteFetch:::: %s\n", query) + } if dbrs := dc.queries[query]; dbrs != nil { + //fmt.Printf("check: %s remaining %d:%v\n", query, dbrs.index, dc.queriesRE[query]) return dbrs.next(query) } for re, dbrs := range dc.queriesRE { + //fmt.Printf("checkRE: %s :against: %s: remaining %d:%v\n", query, re, dbrs.index, dc.queriesRE[query]) if regexp.MustCompile(re).MatchString(query) { + //fmt.Printf("checkRE: MATCH %s :against: %s remaining %d:%v\n", query, re, dbrs.index, dc.queriesRE[query]) return dbrs.next(query) } + //fmt.Printf("checkRE: NO MATCH %s :against: %s remaining %d:%v\n", query, re, dbrs.index, dc.queriesRE[query]) } if result := dc.invariants[query]; result != nil { return result, nil } + //fmt.Printf("unexpected query: %s\n", query) return nil, fmt.Errorf("unexpected query: %s", query) } @@ -145,12 +161,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) + t.Errorf("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) + t.Errorf("expected re 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 0c8c8efd942..6d59cbc60d9 100644 --- a/go/vt/wrangler/keyspace.go +++ b/go/vt/wrangler/keyspace.go @@ -118,10 +118,11 @@ func (wr *Wrangler) validateNewWorkflow(ctx context.Context, keyspace, workflow 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", workflow, keyspace), + 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", keyspace, workflow), + 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) @@ -129,12 +130,11 @@ func (wr *Wrangler) validateNewWorkflow(ctx context.Context, keyspace, workflow allErrors.RecordError(vterrors.Wrap(err, "validateWorkflowName.VReplicationExec")) return } - if len(p3qr.Rows) != 0 { - allErrors.RecordError(fmt.Errorf(validation.msg)) + if p3qr != nil && len(p3qr.Rows) != 0 { + allErrors.RecordError(vterrors.Wrap(fmt.Errorf(validation.msg), "validateWorkflowName.VReplicationExec")) return } } - }(si) } wg.Wait() diff --git a/go/vt/wrangler/materializer.go b/go/vt/wrangler/materializer.go index 6057682a4ec..dce4cdefa28 100644 --- a/go/vt/wrangler/materializer.go +++ b/go/vt/wrangler/materializer.go @@ -64,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 @@ -135,20 +144,19 @@ func (wr *Wrangler) MoveTables(ctx context.Context, workflow, sourceKeyspace, ta return err } - migrationId, err := getMigrationId(targetKeyspace, tabletShards) + migrationID, err := getMigrationID(targetKeyspace, tabletShards) if err != nil { return err } - wr.Logger().Infof("********* Migration id is %d", migrationId) - exists, tablets, err := wr.checkIfPreviousJournalExists(ctx, mz, migrationId) + 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) + 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, ",")) + 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) @@ -156,7 +164,7 @@ func (wr *Wrangler) MoveTables(ctx context.Context, workflow, sourceKeyspace, ta return mz.startStreams(ctx) } -func (wr *Wrangler) checkIfPreviousJournalExists(ctx context.Context, mz *materializer, migrationId int64) (bool, []string, error) { +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{} @@ -185,14 +193,13 @@ func (wr *Wrangler) checkIfPreviousJournalExists(ctx context.Context, mz *materi if tablet == nil { return nil } - journal, err := wr.checkIfJournalExistsOnTablet(ctx, tablet.Tablet, migrationId) + _, exists, err = wr.checkIfJournalExistsOnTablet(ctx, tablet.Tablet, migrationID) if err != nil { return err } - if journal.Id != 0 { + if exists { mu.Lock() defer mu.Unlock() - exists = true tablets = append(tablets, tablet.AliasString()) } return nil @@ -627,6 +634,9 @@ func (wr *Wrangler) collectTargetStreams(ctx context.Context, mz *materializer) 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() @@ -639,8 +649,8 @@ func (wr *Wrangler) collectTargetStreams(ctx context.Context, mz *materializer) return shardTablets, nil } -// getMigrationId produces a reproducible hash based on the input parameters. -func getMigrationId(targetKeyspace string, shardTablets []string) (int64, error) { +// 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)) @@ -724,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 @@ -746,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 @@ -822,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, @@ -831,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..b847b737d46 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 execed by the test: %v", tabletID, list) } } } diff --git a/go/vt/wrangler/materializer_test.go b/go/vt/wrangler/materializer_test.go index d856cbdbf60..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,7 +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 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{ @@ -52,23 +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, 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) } } @@ -85,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) } } @@ -176,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{}) @@ -215,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{ @@ -224,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) { @@ -440,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) } } @@ -913,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) } } @@ -1412,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) } } @@ -1442,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+ @@ -1460,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) } @@ -1482,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+ @@ -1494,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) } @@ -1533,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+ @@ -1549,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) } @@ -1588,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+ @@ -1606,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) } @@ -1648,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+ @@ -1664,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) } @@ -1688,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, @@ -1699,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) @@ -1725,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, @@ -1736,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) @@ -1781,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+ @@ -1797,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) } @@ -1839,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+ @@ -1855,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) } @@ -1878,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) } @@ -1907,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) { @@ -1927,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) @@ -1976,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) { @@ -1996,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) { @@ -2016,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) { @@ -2037,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) { @@ -2055,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) { @@ -2073,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) { @@ -2112,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) { @@ -2151,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) { @@ -2190,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 909cea0c10d..321bcaa53a2 100644 --- a/go/vt/wrangler/resharder.go +++ b/go/vt/wrangler/resharder.go @@ -18,14 +18,9 @@ package wrangler import ( "fmt" - "hash/fnv" - "math" - "sort" "sync" "time" - "vitess.io/vitess/go/vt/vtgate/evalengine" - "github.com/golang/protobuf/proto" "github.com/pkg/errors" "golang.org/x/net/context" @@ -63,47 +58,11 @@ type refStream struct { tabletTypes string } -// hashStreams produces a reproducible hash based on the input parameters. -func (rs *resharder) getMigrationId(ctx context.Context) (int64, error) { - var expanded []string - var mu sync.Mutex - err := rs.forAll(rs.targetShards, func(target *topo.ShardInfo) error { - var id int64 - var err error - targetMaster := rs.targetMasters[target.ShardName()] - query := fmt.Sprintf("select id from _vt.vreplication where db_name=%s and workflow=%s", encodeString(targetMaster.DbName()), encodeString(rs.workflow)) - p3qr, err := rs.wr.tmc.VReplicationExec(ctx, targetMaster.Tablet, query) - if err != nil { - return vterrors.Wrapf(err, "VReplicationExec(%v, %s)", targetMaster.Tablet, query) - } - qr := sqltypes.Proto3ToResult(p3qr) - for i := 0; i < len(qr.Rows); i++ { - id, err = evalengine.ToInt64(qr.Rows[i][0]) - mu.Lock() - expanded = append(expanded, fmt.Sprintf("%s:%d", target.ShardName(), id)) - mu.Unlock() - } - return nil - }) - if err != nil { - return 0, err - } - sort.Strings(expanded) - hasher := fnv.New64() - hasher.Write([]byte(rs.keyspace)) - for _, str := range expanded { - hasher.Write([]byte(str)) - } - // Convert to int64 after dropping the highest bit. - return int64(hasher.Sum64() & math.MaxInt64), nil -} - // Reshard initiates a resharding workflow. func (wr *Wrangler) Reshard(ctx context.Context, keyspace, workflow string, sources, targets []string, skipSchemaCopy bool, cell, tabletTypes string) error { 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") @@ -116,12 +75,6 @@ func (wr *Wrangler) Reshard(ctx context.Context, keyspace, workflow string, sour if err := rs.createStreams(ctx); err != nil { return vterrors.Wrap(err, "createStreams") } - migrationId, err := rs.getMigrationId(ctx) - if err != nil { - return err - } - wr.Logger().Infof("********* Migration id is %d", migrationId) - if err := rs.startStreams(ctx); err != nil { return vterrors.Wrap(err, "startStream") } @@ -209,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) @@ -232,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..28d6fa99e4b 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..e256e5c378f 100644 --- a/go/vt/wrangler/resharder_test.go +++ b/go/vt/wrangler/resharder_test.go @@ -32,6 +32,8 @@ import ( "vitess.io/vitess/go/vt/vtgate/vindexes" ) +const rsSelectIDQuery = "select id from _vt.vreplication where db_name='vt_ks' and workflow='resharderTest'" +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 = "$" @@ -100,6 +102,8 @@ func TestResharderOneToMany(t *testing.T) { tc.cells+`', '`+tc.tabletTypes+`', [0-9]*, 0, 'Stopped', 'vt_ks'\)`+eol, &sqltypes.Result{}, ) + env.tmc.expectVRQuery(200, rsSelectIDQuery, &sqltypes.Result{}) + env.tmc.expectVRQuery(210, rsSelectIDQuery, &sqltypes.Result{}) env.tmc.expectVRQuery(200, "update _vt.vreplication set state='Running' where db_name='vt_ks'", &sqltypes.Result{}) env.tmc.expectVRQuery(210, "update _vt.vreplication set state='Running' where db_name='vt_ks'", &sqltypes.Result{}) @@ -138,6 +142,7 @@ func TestResharderManyToOne(t *testing.T) { &sqltypes.Result{}, ) + env.tmc.expectVRQuery(200, rsSelectIDQuery, &sqltypes.Result{}) env.tmc.expectVRQuery(200, "update _vt.vreplication set state='Running' where db_name='vt_ks'", &sqltypes.Result{}) err := env.wr.Reshard(context.Background(), env.keyspace, env.workflow, env.sources, env.targets, true, "", "") @@ -178,6 +183,8 @@ func TestResharderManyToMany(t *testing.T) { &sqltypes.Result{}, ) + env.tmc.expectVRQuery(200, rsSelectIDQuery, &sqltypes.Result{}) + env.tmc.expectVRQuery(210, rsSelectIDQuery, &sqltypes.Result{}) env.tmc.expectVRQuery(200, "update _vt.vreplication set state='Running' where db_name='vt_ks'", &sqltypes.Result{}) env.tmc.expectVRQuery(210, "update _vt.vreplication set state='Running' where db_name='vt_ks'", &sqltypes.Result{}) @@ -231,6 +238,8 @@ func TestResharderOneRefTable(t *testing.T) { &sqltypes.Result{}, ) + env.tmc.expectVRQuery(200, rsSelectIDQuery, &sqltypes.Result{}) + env.tmc.expectVRQuery(210, rsSelectIDQuery, &sqltypes.Result{}) env.tmc.expectVRQuery(200, "update _vt.vreplication set state='Running' where db_name='vt_ks'", &sqltypes.Result{}) env.tmc.expectVRQuery(210, "update _vt.vreplication set state='Running' where db_name='vt_ks'", &sqltypes.Result{}) @@ -281,7 +290,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( @@ -299,6 +308,8 @@ func TestResharderOneRefStream(t *testing.T) { &sqltypes.Result{}, ) + env.tmc.expectVRQuery(200, rsSelectIDQuery, &sqltypes.Result{}) + env.tmc.expectVRQuery(210, rsSelectIDQuery, &sqltypes.Result{}) env.tmc.expectVRQuery(200, "update _vt.vreplication set state='Running' where db_name='vt_ks'", &sqltypes.Result{}) env.tmc.expectVRQuery(210, "update _vt.vreplication set state='Running' where db_name='vt_ks'", &sqltypes.Result{}) @@ -359,7 +370,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, @@ -376,6 +387,8 @@ func TestResharderNoRefStream(t *testing.T) { &sqltypes.Result{}, ) + env.tmc.expectVRQuery(200, rsSelectIDQuery, &sqltypes.Result{}) + env.tmc.expectVRQuery(210, rsSelectIDQuery, &sqltypes.Result{}) env.tmc.expectVRQuery(200, "update _vt.vreplication set state='Running' where db_name='vt_ks'", &sqltypes.Result{}) env.tmc.expectVRQuery(210, "update _vt.vreplication set state='Running' where db_name='vt_ks'", &sqltypes.Result{}) @@ -420,6 +433,8 @@ func TestResharderCopySchema(t *testing.T) { &sqltypes.Result{}, ) + env.tmc.expectVRQuery(200, rsSelectIDQuery, &sqltypes.Result{}) + env.tmc.expectVRQuery(210, rsSelectIDQuery, &sqltypes.Result{}) env.tmc.expectVRQuery(200, "update _vt.vreplication set state='Running' where db_name='vt_ks'", &sqltypes.Result{}) env.tmc.expectVRQuery(210, "update _vt.vreplication set state='Running' where db_name='vt_ks'", &sqltypes.Result{}) @@ -451,8 +466,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 +491,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 +539,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 +590,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 +638,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 +654,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 +694,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 +758,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 +825,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 a556ef6a17a..083fb02d505 100644 --- a/go/vt/wrangler/traffic_switcher.go +++ b/go/vt/wrangler/traffic_switcher.go @@ -137,7 +137,7 @@ func (wr *Wrangler) SwitchReads(ctx context.Context, targetKeyspace, workflow st return nil, err } - // If journals exist notify user and fail + //If journals exist notify user and fail journalsExist, _, err := ts.checkJournals(ctx) if err != nil { wr.Logger().Errorf("checkJournals failed: %v", err) @@ -246,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) @@ -257,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) @@ -688,27 +693,24 @@ 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, error) { +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) - wr.Logger().Infof("********* running %s on %s", query, tablet.String()) + 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, err + 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, err + return nil, false, err } - wr.Logger().Infof("********* journal is %s", journal.String()) exists = true } } - return journal, nil + return journal, exists, nil } @@ -717,15 +719,15 @@ func (wr *Wrangler) checkIfJournalExistsOnTablet(ctx context.Context, tablet *to func (ts *trafficSwitcher) checkJournals(ctx context.Context) (journalsExist bool, sourceWorkflows []string, err error) { var mu sync.Mutex var exists bool + var journal *binlogdatapb.Journal err = ts.forAllSources(func(source *tsSource) error { - journal, err := ts.wr.checkIfJournalExistsOnTablet(ctx, source.master.Tablet, ts.id) + mu.Lock() + defer mu.Unlock() + journal, exists, err = ts.wr.checkIfJournalExistsOnTablet(ctx, source.master.Tablet, ts.id) if err != nil { return err } if journal.Id != 0 { - mu.Lock() - defer mu.Unlock() - exists = true source.journaled = true sourceWorkflows = journal.SourceWorkflows } @@ -872,7 +874,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..9dd431b4268 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,10 +1033,12 @@ 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) @@ -1105,14 +1127,17 @@ func TestMigrateFailJournal(t *testing.T) { } func TestTableMigrateJournalExists(t *testing.T) { + t.Skip() 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) @@ -1120,11 +1145,12 @@ func TestTableMigrateJournalExists(t *testing.T) { // 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) - - // mi.createJournals: Create the missing journal. - journal2 := "insert into _vt.resharding_journal.*7672494164556733923,.*tables.*t1.*t2.*local_position.*MariaDB/5-456-892.*shard_gtids.*80.*MariaDB/5-456-893.*80.*participants.*40.*40" - tme.dbSourceClients[1].addQueryRE(journal2, &sqltypes.Result{}, nil) + tme.dbSourceClients[1].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) + // + //// mi.createJournals: Create the missing journal. + //journal2 := "insert into _vt.resharding_journal.*7672494164556733923,.*tables.*t1.*t2.*local_position.*MariaDB/5-456-892.*shard_gtids.*80.*MariaDB/5-456-893.*80.*participants.*40.*40" + //tme.dbSourceClients[1].addQueryRE(journal2, &sqltypes.Result{}, nil) // mi.startReverseVReplication tme.dbSourceClients[0].addQuery("select id from _vt.vreplication where db_name = 'vt_ks1'", resultid34, nil) @@ -1169,14 +1195,21 @@ func TestTableMigrateJournalExists(t *testing.T) { } func TestShardMigrateJournalExists(t *testing.T) { + t.Skip() ctx := context.Background() tme := newTestShardMigrater(ctx, t, []string{"-40", "40-"}, []string{"-80", "80-"}) defer tme.stopTablets(t) + // mi.checkJournals + tme.dbSourceClients[0].addQuery("select val from _vt.resharding_journal where id=6432976123657117097", sqltypes.MakeTestResult(sqltypes.MakeTestFields("val", "varbinary"), ""), nil) + tme.dbSourceClients[1].addQuery("select val from _vt.resharding_journal where id=6432976123657117097", &sqltypes.Result{}, nil) _, err := tme.wr.SwitchReads(ctx, tme.targetKeyspace, "test", topodatapb.TabletType_RDONLY, nil, DirectionForward, false) if err != nil { t.Fatal(err) } + // mi.checkJournals + tme.dbSourceClients[0].addQuery("select val from _vt.resharding_journal where id=6432976123657117097", sqltypes.MakeTestResult(sqltypes.MakeTestFields("val", "varbinary"), ""), nil) + tme.dbSourceClients[1].addQuery("select val from _vt.resharding_journal where id=6432976123657117097", &sqltypes.Result{}, nil) _, err = tme.wr.SwitchReads(ctx, tme.targetKeyspace, "test", topodatapb.TabletType_REPLICA, nil, DirectionForward, false) if err != nil { t.Fatal(err) @@ -1209,6 +1242,14 @@ func TestShardMigrateJournalExists(t *testing.T) { tme.dbTargetClients[1].addQuery("update _vt.vreplication set message = 'FROZEN' where id in (2)", &sqltypes.Result{}, nil) tme.dbTargetClients[1].addQuery("select * from _vt.vreplication where id = 2", stoppedResult(2), nil) + //tme.dbSourceClients[0].addQuery("select id, workflow, source, pos from _vt.vreplication where db_name='vt_ks' and workflow != 'test_reverse'", &sqltypes.Result{}, nil) + //tme.dbSourceClients[1].addQuery("select id, workflow, source, pos from _vt.vreplication where db_name='vt_ks' and workflow != 'test_reverse'", &sqltypes.Result{}, nil) + //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) + //tme.dbSourceClients[1].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) + + tme.expectWaitForCatchup() + tme.expectDeleteReverseVReplication() + _, _, err = tme.wr.SwitchWrites(ctx, tme.targetKeyspace, "test", 1*time.Second, false, true, false) if err != nil { t.Fatal(err) @@ -1232,10 +1273,12 @@ func TestTableMigrateCancel(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) @@ -1289,10 +1332,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 +1381,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 +1481,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 +1510,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 +1539,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 +1571,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 +1601,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 +1616,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 +1629,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 +1674,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) { From 3a605639948560162143f44ec935b79990a056ba Mon Sep 17 00:00:00 2001 From: Rohit Nayak Date: Sat, 3 Oct 2020 19:08:01 +0200 Subject: [PATCH 12/19] Fix breaking resharder tests Signed-off-by: Rohit Nayak --- go/vt/wrangler/resharder_env_test.go | 2 +- go/vt/wrangler/resharder_test.go | 15 --------------- 2 files changed, 1 insertion(+), 16 deletions(-) diff --git a/go/vt/wrangler/resharder_env_test.go b/go/vt/wrangler/resharder_env_test.go index 28d6fa99e4b..709ca04a9a5 100644 --- a/go/vt/wrangler/resharder_env_test.go +++ b/go/vt/wrangler/resharder_env_test.go @@ -48,7 +48,7 @@ type testResharderEnv struct { } var ( - testMode = "debug" + testMode = "" //"debug" ) //---------------------------------------------- diff --git a/go/vt/wrangler/resharder_test.go b/go/vt/wrangler/resharder_test.go index e256e5c378f..886aa8dbbcb 100644 --- a/go/vt/wrangler/resharder_test.go +++ b/go/vt/wrangler/resharder_test.go @@ -32,7 +32,6 @@ import ( "vitess.io/vitess/go/vt/vtgate/vindexes" ) -const rsSelectIDQuery = "select id from _vt.vreplication where db_name='vt_ks' and workflow='resharderTest'" 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 = "$" @@ -102,8 +101,6 @@ func TestResharderOneToMany(t *testing.T) { tc.cells+`', '`+tc.tabletTypes+`', [0-9]*, 0, 'Stopped', 'vt_ks'\)`+eol, &sqltypes.Result{}, ) - env.tmc.expectVRQuery(200, rsSelectIDQuery, &sqltypes.Result{}) - env.tmc.expectVRQuery(210, rsSelectIDQuery, &sqltypes.Result{}) env.tmc.expectVRQuery(200, "update _vt.vreplication set state='Running' where db_name='vt_ks'", &sqltypes.Result{}) env.tmc.expectVRQuery(210, "update _vt.vreplication set state='Running' where db_name='vt_ks'", &sqltypes.Result{}) @@ -113,7 +110,6 @@ func TestResharderOneToMany(t *testing.T) { }) env.close() } - } func TestResharderManyToOne(t *testing.T) { @@ -142,7 +138,6 @@ func TestResharderManyToOne(t *testing.T) { &sqltypes.Result{}, ) - env.tmc.expectVRQuery(200, rsSelectIDQuery, &sqltypes.Result{}) env.tmc.expectVRQuery(200, "update _vt.vreplication set state='Running' where db_name='vt_ks'", &sqltypes.Result{}) err := env.wr.Reshard(context.Background(), env.keyspace, env.workflow, env.sources, env.targets, true, "", "") @@ -183,8 +178,6 @@ func TestResharderManyToMany(t *testing.T) { &sqltypes.Result{}, ) - env.tmc.expectVRQuery(200, rsSelectIDQuery, &sqltypes.Result{}) - env.tmc.expectVRQuery(210, rsSelectIDQuery, &sqltypes.Result{}) env.tmc.expectVRQuery(200, "update _vt.vreplication set state='Running' where db_name='vt_ks'", &sqltypes.Result{}) env.tmc.expectVRQuery(210, "update _vt.vreplication set state='Running' where db_name='vt_ks'", &sqltypes.Result{}) @@ -238,8 +231,6 @@ func TestResharderOneRefTable(t *testing.T) { &sqltypes.Result{}, ) - env.tmc.expectVRQuery(200, rsSelectIDQuery, &sqltypes.Result{}) - env.tmc.expectVRQuery(210, rsSelectIDQuery, &sqltypes.Result{}) env.tmc.expectVRQuery(200, "update _vt.vreplication set state='Running' where db_name='vt_ks'", &sqltypes.Result{}) env.tmc.expectVRQuery(210, "update _vt.vreplication set state='Running' where db_name='vt_ks'", &sqltypes.Result{}) @@ -308,8 +299,6 @@ func TestResharderOneRefStream(t *testing.T) { &sqltypes.Result{}, ) - env.tmc.expectVRQuery(200, rsSelectIDQuery, &sqltypes.Result{}) - env.tmc.expectVRQuery(210, rsSelectIDQuery, &sqltypes.Result{}) env.tmc.expectVRQuery(200, "update _vt.vreplication set state='Running' where db_name='vt_ks'", &sqltypes.Result{}) env.tmc.expectVRQuery(210, "update _vt.vreplication set state='Running' where db_name='vt_ks'", &sqltypes.Result{}) @@ -387,8 +376,6 @@ func TestResharderNoRefStream(t *testing.T) { &sqltypes.Result{}, ) - env.tmc.expectVRQuery(200, rsSelectIDQuery, &sqltypes.Result{}) - env.tmc.expectVRQuery(210, rsSelectIDQuery, &sqltypes.Result{}) env.tmc.expectVRQuery(200, "update _vt.vreplication set state='Running' where db_name='vt_ks'", &sqltypes.Result{}) env.tmc.expectVRQuery(210, "update _vt.vreplication set state='Running' where db_name='vt_ks'", &sqltypes.Result{}) @@ -433,8 +420,6 @@ func TestResharderCopySchema(t *testing.T) { &sqltypes.Result{}, ) - env.tmc.expectVRQuery(200, rsSelectIDQuery, &sqltypes.Result{}) - env.tmc.expectVRQuery(210, rsSelectIDQuery, &sqltypes.Result{}) env.tmc.expectVRQuery(200, "update _vt.vreplication set state='Running' where db_name='vt_ks'", &sqltypes.Result{}) env.tmc.expectVRQuery(210, "update _vt.vreplication set state='Running' where db_name='vt_ks'", &sqltypes.Result{}) From c1d7a5ad32c9fee7a7fcd3449246150fd4159f5f Mon Sep 17 00:00:00 2001 From: Rohit Nayak Date: Sat, 3 Oct 2020 22:50:36 +0200 Subject: [PATCH 13/19] Fix tests for existing journals Signed-off-by: Rohit Nayak --- go/vt/wrangler/traffic_switcher.go | 13 ++++----- go/vt/wrangler/traffic_switcher_test.go | 36 +++++++------------------ 2 files changed, 16 insertions(+), 33 deletions(-) diff --git a/go/vt/wrangler/traffic_switcher.go b/go/vt/wrangler/traffic_switcher.go index 083fb02d505..82217195009 100644 --- a/go/vt/wrangler/traffic_switcher.go +++ b/go/vt/wrangler/traffic_switcher.go @@ -718,22 +718,23 @@ func (wr *Wrangler) checkIfJournalExistsOnTablet(ctx context.Context, tablet *to // 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 - var exists bool - var journal *binlogdatapb.Journal err = ts.forAllSources(func(source *tsSource) error { mu.Lock() defer mu.Unlock() - journal, exists, err = ts.wr.checkIfJournalExistsOnTablet(ctx, source.master.Tablet, ts.id) + journal, exists, err := ts.wr.checkIfJournalExistsOnTablet(ctx, source.master.Tablet, ts.id) if err != nil { return err } - if journal.Id != 0 { + if exists { + if journal.Id != 0 { + sourceWorkflows = journal.SourceWorkflows + } source.journaled = true - sourceWorkflows = journal.SourceWorkflows + journalsExist = true } return nil }) - return exists, sourceWorkflows, err + return journalsExist, sourceWorkflows, err } func (ts *trafficSwitcher) stopSourceWrites(ctx context.Context) error { diff --git a/go/vt/wrangler/traffic_switcher_test.go b/go/vt/wrangler/traffic_switcher_test.go index 9dd431b4268..e31e10c2f75 100644 --- a/go/vt/wrangler/traffic_switcher_test.go +++ b/go/vt/wrangler/traffic_switcher_test.go @@ -1127,30 +1127,27 @@ func TestMigrateFailJournal(t *testing.T) { } func TestTableMigrateJournalExists(t *testing.T) { - t.Skip() ctx := context.Background() tme := newTestTableMigrater(ctx, t) defer tme.stopTablets(t) - //tme.expectNoPreviousJournals() + tme.expectNoPreviousJournals() _, err := tme.wr.SwitchReads(ctx, tme.targetKeyspace, "test", topodatapb.TabletType_RDONLY, nil, DirectionForward, false) if err != nil { t.Fatal(err) } - //tme.expectNoPreviousJournals() + 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.MakeTestResult(sqltypes.MakeTestFields("val", "varbinary"), ""), nil) - //tme.dbSourceClients[1].addQuery("select val from _vt.resharding_journal where id=7672494164556733923", &sqltypes.Result{}, nil) - // - //// mi.createJournals: Create the missing journal. - //journal2 := "insert into _vt.resharding_journal.*7672494164556733923,.*tables.*t1.*t2.*local_position.*MariaDB/5-456-892.*shard_gtids.*80.*MariaDB/5-456-893.*80.*participants.*40.*40" - //tme.dbSourceClients[1].addQueryRE(journal2, &sqltypes.Result{}, nil) + tme.dbSourceClients[1].addQuery("select val from _vt.resharding_journal where id=7672494164556733923", &sqltypes.Result{}, nil) + + // mi.createJournals: Create the missing journal. + journal2 := "insert into _vt.resharding_journal.*7672494164556733923,.*tables.*t1.*t2.*local_position.*MariaDB/5-456-892.*shard_gtids.*80.*MariaDB/5-456-893.*80.*participants.*40.*40" + tme.dbSourceClients[1].addQueryRE(journal2, &sqltypes.Result{}, nil) // mi.startReverseVReplication tme.dbSourceClients[0].addQuery("select id from _vt.vreplication where db_name = 'vt_ks1'", resultid34, nil) @@ -1193,23 +1190,17 @@ func TestTableMigrateJournalExists(t *testing.T) { verifyQueries(t, tme.allDBClients) } - func TestShardMigrateJournalExists(t *testing.T) { - t.Skip() ctx := context.Background() tme := newTestShardMigrater(ctx, t, []string{"-40", "40-"}, []string{"-80", "80-"}) defer tme.stopTablets(t) - // mi.checkJournals - tme.dbSourceClients[0].addQuery("select val from _vt.resharding_journal where id=6432976123657117097", sqltypes.MakeTestResult(sqltypes.MakeTestFields("val", "varbinary"), ""), nil) - tme.dbSourceClients[1].addQuery("select val from _vt.resharding_journal where id=6432976123657117097", &sqltypes.Result{}, nil) + tme.expectNoPreviousJournals() _, err := tme.wr.SwitchReads(ctx, tme.targetKeyspace, "test", topodatapb.TabletType_RDONLY, nil, DirectionForward, false) if err != nil { t.Fatal(err) } - // mi.checkJournals - tme.dbSourceClients[0].addQuery("select val from _vt.resharding_journal where id=6432976123657117097", sqltypes.MakeTestResult(sqltypes.MakeTestFields("val", "varbinary"), ""), nil) - tme.dbSourceClients[1].addQuery("select val from _vt.resharding_journal where id=6432976123657117097", &sqltypes.Result{}, nil) + tme.expectNoPreviousJournals() _, err = tme.wr.SwitchReads(ctx, tme.targetKeyspace, "test", topodatapb.TabletType_REPLICA, nil, DirectionForward, false) if err != nil { t.Fatal(err) @@ -1242,14 +1233,6 @@ func TestShardMigrateJournalExists(t *testing.T) { tme.dbTargetClients[1].addQuery("update _vt.vreplication set message = 'FROZEN' where id in (2)", &sqltypes.Result{}, nil) tme.dbTargetClients[1].addQuery("select * from _vt.vreplication where id = 2", stoppedResult(2), nil) - //tme.dbSourceClients[0].addQuery("select id, workflow, source, pos from _vt.vreplication where db_name='vt_ks' and workflow != 'test_reverse'", &sqltypes.Result{}, nil) - //tme.dbSourceClients[1].addQuery("select id, workflow, source, pos from _vt.vreplication where db_name='vt_ks' and workflow != 'test_reverse'", &sqltypes.Result{}, nil) - //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) - //tme.dbSourceClients[1].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) - - tme.expectWaitForCatchup() - tme.expectDeleteReverseVReplication() - _, _, err = tme.wr.SwitchWrites(ctx, tme.targetKeyspace, "test", 1*time.Second, false, true, false) if err != nil { t.Fatal(err) @@ -1267,7 +1250,6 @@ func TestShardMigrateJournalExists(t *testing.T) { verifyQueries(t, tme.allDBClients) } - func TestTableMigrateCancel(t *testing.T) { ctx := context.Background() tme := newTestTableMigrater(ctx, t) From cfe804c55d51b27d2bd9ccb25d09acbeadcc04b7 Mon Sep 17 00:00:00 2001 From: Rohit Nayak Date: Sun, 4 Oct 2020 09:50:19 +0200 Subject: [PATCH 14/19] Removed leftover debug lines Signed-off-by: Rohit Nayak --- go/vt/wrangler/fake_dbclient_test.go | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/go/vt/wrangler/fake_dbclient_test.go b/go/vt/wrangler/fake_dbclient_test.go index faeca38b3c0..2a919aca245 100644 --- a/go/vt/wrangler/fake_dbclient_test.go +++ b/go/vt/wrangler/fake_dbclient_test.go @@ -48,7 +48,6 @@ func (dbrs *dbResults) next(query string) (*sqltypes.Result, error) { } i := dbrs.index dbrs.index++ - //fmt.Printf("Next: %d/%d::%s\n", dbrs.index, len(dbrs.results), query) return dbrs.results[i].result, dbrs.results[i].err } @@ -76,27 +75,21 @@ func newFakeDBClient() *fakeDBClient { } func (dc *fakeDBClient) addQuery(query string, result *sqltypes.Result, err error) { - //fmt.Printf("@@@Addquery %s\n", query) dbr := &dbResult{result: result, err: err} if dbrs, ok := dc.queries[query]; ok { dbrs.results = append(dbrs.results, dbr) - //fmt.Printf("@@@AQuery: %d:%s remaining %d/%v", len(dbrs.results), query, dbrs.index, dc.queries[query]) return } dc.queries[query] = &dbResults{results: []*dbResult{dbr}, err: err} - //fmt.Printf("@@@BQuery: %d:%s remaining %v\n",1, query, dc.queries[query]) } func (dc *fakeDBClient) addQueryRE(query string, result *sqltypes.Result, err error) { - //fmt.Printf("$$$ %s\n", query) dbr := &dbResult{result: result, err: err} if dbrs, ok := dc.queriesRE[query]; ok { dbrs.results = append(dbrs.results, dbr) - //fmt.Printf("AQueryRE: %d:%s remaining %d/%v", len(dbrs.results), query, dbrs.index, dc.queriesRE[query]) return } dc.queriesRE[query] = &dbResults{results: []*dbResult{dbr}, err: err} - //fmt.Printf("BQueryRE: %d:%s remaining %v\n",1, query, dc.queriesRE[query]) } func (dc *fakeDBClient) addInvariant(query string, result *sqltypes.Result) { @@ -134,26 +127,20 @@ func (dc *fakeDBClient) Close() { // ExecuteFetch is part of the DBClient interface func (dc *fakeDBClient) ExecuteFetch(query string, maxrows int) (qr *sqltypes.Result, err error) { - //fmt.Printf("@@@ query: %s, ALL: %v\n", query, dc.queries) if testMode == "debug" { fmt.Printf("ExecuteFetch:::: %s\n", query) } if dbrs := dc.queries[query]; dbrs != nil { - //fmt.Printf("check: %s remaining %d:%v\n", query, dbrs.index, dc.queriesRE[query]) return dbrs.next(query) } for re, dbrs := range dc.queriesRE { - //fmt.Printf("checkRE: %s :against: %s: remaining %d:%v\n", query, re, dbrs.index, dc.queriesRE[query]) if regexp.MustCompile(re).MatchString(query) { - //fmt.Printf("checkRE: MATCH %s :against: %s remaining %d:%v\n", query, re, dbrs.index, dc.queriesRE[query]) return dbrs.next(query) } - //fmt.Printf("checkRE: NO MATCH %s :against: %s remaining %d:%v\n", query, re, dbrs.index, dc.queriesRE[query]) } if result := dc.invariants[query]; result != nil { return result, nil } - //fmt.Printf("unexpected query: %s\n", query) return nil, fmt.Errorf("unexpected query: %s", query) } From 85ef1318718f42a1f5ea7f3f188853a6fb39dba8 Mon Sep 17 00:00:00 2001 From: Andres Taylor Date: Mon, 5 Oct 2020 09:13:55 +0200 Subject: [PATCH 15/19] refactored handleNextCommand to make it easier to read Signed-off-by: Andres Taylor --- go/mysql/conn.go | 602 +++++++++++++++++++++++++---------------------- 1 file changed, 321 insertions(+), 281 deletions(-) diff --git a/go/mysql/conn.go b/go/mysql/conn.go index 7a220168df4..ddbed87da42 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 ( @@ -787,361 +788,400 @@ 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 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 + } + } - 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 err := c.writeErrorPacket(ERUnknownComError, SSUnknownComError, "error handling packet: %v", data); err != nil { + log.Error("Error writing error packet to client: %v", err) + 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 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 } + } - 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) + 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 + } - 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) + 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 + } - 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) + 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 + } - 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 { + 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 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 !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 - } + 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) - }) + 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 - } + // 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 + } - // 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 - } + // 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 } } + } - timings.Record(queryTimingKey, queryStart) + timings.Record(queryTimingKey, queryStart) + return true +} - 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) +func (c *Conn) handleComPrepare(handler Handler, data []byte) bool { + query := c.parseComPrepare(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.Error("Error writing query error to client %v: %v", c.ConnectionID, werr) + log.Errorf("Conn %v: Error writing query error: %v", c, werr) return false } return true } - - 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 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.Error("Error writing query error to client %v: %v", c.ConnectionID, werr) + log.Errorf("Conn %v: Error writing query error: %v", c, werr) return false } return true } + } else { + queries = []string{query} + } - 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) - return false + // 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 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 + } + } + + 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 } + return true, nil + }, statement) - chunk := make([]byte, len(chunkData)) - copy(chunk, chunkData) + if paramsCount > 0 { + prepare.ParamsCount = paramsCount + prepare.ParamsType = make([]int32, paramsCount) + prepare.BindVars = make(map[string]*querypb.BindVariable, paramsCount) + } - 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) - } - case ComStmtClose: - stmtID, ok := c.parseComStmtClose(data) - c.recycleReadPacket() - if ok { - delete(c.PrepareData, stmtID) + 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 { + 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 } - 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) + 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 + } + 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 err := c.writeErrorPacket(ERUnknownComError, SSUnknownComError, "error handling packet: %v", data); err != nil { - log.Error("Error writing error packet to client: %v", err) + log.Errorf("Error writing error packet to client: %v", 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 - } + if err := c.writeEndResult(false, 0, 0, 0); err != nil { + log.Errorf("Error writeEndResult error %v ", err) + return false } - - if prepare.BindVars != nil { - for k := range prepare.BindVars { - prepare.BindVars[k] = nil - } + } 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 } + } + return true +} +func (c *Conn) handleComPing() bool { + 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.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) + 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} + } + 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 } From 646ff9d8dbaa1f08c8f1076006c8b81190389844 Mon Sep 17 00:00:00 2001 From: Andres Taylor Date: Mon, 5 Oct 2020 09:29:06 +0200 Subject: [PATCH 16/19] DRYed error packet writing Signed-off-by: Andres Taylor --- go/mysql/conn.go | 103 ++++++++++++++++------------------------------- 1 file changed, 34 insertions(+), 69 deletions(-) diff --git a/go/mysql/conn.go b/go/mysql/conn.go index ddbed87da42..bbb30d241d8 100644 --- a/go/mysql/conn.go +++ b/go/mysql/conn.go @@ -721,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. @@ -814,8 +831,7 @@ func (c *Conn) handleNextCommand(handler Handler) bool { 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) + if !c.writeErrorAndLog(ERUnknownComError, SSUnknownComError, "command handling not implemented yet: %v", data[0]) { return false } } @@ -840,8 +856,7 @@ func (c *Conn) handleComStmtReset(data []byte) bool { 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) + if !c.writeErrorAndLog(ERUnknownComError, SSUnknownComError, "error handling packet: %v", data) { return false } } @@ -849,8 +864,7 @@ func (c *Conn) handleComStmtReset(data []byte) bool { 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) + if !c.writeErrorAndLog(CRCommandsOutOfSync, SSUnknownComError, "commands were executed in an improper order: %v", data) { return false } } @@ -873,35 +887,20 @@ func (c *Conn) handleComStmtSendLongData(data []byte) bool { 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 + return c.writeErrorPacketFromErrorAndLog(err) } 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 + return !c.writeErrorPacketFromErrorAndLog(err) } 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) - return false - } - return true + return !c.writeErrorPacketFromErrorAndLog(err) } chunk := make([]byte, len(chunkData)) @@ -937,12 +936,7 @@ func (c *Conn) handleComStmtExecute(handler Handler, data []byte) (kontinue bool } 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 + return !c.writeErrorPacketFromErrorAndLog(err) } fieldSent := false @@ -977,9 +971,7 @@ func (c *Conn) handleComStmtExecute(handler Handler, data []byte) (kontinue bool 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 false } } else { @@ -1014,21 +1006,11 @@ func (c *Conn) handleComPrepare(handler Handler, data []byte) bool { 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 - } - return true + return !c.writeErrorPacketFromErrorAndLog(err) } 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 + return !c.writeErrorPacketFromErrorAndLog(err) } } else { queries = []string{query} @@ -1044,9 +1026,7 @@ func (c *Conn) handleComPrepare(handler Handler, data []byte) bool { 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) + if !c.writeErrorPacketFromErrorAndLog(err) { return false } } @@ -1079,12 +1059,7 @@ func (c *Conn) handleComPrepare(handler Handler, data []byte) bool { fld, err := handler.ComPrepare(c, queries[0], bindVars) 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 + return !c.writeErrorPacketFromErrorAndLog(err) } if err := c.writePrepare(fld, c.PrepareData[c.StatementID]); err != nil { @@ -1105,8 +1080,7 @@ func (c *Conn) handleComSetOption(data []byte) bool { 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) + if !c.writeErrorAndLog(ERUnknownComError, SSUnknownComError, "error handling packet: %v", data) { return false } } @@ -1116,8 +1090,7 @@ func (c *Conn) handleComSetOption(data []byte) bool { } } 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) + if !c.writeErrorAndLog(ERUnknownComError, SSUnknownComError, "error handling packet: %v", data) { return false } } @@ -1128,8 +1101,7 @@ func (c *Conn) handleComPing() bool { 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) + if !c.writeErrorAndLog(ERServerShutdown, SSServerShutdown, "Server shutdown in progress") { return false } } else { @@ -1160,12 +1132,7 @@ func (c *Conn) handleComQuery(handler Handler, data []byte) (kontinue bool) { 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 - } - return true + return !c.writeErrorPacketFromErrorAndLog(err) } } else { queries = []string{query} @@ -1228,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 From 4c50ded5899e558b83c9f5a133f0fd332d0ead47 Mon Sep 17 00:00:00 2001 From: GuptaManan100 Date: Mon, 5 Oct 2020 18:05:07 +0530 Subject: [PATCH 17/19] Support for bypass queries for INTO OUTFILE S3 along with tests Signed-off-by: GuptaManan100 --- go/vt/vtgate/planbuilder/select.go | 8 +++++ .../planbuilder/testdata/bypass_cases.txt | 35 +++++++++++++++++++ .../testdata/unsupported_cases.txt | 12 +++++++ 3 files changed, 55 insertions(+) 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" From 7de8c8731d85ef9d24257cdcbe528336b02f4351 Mon Sep 17 00:00:00 2001 From: Rohit Nayak Date: Tue, 6 Oct 2020 12:54:36 +0200 Subject: [PATCH 18/19] Address review comments Signed-off-by: Rohit Nayak --- go/vt/wrangler/fake_dbclient_test.go | 8 +++++--- go/vt/wrangler/materializer_env_test.go | 2 +- go/vt/wrangler/traffic_switcher_test.go | 4 +--- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/go/vt/wrangler/fake_dbclient_test.go b/go/vt/wrangler/fake_dbclient_test.go index 2a919aca245..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" ) @@ -128,7 +130,7 @@ 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) + fmt.Printf("ExecuteFetch: %s\n", query) } if dbrs := dc.queries[query]; dbrs != nil { return dbrs.next(query) @@ -148,12 +150,12 @@ func (dc *fakeDBClient) verifyQueries(t *testing.T) { t.Helper() for query, dbrs := range dc.queries { if !dbrs.exhausted() { - t.Errorf("expected query: %v did not get executed during the test", 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("expected re query: %v did not get executed during the test", query) + assert.FailNow(t, "expected regex query: %v did not get executed during the test", query) } } } diff --git a/go/vt/wrangler/materializer_env_test.go b/go/vt/wrangler/materializer_env_test.go index b847b737d46..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: found queries that were expected but never got execed by the test: %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/traffic_switcher_test.go b/go/vt/wrangler/traffic_switcher_test.go index e31e10c2f75..8e80c03a362 100644 --- a/go/vt/wrangler/traffic_switcher_test.go +++ b/go/vt/wrangler/traffic_switcher_test.go @@ -1040,9 +1040,7 @@ func TestMigrateFailJournal(t *testing.T) { } 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) From 07e23c0dbeab95a976245773b6b6b8c70a62f0fd Mon Sep 17 00:00:00 2001 From: Anthony Yeh Date: Tue, 6 Oct 2020 15:18:38 -0500 Subject: [PATCH 19/19] Rename Vitess fork of orchestrator to vtorc. The usage pattern has diverged enough that we need to be clear that this is a different binary than pure orchestrator. This only renames the output binary, not the internal packages. Signed-off-by: Anthony Yeh --- Makefile | 2 +- go/cmd/{orchestrator => vtorc}/main.go | 0 .../{orchestrator => vtorc}/plugin_consultopo.go | 0 .../{orchestrator => vtorc}/plugin_etcd2topo.go | 0 .../plugin_grpctmclient.go | 0 .../plugin_kubernetestopo.go | 0 go/cmd/{orchestrator => vtorc}/plugin_zk2topo.go | 0 go/test/endtoend/cluster/cluster_process.go | 16 ++++++++-------- ...{orchestrator_process.go => vtorc_process.go} | 14 +++++++------- go/test/endtoend/orchestrator/orc_test.go | 8 ++++---- 10 files changed, 20 insertions(+), 20 deletions(-) rename go/cmd/{orchestrator => vtorc}/main.go (100%) rename go/cmd/{orchestrator => vtorc}/plugin_consultopo.go (100%) rename go/cmd/{orchestrator => vtorc}/plugin_etcd2topo.go (100%) rename go/cmd/{orchestrator => vtorc}/plugin_grpctmclient.go (100%) rename go/cmd/{orchestrator => vtorc}/plugin_kubernetestopo.go (100%) rename go/cmd/{orchestrator => vtorc}/plugin_zk2topo.go (100%) rename go/test/endtoend/cluster/{orchestrator_process.go => vtorc_process.go} (83%) 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/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/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